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