| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Disassemble SuperH instructions. |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 1999 kaz Kojima |
|---|
| 5 | 6 | * Copyright (C) 2008 Paul Mundt |
|---|
| 6 | | - * |
|---|
| 7 | | - * This file is subject to the terms and conditions of the GNU General Public |
|---|
| 8 | | - * License. See the file "COPYING" in the main directory of this archive |
|---|
| 9 | | - * for more details. |
|---|
| 10 | 7 | */ |
|---|
| 11 | 8 | #include <linux/kernel.h> |
|---|
| 12 | 9 | #include <linux/string.h> |
|---|
| .. | .. |
|---|
| 379 | 376 | } |
|---|
| 380 | 377 | |
|---|
| 381 | 378 | ok: |
|---|
| 382 | | - printk("%-8s ", op->name); |
|---|
| 379 | + pr_cont("%-8s ", op->name); |
|---|
| 383 | 380 | lastsp = (op->arg[0] == A_END); |
|---|
| 384 | 381 | disp_pc = 0; |
|---|
| 385 | 382 | for (n = 0; n < 6 && op->arg[n] != A_END; n++) { |
|---|
| 386 | 383 | if (n && op->arg[1] != A_END) |
|---|
| 387 | | - printk(", "); |
|---|
| 384 | + pr_cont(", "); |
|---|
| 388 | 385 | switch (op->arg[n]) { |
|---|
| 389 | 386 | case A_IMM: |
|---|
| 390 | | - printk("#%d", (char)(imm)); |
|---|
| 387 | + pr_cont("#%d", (char)(imm)); |
|---|
| 391 | 388 | break; |
|---|
| 392 | 389 | case A_R0: |
|---|
| 393 | | - printk("r0"); |
|---|
| 390 | + pr_cont("r0"); |
|---|
| 394 | 391 | break; |
|---|
| 395 | 392 | case A_REG_N: |
|---|
| 396 | | - printk("r%d", rn); |
|---|
| 393 | + pr_cont("r%d", rn); |
|---|
| 397 | 394 | break; |
|---|
| 398 | 395 | case A_INC_N: |
|---|
| 399 | | - printk("@r%d+", rn); |
|---|
| 396 | + pr_cont("@r%d+", rn); |
|---|
| 400 | 397 | break; |
|---|
| 401 | 398 | case A_DEC_N: |
|---|
| 402 | | - printk("@-r%d", rn); |
|---|
| 399 | + pr_cont("@-r%d", rn); |
|---|
| 403 | 400 | break; |
|---|
| 404 | 401 | case A_IND_N: |
|---|
| 405 | | - printk("@r%d", rn); |
|---|
| 402 | + pr_cont("@r%d", rn); |
|---|
| 406 | 403 | break; |
|---|
| 407 | 404 | case A_DISP_REG_N: |
|---|
| 408 | | - printk("@(%d,r%d)", imm, rn); |
|---|
| 405 | + pr_cont("@(%d,r%d)", imm, rn); |
|---|
| 409 | 406 | break; |
|---|
| 410 | 407 | case A_REG_M: |
|---|
| 411 | | - printk("r%d", rm); |
|---|
| 408 | + pr_cont("r%d", rm); |
|---|
| 412 | 409 | break; |
|---|
| 413 | 410 | case A_INC_M: |
|---|
| 414 | | - printk("@r%d+", rm); |
|---|
| 411 | + pr_cont("@r%d+", rm); |
|---|
| 415 | 412 | break; |
|---|
| 416 | 413 | case A_DEC_M: |
|---|
| 417 | | - printk("@-r%d", rm); |
|---|
| 414 | + pr_cont("@-r%d", rm); |
|---|
| 418 | 415 | break; |
|---|
| 419 | 416 | case A_IND_M: |
|---|
| 420 | | - printk("@r%d", rm); |
|---|
| 417 | + pr_cont("@r%d", rm); |
|---|
| 421 | 418 | break; |
|---|
| 422 | 419 | case A_DISP_REG_M: |
|---|
| 423 | | - printk("@(%d,r%d)", imm, rm); |
|---|
| 420 | + pr_cont("@(%d,r%d)", imm, rm); |
|---|
| 424 | 421 | break; |
|---|
| 425 | 422 | case A_REG_B: |
|---|
| 426 | | - printk("r%d_bank", rb); |
|---|
| 423 | + pr_cont("r%d_bank", rb); |
|---|
| 427 | 424 | break; |
|---|
| 428 | 425 | case A_DISP_PC: |
|---|
| 429 | 426 | disp_pc = 1; |
|---|
| 430 | 427 | disp_pc_addr = imm + 4 + (memaddr & relmask); |
|---|
| 431 | | - printk("%08x <%pS>", disp_pc_addr, |
|---|
| 432 | | - (void *)disp_pc_addr); |
|---|
| 428 | + pr_cont("%08x <%pS>", disp_pc_addr, |
|---|
| 429 | + (void *)disp_pc_addr); |
|---|
| 433 | 430 | break; |
|---|
| 434 | 431 | case A_IND_R0_REG_N: |
|---|
| 435 | | - printk("@(r0,r%d)", rn); |
|---|
| 432 | + pr_cont("@(r0,r%d)", rn); |
|---|
| 436 | 433 | break; |
|---|
| 437 | 434 | case A_IND_R0_REG_M: |
|---|
| 438 | | - printk("@(r0,r%d)", rm); |
|---|
| 435 | + pr_cont("@(r0,r%d)", rm); |
|---|
| 439 | 436 | break; |
|---|
| 440 | 437 | case A_DISP_GBR: |
|---|
| 441 | | - printk("@(%d,gbr)",imm); |
|---|
| 438 | + pr_cont("@(%d,gbr)", imm); |
|---|
| 442 | 439 | break; |
|---|
| 443 | 440 | case A_R0_GBR: |
|---|
| 444 | | - printk("@(r0,gbr)"); |
|---|
| 441 | + pr_cont("@(r0,gbr)"); |
|---|
| 445 | 442 | break; |
|---|
| 446 | 443 | case A_BDISP12: |
|---|
| 447 | 444 | case A_BDISP8: |
|---|
| 448 | | - printk("%08x", imm + memaddr); |
|---|
| 445 | + pr_cont("%08x", imm + memaddr); |
|---|
| 449 | 446 | break; |
|---|
| 450 | 447 | case A_SR: |
|---|
| 451 | | - printk("sr"); |
|---|
| 448 | + pr_cont("sr"); |
|---|
| 452 | 449 | break; |
|---|
| 453 | 450 | case A_GBR: |
|---|
| 454 | | - printk("gbr"); |
|---|
| 451 | + pr_cont("gbr"); |
|---|
| 455 | 452 | break; |
|---|
| 456 | 453 | case A_VBR: |
|---|
| 457 | | - printk("vbr"); |
|---|
| 454 | + pr_cont("vbr"); |
|---|
| 458 | 455 | break; |
|---|
| 459 | 456 | case A_SSR: |
|---|
| 460 | | - printk("ssr"); |
|---|
| 457 | + pr_cont("ssr"); |
|---|
| 461 | 458 | break; |
|---|
| 462 | 459 | case A_SPC: |
|---|
| 463 | | - printk("spc"); |
|---|
| 460 | + pr_cont("spc"); |
|---|
| 464 | 461 | break; |
|---|
| 465 | 462 | case A_MACH: |
|---|
| 466 | | - printk("mach"); |
|---|
| 463 | + pr_cont("mach"); |
|---|
| 467 | 464 | break; |
|---|
| 468 | 465 | case A_MACL: |
|---|
| 469 | | - printk("macl"); |
|---|
| 466 | + pr_cont("macl"); |
|---|
| 470 | 467 | break; |
|---|
| 471 | 468 | case A_PR: |
|---|
| 472 | | - printk("pr"); |
|---|
| 469 | + pr_cont("pr"); |
|---|
| 473 | 470 | break; |
|---|
| 474 | 471 | case A_SGR: |
|---|
| 475 | | - printk("sgr"); |
|---|
| 472 | + pr_cont("sgr"); |
|---|
| 476 | 473 | break; |
|---|
| 477 | 474 | case A_DBR: |
|---|
| 478 | | - printk("dbr"); |
|---|
| 475 | + pr_cont("dbr"); |
|---|
| 479 | 476 | break; |
|---|
| 480 | 477 | case FD_REG_N: |
|---|
| 481 | | - if (0) |
|---|
| 482 | | - goto d_reg_n; |
|---|
| 483 | 478 | case F_REG_N: |
|---|
| 484 | | - printk("fr%d", rn); |
|---|
| 479 | + pr_cont("fr%d", rn); |
|---|
| 485 | 480 | break; |
|---|
| 486 | 481 | case F_REG_M: |
|---|
| 487 | | - printk("fr%d", rm); |
|---|
| 482 | + pr_cont("fr%d", rm); |
|---|
| 488 | 483 | break; |
|---|
| 489 | 484 | case DX_REG_N: |
|---|
| 490 | 485 | if (rn & 1) { |
|---|
| 491 | | - printk("xd%d", rn & ~1); |
|---|
| 486 | + pr_cont("xd%d", rn & ~1); |
|---|
| 492 | 487 | break; |
|---|
| 493 | 488 | } |
|---|
| 494 | | - d_reg_n: |
|---|
| 489 | + fallthrough; |
|---|
| 495 | 490 | case D_REG_N: |
|---|
| 496 | | - printk("dr%d", rn); |
|---|
| 491 | + pr_cont("dr%d", rn); |
|---|
| 497 | 492 | break; |
|---|
| 498 | 493 | case DX_REG_M: |
|---|
| 499 | 494 | if (rm & 1) { |
|---|
| 500 | | - printk("xd%d", rm & ~1); |
|---|
| 495 | + pr_cont("xd%d", rm & ~1); |
|---|
| 501 | 496 | break; |
|---|
| 502 | 497 | } |
|---|
| 498 | + fallthrough; |
|---|
| 503 | 499 | case D_REG_M: |
|---|
| 504 | | - printk("dr%d", rm); |
|---|
| 500 | + pr_cont("dr%d", rm); |
|---|
| 505 | 501 | break; |
|---|
| 506 | 502 | case FPSCR_M: |
|---|
| 507 | 503 | case FPSCR_N: |
|---|
| 508 | | - printk("fpscr"); |
|---|
| 504 | + pr_cont("fpscr"); |
|---|
| 509 | 505 | break; |
|---|
| 510 | 506 | case FPUL_M: |
|---|
| 511 | 507 | case FPUL_N: |
|---|
| 512 | | - printk("fpul"); |
|---|
| 508 | + pr_cont("fpul"); |
|---|
| 513 | 509 | break; |
|---|
| 514 | 510 | case F_FR0: |
|---|
| 515 | | - printk("fr0"); |
|---|
| 511 | + pr_cont("fr0"); |
|---|
| 516 | 512 | break; |
|---|
| 517 | 513 | case V_REG_N: |
|---|
| 518 | | - printk("fv%d", rn*4); |
|---|
| 514 | + pr_cont("fv%d", rn*4); |
|---|
| 519 | 515 | break; |
|---|
| 520 | 516 | case V_REG_M: |
|---|
| 521 | | - printk("fv%d", rm*4); |
|---|
| 517 | + pr_cont("fv%d", rm*4); |
|---|
| 522 | 518 | break; |
|---|
| 523 | 519 | case XMTRX_M4: |
|---|
| 524 | | - printk("xmtrx"); |
|---|
| 520 | + pr_cont("xmtrx"); |
|---|
| 525 | 521 | break; |
|---|
| 526 | 522 | default: |
|---|
| 527 | 523 | return; |
|---|
| .. | .. |
|---|
| 536 | 532 | else |
|---|
| 537 | 533 | __get_user(val, (u32 *)disp_pc_addr); |
|---|
| 538 | 534 | |
|---|
| 539 | | - printk(" ! %08x <%pS>", val, (void *)val); |
|---|
| 535 | + pr_cont(" ! %08x <%pS>", val, (void *)val); |
|---|
| 540 | 536 | } |
|---|
| 541 | 537 | |
|---|
| 542 | 538 | return; |
|---|
| .. | .. |
|---|
| 545 | 541 | |
|---|
| 546 | 542 | } |
|---|
| 547 | 543 | |
|---|
| 548 | | - printk(".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]); |
|---|
| 544 | + pr_info(".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]); |
|---|
| 549 | 545 | } |
|---|
| 550 | 546 | |
|---|
| 551 | 547 | void show_code(struct pt_regs *regs) |
|---|
| .. | .. |
|---|
| 556 | 552 | if (regs->pc & 0x1) |
|---|
| 557 | 553 | return; |
|---|
| 558 | 554 | |
|---|
| 559 | | - printk("Code:\n"); |
|---|
| 555 | + pr_info("Code:\n"); |
|---|
| 560 | 556 | |
|---|
| 561 | 557 | for (i = -3 ; i < 6 ; i++) { |
|---|
| 562 | 558 | unsigned short insn; |
|---|
| 563 | 559 | |
|---|
| 564 | 560 | if (__get_user(insn, pc + i)) { |
|---|
| 565 | | - printk(" (Bad address in pc)\n"); |
|---|
| 561 | + pr_err(" (Bad address in pc)\n"); |
|---|
| 566 | 562 | break; |
|---|
| 567 | 563 | } |
|---|
| 568 | 564 | |
|---|
| 569 | | - printk("%s%08lx: ", (i ? " ": "->"), (unsigned long)(pc + i)); |
|---|
| 565 | + pr_info("%s%08lx: ", (i ? " " : "->"), |
|---|
| 566 | + (unsigned long)(pc + i)); |
|---|
| 570 | 567 | print_sh_insn((unsigned long)(pc + i), insn); |
|---|
| 571 | | - printk("\n"); |
|---|
| 568 | + pr_cont("\n"); |
|---|
| 572 | 569 | } |
|---|
| 573 | 570 | |
|---|
| 574 | | - printk("\n"); |
|---|
| 571 | + pr_info("\n"); |
|---|
| 575 | 572 | } |
|---|