1 2/* low-level asm for "intrigue" (PA8500-8700 CPU perf counters) 3 * 4 * Copyright (C) 2001 Randolph Chung <tausq at parisc-linux.org> 5 * Copyright (C) 2001 Hewlett-Packard (Grant Grundler) 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 22#include <asm/assembly.h> 23 24#include <linux/init.h> 25#include <linux/linkage.h> 26 27#ifdef CONFIG_64BIT 28 .level 2.0w 29#endif /* CONFIG_64BIT */ 30 31#define MTDIAG_1(gr) .word 0x14201840 + gr*0x10000 32#define MTDIAG_2(gr) .word 0x14401840 + gr*0x10000 33#define MFDIAG_1(gr) .word 0x142008A0 + gr 34#define MFDIAG_2(gr) .word 0x144008A0 + gr 35#define STDIAG(dr) .word 0x14000AA0 + dr*0x200000 36#define SFDIAG(dr) .word 0x14000BA0 + dr*0x200000 37#define DR2_SLOW_RET 53 38 39 40; 41; Enable the performance counters 42; 43; The coprocessor only needs to be enabled when 44; starting/stopping the coprocessor with the pmenb/pmdis. 45; 46 .text 47 48ENTRY(perf_intrigue_enable_perf_counters) 49 .proc 50 .callinfo frame=0,NO_CALLS 51 .entry 52 53 ldi 0x20,%r25 ; load up perfmon bit 54 mfctl ccr,%r26 ; get coprocessor register 55 or %r25,%r26,%r26 ; set bit 56 mtctl %r26,ccr ; turn on performance coprocessor 57 pmenb ; enable performance monitor 58 ssm 0,0 ; dummy op to ensure completion 59 sync ; follow ERS 60 andcm %r26,%r25,%r26 ; clear bit now 61 mtctl %r26,ccr ; turn off performance coprocessor 62 nop ; NOPs as specified in ERS 63 nop 64 nop 65 nop 66 nop 67 nop 68 nop 69 bve (%r2) 70 nop 71 .exit 72 .procend 73ENDPROC(perf_intrigue_enable_perf_counters) 74 75ENTRY(perf_intrigue_disable_perf_counters) 76 .proc 77 .callinfo frame=0,NO_CALLS 78 .entry 79 ldi 0x20,%r25 ; load up perfmon bit 80 mfctl ccr,%r26 ; get coprocessor register 81 or %r25,%r26,%r26 ; set bit 82 mtctl %r26,ccr ; turn on performance coprocessor 83 pmdis ; disable performance monitor 84 ssm 0,0 ; dummy op to ensure completion 85 andcm %r26,%r25,%r26 ; clear bit now 86 bve (%r2) 87 mtctl %r26,ccr ; turn off performance coprocessor 88 .exit 89 .procend 90ENDPROC(perf_intrigue_disable_perf_counters) 91 92;*********************************************************************** 93;* 94;* Name: perf_rdr_shift_in_W 95;* 96;* Description: 97;* This routine shifts data in from the RDR in arg0 and returns 98;* the result in ret0. If the RDR is <= 64 bits in length, it 99;* is shifted shifted backup immediately. This is to compensate 100;* for RDR10 which has bits that preclude PDC stack operations 101;* when they are in the wrong state. 102;* 103;* Arguments: 104;* arg0 : rdr to be read 105;* arg1 : bit length of rdr 106;* 107;* Returns: 108;* ret0 = next 64 bits of rdr data from staging register 109;* 110;* Register usage: 111;* arg0 : rdr to be read 112;* arg1 : bit length of rdr 113;* %r24 - original DR2 value 114;* %r1 - scratch 115;* %r29 - scratch 116;* 117;* Returns: 118;* ret0 = RDR data (right justified) 119;* 120;*********************************************************************** 121 122ENTRY(perf_rdr_shift_in_W) 123 .proc 124 .callinfo frame=0,NO_CALLS 125 .entry 126; 127; read(shift in) the RDR. 128; 129 130; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any 131; shifting is done, from or to, remote diagnose registers. 132; 133 134 depdi,z 1,DR2_SLOW_RET,1,%r29 135 MFDIAG_2 (24) 136 or %r24,%r29,%r29 137 MTDIAG_2 (29) ; set DR2_SLOW_RET 138 139 nop 140 nop 141 nop 142 nop 143 144; 145; Cacheline start (32-byte cacheline) 146; 147 nop 148 nop 149 nop 150 extrd,u arg1,63,6,%r1 ; setup shift amount by bits to move 151 152 mtsar %r1 153 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number 154 blr %r1,%r0 ; branch to 8-instruction sequence 155 nop 156 157; 158; Cacheline start (32-byte cacheline) 159; 160 161 ; 162 ; RDR 0 sequence 163 ; 164 SFDIAG (0) 165 ssm 0,0 166 MFDIAG_1 (28) 167 shrpd ret0,%r0,%sar,%r1 168 MTDIAG_1 (1) ; mtdiag %dr1, %r1 169 STDIAG (0) 170 ssm 0,0 171 b,n perf_rdr_shift_in_W_leave 172 173 ; 174 ; RDR 1 sequence 175 ; 176 sync 177 ssm 0,0 178 SFDIAG (1) 179 ssm 0,0 180 MFDIAG_1 (28) 181 ssm 0,0 182 b,n perf_rdr_shift_in_W_leave 183 nop 184 185 ; 186 ; RDR 2 read sequence 187 ; 188 SFDIAG (2) 189 ssm 0,0 190 MFDIAG_1 (28) 191 shrpd ret0,%r0,%sar,%r1 192 MTDIAG_1 (1) 193 STDIAG (2) 194 ssm 0,0 195 b,n perf_rdr_shift_in_W_leave 196 197 ; 198 ; RDR 3 read sequence 199 ; 200 b,n perf_rdr_shift_in_W_leave 201 nop 202 nop 203 nop 204 nop 205 nop 206 nop 207 nop 208 209 ; 210 ; RDR 4 read sequence 211 ; 212 sync 213 ssm 0,0 214 SFDIAG (4) 215 ssm 0,0 216 MFDIAG_1 (28) 217 b,n perf_rdr_shift_in_W_leave 218 ssm 0,0 219 nop 220 221 ; 222 ; RDR 5 read sequence 223 ; 224 sync 225 ssm 0,0 226 SFDIAG (5) 227 ssm 0,0 228 MFDIAG_1 (28) 229 b,n perf_rdr_shift_in_W_leave 230 ssm 0,0 231 nop 232 233 ; 234 ; RDR 6 read sequence 235 ; 236 sync 237 ssm 0,0 238 SFDIAG (6) 239 ssm 0,0 240 MFDIAG_1 (28) 241 b,n perf_rdr_shift_in_W_leave 242 ssm 0,0 243 nop 244 245 ; 246 ; RDR 7 read sequence 247 ; 248 b,n perf_rdr_shift_in_W_leave 249 nop 250 nop 251 nop 252 nop 253 nop 254 nop 255 nop 256 257 ; 258 ; RDR 8 read sequence 259 ; 260 b,n perf_rdr_shift_in_W_leave 261 nop 262 nop 263 nop 264 nop 265 nop 266 nop 267 nop 268 269 ; 270 ; RDR 9 read sequence 271 ; 272 b,n perf_rdr_shift_in_W_leave 273 nop 274 nop 275 nop 276 nop 277 nop 278 nop 279 nop 280 281 ; 282 ; RDR 10 read sequence 283 ; 284 SFDIAG (10) 285 ssm 0,0 286 MFDIAG_1 (28) 287 shrpd ret0,%r0,%sar,%r1 288 MTDIAG_1 (1) 289 STDIAG (10) 290 ssm 0,0 291 b,n perf_rdr_shift_in_W_leave 292 293 ; 294 ; RDR 11 read sequence 295 ; 296 SFDIAG (11) 297 ssm 0,0 298 MFDIAG_1 (28) 299 shrpd ret0,%r0,%sar,%r1 300 MTDIAG_1 (1) 301 STDIAG (11) 302 ssm 0,0 303 b,n perf_rdr_shift_in_W_leave 304 305 ; 306 ; RDR 12 read sequence 307 ; 308 b,n perf_rdr_shift_in_W_leave 309 nop 310 nop 311 nop 312 nop 313 nop 314 nop 315 nop 316 317 ; 318 ; RDR 13 read sequence 319 ; 320 sync 321 ssm 0,0 322 SFDIAG (13) 323 ssm 0,0 324 MFDIAG_1 (28) 325 b,n perf_rdr_shift_in_W_leave 326 ssm 0,0 327 nop 328 329 ; 330 ; RDR 14 read sequence 331 ; 332 SFDIAG (14) 333 ssm 0,0 334 MFDIAG_1 (28) 335 shrpd ret0,%r0,%sar,%r1 336 MTDIAG_1 (1) 337 STDIAG (14) 338 ssm 0,0 339 b,n perf_rdr_shift_in_W_leave 340 341 ; 342 ; RDR 15 read sequence 343 ; 344 sync 345 ssm 0,0 346 SFDIAG (15) 347 ssm 0,0 348 MFDIAG_1 (28) 349 ssm 0,0 350 b,n perf_rdr_shift_in_W_leave 351 nop 352 353 ; 354 ; RDR 16 read sequence 355 ; 356 sync 357 ssm 0,0 358 SFDIAG (16) 359 ssm 0,0 360 MFDIAG_1 (28) 361 b,n perf_rdr_shift_in_W_leave 362 ssm 0,0 363 nop 364 365 ; 366 ; RDR 17 read sequence 367 ; 368 SFDIAG (17) 369 ssm 0,0 370 MFDIAG_1 (28) 371 shrpd ret0,%r0,%sar,%r1 372 MTDIAG_1 (1) 373 STDIAG (17) 374 ssm 0,0 375 b,n perf_rdr_shift_in_W_leave 376 377 ; 378 ; RDR 18 read sequence 379 ; 380 SFDIAG (18) 381 ssm 0,0 382 MFDIAG_1 (28) 383 shrpd ret0,%r0,%sar,%r1 384 MTDIAG_1 (1) 385 STDIAG (18) 386 ssm 0,0 387 b,n perf_rdr_shift_in_W_leave 388 389 ; 390 ; RDR 19 read sequence 391 ; 392 b,n perf_rdr_shift_in_W_leave 393 nop 394 nop 395 nop 396 nop 397 nop 398 nop 399 nop 400 401 ; 402 ; RDR 20 read sequence 403 ; 404 sync 405 ssm 0,0 406 SFDIAG (20) 407 ssm 0,0 408 MFDIAG_1 (28) 409 b,n perf_rdr_shift_in_W_leave 410 ssm 0,0 411 nop 412 413 ; 414 ; RDR 21 read sequence 415 ; 416 sync 417 ssm 0,0 418 SFDIAG (21) 419 ssm 0,0 420 MFDIAG_1 (28) 421 b,n perf_rdr_shift_in_W_leave 422 ssm 0,0 423 nop 424 425 ; 426 ; RDR 22 read sequence 427 ; 428 sync 429 ssm 0,0 430 SFDIAG (22) 431 ssm 0,0 432 MFDIAG_1 (28) 433 b,n perf_rdr_shift_in_W_leave 434 ssm 0,0 435 nop 436 437 ; 438 ; RDR 23 read sequence 439 ; 440 sync 441 ssm 0,0 442 SFDIAG (23) 443 ssm 0,0 444 MFDIAG_1 (28) 445 b,n perf_rdr_shift_in_W_leave 446 ssm 0,0 447 nop 448 449 ; 450 ; RDR 24 read sequence 451 ; 452 sync 453 ssm 0,0 454 SFDIAG (24) 455 ssm 0,0 456 MFDIAG_1 (28) 457 b,n perf_rdr_shift_in_W_leave 458 ssm 0,0 459 nop 460 461 ; 462 ; RDR 25 read sequence 463 ; 464 sync 465 ssm 0,0 466 SFDIAG (25) 467 ssm 0,0 468 MFDIAG_1 (28) 469 b,n perf_rdr_shift_in_W_leave 470 ssm 0,0 471 nop 472 473 ; 474 ; RDR 26 read sequence 475 ; 476 SFDIAG (26) 477 ssm 0,0 478 MFDIAG_1 (28) 479 shrpd ret0,%r0,%sar,%r1 480 MTDIAG_1 (1) 481 STDIAG (26) 482 ssm 0,0 483 b,n perf_rdr_shift_in_W_leave 484 485 ; 486 ; RDR 27 read sequence 487 ; 488 SFDIAG (27) 489 ssm 0,0 490 MFDIAG_1 (28) 491 shrpd ret0,%r0,%sar,%r1 492 MTDIAG_1 (1) 493 STDIAG (27) 494 ssm 0,0 495 b,n perf_rdr_shift_in_W_leave 496 497 ; 498 ; RDR 28 read sequence 499 ; 500 sync 501 ssm 0,0 502 SFDIAG (28) 503 ssm 0,0 504 MFDIAG_1 (28) 505 b,n perf_rdr_shift_in_W_leave 506 ssm 0,0 507 nop 508 509 ; 510 ; RDR 29 read sequence 511 ; 512 sync 513 ssm 0,0 514 SFDIAG (29) 515 ssm 0,0 516 MFDIAG_1 (28) 517 b,n perf_rdr_shift_in_W_leave 518 ssm 0,0 519 nop 520 521 ; 522 ; RDR 30 read sequence 523 ; 524 SFDIAG (30) 525 ssm 0,0 526 MFDIAG_1 (28) 527 shrpd ret0,%r0,%sar,%r1 528 MTDIAG_1 (1) 529 STDIAG (30) 530 ssm 0,0 531 b,n perf_rdr_shift_in_W_leave 532 533 ; 534 ; RDR 31 read sequence 535 ; 536 sync 537 ssm 0,0 538 SFDIAG (31) 539 ssm 0,0 540 MFDIAG_1 (28) 541 nop 542 ssm 0,0 543 nop 544 545 ; 546 ; Fallthrough 547 ; 548 549perf_rdr_shift_in_W_leave: 550 bve (%r2) 551 .exit 552 MTDIAG_2 (24) ; restore DR2 553 .procend 554ENDPROC(perf_rdr_shift_in_W) 555 556 557;*********************************************************************** 558;* 559;* Name: perf_rdr_shift_out_W 560;* 561;* Description: 562;* This routine moves data to the RDR's. The double-word that 563;* arg1 points to is loaded and moved into the staging register. 564;* Then the STDIAG instruction for the RDR # in arg0 is called 565;* to move the data to the RDR. 566;* 567;* Arguments: 568;* arg0 = rdr number 569;* arg1 = 64-bit value to write 570;* %r24 - DR2 | DR2_SLOW_RET 571;* %r23 - original DR2 value 572;* 573;* Returns: 574;* None 575;* 576;* Register usage: 577;* 578;*********************************************************************** 579 580ENTRY(perf_rdr_shift_out_W) 581 .proc 582 .callinfo frame=0,NO_CALLS 583 .entry 584; 585; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any 586; shifting is done, from or to, the remote diagnose registers. 587; 588 589 depdi,z 1,DR2_SLOW_RET,1,%r24 590 MFDIAG_2 (23) 591 or %r24,%r23,%r24 592 MTDIAG_2 (24) ; set DR2_SLOW_RET 593 MTDIAG_1 (25) ; data to the staging register 594 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number 595 blr %r1,%r0 ; branch to 8-instruction sequence 596 nop 597 598 ; 599 ; RDR 0 write sequence 600 ; 601 sync ; RDR 0 write sequence 602 ssm 0,0 603 STDIAG (0) 604 ssm 0,0 605 b,n perf_rdr_shift_out_W_leave 606 nop 607 ssm 0,0 608 nop 609 610 ; 611 ; RDR 1 write sequence 612 ; 613 sync 614 ssm 0,0 615 STDIAG (1) 616 ssm 0,0 617 b,n perf_rdr_shift_out_W_leave 618 nop 619 ssm 0,0 620 nop 621 622 ; 623 ; RDR 2 write sequence 624 ; 625 sync 626 ssm 0,0 627 STDIAG (2) 628 ssm 0,0 629 b,n perf_rdr_shift_out_W_leave 630 nop 631 ssm 0,0 632 nop 633 634 ; 635 ; RDR 3 write sequence 636 ; 637 sync 638 ssm 0,0 639 STDIAG (3) 640 ssm 0,0 641 b,n perf_rdr_shift_out_W_leave 642 nop 643 ssm 0,0 644 nop 645 646 ; 647 ; RDR 4 write sequence 648 ; 649 sync 650 ssm 0,0 651 STDIAG (4) 652 ssm 0,0 653 b,n perf_rdr_shift_out_W_leave 654 nop 655 ssm 0,0 656 nop 657 658 ; 659 ; RDR 5 write sequence 660 ; 661 sync 662 ssm 0,0 663 STDIAG (5) 664 ssm 0,0 665 b,n perf_rdr_shift_out_W_leave 666 nop 667 ssm 0,0 668 nop 669 670 ; 671 ; RDR 6 write sequence 672 ; 673 sync 674 ssm 0,0 675 STDIAG (6) 676 ssm 0,0 677 b,n perf_rdr_shift_out_W_leave 678 nop 679 ssm 0,0 680 nop 681 682 ; 683 ; RDR 7 write sequence 684 ; 685 sync 686 ssm 0,0 687 STDIAG (7) 688 ssm 0,0 689 b,n perf_rdr_shift_out_W_leave 690 nop 691 ssm 0,0 692 nop 693 694 ; 695 ; RDR 8 write sequence 696 ; 697 sync 698 ssm 0,0 699 STDIAG (8) 700 ssm 0,0 701 b,n perf_rdr_shift_out_W_leave 702 nop 703 ssm 0,0 704 nop 705 706 ; 707 ; RDR 9 write sequence 708 ; 709 sync 710 ssm 0,0 711 STDIAG (9) 712 ssm 0,0 713 b,n perf_rdr_shift_out_W_leave 714 nop 715 ssm 0,0 716 nop 717 718 ; 719 ; RDR 10 write sequence 720 ; 721 sync 722 ssm 0,0 723 STDIAG (10) 724 STDIAG (26) 725 ssm 0,0 726 b,n perf_rdr_shift_out_W_leave 727 ssm 0,0 728 nop 729 730 ; 731 ; RDR 11 write sequence 732 ; 733 sync 734 ssm 0,0 735 STDIAG (11) 736 STDIAG (27) 737 ssm 0,0 738 b,n perf_rdr_shift_out_W_leave 739 ssm 0,0 740 nop 741 742 ; 743 ; RDR 12 write sequence 744 ; 745 sync 746 ssm 0,0 747 STDIAG (12) 748 ssm 0,0 749 b,n perf_rdr_shift_out_W_leave 750 nop 751 ssm 0,0 752 nop 753 754 ; 755 ; RDR 13 write sequence 756 ; 757 sync 758 ssm 0,0 759 STDIAG (13) 760 ssm 0,0 761 b,n perf_rdr_shift_out_W_leave 762 nop 763 ssm 0,0 764 nop 765 766 ; 767 ; RDR 14 write sequence 768 ; 769 sync 770 ssm 0,0 771 STDIAG (14) 772 ssm 0,0 773 b,n perf_rdr_shift_out_W_leave 774 nop 775 ssm 0,0 776 nop 777 778 ; 779 ; RDR 15 write sequence 780 ; 781 sync 782 ssm 0,0 783 STDIAG (15) 784 ssm 0,0 785 b,n perf_rdr_shift_out_W_leave 786 nop 787 ssm 0,0 788 nop 789 790 ; 791 ; RDR 16 write sequence 792 ; 793 sync 794 ssm 0,0 795 STDIAG (16) 796 ssm 0,0 797 b,n perf_rdr_shift_out_W_leave 798 nop 799 ssm 0,0 800 nop 801 802 ; 803 ; RDR 17 write sequence 804 ; 805 sync 806 ssm 0,0 807 STDIAG (17) 808 ssm 0,0 809 b,n perf_rdr_shift_out_W_leave 810 nop 811 ssm 0,0 812 nop 813 814 ; 815 ; RDR 18 write sequence 816 ; 817 sync 818 ssm 0,0 819 STDIAG (18) 820 ssm 0,0 821 b,n perf_rdr_shift_out_W_leave 822 nop 823 ssm 0,0 824 nop 825 826 ; 827 ; RDR 19 write sequence 828 ; 829 sync 830 ssm 0,0 831 STDIAG (19) 832 ssm 0,0 833 b,n perf_rdr_shift_out_W_leave 834 nop 835 ssm 0,0 836 nop 837 838 ; 839 ; RDR 20 write sequence 840 ; 841 sync 842 ssm 0,0 843 STDIAG (20) 844 ssm 0,0 845 b,n perf_rdr_shift_out_W_leave 846 nop 847 ssm 0,0 848 nop 849 850 ; 851 ; RDR 21 write sequence 852 ; 853 sync 854 ssm 0,0 855 STDIAG (21) 856 ssm 0,0 857 b,n perf_rdr_shift_out_W_leave 858 nop 859 ssm 0,0 860 nop 861 862 ; 863 ; RDR 22 write sequence 864 ; 865 sync 866 ssm 0,0 867 STDIAG (22) 868 ssm 0,0 869 b,n perf_rdr_shift_out_W_leave 870 nop 871 ssm 0,0 872 nop 873 874 ; 875 ; RDR 23 write sequence 876 ; 877 sync 878 ssm 0,0 879 STDIAG (23) 880 ssm 0,0 881 b,n perf_rdr_shift_out_W_leave 882 nop 883 ssm 0,0 884 nop 885 886 ; 887 ; RDR 24 write sequence 888 ; 889 sync 890 ssm 0,0 891 STDIAG (24) 892 ssm 0,0 893 b,n perf_rdr_shift_out_W_leave 894 nop 895 ssm 0,0 896 nop 897 898 ; 899 ; RDR 25 write sequence 900 ; 901 sync 902 ssm 0,0 903 STDIAG (25) 904 ssm 0,0 905 b,n perf_rdr_shift_out_W_leave 906 nop 907 ssm 0,0 908 nop 909 910 ; 911 ; RDR 26 write sequence 912 ; 913 sync 914 ssm 0,0 915 STDIAG (10) 916 STDIAG (26) 917 ssm 0,0 918 b,n perf_rdr_shift_out_W_leave 919 ssm 0,0 920 nop 921 922 ; 923 ; RDR 27 write sequence 924 ; 925 sync 926 ssm 0,0 927 STDIAG (11) 928 STDIAG (27) 929 ssm 0,0 930 b,n perf_rdr_shift_out_W_leave 931 ssm 0,0 932 nop 933 934 ; 935 ; RDR 28 write sequence 936 ; 937 sync 938 ssm 0,0 939 STDIAG (28) 940 ssm 0,0 941 b,n perf_rdr_shift_out_W_leave 942 nop 943 ssm 0,0 944 nop 945 946 ; 947 ; RDR 29 write sequence 948 ; 949 sync 950 ssm 0,0 951 STDIAG (29) 952 ssm 0,0 953 b,n perf_rdr_shift_out_W_leave 954 nop 955 ssm 0,0 956 nop 957 958 ; 959 ; RDR 30 write sequence 960 ; 961 sync 962 ssm 0,0 963 STDIAG (30) 964 ssm 0,0 965 b,n perf_rdr_shift_out_W_leave 966 nop 967 ssm 0,0 968 nop 969 970 ; 971 ; RDR 31 write sequence 972 ; 973 sync 974 ssm 0,0 975 STDIAG (31) 976 ssm 0,0 977 b,n perf_rdr_shift_out_W_leave 978 nop 979 ssm 0,0 980 nop 981 982perf_rdr_shift_out_W_leave: 983 bve (%r2) 984 .exit 985 MTDIAG_2 (23) ; restore DR2 986 .procend 987ENDPROC(perf_rdr_shift_out_W) 988 989 990;*********************************************************************** 991;* 992;* Name: rdr_shift_in_U 993;* 994;* Description: 995;* This routine shifts data in from the RDR in arg0 and returns 996;* the result in ret0. If the RDR is <= 64 bits in length, it 997;* is shifted shifted backup immediately. This is to compensate 998;* for RDR10 which has bits that preclude PDC stack operations 999;* when they are in the wrong state. 1000;* 1001;* Arguments: 1002;* arg0 : rdr to be read 1003;* arg1 : bit length of rdr 1004;* 1005;* Returns: 1006;* ret0 = next 64 bits of rdr data from staging register 1007;* 1008;* Register usage: 1009;* arg0 : rdr to be read 1010;* arg1 : bit length of rdr 1011;* %r24 - original DR2 value 1012;* %r23 - DR2 | DR2_SLOW_RET 1013;* %r1 - scratch 1014;* 1015;*********************************************************************** 1016 1017ENTRY(perf_rdr_shift_in_U) 1018 .proc 1019 .callinfo frame=0,NO_CALLS 1020 .entry 1021 1022; read(shift in) the RDR. 1023; 1024; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any 1025; shifting is done, from or to, remote diagnose registers. 1026 1027 depdi,z 1,DR2_SLOW_RET,1,%r29 1028 MFDIAG_2 (24) 1029 or %r24,%r29,%r29 1030 MTDIAG_2 (29) ; set DR2_SLOW_RET 1031 1032 nop 1033 nop 1034 nop 1035 nop 1036 1037; 1038; Start of next 32-byte cacheline 1039; 1040 nop 1041 nop 1042 nop 1043 extrd,u arg1,63,6,%r1 1044 1045 mtsar %r1 1046 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number 1047 blr %r1,%r0 ; branch to 8-instruction sequence 1048 nop 1049 1050; 1051; Start of next 32-byte cacheline 1052; 1053 SFDIAG (0) ; RDR 0 read sequence 1054 ssm 0,0 1055 MFDIAG_1 (28) 1056 shrpd ret0,%r0,%sar,%r1 1057 MTDIAG_1 (1) 1058 STDIAG (0) 1059 ssm 0,0 1060 b,n perf_rdr_shift_in_U_leave 1061 1062 SFDIAG (1) ; RDR 1 read sequence 1063 ssm 0,0 1064 MFDIAG_1 (28) 1065 shrpd ret0,%r0,%sar,%r1 1066 MTDIAG_1 (1) 1067 STDIAG (1) 1068 ssm 0,0 1069 b,n perf_rdr_shift_in_U_leave 1070 1071 sync ; RDR 2 read sequence 1072 ssm 0,0 1073 SFDIAG (4) 1074 ssm 0,0 1075 MFDIAG_1 (28) 1076 b,n perf_rdr_shift_in_U_leave 1077 ssm 0,0 1078 nop 1079 1080 sync ; RDR 3 read sequence 1081 ssm 0,0 1082 SFDIAG (3) 1083 ssm 0,0 1084 MFDIAG_1 (28) 1085 b,n perf_rdr_shift_in_U_leave 1086 ssm 0,0 1087 nop 1088 1089 sync ; RDR 4 read sequence 1090 ssm 0,0 1091 SFDIAG (4) 1092 ssm 0,0 1093 MFDIAG_1 (28) 1094 b,n perf_rdr_shift_in_U_leave 1095 ssm 0,0 1096 nop 1097 1098 sync ; RDR 5 read sequence 1099 ssm 0,0 1100 SFDIAG (5) 1101 ssm 0,0 1102 MFDIAG_1 (28) 1103 b,n perf_rdr_shift_in_U_leave 1104 ssm 0,0 1105 nop 1106 1107 sync ; RDR 6 read sequence 1108 ssm 0,0 1109 SFDIAG (6) 1110 ssm 0,0 1111 MFDIAG_1 (28) 1112 b,n perf_rdr_shift_in_U_leave 1113 ssm 0,0 1114 nop 1115 1116 sync ; RDR 7 read sequence 1117 ssm 0,0 1118 SFDIAG (7) 1119 ssm 0,0 1120 MFDIAG_1 (28) 1121 b,n perf_rdr_shift_in_U_leave 1122 ssm 0,0 1123 nop 1124 1125 b,n perf_rdr_shift_in_U_leave 1126 nop 1127 nop 1128 nop 1129 nop 1130 nop 1131 nop 1132 nop 1133 1134 SFDIAG (9) ; RDR 9 read sequence 1135 ssm 0,0 1136 MFDIAG_1 (28) 1137 shrpd ret0,%r0,%sar,%r1 1138 MTDIAG_1 (1) 1139 STDIAG (9) 1140 ssm 0,0 1141 b,n perf_rdr_shift_in_U_leave 1142 1143 SFDIAG (10) ; RDR 10 read sequence 1144 ssm 0,0 1145 MFDIAG_1 (28) 1146 shrpd ret0,%r0,%sar,%r1 1147 MTDIAG_1 (1) 1148 STDIAG (10) 1149 ssm 0,0 1150 b,n perf_rdr_shift_in_U_leave 1151 1152 SFDIAG (11) ; RDR 11 read sequence 1153 ssm 0,0 1154 MFDIAG_1 (28) 1155 shrpd ret0,%r0,%sar,%r1 1156 MTDIAG_1 (1) 1157 STDIAG (11) 1158 ssm 0,0 1159 b,n perf_rdr_shift_in_U_leave 1160 1161 SFDIAG (12) ; RDR 12 read sequence 1162 ssm 0,0 1163 MFDIAG_1 (28) 1164 shrpd ret0,%r0,%sar,%r1 1165 MTDIAG_1 (1) 1166 STDIAG (12) 1167 ssm 0,0 1168 b,n perf_rdr_shift_in_U_leave 1169 1170 SFDIAG (13) ; RDR 13 read sequence 1171 ssm 0,0 1172 MFDIAG_1 (28) 1173 shrpd ret0,%r0,%sar,%r1 1174 MTDIAG_1 (1) 1175 STDIAG (13) 1176 ssm 0,0 1177 b,n perf_rdr_shift_in_U_leave 1178 1179 SFDIAG (14) ; RDR 14 read sequence 1180 ssm 0,0 1181 MFDIAG_1 (28) 1182 shrpd ret0,%r0,%sar,%r1 1183 MTDIAG_1 (1) 1184 STDIAG (14) 1185 ssm 0,0 1186 b,n perf_rdr_shift_in_U_leave 1187 1188 SFDIAG (15) ; RDR 15 read sequence 1189 ssm 0,0 1190 MFDIAG_1 (28) 1191 shrpd ret0,%r0,%sar,%r1 1192 MTDIAG_1 (1) 1193 STDIAG (15) 1194 ssm 0,0 1195 b,n perf_rdr_shift_in_U_leave 1196 1197 sync ; RDR 16 read sequence 1198 ssm 0,0 1199 SFDIAG (16) 1200 ssm 0,0 1201 MFDIAG_1 (28) 1202 b,n perf_rdr_shift_in_U_leave 1203 ssm 0,0 1204 nop 1205 1206 SFDIAG (17) ; RDR 17 read sequence 1207 ssm 0,0 1208 MFDIAG_1 (28) 1209 shrpd ret0,%r0,%sar,%r1 1210 MTDIAG_1 (1) 1211 STDIAG (17) 1212 ssm 0,0 1213 b,n perf_rdr_shift_in_U_leave 1214 1215 SFDIAG (18) ; RDR 18 read sequence 1216 ssm 0,0 1217 MFDIAG_1 (28) 1218 shrpd ret0,%r0,%sar,%r1 1219 MTDIAG_1 (1) 1220 STDIAG (18) 1221 ssm 0,0 1222 b,n perf_rdr_shift_in_U_leave 1223 1224 b,n perf_rdr_shift_in_U_leave 1225 nop 1226 nop 1227 nop 1228 nop 1229 nop 1230 nop 1231 nop 1232 1233 sync ; RDR 20 read sequence 1234 ssm 0,0 1235 SFDIAG (20) 1236 ssm 0,0 1237 MFDIAG_1 (28) 1238 b,n perf_rdr_shift_in_U_leave 1239 ssm 0,0 1240 nop 1241 1242 sync ; RDR 21 read sequence 1243 ssm 0,0 1244 SFDIAG (21) 1245 ssm 0,0 1246 MFDIAG_1 (28) 1247 b,n perf_rdr_shift_in_U_leave 1248 ssm 0,0 1249 nop 1250 1251 sync ; RDR 22 read sequence 1252 ssm 0,0 1253 SFDIAG (22) 1254 ssm 0,0 1255 MFDIAG_1 (28) 1256 b,n perf_rdr_shift_in_U_leave 1257 ssm 0,0 1258 nop 1259 1260 sync ; RDR 23 read sequence 1261 ssm 0,0 1262 SFDIAG (23) 1263 ssm 0,0 1264 MFDIAG_1 (28) 1265 b,n perf_rdr_shift_in_U_leave 1266 ssm 0,0 1267 nop 1268 1269 sync ; RDR 24 read sequence 1270 ssm 0,0 1271 SFDIAG (24) 1272 ssm 0,0 1273 MFDIAG_1 (28) 1274 b,n perf_rdr_shift_in_U_leave 1275 ssm 0,0 1276 nop 1277 1278 sync ; RDR 25 read sequence 1279 ssm 0,0 1280 SFDIAG (25) 1281 ssm 0,0 1282 MFDIAG_1 (28) 1283 b,n perf_rdr_shift_in_U_leave 1284 ssm 0,0 1285 nop 1286 1287 SFDIAG (26) ; RDR 26 read sequence 1288 ssm 0,0 1289 MFDIAG_1 (28) 1290 shrpd ret0,%r0,%sar,%r1 1291 MTDIAG_1 (1) 1292 STDIAG (26) 1293 ssm 0,0 1294 b,n perf_rdr_shift_in_U_leave 1295 1296 SFDIAG (27) ; RDR 27 read sequence 1297 ssm 0,0 1298 MFDIAG_1 (28) 1299 shrpd ret0,%r0,%sar,%r1 1300 MTDIAG_1 (1) 1301 STDIAG (27) 1302 ssm 0,0 1303 b,n perf_rdr_shift_in_U_leave 1304 1305 sync ; RDR 28 read sequence 1306 ssm 0,0 1307 SFDIAG (28) 1308 ssm 0,0 1309 MFDIAG_1 (28) 1310 b,n perf_rdr_shift_in_U_leave 1311 ssm 0,0 1312 nop 1313 1314 b,n perf_rdr_shift_in_U_leave 1315 nop 1316 nop 1317 nop 1318 nop 1319 nop 1320 nop 1321 nop 1322 1323 SFDIAG (30) ; RDR 30 read sequence 1324 ssm 0,0 1325 MFDIAG_1 (28) 1326 shrpd ret0,%r0,%sar,%r1 1327 MTDIAG_1 (1) 1328 STDIAG (30) 1329 ssm 0,0 1330 b,n perf_rdr_shift_in_U_leave 1331 1332 SFDIAG (31) ; RDR 31 read sequence 1333 ssm 0,0 1334 MFDIAG_1 (28) 1335 shrpd ret0,%r0,%sar,%r1 1336 MTDIAG_1 (1) 1337 STDIAG (31) 1338 ssm 0,0 1339 b,n perf_rdr_shift_in_U_leave 1340 nop 1341 1342perf_rdr_shift_in_U_leave: 1343 bve (%r2) 1344 .exit 1345 MTDIAG_2 (24) ; restore DR2 1346 .procend 1347ENDPROC(perf_rdr_shift_in_U) 1348 1349;*********************************************************************** 1350;* 1351;* Name: rdr_shift_out_U 1352;* 1353;* Description: 1354;* This routine moves data to the RDR's. The double-word that 1355;* arg1 points to is loaded and moved into the staging register. 1356;* Then the STDIAG instruction for the RDR # in arg0 is called 1357;* to move the data to the RDR. 1358;* 1359;* Arguments: 1360;* arg0 = rdr target 1361;* arg1 = buffer pointer 1362;* 1363;* Returns: 1364;* None 1365;* 1366;* Register usage: 1367;* arg0 = rdr target 1368;* arg1 = buffer pointer 1369;* %r24 - DR2 | DR2_SLOW_RET 1370;* %r23 - original DR2 value 1371;* 1372;*********************************************************************** 1373 1374ENTRY(perf_rdr_shift_out_U) 1375 .proc 1376 .callinfo frame=0,NO_CALLS 1377 .entry 1378 1379; 1380; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any 1381; shifting is done, from or to, the remote diagnose registers. 1382; 1383 1384 depdi,z 1,DR2_SLOW_RET,1,%r24 1385 MFDIAG_2 (23) 1386 or %r24,%r23,%r24 1387 MTDIAG_2 (24) ; set DR2_SLOW_RET 1388 1389 MTDIAG_1 (25) ; data to the staging register 1390 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number 1391 blr %r1,%r0 ; branch to 8-instruction sequence 1392 nop 1393 1394; 1395; 32-byte cachline aligned 1396; 1397 1398 sync ; RDR 0 write sequence 1399 ssm 0,0 1400 STDIAG (0) 1401 ssm 0,0 1402 b,n perf_rdr_shift_out_U_leave 1403 nop 1404 ssm 0,0 1405 nop 1406 1407 sync ; RDR 1 write sequence 1408 ssm 0,0 1409 STDIAG (1) 1410 ssm 0,0 1411 b,n perf_rdr_shift_out_U_leave 1412 nop 1413 ssm 0,0 1414 nop 1415 1416 sync ; RDR 2 write sequence 1417 ssm 0,0 1418 STDIAG (2) 1419 ssm 0,0 1420 b,n perf_rdr_shift_out_U_leave 1421 nop 1422 ssm 0,0 1423 nop 1424 1425 sync ; RDR 3 write sequence 1426 ssm 0,0 1427 STDIAG (3) 1428 ssm 0,0 1429 b,n perf_rdr_shift_out_U_leave 1430 nop 1431 ssm 0,0 1432 nop 1433 1434 sync ; RDR 4 write sequence 1435 ssm 0,0 1436 STDIAG (4) 1437 ssm 0,0 1438 b,n perf_rdr_shift_out_U_leave 1439 nop 1440 ssm 0,0 1441 nop 1442 1443 sync ; RDR 5 write sequence 1444 ssm 0,0 1445 STDIAG (5) 1446 ssm 0,0 1447 b,n perf_rdr_shift_out_U_leave 1448 nop 1449 ssm 0,0 1450 nop 1451 1452 sync ; RDR 6 write sequence 1453 ssm 0,0 1454 STDIAG (6) 1455 ssm 0,0 1456 b,n perf_rdr_shift_out_U_leave 1457 nop 1458 ssm 0,0 1459 nop 1460 1461 sync ; RDR 7 write sequence 1462 ssm 0,0 1463 STDIAG (7) 1464 ssm 0,0 1465 b,n perf_rdr_shift_out_U_leave 1466 nop 1467 ssm 0,0 1468 nop 1469 1470 sync ; RDR 8 write sequence 1471 ssm 0,0 1472 STDIAG (8) 1473 ssm 0,0 1474 b,n perf_rdr_shift_out_U_leave 1475 nop 1476 ssm 0,0 1477 nop 1478 1479 sync ; RDR 9 write sequence 1480 ssm 0,0 1481 STDIAG (9) 1482 ssm 0,0 1483 b,n perf_rdr_shift_out_U_leave 1484 nop 1485 ssm 0,0 1486 nop 1487 1488 sync ; RDR 10 write sequence 1489 ssm 0,0 1490 STDIAG (10) 1491 ssm 0,0 1492 b,n perf_rdr_shift_out_U_leave 1493 nop 1494 ssm 0,0 1495 nop 1496 1497 sync ; RDR 11 write sequence 1498 ssm 0,0 1499 STDIAG (11) 1500 ssm 0,0 1501 b,n perf_rdr_shift_out_U_leave 1502 nop 1503 ssm 0,0 1504 nop 1505 1506 sync ; RDR 12 write sequence 1507 ssm 0,0 1508 STDIAG (12) 1509 ssm 0,0 1510 b,n perf_rdr_shift_out_U_leave 1511 nop 1512 ssm 0,0 1513 nop 1514 1515 sync ; RDR 13 write sequence 1516 ssm 0,0 1517 STDIAG (13) 1518 ssm 0,0 1519 b,n perf_rdr_shift_out_U_leave 1520 nop 1521 ssm 0,0 1522 nop 1523 1524 sync ; RDR 14 write sequence 1525 ssm 0,0 1526 STDIAG (14) 1527 ssm 0,0 1528 b,n perf_rdr_shift_out_U_leave 1529 nop 1530 ssm 0,0 1531 nop 1532 1533 sync ; RDR 15 write sequence 1534 ssm 0,0 1535 STDIAG (15) 1536 ssm 0,0 1537 b,n perf_rdr_shift_out_U_leave 1538 nop 1539 ssm 0,0 1540 nop 1541 1542 sync ; RDR 16 write sequence 1543 ssm 0,0 1544 STDIAG (16) 1545 ssm 0,0 1546 b,n perf_rdr_shift_out_U_leave 1547 nop 1548 ssm 0,0 1549 nop 1550 1551 sync ; RDR 17 write sequence 1552 ssm 0,0 1553 STDIAG (17) 1554 ssm 0,0 1555 b,n perf_rdr_shift_out_U_leave 1556 nop 1557 ssm 0,0 1558 nop 1559 1560 sync ; RDR 18 write sequence 1561 ssm 0,0 1562 STDIAG (18) 1563 ssm 0,0 1564 b,n perf_rdr_shift_out_U_leave 1565 nop 1566 ssm 0,0 1567 nop 1568 1569 sync ; RDR 19 write sequence 1570 ssm 0,0 1571 STDIAG (19) 1572 ssm 0,0 1573 b,n perf_rdr_shift_out_U_leave 1574 nop 1575 ssm 0,0 1576 nop 1577 1578 sync ; RDR 20 write sequence 1579 ssm 0,0 1580 STDIAG (20) 1581 ssm 0,0 1582 b,n perf_rdr_shift_out_U_leave 1583 nop 1584 ssm 0,0 1585 nop 1586 1587 sync ; RDR 21 write sequence 1588 ssm 0,0 1589 STDIAG (21) 1590 ssm 0,0 1591 b,n perf_rdr_shift_out_U_leave 1592 nop 1593 ssm 0,0 1594 nop 1595 1596 sync ; RDR 22 write sequence 1597 ssm 0,0 1598 STDIAG (22) 1599 ssm 0,0 1600 b,n perf_rdr_shift_out_U_leave 1601 nop 1602 ssm 0,0 1603 nop 1604 1605 sync ; RDR 23 write sequence 1606 ssm 0,0 1607 STDIAG (23) 1608 ssm 0,0 1609 b,n perf_rdr_shift_out_U_leave 1610 nop 1611 ssm 0,0 1612 nop 1613 1614 sync ; RDR 24 write sequence 1615 ssm 0,0 1616 STDIAG (24) 1617 ssm 0,0 1618 b,n perf_rdr_shift_out_U_leave 1619 nop 1620 ssm 0,0 1621 nop 1622 1623 sync ; RDR 25 write sequence 1624 ssm 0,0 1625 STDIAG (25) 1626 ssm 0,0 1627 b,n perf_rdr_shift_out_U_leave 1628 nop 1629 ssm 0,0 1630 nop 1631 1632 sync ; RDR 26 write sequence 1633 ssm 0,0 1634 STDIAG (26) 1635 ssm 0,0 1636 b,n perf_rdr_shift_out_U_leave 1637 nop 1638 ssm 0,0 1639 nop 1640 1641 sync ; RDR 27 write sequence 1642 ssm 0,0 1643 STDIAG (27) 1644 ssm 0,0 1645 b,n perf_rdr_shift_out_U_leave 1646 nop 1647 ssm 0,0 1648 nop 1649 1650 sync ; RDR 28 write sequence 1651 ssm 0,0 1652 STDIAG (28) 1653 ssm 0,0 1654 b,n perf_rdr_shift_out_U_leave 1655 nop 1656 ssm 0,0 1657 nop 1658 1659 sync ; RDR 29 write sequence 1660 ssm 0,0 1661 STDIAG (29) 1662 ssm 0,0 1663 b,n perf_rdr_shift_out_U_leave 1664 nop 1665 ssm 0,0 1666 nop 1667 1668 sync ; RDR 30 write sequence 1669 ssm 0,0 1670 STDIAG (30) 1671 ssm 0,0 1672 b,n perf_rdr_shift_out_U_leave 1673 nop 1674 ssm 0,0 1675 nop 1676 1677 sync ; RDR 31 write sequence 1678 ssm 0,0 1679 STDIAG (31) 1680 ssm 0,0 1681 b,n perf_rdr_shift_out_U_leave 1682 nop 1683 ssm 0,0 1684 nop 1685 1686perf_rdr_shift_out_U_leave: 1687 bve (%r2) 1688 .exit 1689 MTDIAG_2 (23) ; restore DR2 1690 .procend 1691ENDPROC(perf_rdr_shift_out_U) 1692 1693