1/* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (c) 2014 Imagination Technologies Ltd. 7 * Author: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com> 8 * Author: Markos Chandras <markos.chandras@imgtec.com> 9 * 10 * MIPS R2 user space instruction emulator for MIPS R6 11 * 12 */ 13#include <linux/bug.h> 14#include <linux/compiler.h> 15#include <linux/debugfs.h> 16#include <linux/init.h> 17#include <linux/kernel.h> 18#include <linux/module.h> 19#include <linux/ptrace.h> 20#include <linux/seq_file.h> 21 22#include <asm/asm.h> 23#include <asm/branch.h> 24#include <asm/break.h> 25#include <asm/debug.h> 26#include <asm/fpu.h> 27#include <asm/fpu_emulator.h> 28#include <asm/inst.h> 29#include <asm/mips-r2-to-r6-emul.h> 30#include <asm/local.h> 31#include <asm/mipsregs.h> 32#include <asm/ptrace.h> 33#include <asm/uaccess.h> 34 35#ifdef CONFIG_64BIT 36#define ADDIU "daddiu " 37#define INS "dins " 38#define EXT "dext " 39#else 40#define ADDIU "addiu " 41#define INS "ins " 42#define EXT "ext " 43#endif /* CONFIG_64BIT */ 44 45#define SB "sb " 46#define LB "lb " 47#define LL "ll " 48#define SC "sc " 49 50DEFINE_PER_CPU(struct mips_r2_emulator_stats, mipsr2emustats); 51DEFINE_PER_CPU(struct mips_r2_emulator_stats, mipsr2bdemustats); 52DEFINE_PER_CPU(struct mips_r2br_emulator_stats, mipsr2bremustats); 53 54extern const unsigned int fpucondbit[8]; 55 56#define MIPS_R2_EMUL_TOTAL_PASS 10 57 58int mipsr2_emulation = 0; 59 60static int __init mipsr2emu_enable(char *s) 61{ 62 mipsr2_emulation = 1; 63 64 pr_info("MIPS R2-to-R6 Emulator Enabled!"); 65 66 return 1; 67} 68__setup("mipsr2emu", mipsr2emu_enable); 69 70/** 71 * mipsr6_emul - Emulate some frequent R2/R5/R6 instructions in delay slot 72 * for performance instead of the traditional way of using a stack trampoline 73 * which is rather slow. 74 * @regs: Process register set 75 * @ir: Instruction 76 */ 77static inline int mipsr6_emul(struct pt_regs *regs, u32 ir) 78{ 79 switch (MIPSInst_OPCODE(ir)) { 80 case addiu_op: 81 if (MIPSInst_RT(ir)) 82 regs->regs[MIPSInst_RT(ir)] = 83 (s32)regs->regs[MIPSInst_RS(ir)] + 84 (s32)MIPSInst_SIMM(ir); 85 return 0; 86 case daddiu_op: 87 if (config_enabled(CONFIG_32BIT)) 88 break; 89 90 if (MIPSInst_RT(ir)) 91 regs->regs[MIPSInst_RT(ir)] = 92 (s64)regs->regs[MIPSInst_RS(ir)] + 93 (s64)MIPSInst_SIMM(ir); 94 return 0; 95 case lwc1_op: 96 case swc1_op: 97 case cop1_op: 98 case cop1x_op: 99 /* FPU instructions in delay slot */ 100 return -SIGFPE; 101 case spec_op: 102 switch (MIPSInst_FUNC(ir)) { 103 case or_op: 104 if (MIPSInst_RD(ir)) 105 regs->regs[MIPSInst_RD(ir)] = 106 regs->regs[MIPSInst_RS(ir)] | 107 regs->regs[MIPSInst_RT(ir)]; 108 return 0; 109 case sll_op: 110 if (MIPSInst_RS(ir)) 111 break; 112 113 if (MIPSInst_RD(ir)) 114 regs->regs[MIPSInst_RD(ir)] = 115 (s32)(((u32)regs->regs[MIPSInst_RT(ir)]) << 116 MIPSInst_FD(ir)); 117 return 0; 118 case srl_op: 119 if (MIPSInst_RS(ir)) 120 break; 121 122 if (MIPSInst_RD(ir)) 123 regs->regs[MIPSInst_RD(ir)] = 124 (s32)(((u32)regs->regs[MIPSInst_RT(ir)]) >> 125 MIPSInst_FD(ir)); 126 return 0; 127 case addu_op: 128 if (MIPSInst_FD(ir)) 129 break; 130 131 if (MIPSInst_RD(ir)) 132 regs->regs[MIPSInst_RD(ir)] = 133 (s32)((u32)regs->regs[MIPSInst_RS(ir)] + 134 (u32)regs->regs[MIPSInst_RT(ir)]); 135 return 0; 136 case subu_op: 137 if (MIPSInst_FD(ir)) 138 break; 139 140 if (MIPSInst_RD(ir)) 141 regs->regs[MIPSInst_RD(ir)] = 142 (s32)((u32)regs->regs[MIPSInst_RS(ir)] - 143 (u32)regs->regs[MIPSInst_RT(ir)]); 144 return 0; 145 case dsll_op: 146 if (config_enabled(CONFIG_32BIT) || MIPSInst_RS(ir)) 147 break; 148 149 if (MIPSInst_RD(ir)) 150 regs->regs[MIPSInst_RD(ir)] = 151 (s64)(((u64)regs->regs[MIPSInst_RT(ir)]) << 152 MIPSInst_FD(ir)); 153 return 0; 154 case dsrl_op: 155 if (config_enabled(CONFIG_32BIT) || MIPSInst_RS(ir)) 156 break; 157 158 if (MIPSInst_RD(ir)) 159 regs->regs[MIPSInst_RD(ir)] = 160 (s64)(((u64)regs->regs[MIPSInst_RT(ir)]) >> 161 MIPSInst_FD(ir)); 162 return 0; 163 case daddu_op: 164 if (config_enabled(CONFIG_32BIT) || MIPSInst_FD(ir)) 165 break; 166 167 if (MIPSInst_RD(ir)) 168 regs->regs[MIPSInst_RD(ir)] = 169 (u64)regs->regs[MIPSInst_RS(ir)] + 170 (u64)regs->regs[MIPSInst_RT(ir)]; 171 return 0; 172 case dsubu_op: 173 if (config_enabled(CONFIG_32BIT) || MIPSInst_FD(ir)) 174 break; 175 176 if (MIPSInst_RD(ir)) 177 regs->regs[MIPSInst_RD(ir)] = 178 (s64)((u64)regs->regs[MIPSInst_RS(ir)] - 179 (u64)regs->regs[MIPSInst_RT(ir)]); 180 return 0; 181 } 182 break; 183 default: 184 pr_debug("No fastpath BD emulation for instruction 0x%08x (op: %02x)\n", 185 ir, MIPSInst_OPCODE(ir)); 186 } 187 188 return SIGILL; 189} 190 191/** 192 * movf_func - Emulate a MOVF instruction 193 * @regs: Process register set 194 * @ir: Instruction 195 * 196 * Returns 0 since it always succeeds. 197 */ 198static int movf_func(struct pt_regs *regs, u32 ir) 199{ 200 u32 csr; 201 u32 cond; 202 203 csr = current->thread.fpu.fcr31; 204 cond = fpucondbit[MIPSInst_RT(ir) >> 2]; 205 206 if (((csr & cond) == 0) && MIPSInst_RD(ir)) 207 regs->regs[MIPSInst_RD(ir)] = regs->regs[MIPSInst_RS(ir)]; 208 209 MIPS_R2_STATS(movs); 210 211 return 0; 212} 213 214/** 215 * movt_func - Emulate a MOVT instruction 216 * @regs: Process register set 217 * @ir: Instruction 218 * 219 * Returns 0 since it always succeeds. 220 */ 221static int movt_func(struct pt_regs *regs, u32 ir) 222{ 223 u32 csr; 224 u32 cond; 225 226 csr = current->thread.fpu.fcr31; 227 cond = fpucondbit[MIPSInst_RT(ir) >> 2]; 228 229 if (((csr & cond) != 0) && MIPSInst_RD(ir)) 230 regs->regs[MIPSInst_RD(ir)] = regs->regs[MIPSInst_RS(ir)]; 231 232 MIPS_R2_STATS(movs); 233 234 return 0; 235} 236 237/** 238 * jr_func - Emulate a JR instruction. 239 * @pt_regs: Process register set 240 * @ir: Instruction 241 * 242 * Returns SIGILL if JR was in delay slot, SIGEMT if we 243 * can't compute the EPC, SIGSEGV if we can't access the 244 * userland instruction or 0 on success. 245 */ 246static int jr_func(struct pt_regs *regs, u32 ir) 247{ 248 int err; 249 unsigned long cepc, epc, nepc; 250 u32 nir; 251 252 if (delay_slot(regs)) 253 return SIGILL; 254 255 /* EPC after the RI/JR instruction */ 256 nepc = regs->cp0_epc; 257 /* Roll back to the reserved R2 JR instruction */ 258 regs->cp0_epc -= 4; 259 epc = regs->cp0_epc; 260 err = __compute_return_epc(regs); 261 262 if (err < 0) 263 return SIGEMT; 264 265 266 /* Computed EPC */ 267 cepc = regs->cp0_epc; 268 269 /* Get DS instruction */ 270 err = __get_user(nir, (u32 __user *)nepc); 271 if (err) 272 return SIGSEGV; 273 274 MIPS_R2BR_STATS(jrs); 275 276 /* If nir == 0(NOP), then nothing else to do */ 277 if (nir) { 278 /* 279 * Negative err means FPU instruction in BD-slot, 280 * Zero err means 'BD-slot emulation done' 281 * For anything else we go back to trampoline emulation. 282 */ 283 err = mipsr6_emul(regs, nir); 284 if (err > 0) { 285 regs->cp0_epc = nepc; 286 err = mips_dsemul(regs, nir, cepc); 287 if (err == SIGILL) 288 err = SIGEMT; 289 MIPS_R2_STATS(dsemul); 290 } 291 } 292 293 return err; 294} 295 296/** 297 * movz_func - Emulate a MOVZ instruction 298 * @regs: Process register set 299 * @ir: Instruction 300 * 301 * Returns 0 since it always succeeds. 302 */ 303static int movz_func(struct pt_regs *regs, u32 ir) 304{ 305 if (((regs->regs[MIPSInst_RT(ir)]) == 0) && MIPSInst_RD(ir)) 306 regs->regs[MIPSInst_RD(ir)] = regs->regs[MIPSInst_RS(ir)]; 307 MIPS_R2_STATS(movs); 308 309 return 0; 310} 311 312/** 313 * movn_func - Emulate a MOVZ instruction 314 * @regs: Process register set 315 * @ir: Instruction 316 * 317 * Returns 0 since it always succeeds. 318 */ 319static int movn_func(struct pt_regs *regs, u32 ir) 320{ 321 if (((regs->regs[MIPSInst_RT(ir)]) != 0) && MIPSInst_RD(ir)) 322 regs->regs[MIPSInst_RD(ir)] = regs->regs[MIPSInst_RS(ir)]; 323 MIPS_R2_STATS(movs); 324 325 return 0; 326} 327 328/** 329 * mfhi_func - Emulate a MFHI instruction 330 * @regs: Process register set 331 * @ir: Instruction 332 * 333 * Returns 0 since it always succeeds. 334 */ 335static int mfhi_func(struct pt_regs *regs, u32 ir) 336{ 337 if (MIPSInst_RD(ir)) 338 regs->regs[MIPSInst_RD(ir)] = regs->hi; 339 340 MIPS_R2_STATS(hilo); 341 342 return 0; 343} 344 345/** 346 * mthi_func - Emulate a MTHI instruction 347 * @regs: Process register set 348 * @ir: Instruction 349 * 350 * Returns 0 since it always succeeds. 351 */ 352static int mthi_func(struct pt_regs *regs, u32 ir) 353{ 354 regs->hi = regs->regs[MIPSInst_RS(ir)]; 355 356 MIPS_R2_STATS(hilo); 357 358 return 0; 359} 360 361/** 362 * mflo_func - Emulate a MFLO instruction 363 * @regs: Process register set 364 * @ir: Instruction 365 * 366 * Returns 0 since it always succeeds. 367 */ 368static int mflo_func(struct pt_regs *regs, u32 ir) 369{ 370 if (MIPSInst_RD(ir)) 371 regs->regs[MIPSInst_RD(ir)] = regs->lo; 372 373 MIPS_R2_STATS(hilo); 374 375 return 0; 376} 377 378/** 379 * mtlo_func - Emulate a MTLO instruction 380 * @regs: Process register set 381 * @ir: Instruction 382 * 383 * Returns 0 since it always succeeds. 384 */ 385static int mtlo_func(struct pt_regs *regs, u32 ir) 386{ 387 regs->lo = regs->regs[MIPSInst_RS(ir)]; 388 389 MIPS_R2_STATS(hilo); 390 391 return 0; 392} 393 394/** 395 * mult_func - Emulate a MULT instruction 396 * @regs: Process register set 397 * @ir: Instruction 398 * 399 * Returns 0 since it always succeeds. 400 */ 401static int mult_func(struct pt_regs *regs, u32 ir) 402{ 403 s64 res; 404 s32 rt, rs; 405 406 rt = regs->regs[MIPSInst_RT(ir)]; 407 rs = regs->regs[MIPSInst_RS(ir)]; 408 res = (s64)rt * (s64)rs; 409 410 rs = res; 411 regs->lo = (s64)rs; 412 rt = res >> 32; 413 res = (s64)rt; 414 regs->hi = res; 415 416 MIPS_R2_STATS(muls); 417 418 return 0; 419} 420 421/** 422 * multu_func - Emulate a MULTU instruction 423 * @regs: Process register set 424 * @ir: Instruction 425 * 426 * Returns 0 since it always succeeds. 427 */ 428static int multu_func(struct pt_regs *regs, u32 ir) 429{ 430 u64 res; 431 u32 rt, rs; 432 433 rt = regs->regs[MIPSInst_RT(ir)]; 434 rs = regs->regs[MIPSInst_RS(ir)]; 435 res = (u64)rt * (u64)rs; 436 rt = res; 437 regs->lo = (s64)rt; 438 regs->hi = (s64)(res >> 32); 439 440 MIPS_R2_STATS(muls); 441 442 return 0; 443} 444 445/** 446 * div_func - Emulate a DIV instruction 447 * @regs: Process register set 448 * @ir: Instruction 449 * 450 * Returns 0 since it always succeeds. 451 */ 452static int div_func(struct pt_regs *regs, u32 ir) 453{ 454 s32 rt, rs; 455 456 rt = regs->regs[MIPSInst_RT(ir)]; 457 rs = regs->regs[MIPSInst_RS(ir)]; 458 459 regs->lo = (s64)(rs / rt); 460 regs->hi = (s64)(rs % rt); 461 462 MIPS_R2_STATS(divs); 463 464 return 0; 465} 466 467/** 468 * divu_func - Emulate a DIVU instruction 469 * @regs: Process register set 470 * @ir: Instruction 471 * 472 * Returns 0 since it always succeeds. 473 */ 474static int divu_func(struct pt_regs *regs, u32 ir) 475{ 476 u32 rt, rs; 477 478 rt = regs->regs[MIPSInst_RT(ir)]; 479 rs = regs->regs[MIPSInst_RS(ir)]; 480 481 regs->lo = (s64)(rs / rt); 482 regs->hi = (s64)(rs % rt); 483 484 MIPS_R2_STATS(divs); 485 486 return 0; 487} 488 489/** 490 * dmult_func - Emulate a DMULT instruction 491 * @regs: Process register set 492 * @ir: Instruction 493 * 494 * Returns 0 on success or SIGILL for 32-bit kernels. 495 */ 496static int dmult_func(struct pt_regs *regs, u32 ir) 497{ 498 s64 res; 499 s64 rt, rs; 500 501 if (config_enabled(CONFIG_32BIT)) 502 return SIGILL; 503 504 rt = regs->regs[MIPSInst_RT(ir)]; 505 rs = regs->regs[MIPSInst_RS(ir)]; 506 res = rt * rs; 507 508 regs->lo = res; 509 __asm__ __volatile__( 510 "dmuh %0, %1, %2\t\n" 511 : "=r"(res) 512 : "r"(rt), "r"(rs)); 513 514 regs->hi = res; 515 516 MIPS_R2_STATS(muls); 517 518 return 0; 519} 520 521/** 522 * dmultu_func - Emulate a DMULTU instruction 523 * @regs: Process register set 524 * @ir: Instruction 525 * 526 * Returns 0 on success or SIGILL for 32-bit kernels. 527 */ 528static int dmultu_func(struct pt_regs *regs, u32 ir) 529{ 530 u64 res; 531 u64 rt, rs; 532 533 if (config_enabled(CONFIG_32BIT)) 534 return SIGILL; 535 536 rt = regs->regs[MIPSInst_RT(ir)]; 537 rs = regs->regs[MIPSInst_RS(ir)]; 538 res = rt * rs; 539 540 regs->lo = res; 541 __asm__ __volatile__( 542 "dmuhu %0, %1, %2\t\n" 543 : "=r"(res) 544 : "r"(rt), "r"(rs)); 545 546 regs->hi = res; 547 548 MIPS_R2_STATS(muls); 549 550 return 0; 551} 552 553/** 554 * ddiv_func - Emulate a DDIV instruction 555 * @regs: Process register set 556 * @ir: Instruction 557 * 558 * Returns 0 on success or SIGILL for 32-bit kernels. 559 */ 560static int ddiv_func(struct pt_regs *regs, u32 ir) 561{ 562 s64 rt, rs; 563 564 if (config_enabled(CONFIG_32BIT)) 565 return SIGILL; 566 567 rt = regs->regs[MIPSInst_RT(ir)]; 568 rs = regs->regs[MIPSInst_RS(ir)]; 569 570 regs->lo = rs / rt; 571 regs->hi = rs % rt; 572 573 MIPS_R2_STATS(divs); 574 575 return 0; 576} 577 578/** 579 * ddivu_func - Emulate a DDIVU instruction 580 * @regs: Process register set 581 * @ir: Instruction 582 * 583 * Returns 0 on success or SIGILL for 32-bit kernels. 584 */ 585static int ddivu_func(struct pt_regs *regs, u32 ir) 586{ 587 u64 rt, rs; 588 589 if (config_enabled(CONFIG_32BIT)) 590 return SIGILL; 591 592 rt = regs->regs[MIPSInst_RT(ir)]; 593 rs = regs->regs[MIPSInst_RS(ir)]; 594 595 regs->lo = rs / rt; 596 regs->hi = rs % rt; 597 598 MIPS_R2_STATS(divs); 599 600 return 0; 601} 602 603/* R6 removed instructions for the SPECIAL opcode */ 604static struct r2_decoder_table spec_op_table[] = { 605 { 0xfc1ff83f, 0x00000008, jr_func }, 606 { 0xfc00ffff, 0x00000018, mult_func }, 607 { 0xfc00ffff, 0x00000019, multu_func }, 608 { 0xfc00ffff, 0x0000001c, dmult_func }, 609 { 0xfc00ffff, 0x0000001d, dmultu_func }, 610 { 0xffff07ff, 0x00000010, mfhi_func }, 611 { 0xfc1fffff, 0x00000011, mthi_func }, 612 { 0xffff07ff, 0x00000012, mflo_func }, 613 { 0xfc1fffff, 0x00000013, mtlo_func }, 614 { 0xfc0307ff, 0x00000001, movf_func }, 615 { 0xfc0307ff, 0x00010001, movt_func }, 616 { 0xfc0007ff, 0x0000000a, movz_func }, 617 { 0xfc0007ff, 0x0000000b, movn_func }, 618 { 0xfc00ffff, 0x0000001a, div_func }, 619 { 0xfc00ffff, 0x0000001b, divu_func }, 620 { 0xfc00ffff, 0x0000001e, ddiv_func }, 621 { 0xfc00ffff, 0x0000001f, ddivu_func }, 622 {} 623}; 624 625/** 626 * madd_func - Emulate a MADD instruction 627 * @regs: Process register set 628 * @ir: Instruction 629 * 630 * Returns 0 since it always succeeds. 631 */ 632static int madd_func(struct pt_regs *regs, u32 ir) 633{ 634 s64 res; 635 s32 rt, rs; 636 637 rt = regs->regs[MIPSInst_RT(ir)]; 638 rs = regs->regs[MIPSInst_RS(ir)]; 639 res = (s64)rt * (s64)rs; 640 rt = regs->hi; 641 rs = regs->lo; 642 res += ((((s64)rt) << 32) | (u32)rs); 643 644 rt = res; 645 regs->lo = (s64)rt; 646 rs = res >> 32; 647 regs->hi = (s64)rs; 648 649 MIPS_R2_STATS(dsps); 650 651 return 0; 652} 653 654/** 655 * maddu_func - Emulate a MADDU instruction 656 * @regs: Process register set 657 * @ir: Instruction 658 * 659 * Returns 0 since it always succeeds. 660 */ 661static int maddu_func(struct pt_regs *regs, u32 ir) 662{ 663 u64 res; 664 u32 rt, rs; 665 666 rt = regs->regs[MIPSInst_RT(ir)]; 667 rs = regs->regs[MIPSInst_RS(ir)]; 668 res = (u64)rt * (u64)rs; 669 rt = regs->hi; 670 rs = regs->lo; 671 res += ((((s64)rt) << 32) | (u32)rs); 672 673 rt = res; 674 regs->lo = (s64)rt; 675 rs = res >> 32; 676 regs->hi = (s64)rs; 677 678 MIPS_R2_STATS(dsps); 679 680 return 0; 681} 682 683/** 684 * msub_func - Emulate a MSUB instruction 685 * @regs: Process register set 686 * @ir: Instruction 687 * 688 * Returns 0 since it always succeeds. 689 */ 690static int msub_func(struct pt_regs *regs, u32 ir) 691{ 692 s64 res; 693 s32 rt, rs; 694 695 rt = regs->regs[MIPSInst_RT(ir)]; 696 rs = regs->regs[MIPSInst_RS(ir)]; 697 res = (s64)rt * (s64)rs; 698 rt = regs->hi; 699 rs = regs->lo; 700 res = ((((s64)rt) << 32) | (u32)rs) - res; 701 702 rt = res; 703 regs->lo = (s64)rt; 704 rs = res >> 32; 705 regs->hi = (s64)rs; 706 707 MIPS_R2_STATS(dsps); 708 709 return 0; 710} 711 712/** 713 * msubu_func - Emulate a MSUBU instruction 714 * @regs: Process register set 715 * @ir: Instruction 716 * 717 * Returns 0 since it always succeeds. 718 */ 719static int msubu_func(struct pt_regs *regs, u32 ir) 720{ 721 u64 res; 722 u32 rt, rs; 723 724 rt = regs->regs[MIPSInst_RT(ir)]; 725 rs = regs->regs[MIPSInst_RS(ir)]; 726 res = (u64)rt * (u64)rs; 727 rt = regs->hi; 728 rs = regs->lo; 729 res = ((((s64)rt) << 32) | (u32)rs) - res; 730 731 rt = res; 732 regs->lo = (s64)rt; 733 rs = res >> 32; 734 regs->hi = (s64)rs; 735 736 MIPS_R2_STATS(dsps); 737 738 return 0; 739} 740 741/** 742 * mul_func - Emulate a MUL instruction 743 * @regs: Process register set 744 * @ir: Instruction 745 * 746 * Returns 0 since it always succeeds. 747 */ 748static int mul_func(struct pt_regs *regs, u32 ir) 749{ 750 s64 res; 751 s32 rt, rs; 752 753 if (!MIPSInst_RD(ir)) 754 return 0; 755 rt = regs->regs[MIPSInst_RT(ir)]; 756 rs = regs->regs[MIPSInst_RS(ir)]; 757 res = (s64)rt * (s64)rs; 758 759 rs = res; 760 regs->regs[MIPSInst_RD(ir)] = (s64)rs; 761 762 MIPS_R2_STATS(muls); 763 764 return 0; 765} 766 767/** 768 * clz_func - Emulate a CLZ instruction 769 * @regs: Process register set 770 * @ir: Instruction 771 * 772 * Returns 0 since it always succeeds. 773 */ 774static int clz_func(struct pt_regs *regs, u32 ir) 775{ 776 u32 res; 777 u32 rs; 778 779 if (!MIPSInst_RD(ir)) 780 return 0; 781 782 rs = regs->regs[MIPSInst_RS(ir)]; 783 __asm__ __volatile__("clz %0, %1" : "=r"(res) : "r"(rs)); 784 regs->regs[MIPSInst_RD(ir)] = res; 785 786 MIPS_R2_STATS(bops); 787 788 return 0; 789} 790 791/** 792 * clo_func - Emulate a CLO instruction 793 * @regs: Process register set 794 * @ir: Instruction 795 * 796 * Returns 0 since it always succeeds. 797 */ 798 799static int clo_func(struct pt_regs *regs, u32 ir) 800{ 801 u32 res; 802 u32 rs; 803 804 if (!MIPSInst_RD(ir)) 805 return 0; 806 807 rs = regs->regs[MIPSInst_RS(ir)]; 808 __asm__ __volatile__("clo %0, %1" : "=r"(res) : "r"(rs)); 809 regs->regs[MIPSInst_RD(ir)] = res; 810 811 MIPS_R2_STATS(bops); 812 813 return 0; 814} 815 816/** 817 * dclz_func - Emulate a DCLZ instruction 818 * @regs: Process register set 819 * @ir: Instruction 820 * 821 * Returns 0 since it always succeeds. 822 */ 823static int dclz_func(struct pt_regs *regs, u32 ir) 824{ 825 u64 res; 826 u64 rs; 827 828 if (config_enabled(CONFIG_32BIT)) 829 return SIGILL; 830 831 if (!MIPSInst_RD(ir)) 832 return 0; 833 834 rs = regs->regs[MIPSInst_RS(ir)]; 835 __asm__ __volatile__("dclz %0, %1" : "=r"(res) : "r"(rs)); 836 regs->regs[MIPSInst_RD(ir)] = res; 837 838 MIPS_R2_STATS(bops); 839 840 return 0; 841} 842 843/** 844 * dclo_func - Emulate a DCLO instruction 845 * @regs: Process register set 846 * @ir: Instruction 847 * 848 * Returns 0 since it always succeeds. 849 */ 850static int dclo_func(struct pt_regs *regs, u32 ir) 851{ 852 u64 res; 853 u64 rs; 854 855 if (config_enabled(CONFIG_32BIT)) 856 return SIGILL; 857 858 if (!MIPSInst_RD(ir)) 859 return 0; 860 861 rs = regs->regs[MIPSInst_RS(ir)]; 862 __asm__ __volatile__("dclo %0, %1" : "=r"(res) : "r"(rs)); 863 regs->regs[MIPSInst_RD(ir)] = res; 864 865 MIPS_R2_STATS(bops); 866 867 return 0; 868} 869 870/* R6 removed instructions for the SPECIAL2 opcode */ 871static struct r2_decoder_table spec2_op_table[] = { 872 { 0xfc00ffff, 0x70000000, madd_func }, 873 { 0xfc00ffff, 0x70000001, maddu_func }, 874 { 0xfc0007ff, 0x70000002, mul_func }, 875 { 0xfc00ffff, 0x70000004, msub_func }, 876 { 0xfc00ffff, 0x70000005, msubu_func }, 877 { 0xfc0007ff, 0x70000020, clz_func }, 878 { 0xfc0007ff, 0x70000021, clo_func }, 879 { 0xfc0007ff, 0x70000024, dclz_func }, 880 { 0xfc0007ff, 0x70000025, dclo_func }, 881 { } 882}; 883 884static inline int mipsr2_find_op_func(struct pt_regs *regs, u32 inst, 885 struct r2_decoder_table *table) 886{ 887 struct r2_decoder_table *p; 888 int err; 889 890 for (p = table; p->func; p++) { 891 if ((inst & p->mask) == p->code) { 892 err = (p->func)(regs, inst); 893 return err; 894 } 895 } 896 return SIGILL; 897} 898 899/** 900 * mipsr2_decoder: Decode and emulate a MIPS R2 instruction 901 * @regs: Process register set 902 * @inst: Instruction to decode and emulate 903 * @fcr31: Floating Point Control and Status Register returned 904 */ 905int mipsr2_decoder(struct pt_regs *regs, u32 inst, unsigned long *fcr31) 906{ 907 int err = 0; 908 unsigned long vaddr; 909 u32 nir; 910 unsigned long cpc, epc, nepc, r31, res, rs, rt; 911 912 void __user *fault_addr = NULL; 913 int pass = 0; 914 915repeat: 916 r31 = regs->regs[31]; 917 epc = regs->cp0_epc; 918 err = compute_return_epc(regs); 919 if (err < 0) { 920 BUG(); 921 return SIGEMT; 922 } 923 pr_debug("Emulating the 0x%08x R2 instruction @ 0x%08lx (pass=%d))\n", 924 inst, epc, pass); 925 926 switch (MIPSInst_OPCODE(inst)) { 927 case spec_op: 928 err = mipsr2_find_op_func(regs, inst, spec_op_table); 929 if (err < 0) { 930 /* FPU instruction under JR */ 931 regs->cp0_cause |= CAUSEF_BD; 932 goto fpu_emul; 933 } 934 break; 935 case spec2_op: 936 err = mipsr2_find_op_func(regs, inst, spec2_op_table); 937 break; 938 case bcond_op: 939 rt = MIPSInst_RT(inst); 940 rs = MIPSInst_RS(inst); 941 switch (rt) { 942 case tgei_op: 943 if ((long)regs->regs[rs] >= MIPSInst_SIMM(inst)) 944 do_trap_or_bp(regs, 0, "TGEI"); 945 946 MIPS_R2_STATS(traps); 947 948 break; 949 case tgeiu_op: 950 if (regs->regs[rs] >= MIPSInst_UIMM(inst)) 951 do_trap_or_bp(regs, 0, "TGEIU"); 952 953 MIPS_R2_STATS(traps); 954 955 break; 956 case tlti_op: 957 if ((long)regs->regs[rs] < MIPSInst_SIMM(inst)) 958 do_trap_or_bp(regs, 0, "TLTI"); 959 960 MIPS_R2_STATS(traps); 961 962 break; 963 case tltiu_op: 964 if (regs->regs[rs] < MIPSInst_UIMM(inst)) 965 do_trap_or_bp(regs, 0, "TLTIU"); 966 967 MIPS_R2_STATS(traps); 968 969 break; 970 case teqi_op: 971 if (regs->regs[rs] == MIPSInst_SIMM(inst)) 972 do_trap_or_bp(regs, 0, "TEQI"); 973 974 MIPS_R2_STATS(traps); 975 976 break; 977 case tnei_op: 978 if (regs->regs[rs] != MIPSInst_SIMM(inst)) 979 do_trap_or_bp(regs, 0, "TNEI"); 980 981 MIPS_R2_STATS(traps); 982 983 break; 984 case bltzl_op: 985 case bgezl_op: 986 case bltzall_op: 987 case bgezall_op: 988 if (delay_slot(regs)) { 989 err = SIGILL; 990 break; 991 } 992 regs->regs[31] = r31; 993 regs->cp0_epc = epc; 994 err = __compute_return_epc(regs); 995 if (err < 0) 996 return SIGEMT; 997 if (err != BRANCH_LIKELY_TAKEN) 998 break; 999 cpc = regs->cp0_epc; 1000 nepc = epc + 4; 1001 err = __get_user(nir, (u32 __user *)nepc); 1002 if (err) { 1003 err = SIGSEGV; 1004 break; 1005 } 1006 /* 1007 * This will probably be optimized away when 1008 * CONFIG_DEBUG_FS is not enabled 1009 */ 1010 switch (rt) { 1011 case bltzl_op: 1012 MIPS_R2BR_STATS(bltzl); 1013 break; 1014 case bgezl_op: 1015 MIPS_R2BR_STATS(bgezl); 1016 break; 1017 case bltzall_op: 1018 MIPS_R2BR_STATS(bltzall); 1019 break; 1020 case bgezall_op: 1021 MIPS_R2BR_STATS(bgezall); 1022 break; 1023 } 1024 1025 switch (MIPSInst_OPCODE(nir)) { 1026 case cop1_op: 1027 case cop1x_op: 1028 case lwc1_op: 1029 case swc1_op: 1030 regs->cp0_cause |= CAUSEF_BD; 1031 goto fpu_emul; 1032 } 1033 if (nir) { 1034 err = mipsr6_emul(regs, nir); 1035 if (err > 0) { 1036 err = mips_dsemul(regs, nir, cpc); 1037 if (err == SIGILL) 1038 err = SIGEMT; 1039 MIPS_R2_STATS(dsemul); 1040 } 1041 } 1042 break; 1043 case bltzal_op: 1044 case bgezal_op: 1045 if (delay_slot(regs)) { 1046 err = SIGILL; 1047 break; 1048 } 1049 regs->regs[31] = r31; 1050 regs->cp0_epc = epc; 1051 err = __compute_return_epc(regs); 1052 if (err < 0) 1053 return SIGEMT; 1054 cpc = regs->cp0_epc; 1055 nepc = epc + 4; 1056 err = __get_user(nir, (u32 __user *)nepc); 1057 if (err) { 1058 err = SIGSEGV; 1059 break; 1060 } 1061 /* 1062 * This will probably be optimized away when 1063 * CONFIG_DEBUG_FS is not enabled 1064 */ 1065 switch (rt) { 1066 case bltzal_op: 1067 MIPS_R2BR_STATS(bltzal); 1068 break; 1069 case bgezal_op: 1070 MIPS_R2BR_STATS(bgezal); 1071 break; 1072 } 1073 1074 switch (MIPSInst_OPCODE(nir)) { 1075 case cop1_op: 1076 case cop1x_op: 1077 case lwc1_op: 1078 case swc1_op: 1079 regs->cp0_cause |= CAUSEF_BD; 1080 goto fpu_emul; 1081 } 1082 if (nir) { 1083 err = mipsr6_emul(regs, nir); 1084 if (err > 0) { 1085 err = mips_dsemul(regs, nir, cpc); 1086 if (err == SIGILL) 1087 err = SIGEMT; 1088 MIPS_R2_STATS(dsemul); 1089 } 1090 } 1091 break; 1092 default: 1093 regs->regs[31] = r31; 1094 regs->cp0_epc = epc; 1095 err = SIGILL; 1096 break; 1097 } 1098 break; 1099 1100 case beql_op: 1101 case bnel_op: 1102 case blezl_op: 1103 case bgtzl_op: 1104 if (delay_slot(regs)) { 1105 err = SIGILL; 1106 break; 1107 } 1108 regs->regs[31] = r31; 1109 regs->cp0_epc = epc; 1110 err = __compute_return_epc(regs); 1111 if (err < 0) 1112 return SIGEMT; 1113 if (err != BRANCH_LIKELY_TAKEN) 1114 break; 1115 cpc = regs->cp0_epc; 1116 nepc = epc + 4; 1117 err = __get_user(nir, (u32 __user *)nepc); 1118 if (err) { 1119 err = SIGSEGV; 1120 break; 1121 } 1122 /* 1123 * This will probably be optimized away when 1124 * CONFIG_DEBUG_FS is not enabled 1125 */ 1126 switch (MIPSInst_OPCODE(inst)) { 1127 case beql_op: 1128 MIPS_R2BR_STATS(beql); 1129 break; 1130 case bnel_op: 1131 MIPS_R2BR_STATS(bnel); 1132 break; 1133 case blezl_op: 1134 MIPS_R2BR_STATS(blezl); 1135 break; 1136 case bgtzl_op: 1137 MIPS_R2BR_STATS(bgtzl); 1138 break; 1139 } 1140 1141 switch (MIPSInst_OPCODE(nir)) { 1142 case cop1_op: 1143 case cop1x_op: 1144 case lwc1_op: 1145 case swc1_op: 1146 regs->cp0_cause |= CAUSEF_BD; 1147 goto fpu_emul; 1148 } 1149 if (nir) { 1150 err = mipsr6_emul(regs, nir); 1151 if (err > 0) { 1152 err = mips_dsemul(regs, nir, cpc); 1153 if (err == SIGILL) 1154 err = SIGEMT; 1155 MIPS_R2_STATS(dsemul); 1156 } 1157 } 1158 break; 1159 case lwc1_op: 1160 case swc1_op: 1161 case cop1_op: 1162 case cop1x_op: 1163fpu_emul: 1164 regs->regs[31] = r31; 1165 regs->cp0_epc = epc; 1166 if (!used_math()) { /* First time FPU user. */ 1167 err = init_fpu(); 1168 set_used_math(); 1169 } 1170 lose_fpu(1); /* Save FPU state for the emulator. */ 1171 1172 err = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 0, 1173 &fault_addr); 1174 *fcr31 = current->thread.fpu.fcr31; 1175 1176 /* 1177 * We can't allow the emulated instruction to leave any of 1178 * the cause bits set in $fcr31. 1179 */ 1180 current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X; 1181 1182 /* 1183 * this is a tricky issue - lose_fpu() uses LL/SC atomics 1184 * if FPU is owned and effectively cancels user level LL/SC. 1185 * So, it could be logical to don't restore FPU ownership here. 1186 * But the sequence of multiple FPU instructions is much much 1187 * more often than LL-FPU-SC and I prefer loop here until 1188 * next scheduler cycle cancels FPU ownership 1189 */ 1190 own_fpu(1); /* Restore FPU state. */ 1191 1192 if (err) 1193 current->thread.cp0_baduaddr = (unsigned long)fault_addr; 1194 1195 MIPS_R2_STATS(fpus); 1196 1197 break; 1198 1199 case lwl_op: 1200 rt = regs->regs[MIPSInst_RT(inst)]; 1201 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1202 if (!access_ok(VERIFY_READ, vaddr, 4)) { 1203 current->thread.cp0_baduaddr = vaddr; 1204 err = SIGSEGV; 1205 break; 1206 } 1207 __asm__ __volatile__( 1208 " .set push\n" 1209 " .set reorder\n" 1210#ifdef CONFIG_CPU_LITTLE_ENDIAN 1211 "1:" LB "%1, 0(%2)\n" 1212 INS "%0, %1, 24, 8\n" 1213 " andi %1, %2, 0x3\n" 1214 " beq $0, %1, 9f\n" 1215 ADDIU "%2, %2, -1\n" 1216 "2:" LB "%1, 0(%2)\n" 1217 INS "%0, %1, 16, 8\n" 1218 " andi %1, %2, 0x3\n" 1219 " beq $0, %1, 9f\n" 1220 ADDIU "%2, %2, -1\n" 1221 "3:" LB "%1, 0(%2)\n" 1222 INS "%0, %1, 8, 8\n" 1223 " andi %1, %2, 0x3\n" 1224 " beq $0, %1, 9f\n" 1225 ADDIU "%2, %2, -1\n" 1226 "4:" LB "%1, 0(%2)\n" 1227 INS "%0, %1, 0, 8\n" 1228#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1229 "1:" LB "%1, 0(%2)\n" 1230 INS "%0, %1, 24, 8\n" 1231 ADDIU "%2, %2, 1\n" 1232 " andi %1, %2, 0x3\n" 1233 " beq $0, %1, 9f\n" 1234 "2:" LB "%1, 0(%2)\n" 1235 INS "%0, %1, 16, 8\n" 1236 ADDIU "%2, %2, 1\n" 1237 " andi %1, %2, 0x3\n" 1238 " beq $0, %1, 9f\n" 1239 "3:" LB "%1, 0(%2)\n" 1240 INS "%0, %1, 8, 8\n" 1241 ADDIU "%2, %2, 1\n" 1242 " andi %1, %2, 0x3\n" 1243 " beq $0, %1, 9f\n" 1244 "4:" LB "%1, 0(%2)\n" 1245 INS "%0, %1, 0, 8\n" 1246#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1247 "9: sll %0, %0, 0\n" 1248 "10:\n" 1249 " .insn\n" 1250 " .section .fixup,\"ax\"\n" 1251 "8: li %3,%4\n" 1252 " j 10b\n" 1253 " .previous\n" 1254 " .section __ex_table,\"a\"\n" 1255 STR(PTR) " 1b,8b\n" 1256 STR(PTR) " 2b,8b\n" 1257 STR(PTR) " 3b,8b\n" 1258 STR(PTR) " 4b,8b\n" 1259 " .previous\n" 1260 " .set pop\n" 1261 : "+&r"(rt), "=&r"(rs), 1262 "+&r"(vaddr), "+&r"(err) 1263 : "i"(SIGSEGV)); 1264 1265 if (MIPSInst_RT(inst) && !err) 1266 regs->regs[MIPSInst_RT(inst)] = rt; 1267 1268 MIPS_R2_STATS(loads); 1269 1270 break; 1271 1272 case lwr_op: 1273 rt = regs->regs[MIPSInst_RT(inst)]; 1274 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1275 if (!access_ok(VERIFY_READ, vaddr, 4)) { 1276 current->thread.cp0_baduaddr = vaddr; 1277 err = SIGSEGV; 1278 break; 1279 } 1280 __asm__ __volatile__( 1281 " .set push\n" 1282 " .set reorder\n" 1283#ifdef CONFIG_CPU_LITTLE_ENDIAN 1284 "1:" LB "%1, 0(%2)\n" 1285 INS "%0, %1, 0, 8\n" 1286 ADDIU "%2, %2, 1\n" 1287 " andi %1, %2, 0x3\n" 1288 " beq $0, %1, 9f\n" 1289 "2:" LB "%1, 0(%2)\n" 1290 INS "%0, %1, 8, 8\n" 1291 ADDIU "%2, %2, 1\n" 1292 " andi %1, %2, 0x3\n" 1293 " beq $0, %1, 9f\n" 1294 "3:" LB "%1, 0(%2)\n" 1295 INS "%0, %1, 16, 8\n" 1296 ADDIU "%2, %2, 1\n" 1297 " andi %1, %2, 0x3\n" 1298 " beq $0, %1, 9f\n" 1299 "4:" LB "%1, 0(%2)\n" 1300 INS "%0, %1, 24, 8\n" 1301 " sll %0, %0, 0\n" 1302#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1303 "1:" LB "%1, 0(%2)\n" 1304 INS "%0, %1, 0, 8\n" 1305 " andi %1, %2, 0x3\n" 1306 " beq $0, %1, 9f\n" 1307 ADDIU "%2, %2, -1\n" 1308 "2:" LB "%1, 0(%2)\n" 1309 INS "%0, %1, 8, 8\n" 1310 " andi %1, %2, 0x3\n" 1311 " beq $0, %1, 9f\n" 1312 ADDIU "%2, %2, -1\n" 1313 "3:" LB "%1, 0(%2)\n" 1314 INS "%0, %1, 16, 8\n" 1315 " andi %1, %2, 0x3\n" 1316 " beq $0, %1, 9f\n" 1317 ADDIU "%2, %2, -1\n" 1318 "4:" LB "%1, 0(%2)\n" 1319 INS "%0, %1, 24, 8\n" 1320 " sll %0, %0, 0\n" 1321#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1322 "9:\n" 1323 "10:\n" 1324 " .insn\n" 1325 " .section .fixup,\"ax\"\n" 1326 "8: li %3,%4\n" 1327 " j 10b\n" 1328 " .previous\n" 1329 " .section __ex_table,\"a\"\n" 1330 STR(PTR) " 1b,8b\n" 1331 STR(PTR) " 2b,8b\n" 1332 STR(PTR) " 3b,8b\n" 1333 STR(PTR) " 4b,8b\n" 1334 " .previous\n" 1335 " .set pop\n" 1336 : "+&r"(rt), "=&r"(rs), 1337 "+&r"(vaddr), "+&r"(err) 1338 : "i"(SIGSEGV)); 1339 if (MIPSInst_RT(inst) && !err) 1340 regs->regs[MIPSInst_RT(inst)] = rt; 1341 1342 MIPS_R2_STATS(loads); 1343 1344 break; 1345 1346 case swl_op: 1347 rt = regs->regs[MIPSInst_RT(inst)]; 1348 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1349 if (!access_ok(VERIFY_WRITE, vaddr, 4)) { 1350 current->thread.cp0_baduaddr = vaddr; 1351 err = SIGSEGV; 1352 break; 1353 } 1354 __asm__ __volatile__( 1355 " .set push\n" 1356 " .set reorder\n" 1357#ifdef CONFIG_CPU_LITTLE_ENDIAN 1358 EXT "%1, %0, 24, 8\n" 1359 "1:" SB "%1, 0(%2)\n" 1360 " andi %1, %2, 0x3\n" 1361 " beq $0, %1, 9f\n" 1362 ADDIU "%2, %2, -1\n" 1363 EXT "%1, %0, 16, 8\n" 1364 "2:" SB "%1, 0(%2)\n" 1365 " andi %1, %2, 0x3\n" 1366 " beq $0, %1, 9f\n" 1367 ADDIU "%2, %2, -1\n" 1368 EXT "%1, %0, 8, 8\n" 1369 "3:" SB "%1, 0(%2)\n" 1370 " andi %1, %2, 0x3\n" 1371 " beq $0, %1, 9f\n" 1372 ADDIU "%2, %2, -1\n" 1373 EXT "%1, %0, 0, 8\n" 1374 "4:" SB "%1, 0(%2)\n" 1375#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1376 EXT "%1, %0, 24, 8\n" 1377 "1:" SB "%1, 0(%2)\n" 1378 ADDIU "%2, %2, 1\n" 1379 " andi %1, %2, 0x3\n" 1380 " beq $0, %1, 9f\n" 1381 EXT "%1, %0, 16, 8\n" 1382 "2:" SB "%1, 0(%2)\n" 1383 ADDIU "%2, %2, 1\n" 1384 " andi %1, %2, 0x3\n" 1385 " beq $0, %1, 9f\n" 1386 EXT "%1, %0, 8, 8\n" 1387 "3:" SB "%1, 0(%2)\n" 1388 ADDIU "%2, %2, 1\n" 1389 " andi %1, %2, 0x3\n" 1390 " beq $0, %1, 9f\n" 1391 EXT "%1, %0, 0, 8\n" 1392 "4:" SB "%1, 0(%2)\n" 1393#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1394 "9:\n" 1395 " .insn\n" 1396 " .section .fixup,\"ax\"\n" 1397 "8: li %3,%4\n" 1398 " j 9b\n" 1399 " .previous\n" 1400 " .section __ex_table,\"a\"\n" 1401 STR(PTR) " 1b,8b\n" 1402 STR(PTR) " 2b,8b\n" 1403 STR(PTR) " 3b,8b\n" 1404 STR(PTR) " 4b,8b\n" 1405 " .previous\n" 1406 " .set pop\n" 1407 : "+&r"(rt), "=&r"(rs), 1408 "+&r"(vaddr), "+&r"(err) 1409 : "i"(SIGSEGV) 1410 : "memory"); 1411 1412 MIPS_R2_STATS(stores); 1413 1414 break; 1415 1416 case swr_op: 1417 rt = regs->regs[MIPSInst_RT(inst)]; 1418 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1419 if (!access_ok(VERIFY_WRITE, vaddr, 4)) { 1420 current->thread.cp0_baduaddr = vaddr; 1421 err = SIGSEGV; 1422 break; 1423 } 1424 __asm__ __volatile__( 1425 " .set push\n" 1426 " .set reorder\n" 1427#ifdef CONFIG_CPU_LITTLE_ENDIAN 1428 EXT "%1, %0, 0, 8\n" 1429 "1:" SB "%1, 0(%2)\n" 1430 ADDIU "%2, %2, 1\n" 1431 " andi %1, %2, 0x3\n" 1432 " beq $0, %1, 9f\n" 1433 EXT "%1, %0, 8, 8\n" 1434 "2:" SB "%1, 0(%2)\n" 1435 ADDIU "%2, %2, 1\n" 1436 " andi %1, %2, 0x3\n" 1437 " beq $0, %1, 9f\n" 1438 EXT "%1, %0, 16, 8\n" 1439 "3:" SB "%1, 0(%2)\n" 1440 ADDIU "%2, %2, 1\n" 1441 " andi %1, %2, 0x3\n" 1442 " beq $0, %1, 9f\n" 1443 EXT "%1, %0, 24, 8\n" 1444 "4:" SB "%1, 0(%2)\n" 1445#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1446 EXT "%1, %0, 0, 8\n" 1447 "1:" SB "%1, 0(%2)\n" 1448 " andi %1, %2, 0x3\n" 1449 " beq $0, %1, 9f\n" 1450 ADDIU "%2, %2, -1\n" 1451 EXT "%1, %0, 8, 8\n" 1452 "2:" SB "%1, 0(%2)\n" 1453 " andi %1, %2, 0x3\n" 1454 " beq $0, %1, 9f\n" 1455 ADDIU "%2, %2, -1\n" 1456 EXT "%1, %0, 16, 8\n" 1457 "3:" SB "%1, 0(%2)\n" 1458 " andi %1, %2, 0x3\n" 1459 " beq $0, %1, 9f\n" 1460 ADDIU "%2, %2, -1\n" 1461 EXT "%1, %0, 24, 8\n" 1462 "4:" SB "%1, 0(%2)\n" 1463#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1464 "9:\n" 1465 " .insn\n" 1466 " .section .fixup,\"ax\"\n" 1467 "8: li %3,%4\n" 1468 " j 9b\n" 1469 " .previous\n" 1470 " .section __ex_table,\"a\"\n" 1471 STR(PTR) " 1b,8b\n" 1472 STR(PTR) " 2b,8b\n" 1473 STR(PTR) " 3b,8b\n" 1474 STR(PTR) " 4b,8b\n" 1475 " .previous\n" 1476 " .set pop\n" 1477 : "+&r"(rt), "=&r"(rs), 1478 "+&r"(vaddr), "+&r"(err) 1479 : "i"(SIGSEGV) 1480 : "memory"); 1481 1482 MIPS_R2_STATS(stores); 1483 1484 break; 1485 1486 case ldl_op: 1487 if (config_enabled(CONFIG_32BIT)) { 1488 err = SIGILL; 1489 break; 1490 } 1491 1492 rt = regs->regs[MIPSInst_RT(inst)]; 1493 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1494 if (!access_ok(VERIFY_READ, vaddr, 8)) { 1495 current->thread.cp0_baduaddr = vaddr; 1496 err = SIGSEGV; 1497 break; 1498 } 1499 __asm__ __volatile__( 1500 " .set push\n" 1501 " .set reorder\n" 1502#ifdef CONFIG_CPU_LITTLE_ENDIAN 1503 "1: lb %1, 0(%2)\n" 1504 " dinsu %0, %1, 56, 8\n" 1505 " andi %1, %2, 0x7\n" 1506 " beq $0, %1, 9f\n" 1507 " daddiu %2, %2, -1\n" 1508 "2: lb %1, 0(%2)\n" 1509 " dinsu %0, %1, 48, 8\n" 1510 " andi %1, %2, 0x7\n" 1511 " beq $0, %1, 9f\n" 1512 " daddiu %2, %2, -1\n" 1513 "3: lb %1, 0(%2)\n" 1514 " dinsu %0, %1, 40, 8\n" 1515 " andi %1, %2, 0x7\n" 1516 " beq $0, %1, 9f\n" 1517 " daddiu %2, %2, -1\n" 1518 "4: lb %1, 0(%2)\n" 1519 " dinsu %0, %1, 32, 8\n" 1520 " andi %1, %2, 0x7\n" 1521 " beq $0, %1, 9f\n" 1522 " daddiu %2, %2, -1\n" 1523 "5: lb %1, 0(%2)\n" 1524 " dins %0, %1, 24, 8\n" 1525 " andi %1, %2, 0x7\n" 1526 " beq $0, %1, 9f\n" 1527 " daddiu %2, %2, -1\n" 1528 "6: lb %1, 0(%2)\n" 1529 " dins %0, %1, 16, 8\n" 1530 " andi %1, %2, 0x7\n" 1531 " beq $0, %1, 9f\n" 1532 " daddiu %2, %2, -1\n" 1533 "7: lb %1, 0(%2)\n" 1534 " dins %0, %1, 8, 8\n" 1535 " andi %1, %2, 0x7\n" 1536 " beq $0, %1, 9f\n" 1537 " daddiu %2, %2, -1\n" 1538 "0: lb %1, 0(%2)\n" 1539 " dins %0, %1, 0, 8\n" 1540#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1541 "1: lb %1, 0(%2)\n" 1542 " dinsu %0, %1, 56, 8\n" 1543 " daddiu %2, %2, 1\n" 1544 " andi %1, %2, 0x7\n" 1545 " beq $0, %1, 9f\n" 1546 "2: lb %1, 0(%2)\n" 1547 " dinsu %0, %1, 48, 8\n" 1548 " daddiu %2, %2, 1\n" 1549 " andi %1, %2, 0x7\n" 1550 " beq $0, %1, 9f\n" 1551 "3: lb %1, 0(%2)\n" 1552 " dinsu %0, %1, 40, 8\n" 1553 " daddiu %2, %2, 1\n" 1554 " andi %1, %2, 0x7\n" 1555 " beq $0, %1, 9f\n" 1556 "4: lb %1, 0(%2)\n" 1557 " dinsu %0, %1, 32, 8\n" 1558 " daddiu %2, %2, 1\n" 1559 " andi %1, %2, 0x7\n" 1560 " beq $0, %1, 9f\n" 1561 "5: lb %1, 0(%2)\n" 1562 " dins %0, %1, 24, 8\n" 1563 " daddiu %2, %2, 1\n" 1564 " andi %1, %2, 0x7\n" 1565 " beq $0, %1, 9f\n" 1566 "6: lb %1, 0(%2)\n" 1567 " dins %0, %1, 16, 8\n" 1568 " daddiu %2, %2, 1\n" 1569 " andi %1, %2, 0x7\n" 1570 " beq $0, %1, 9f\n" 1571 "7: lb %1, 0(%2)\n" 1572 " dins %0, %1, 8, 8\n" 1573 " daddiu %2, %2, 1\n" 1574 " andi %1, %2, 0x7\n" 1575 " beq $0, %1, 9f\n" 1576 "0: lb %1, 0(%2)\n" 1577 " dins %0, %1, 0, 8\n" 1578#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1579 "9:\n" 1580 " .insn\n" 1581 " .section .fixup,\"ax\"\n" 1582 "8: li %3,%4\n" 1583 " j 9b\n" 1584 " .previous\n" 1585 " .section __ex_table,\"a\"\n" 1586 STR(PTR) " 1b,8b\n" 1587 STR(PTR) " 2b,8b\n" 1588 STR(PTR) " 3b,8b\n" 1589 STR(PTR) " 4b,8b\n" 1590 STR(PTR) " 5b,8b\n" 1591 STR(PTR) " 6b,8b\n" 1592 STR(PTR) " 7b,8b\n" 1593 STR(PTR) " 0b,8b\n" 1594 " .previous\n" 1595 " .set pop\n" 1596 : "+&r"(rt), "=&r"(rs), 1597 "+&r"(vaddr), "+&r"(err) 1598 : "i"(SIGSEGV)); 1599 if (MIPSInst_RT(inst) && !err) 1600 regs->regs[MIPSInst_RT(inst)] = rt; 1601 1602 MIPS_R2_STATS(loads); 1603 break; 1604 1605 case ldr_op: 1606 if (config_enabled(CONFIG_32BIT)) { 1607 err = SIGILL; 1608 break; 1609 } 1610 1611 rt = regs->regs[MIPSInst_RT(inst)]; 1612 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1613 if (!access_ok(VERIFY_READ, vaddr, 8)) { 1614 current->thread.cp0_baduaddr = vaddr; 1615 err = SIGSEGV; 1616 break; 1617 } 1618 __asm__ __volatile__( 1619 " .set push\n" 1620 " .set reorder\n" 1621#ifdef CONFIG_CPU_LITTLE_ENDIAN 1622 "1: lb %1, 0(%2)\n" 1623 " dins %0, %1, 0, 8\n" 1624 " daddiu %2, %2, 1\n" 1625 " andi %1, %2, 0x7\n" 1626 " beq $0, %1, 9f\n" 1627 "2: lb %1, 0(%2)\n" 1628 " dins %0, %1, 8, 8\n" 1629 " daddiu %2, %2, 1\n" 1630 " andi %1, %2, 0x7\n" 1631 " beq $0, %1, 9f\n" 1632 "3: lb %1, 0(%2)\n" 1633 " dins %0, %1, 16, 8\n" 1634 " daddiu %2, %2, 1\n" 1635 " andi %1, %2, 0x7\n" 1636 " beq $0, %1, 9f\n" 1637 "4: lb %1, 0(%2)\n" 1638 " dins %0, %1, 24, 8\n" 1639 " daddiu %2, %2, 1\n" 1640 " andi %1, %2, 0x7\n" 1641 " beq $0, %1, 9f\n" 1642 "5: lb %1, 0(%2)\n" 1643 " dinsu %0, %1, 32, 8\n" 1644 " daddiu %2, %2, 1\n" 1645 " andi %1, %2, 0x7\n" 1646 " beq $0, %1, 9f\n" 1647 "6: lb %1, 0(%2)\n" 1648 " dinsu %0, %1, 40, 8\n" 1649 " daddiu %2, %2, 1\n" 1650 " andi %1, %2, 0x7\n" 1651 " beq $0, %1, 9f\n" 1652 "7: lb %1, 0(%2)\n" 1653 " dinsu %0, %1, 48, 8\n" 1654 " daddiu %2, %2, 1\n" 1655 " andi %1, %2, 0x7\n" 1656 " beq $0, %1, 9f\n" 1657 "0: lb %1, 0(%2)\n" 1658 " dinsu %0, %1, 56, 8\n" 1659#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1660 "1: lb %1, 0(%2)\n" 1661 " dins %0, %1, 0, 8\n" 1662 " andi %1, %2, 0x7\n" 1663 " beq $0, %1, 9f\n" 1664 " daddiu %2, %2, -1\n" 1665 "2: lb %1, 0(%2)\n" 1666 " dins %0, %1, 8, 8\n" 1667 " andi %1, %2, 0x7\n" 1668 " beq $0, %1, 9f\n" 1669 " daddiu %2, %2, -1\n" 1670 "3: lb %1, 0(%2)\n" 1671 " dins %0, %1, 16, 8\n" 1672 " andi %1, %2, 0x7\n" 1673 " beq $0, %1, 9f\n" 1674 " daddiu %2, %2, -1\n" 1675 "4: lb %1, 0(%2)\n" 1676 " dins %0, %1, 24, 8\n" 1677 " andi %1, %2, 0x7\n" 1678 " beq $0, %1, 9f\n" 1679 " daddiu %2, %2, -1\n" 1680 "5: lb %1, 0(%2)\n" 1681 " dinsu %0, %1, 32, 8\n" 1682 " andi %1, %2, 0x7\n" 1683 " beq $0, %1, 9f\n" 1684 " daddiu %2, %2, -1\n" 1685 "6: lb %1, 0(%2)\n" 1686 " dinsu %0, %1, 40, 8\n" 1687 " andi %1, %2, 0x7\n" 1688 " beq $0, %1, 9f\n" 1689 " daddiu %2, %2, -1\n" 1690 "7: lb %1, 0(%2)\n" 1691 " dinsu %0, %1, 48, 8\n" 1692 " andi %1, %2, 0x7\n" 1693 " beq $0, %1, 9f\n" 1694 " daddiu %2, %2, -1\n" 1695 "0: lb %1, 0(%2)\n" 1696 " dinsu %0, %1, 56, 8\n" 1697#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1698 "9:\n" 1699 " .insn\n" 1700 " .section .fixup,\"ax\"\n" 1701 "8: li %3,%4\n" 1702 " j 9b\n" 1703 " .previous\n" 1704 " .section __ex_table,\"a\"\n" 1705 STR(PTR) " 1b,8b\n" 1706 STR(PTR) " 2b,8b\n" 1707 STR(PTR) " 3b,8b\n" 1708 STR(PTR) " 4b,8b\n" 1709 STR(PTR) " 5b,8b\n" 1710 STR(PTR) " 6b,8b\n" 1711 STR(PTR) " 7b,8b\n" 1712 STR(PTR) " 0b,8b\n" 1713 " .previous\n" 1714 " .set pop\n" 1715 : "+&r"(rt), "=&r"(rs), 1716 "+&r"(vaddr), "+&r"(err) 1717 : "i"(SIGSEGV)); 1718 if (MIPSInst_RT(inst) && !err) 1719 regs->regs[MIPSInst_RT(inst)] = rt; 1720 1721 MIPS_R2_STATS(loads); 1722 break; 1723 1724 case sdl_op: 1725 if (config_enabled(CONFIG_32BIT)) { 1726 err = SIGILL; 1727 break; 1728 } 1729 1730 rt = regs->regs[MIPSInst_RT(inst)]; 1731 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1732 if (!access_ok(VERIFY_WRITE, vaddr, 8)) { 1733 current->thread.cp0_baduaddr = vaddr; 1734 err = SIGSEGV; 1735 break; 1736 } 1737 __asm__ __volatile__( 1738 " .set push\n" 1739 " .set reorder\n" 1740#ifdef CONFIG_CPU_LITTLE_ENDIAN 1741 " dextu %1, %0, 56, 8\n" 1742 "1: sb %1, 0(%2)\n" 1743 " andi %1, %2, 0x7\n" 1744 " beq $0, %1, 9f\n" 1745 " daddiu %2, %2, -1\n" 1746 " dextu %1, %0, 48, 8\n" 1747 "2: sb %1, 0(%2)\n" 1748 " andi %1, %2, 0x7\n" 1749 " beq $0, %1, 9f\n" 1750 " daddiu %2, %2, -1\n" 1751 " dextu %1, %0, 40, 8\n" 1752 "3: sb %1, 0(%2)\n" 1753 " andi %1, %2, 0x7\n" 1754 " beq $0, %1, 9f\n" 1755 " daddiu %2, %2, -1\n" 1756 " dextu %1, %0, 32, 8\n" 1757 "4: sb %1, 0(%2)\n" 1758 " andi %1, %2, 0x7\n" 1759 " beq $0, %1, 9f\n" 1760 " daddiu %2, %2, -1\n" 1761 " dext %1, %0, 24, 8\n" 1762 "5: sb %1, 0(%2)\n" 1763 " andi %1, %2, 0x7\n" 1764 " beq $0, %1, 9f\n" 1765 " daddiu %2, %2, -1\n" 1766 " dext %1, %0, 16, 8\n" 1767 "6: sb %1, 0(%2)\n" 1768 " andi %1, %2, 0x7\n" 1769 " beq $0, %1, 9f\n" 1770 " daddiu %2, %2, -1\n" 1771 " dext %1, %0, 8, 8\n" 1772 "7: sb %1, 0(%2)\n" 1773 " andi %1, %2, 0x7\n" 1774 " beq $0, %1, 9f\n" 1775 " daddiu %2, %2, -1\n" 1776 " dext %1, %0, 0, 8\n" 1777 "0: sb %1, 0(%2)\n" 1778#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1779 " dextu %1, %0, 56, 8\n" 1780 "1: sb %1, 0(%2)\n" 1781 " daddiu %2, %2, 1\n" 1782 " andi %1, %2, 0x7\n" 1783 " beq $0, %1, 9f\n" 1784 " dextu %1, %0, 48, 8\n" 1785 "2: sb %1, 0(%2)\n" 1786 " daddiu %2, %2, 1\n" 1787 " andi %1, %2, 0x7\n" 1788 " beq $0, %1, 9f\n" 1789 " dextu %1, %0, 40, 8\n" 1790 "3: sb %1, 0(%2)\n" 1791 " daddiu %2, %2, 1\n" 1792 " andi %1, %2, 0x7\n" 1793 " beq $0, %1, 9f\n" 1794 " dextu %1, %0, 32, 8\n" 1795 "4: sb %1, 0(%2)\n" 1796 " daddiu %2, %2, 1\n" 1797 " andi %1, %2, 0x7\n" 1798 " beq $0, %1, 9f\n" 1799 " dext %1, %0, 24, 8\n" 1800 "5: sb %1, 0(%2)\n" 1801 " daddiu %2, %2, 1\n" 1802 " andi %1, %2, 0x7\n" 1803 " beq $0, %1, 9f\n" 1804 " dext %1, %0, 16, 8\n" 1805 "6: sb %1, 0(%2)\n" 1806 " daddiu %2, %2, 1\n" 1807 " andi %1, %2, 0x7\n" 1808 " beq $0, %1, 9f\n" 1809 " dext %1, %0, 8, 8\n" 1810 "7: sb %1, 0(%2)\n" 1811 " daddiu %2, %2, 1\n" 1812 " andi %1, %2, 0x7\n" 1813 " beq $0, %1, 9f\n" 1814 " dext %1, %0, 0, 8\n" 1815 "0: sb %1, 0(%2)\n" 1816#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1817 "9:\n" 1818 " .insn\n" 1819 " .section .fixup,\"ax\"\n" 1820 "8: li %3,%4\n" 1821 " j 9b\n" 1822 " .previous\n" 1823 " .section __ex_table,\"a\"\n" 1824 STR(PTR) " 1b,8b\n" 1825 STR(PTR) " 2b,8b\n" 1826 STR(PTR) " 3b,8b\n" 1827 STR(PTR) " 4b,8b\n" 1828 STR(PTR) " 5b,8b\n" 1829 STR(PTR) " 6b,8b\n" 1830 STR(PTR) " 7b,8b\n" 1831 STR(PTR) " 0b,8b\n" 1832 " .previous\n" 1833 " .set pop\n" 1834 : "+&r"(rt), "=&r"(rs), 1835 "+&r"(vaddr), "+&r"(err) 1836 : "i"(SIGSEGV) 1837 : "memory"); 1838 1839 MIPS_R2_STATS(stores); 1840 break; 1841 1842 case sdr_op: 1843 if (config_enabled(CONFIG_32BIT)) { 1844 err = SIGILL; 1845 break; 1846 } 1847 1848 rt = regs->regs[MIPSInst_RT(inst)]; 1849 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1850 if (!access_ok(VERIFY_WRITE, vaddr, 8)) { 1851 current->thread.cp0_baduaddr = vaddr; 1852 err = SIGSEGV; 1853 break; 1854 } 1855 __asm__ __volatile__( 1856 " .set push\n" 1857 " .set reorder\n" 1858#ifdef CONFIG_CPU_LITTLE_ENDIAN 1859 " dext %1, %0, 0, 8\n" 1860 "1: sb %1, 0(%2)\n" 1861 " daddiu %2, %2, 1\n" 1862 " andi %1, %2, 0x7\n" 1863 " beq $0, %1, 9f\n" 1864 " dext %1, %0, 8, 8\n" 1865 "2: sb %1, 0(%2)\n" 1866 " daddiu %2, %2, 1\n" 1867 " andi %1, %2, 0x7\n" 1868 " beq $0, %1, 9f\n" 1869 " dext %1, %0, 16, 8\n" 1870 "3: sb %1, 0(%2)\n" 1871 " daddiu %2, %2, 1\n" 1872 " andi %1, %2, 0x7\n" 1873 " beq $0, %1, 9f\n" 1874 " dext %1, %0, 24, 8\n" 1875 "4: sb %1, 0(%2)\n" 1876 " daddiu %2, %2, 1\n" 1877 " andi %1, %2, 0x7\n" 1878 " beq $0, %1, 9f\n" 1879 " dextu %1, %0, 32, 8\n" 1880 "5: sb %1, 0(%2)\n" 1881 " daddiu %2, %2, 1\n" 1882 " andi %1, %2, 0x7\n" 1883 " beq $0, %1, 9f\n" 1884 " dextu %1, %0, 40, 8\n" 1885 "6: sb %1, 0(%2)\n" 1886 " daddiu %2, %2, 1\n" 1887 " andi %1, %2, 0x7\n" 1888 " beq $0, %1, 9f\n" 1889 " dextu %1, %0, 48, 8\n" 1890 "7: sb %1, 0(%2)\n" 1891 " daddiu %2, %2, 1\n" 1892 " andi %1, %2, 0x7\n" 1893 " beq $0, %1, 9f\n" 1894 " dextu %1, %0, 56, 8\n" 1895 "0: sb %1, 0(%2)\n" 1896#else /* !CONFIG_CPU_LITTLE_ENDIAN */ 1897 " dext %1, %0, 0, 8\n" 1898 "1: sb %1, 0(%2)\n" 1899 " andi %1, %2, 0x7\n" 1900 " beq $0, %1, 9f\n" 1901 " daddiu %2, %2, -1\n" 1902 " dext %1, %0, 8, 8\n" 1903 "2: sb %1, 0(%2)\n" 1904 " andi %1, %2, 0x7\n" 1905 " beq $0, %1, 9f\n" 1906 " daddiu %2, %2, -1\n" 1907 " dext %1, %0, 16, 8\n" 1908 "3: sb %1, 0(%2)\n" 1909 " andi %1, %2, 0x7\n" 1910 " beq $0, %1, 9f\n" 1911 " daddiu %2, %2, -1\n" 1912 " dext %1, %0, 24, 8\n" 1913 "4: sb %1, 0(%2)\n" 1914 " andi %1, %2, 0x7\n" 1915 " beq $0, %1, 9f\n" 1916 " daddiu %2, %2, -1\n" 1917 " dextu %1, %0, 32, 8\n" 1918 "5: sb %1, 0(%2)\n" 1919 " andi %1, %2, 0x7\n" 1920 " beq $0, %1, 9f\n" 1921 " daddiu %2, %2, -1\n" 1922 " dextu %1, %0, 40, 8\n" 1923 "6: sb %1, 0(%2)\n" 1924 " andi %1, %2, 0x7\n" 1925 " beq $0, %1, 9f\n" 1926 " daddiu %2, %2, -1\n" 1927 " dextu %1, %0, 48, 8\n" 1928 "7: sb %1, 0(%2)\n" 1929 " andi %1, %2, 0x7\n" 1930 " beq $0, %1, 9f\n" 1931 " daddiu %2, %2, -1\n" 1932 " dextu %1, %0, 56, 8\n" 1933 "0: sb %1, 0(%2)\n" 1934#endif /* CONFIG_CPU_LITTLE_ENDIAN */ 1935 "9:\n" 1936 " .insn\n" 1937 " .section .fixup,\"ax\"\n" 1938 "8: li %3,%4\n" 1939 " j 9b\n" 1940 " .previous\n" 1941 " .section __ex_table,\"a\"\n" 1942 STR(PTR) " 1b,8b\n" 1943 STR(PTR) " 2b,8b\n" 1944 STR(PTR) " 3b,8b\n" 1945 STR(PTR) " 4b,8b\n" 1946 STR(PTR) " 5b,8b\n" 1947 STR(PTR) " 6b,8b\n" 1948 STR(PTR) " 7b,8b\n" 1949 STR(PTR) " 0b,8b\n" 1950 " .previous\n" 1951 " .set pop\n" 1952 : "+&r"(rt), "=&r"(rs), 1953 "+&r"(vaddr), "+&r"(err) 1954 : "i"(SIGSEGV) 1955 : "memory"); 1956 1957 MIPS_R2_STATS(stores); 1958 1959 break; 1960 case ll_op: 1961 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 1962 if (vaddr & 0x3) { 1963 current->thread.cp0_baduaddr = vaddr; 1964 err = SIGBUS; 1965 break; 1966 } 1967 if (!access_ok(VERIFY_READ, vaddr, 4)) { 1968 current->thread.cp0_baduaddr = vaddr; 1969 err = SIGBUS; 1970 break; 1971 } 1972 1973 if (!cpu_has_rw_llb) { 1974 /* 1975 * An LL/SC block can't be safely emulated without 1976 * a Config5/LLB availability. So it's probably time to 1977 * kill our process before things get any worse. This is 1978 * because Config5/LLB allows us to use ERETNC so that 1979 * the LLAddr/LLB bit is not cleared when we return from 1980 * an exception. MIPS R2 LL/SC instructions trap with an 1981 * RI exception so once we emulate them here, we return 1982 * back to userland with ERETNC. That preserves the 1983 * LLAddr/LLB so the subsequent SC instruction will 1984 * succeed preserving the atomic semantics of the LL/SC 1985 * block. Without that, there is no safe way to emulate 1986 * an LL/SC block in MIPSR2 userland. 1987 */ 1988 pr_err("Can't emulate MIPSR2 LL/SC without Config5/LLB\n"); 1989 err = SIGKILL; 1990 break; 1991 } 1992 1993 __asm__ __volatile__( 1994 "1:\n" 1995 "ll %0, 0(%2)\n" 1996 "2:\n" 1997 ".insn\n" 1998 ".section .fixup,\"ax\"\n" 1999 "3:\n" 2000 "li %1, %3\n" 2001 "j 2b\n" 2002 ".previous\n" 2003 ".section __ex_table,\"a\"\n" 2004 STR(PTR) " 1b,3b\n" 2005 ".previous\n" 2006 : "=&r"(res), "+&r"(err) 2007 : "r"(vaddr), "i"(SIGSEGV) 2008 : "memory"); 2009 2010 if (MIPSInst_RT(inst) && !err) 2011 regs->regs[MIPSInst_RT(inst)] = res; 2012 MIPS_R2_STATS(llsc); 2013 2014 break; 2015 2016 case sc_op: 2017 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 2018 if (vaddr & 0x3) { 2019 current->thread.cp0_baduaddr = vaddr; 2020 err = SIGBUS; 2021 break; 2022 } 2023 if (!access_ok(VERIFY_WRITE, vaddr, 4)) { 2024 current->thread.cp0_baduaddr = vaddr; 2025 err = SIGBUS; 2026 break; 2027 } 2028 2029 if (!cpu_has_rw_llb) { 2030 /* 2031 * An LL/SC block can't be safely emulated without 2032 * a Config5/LLB availability. So it's probably time to 2033 * kill our process before things get any worse. This is 2034 * because Config5/LLB allows us to use ERETNC so that 2035 * the LLAddr/LLB bit is not cleared when we return from 2036 * an exception. MIPS R2 LL/SC instructions trap with an 2037 * RI exception so once we emulate them here, we return 2038 * back to userland with ERETNC. That preserves the 2039 * LLAddr/LLB so the subsequent SC instruction will 2040 * succeed preserving the atomic semantics of the LL/SC 2041 * block. Without that, there is no safe way to emulate 2042 * an LL/SC block in MIPSR2 userland. 2043 */ 2044 pr_err("Can't emulate MIPSR2 LL/SC without Config5/LLB\n"); 2045 err = SIGKILL; 2046 break; 2047 } 2048 2049 res = regs->regs[MIPSInst_RT(inst)]; 2050 2051 __asm__ __volatile__( 2052 "1:\n" 2053 "sc %0, 0(%2)\n" 2054 "2:\n" 2055 ".insn\n" 2056 ".section .fixup,\"ax\"\n" 2057 "3:\n" 2058 "li %1, %3\n" 2059 "j 2b\n" 2060 ".previous\n" 2061 ".section __ex_table,\"a\"\n" 2062 STR(PTR) " 1b,3b\n" 2063 ".previous\n" 2064 : "+&r"(res), "+&r"(err) 2065 : "r"(vaddr), "i"(SIGSEGV)); 2066 2067 if (MIPSInst_RT(inst) && !err) 2068 regs->regs[MIPSInst_RT(inst)] = res; 2069 2070 MIPS_R2_STATS(llsc); 2071 2072 break; 2073 2074 case lld_op: 2075 if (config_enabled(CONFIG_32BIT)) { 2076 err = SIGILL; 2077 break; 2078 } 2079 2080 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 2081 if (vaddr & 0x7) { 2082 current->thread.cp0_baduaddr = vaddr; 2083 err = SIGBUS; 2084 break; 2085 } 2086 if (!access_ok(VERIFY_READ, vaddr, 8)) { 2087 current->thread.cp0_baduaddr = vaddr; 2088 err = SIGBUS; 2089 break; 2090 } 2091 2092 if (!cpu_has_rw_llb) { 2093 /* 2094 * An LL/SC block can't be safely emulated without 2095 * a Config5/LLB availability. So it's probably time to 2096 * kill our process before things get any worse. This is 2097 * because Config5/LLB allows us to use ERETNC so that 2098 * the LLAddr/LLB bit is not cleared when we return from 2099 * an exception. MIPS R2 LL/SC instructions trap with an 2100 * RI exception so once we emulate them here, we return 2101 * back to userland with ERETNC. That preserves the 2102 * LLAddr/LLB so the subsequent SC instruction will 2103 * succeed preserving the atomic semantics of the LL/SC 2104 * block. Without that, there is no safe way to emulate 2105 * an LL/SC block in MIPSR2 userland. 2106 */ 2107 pr_err("Can't emulate MIPSR2 LL/SC without Config5/LLB\n"); 2108 err = SIGKILL; 2109 break; 2110 } 2111 2112 __asm__ __volatile__( 2113 "1:\n" 2114 "lld %0, 0(%2)\n" 2115 "2:\n" 2116 ".insn\n" 2117 ".section .fixup,\"ax\"\n" 2118 "3:\n" 2119 "li %1, %3\n" 2120 "j 2b\n" 2121 ".previous\n" 2122 ".section __ex_table,\"a\"\n" 2123 STR(PTR) " 1b,3b\n" 2124 ".previous\n" 2125 : "=&r"(res), "+&r"(err) 2126 : "r"(vaddr), "i"(SIGSEGV) 2127 : "memory"); 2128 if (MIPSInst_RT(inst) && !err) 2129 regs->regs[MIPSInst_RT(inst)] = res; 2130 2131 MIPS_R2_STATS(llsc); 2132 2133 break; 2134 2135 case scd_op: 2136 if (config_enabled(CONFIG_32BIT)) { 2137 err = SIGILL; 2138 break; 2139 } 2140 2141 vaddr = regs->regs[MIPSInst_RS(inst)] + MIPSInst_SIMM(inst); 2142 if (vaddr & 0x7) { 2143 current->thread.cp0_baduaddr = vaddr; 2144 err = SIGBUS; 2145 break; 2146 } 2147 if (!access_ok(VERIFY_WRITE, vaddr, 8)) { 2148 current->thread.cp0_baduaddr = vaddr; 2149 err = SIGBUS; 2150 break; 2151 } 2152 2153 if (!cpu_has_rw_llb) { 2154 /* 2155 * An LL/SC block can't be safely emulated without 2156 * a Config5/LLB availability. So it's probably time to 2157 * kill our process before things get any worse. This is 2158 * because Config5/LLB allows us to use ERETNC so that 2159 * the LLAddr/LLB bit is not cleared when we return from 2160 * an exception. MIPS R2 LL/SC instructions trap with an 2161 * RI exception so once we emulate them here, we return 2162 * back to userland with ERETNC. That preserves the 2163 * LLAddr/LLB so the subsequent SC instruction will 2164 * succeed preserving the atomic semantics of the LL/SC 2165 * block. Without that, there is no safe way to emulate 2166 * an LL/SC block in MIPSR2 userland. 2167 */ 2168 pr_err("Can't emulate MIPSR2 LL/SC without Config5/LLB\n"); 2169 err = SIGKILL; 2170 break; 2171 } 2172 2173 res = regs->regs[MIPSInst_RT(inst)]; 2174 2175 __asm__ __volatile__( 2176 "1:\n" 2177 "scd %0, 0(%2)\n" 2178 "2:\n" 2179 ".insn\n" 2180 ".section .fixup,\"ax\"\n" 2181 "3:\n" 2182 "li %1, %3\n" 2183 "j 2b\n" 2184 ".previous\n" 2185 ".section __ex_table,\"a\"\n" 2186 STR(PTR) " 1b,3b\n" 2187 ".previous\n" 2188 : "+&r"(res), "+&r"(err) 2189 : "r"(vaddr), "i"(SIGSEGV)); 2190 2191 if (MIPSInst_RT(inst) && !err) 2192 regs->regs[MIPSInst_RT(inst)] = res; 2193 2194 MIPS_R2_STATS(llsc); 2195 2196 break; 2197 case pref_op: 2198 /* skip it */ 2199 break; 2200 default: 2201 err = SIGILL; 2202 } 2203 2204 /* 2205 * Lets not return to userland just yet. It's constly and 2206 * it's likely we have more R2 instructions to emulate 2207 */ 2208 if (!err && (pass++ < MIPS_R2_EMUL_TOTAL_PASS)) { 2209 regs->cp0_cause &= ~CAUSEF_BD; 2210 err = get_user(inst, (u32 __user *)regs->cp0_epc); 2211 if (!err) 2212 goto repeat; 2213 2214 if (err < 0) 2215 err = SIGSEGV; 2216 } 2217 2218 if (err && (err != SIGEMT)) { 2219 regs->regs[31] = r31; 2220 regs->cp0_epc = epc; 2221 } 2222 2223 /* Likely a MIPS R6 compatible instruction */ 2224 if (pass && (err == SIGILL)) 2225 err = 0; 2226 2227 return err; 2228} 2229 2230#ifdef CONFIG_DEBUG_FS 2231 2232static int mipsr2_stats_show(struct seq_file *s, void *unused) 2233{ 2234 2235 seq_printf(s, "Instruction\tTotal\tBDslot\n------------------------------\n"); 2236 seq_printf(s, "movs\t\t%ld\t%ld\n", 2237 (unsigned long)__this_cpu_read(mipsr2emustats.movs), 2238 (unsigned long)__this_cpu_read(mipsr2bdemustats.movs)); 2239 seq_printf(s, "hilo\t\t%ld\t%ld\n", 2240 (unsigned long)__this_cpu_read(mipsr2emustats.hilo), 2241 (unsigned long)__this_cpu_read(mipsr2bdemustats.hilo)); 2242 seq_printf(s, "muls\t\t%ld\t%ld\n", 2243 (unsigned long)__this_cpu_read(mipsr2emustats.muls), 2244 (unsigned long)__this_cpu_read(mipsr2bdemustats.muls)); 2245 seq_printf(s, "divs\t\t%ld\t%ld\n", 2246 (unsigned long)__this_cpu_read(mipsr2emustats.divs), 2247 (unsigned long)__this_cpu_read(mipsr2bdemustats.divs)); 2248 seq_printf(s, "dsps\t\t%ld\t%ld\n", 2249 (unsigned long)__this_cpu_read(mipsr2emustats.dsps), 2250 (unsigned long)__this_cpu_read(mipsr2bdemustats.dsps)); 2251 seq_printf(s, "bops\t\t%ld\t%ld\n", 2252 (unsigned long)__this_cpu_read(mipsr2emustats.bops), 2253 (unsigned long)__this_cpu_read(mipsr2bdemustats.bops)); 2254 seq_printf(s, "traps\t\t%ld\t%ld\n", 2255 (unsigned long)__this_cpu_read(mipsr2emustats.traps), 2256 (unsigned long)__this_cpu_read(mipsr2bdemustats.traps)); 2257 seq_printf(s, "fpus\t\t%ld\t%ld\n", 2258 (unsigned long)__this_cpu_read(mipsr2emustats.fpus), 2259 (unsigned long)__this_cpu_read(mipsr2bdemustats.fpus)); 2260 seq_printf(s, "loads\t\t%ld\t%ld\n", 2261 (unsigned long)__this_cpu_read(mipsr2emustats.loads), 2262 (unsigned long)__this_cpu_read(mipsr2bdemustats.loads)); 2263 seq_printf(s, "stores\t\t%ld\t%ld\n", 2264 (unsigned long)__this_cpu_read(mipsr2emustats.stores), 2265 (unsigned long)__this_cpu_read(mipsr2bdemustats.stores)); 2266 seq_printf(s, "llsc\t\t%ld\t%ld\n", 2267 (unsigned long)__this_cpu_read(mipsr2emustats.llsc), 2268 (unsigned long)__this_cpu_read(mipsr2bdemustats.llsc)); 2269 seq_printf(s, "dsemul\t\t%ld\t%ld\n", 2270 (unsigned long)__this_cpu_read(mipsr2emustats.dsemul), 2271 (unsigned long)__this_cpu_read(mipsr2bdemustats.dsemul)); 2272 seq_printf(s, "jr\t\t%ld\n", 2273 (unsigned long)__this_cpu_read(mipsr2bremustats.jrs)); 2274 seq_printf(s, "bltzl\t\t%ld\n", 2275 (unsigned long)__this_cpu_read(mipsr2bremustats.bltzl)); 2276 seq_printf(s, "bgezl\t\t%ld\n", 2277 (unsigned long)__this_cpu_read(mipsr2bremustats.bgezl)); 2278 seq_printf(s, "bltzll\t\t%ld\n", 2279 (unsigned long)__this_cpu_read(mipsr2bremustats.bltzll)); 2280 seq_printf(s, "bgezll\t\t%ld\n", 2281 (unsigned long)__this_cpu_read(mipsr2bremustats.bgezll)); 2282 seq_printf(s, "bltzal\t\t%ld\n", 2283 (unsigned long)__this_cpu_read(mipsr2bremustats.bltzal)); 2284 seq_printf(s, "bgezal\t\t%ld\n", 2285 (unsigned long)__this_cpu_read(mipsr2bremustats.bgezal)); 2286 seq_printf(s, "beql\t\t%ld\n", 2287 (unsigned long)__this_cpu_read(mipsr2bremustats.beql)); 2288 seq_printf(s, "bnel\t\t%ld\n", 2289 (unsigned long)__this_cpu_read(mipsr2bremustats.bnel)); 2290 seq_printf(s, "blezl\t\t%ld\n", 2291 (unsigned long)__this_cpu_read(mipsr2bremustats.blezl)); 2292 seq_printf(s, "bgtzl\t\t%ld\n", 2293 (unsigned long)__this_cpu_read(mipsr2bremustats.bgtzl)); 2294 2295 return 0; 2296} 2297 2298static int mipsr2_stats_clear_show(struct seq_file *s, void *unused) 2299{ 2300 mipsr2_stats_show(s, unused); 2301 2302 __this_cpu_write((mipsr2emustats).movs, 0); 2303 __this_cpu_write((mipsr2bdemustats).movs, 0); 2304 __this_cpu_write((mipsr2emustats).hilo, 0); 2305 __this_cpu_write((mipsr2bdemustats).hilo, 0); 2306 __this_cpu_write((mipsr2emustats).muls, 0); 2307 __this_cpu_write((mipsr2bdemustats).muls, 0); 2308 __this_cpu_write((mipsr2emustats).divs, 0); 2309 __this_cpu_write((mipsr2bdemustats).divs, 0); 2310 __this_cpu_write((mipsr2emustats).dsps, 0); 2311 __this_cpu_write((mipsr2bdemustats).dsps, 0); 2312 __this_cpu_write((mipsr2emustats).bops, 0); 2313 __this_cpu_write((mipsr2bdemustats).bops, 0); 2314 __this_cpu_write((mipsr2emustats).traps, 0); 2315 __this_cpu_write((mipsr2bdemustats).traps, 0); 2316 __this_cpu_write((mipsr2emustats).fpus, 0); 2317 __this_cpu_write((mipsr2bdemustats).fpus, 0); 2318 __this_cpu_write((mipsr2emustats).loads, 0); 2319 __this_cpu_write((mipsr2bdemustats).loads, 0); 2320 __this_cpu_write((mipsr2emustats).stores, 0); 2321 __this_cpu_write((mipsr2bdemustats).stores, 0); 2322 __this_cpu_write((mipsr2emustats).llsc, 0); 2323 __this_cpu_write((mipsr2bdemustats).llsc, 0); 2324 __this_cpu_write((mipsr2emustats).dsemul, 0); 2325 __this_cpu_write((mipsr2bdemustats).dsemul, 0); 2326 __this_cpu_write((mipsr2bremustats).jrs, 0); 2327 __this_cpu_write((mipsr2bremustats).bltzl, 0); 2328 __this_cpu_write((mipsr2bremustats).bgezl, 0); 2329 __this_cpu_write((mipsr2bremustats).bltzll, 0); 2330 __this_cpu_write((mipsr2bremustats).bgezll, 0); 2331 __this_cpu_write((mipsr2bremustats).bltzal, 0); 2332 __this_cpu_write((mipsr2bremustats).bgezal, 0); 2333 __this_cpu_write((mipsr2bremustats).beql, 0); 2334 __this_cpu_write((mipsr2bremustats).bnel, 0); 2335 __this_cpu_write((mipsr2bremustats).blezl, 0); 2336 __this_cpu_write((mipsr2bremustats).bgtzl, 0); 2337 2338 return 0; 2339} 2340 2341static int mipsr2_stats_open(struct inode *inode, struct file *file) 2342{ 2343 return single_open(file, mipsr2_stats_show, inode->i_private); 2344} 2345 2346static int mipsr2_stats_clear_open(struct inode *inode, struct file *file) 2347{ 2348 return single_open(file, mipsr2_stats_clear_show, inode->i_private); 2349} 2350 2351static const struct file_operations mipsr2_emul_fops = { 2352 .open = mipsr2_stats_open, 2353 .read = seq_read, 2354 .llseek = seq_lseek, 2355 .release = single_release, 2356}; 2357 2358static const struct file_operations mipsr2_clear_fops = { 2359 .open = mipsr2_stats_clear_open, 2360 .read = seq_read, 2361 .llseek = seq_lseek, 2362 .release = single_release, 2363}; 2364 2365 2366static int __init mipsr2_init_debugfs(void) 2367{ 2368 struct dentry *mipsr2_emul; 2369 2370 if (!mips_debugfs_dir) 2371 return -ENODEV; 2372 2373 mipsr2_emul = debugfs_create_file("r2_emul_stats", S_IRUGO, 2374 mips_debugfs_dir, NULL, 2375 &mipsr2_emul_fops); 2376 if (!mipsr2_emul) 2377 return -ENOMEM; 2378 2379 mipsr2_emul = debugfs_create_file("r2_emul_stats_clear", S_IRUGO, 2380 mips_debugfs_dir, NULL, 2381 &mipsr2_clear_fops); 2382 if (!mipsr2_emul) 2383 return -ENOMEM; 2384 2385 return 0; 2386} 2387 2388device_initcall(mipsr2_init_debugfs); 2389 2390#endif /* CONFIG_DEBUG_FS */ 2391