1/ This Source Code Form is subject to the terms of the Mozilla Public 2/ License, v. 2.0. If a copy of the MPL was not distributed with this 3/ file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 .file "mpcpucache.c" 6/ .section .rodata.str1.1,"aMS",@progbits,1 7 .section .rodata 8.LC0: 9 .string "GenuineIntel" 10.LC1: 11 .string "AuthenticAMD" 12.LC2: 13 .string "CyrixInstead" 14.LC3: 15 .string "CentaurHauls" 16.LC4: 17 .string "NexGenDriven" 18.LC5: 19 .string "GenuineTMx86" 20.LC6: 21 .string "RiseRiseRise" 22.LC7: 23 .string "UMC UMC UMC " 24.LC8: 25 .string "Sis Sis Sis " 26.LC9: 27 .string "Geode by NSC" 28 .section .data.rel.ro.local,"aw",@progbits 29 .align 32 30 .type manMap, @object 31 .size manMap, 80 32manMap: 33 .quad .LC0 34 .quad .LC1 35 .quad .LC2 36 .quad .LC3 37 .quad .LC4 38 .quad .LC5 39 .quad .LC6 40 .quad .LC7 41 .quad .LC8 42 .quad .LC9 43 .section .rodata 44 .align 32 45 .type CacheMap, @object 46 .size CacheMap, 512 47CacheMap: 48 .byte 0 49 .byte 0 50 .byte 3 51 .byte 0 52 .byte 3 53 .byte 0 54 .byte 4 55 .byte 0 56 .byte 4 57 .zero 1 58 .byte 1 59 .byte 0 60 .byte 7 61 .byte 32 62 .byte 1 63 .byte 0 64 .byte 7 65 .byte 32 66 .byte 1 67 .byte 0 68 .byte 8 69 .byte 32 70 .byte 1 71 .byte 0 72 .byte 8 73 .byte 32 74 .byte 1 75 .byte 0 76 .byte 1 77 .byte 0 78 .byte 1 79 .byte 0 80 .byte 1 81 .byte 0 82 .byte 1 83 .byte 0 84 .byte 1 85 .byte 0 86 .byte 1 87 .byte 0 88 .byte 1 89 .byte 0 90 .byte 1 91 .byte 0 92 .byte 1 93 .byte 0 94 .byte 1 95 .byte 0 96 .byte 1 97 .byte 0 98 .byte 1 99 .byte 0 100 .byte 1 101 .byte 0 102 .byte 1 103 .byte 0 104 .byte 1 105 .byte 0 106 .byte 1 107 .byte 0 108 .byte 1 109 .byte 0 110 .byte 1 111 .byte 0 112 .byte 1 113 .byte 0 114 .byte 1 115 .byte 0 116 .byte 12 117 .byte 64 118 .byte 12 119 .byte 64 120 .byte 1 121 .byte 0 122 .byte 12 123 .byte 64 124 .byte 1 125 .byte 0 126 .byte 1 127 .byte 0 128 .byte 1 129 .byte 0 130 .byte 12 131 .byte 64 132 .byte 1 133 .byte 0 134 .byte 1 135 .byte 0 136 .byte 8 137 .byte 64 138 .byte 1 139 .byte 0 140 .byte 1 141 .byte 0 142 .byte 1 143 .byte 0 144 .byte 7 145 .byte 64 146 .byte 1 147 .byte 0 148 .byte 1 149 .byte 0 150 .byte 1 151 .byte 0 152 .byte 1 153 .byte 0 154 .byte 1 155 .byte 0 156 .byte 1 157 .byte 0 158 .byte 1 159 .byte 0 160 .byte 1 161 .byte 0 162 .byte 9 163 .byte 64 164 .byte 1 165 .byte 0 166 .byte 9 167 .byte 64 168 .byte 9 169 .byte 64 170 .byte 1 171 .byte 0 172 .byte 1 173 .byte 0 174 .byte 1 175 .byte 0 176 .byte 9 177 .byte 0 178 .byte 9 179 .byte 32 180 .byte 9 181 .byte 32 182 .byte 9 183 .byte 32 184 .byte 9 185 .byte 32 186 .byte 9 187 .byte 32 188 .byte 1 189 .byte 0 190 .byte 1 191 .byte 0 192 .byte 1 193 .byte 0 194 .byte 1 195 .byte 0 196 .byte 1 197 .byte 0 198 .byte 1 199 .byte 0 200 .byte 1 201 .byte 0 202 .byte 1 203 .byte 0 204 .byte 1 205 .byte 0 206 .byte 1 207 .byte 0 208 .byte 3 209 .byte 0 210 .byte 3 211 .byte 0 212 .byte 3 213 .byte 0 214 .byte 1 215 .byte 0 216 .byte 1 217 .byte 0 218 .byte 1 219 .byte 0 220 .byte 1 221 .byte 0 222 .byte 1 223 .byte 0 224 .byte 1 225 .byte 0 226 .byte 1 227 .byte 0 228 .byte 1 229 .byte 0 230 .byte 4 231 .byte 0 232 .byte 4 233 .byte 0 234 .byte 4 235 .byte 0 236 .byte 1 237 .byte 0 238 .byte 1 239 .byte 0 240 .byte 1 241 .byte 0 242 .byte 1 243 .byte 0 244 .byte 1 245 .byte 0 246 .byte 1 247 .byte 0 248 .byte 1 249 .byte 0 250 .byte 1 251 .byte 0 252 .byte 8 253 .byte 64 254 .byte 8 255 .byte 64 256 .byte 8 257 .byte 64 258 .byte 1 259 .byte 0 260 .byte 1 261 .byte 0 262 .byte 1 263 .byte 0 264 .byte 1 265 .byte 0 266 .byte 1 267 .byte 0 268 .byte 1 269 .byte 0 270 .byte 1 271 .byte 0 272 .byte 5 273 .byte 1 274 .byte 5 275 .byte 1 276 .byte 5 277 .byte 1 278 .byte 1 279 .byte 0 280 .byte 1 281 .byte 0 282 .byte 1 283 .byte 0 284 .byte 1 285 .byte 0 286 .byte 1 287 .byte 0 288 .byte 1 289 .byte 0 290 .byte 9 291 .byte 64 292 .byte 9 293 .byte 64 294 .byte 9 295 .byte 64 296 .byte 9 297 .byte 64 298 .byte 1 299 .byte 0 300 .byte 1 301 .byte 0 302 .byte 1 303 .byte 0 304 .byte 1 305 .byte 0 306 .byte 1 307 .byte 0 308 .byte 9 309 .byte 32 310 .byte 9 311 .byte 32 312 .byte 9 313 .byte 32 314 .byte 9 315 .byte 32 316 .byte 9 317 .byte 64 318 .byte 9 319 .byte 64 320 .byte 1 321 .byte 0 322 .byte 1 323 .byte 0 324 .byte 1 325 .byte 0 326 .byte 1 327 .byte 0 328 .byte 1 329 .byte 0 330 .byte 1 331 .byte 0 332 .byte 1 333 .byte 0 334 .byte 1 335 .byte 0 336 .byte 1 337 .byte 0 338 .byte 1 339 .byte 0 340 .byte 1 341 .byte 0 342 .byte 1 343 .byte 0 344 .byte 1 345 .byte 0 346 .byte 1 347 .byte 0 348 .byte 1 349 .byte 0 350 .byte 1 351 .byte 0 352 .byte 1 353 .byte 0 354 .byte 1 355 .byte 0 356 .byte 1 357 .byte 0 358 .byte 1 359 .byte 0 360 .byte 1 361 .byte 0 362 .byte 1 363 .byte 0 364 .byte 1 365 .byte 0 366 .byte 1 367 .byte 0 368 .byte 1 369 .byte 0 370 .byte 1 371 .byte 0 372 .byte 1 373 .byte 0 374 .byte 1 375 .byte 0 376 .byte 1 377 .byte 0 378 .byte 1 379 .byte 0 380 .byte 1 381 .byte 0 382 .byte 1 383 .byte 0 384 .byte 1 385 .byte 0 386 .byte 1 387 .byte 0 388 .byte 1 389 .byte 0 390 .byte 1 391 .byte 0 392 .byte 1 393 .byte 0 394 .byte 1 395 .byte 0 396 .byte 1 397 .byte 0 398 .byte 1 399 .byte 0 400 .byte 3 401 .byte 0 402 .byte 1 403 .byte 0 404 .byte 1 405 .byte 0 406 .byte 4 407 .byte 0 408 .byte 1 409 .byte 0 410 .byte 1 411 .byte 0 412 .byte 1 413 .byte 0 414 .byte 1 415 .byte 0 416 .byte 1 417 .byte 0 418 .byte 1 419 .byte 0 420 .byte 1 421 .byte 0 422 .byte 1 423 .byte 0 424 .byte 1 425 .byte 0 426 .byte 1 427 .byte 0 428 .byte 1 429 .byte 0 430 .byte 1 431 .byte 0 432 .byte 1 433 .byte 0 434 .byte 1 435 .byte 0 436 .byte 1 437 .byte 0 438 .byte 1 439 .byte 0 440 .byte 1 441 .byte 0 442 .byte 1 443 .byte 0 444 .byte 1 445 .byte 0 446 .byte 1 447 .byte 0 448 .byte 1 449 .byte 0 450 .byte 1 451 .byte 0 452 .byte 1 453 .byte 0 454 .byte 1 455 .byte 0 456 .byte 1 457 .byte 0 458 .byte 1 459 .byte 0 460 .byte 1 461 .byte 0 462 .byte 1 463 .byte 0 464 .byte 1 465 .byte 0 466 .byte 1 467 .byte 0 468 .byte 1 469 .byte 0 470 .byte 1 471 .byte 0 472 .byte 1 473 .byte 0 474 .byte 1 475 .byte 0 476 .byte 1 477 .byte 0 478 .byte 1 479 .byte 0 480 .byte 1 481 .byte 0 482 .byte 1 483 .byte 0 484 .byte 1 485 .byte 0 486 .byte 1 487 .byte 0 488 .byte 1 489 .byte 0 490 .byte 1 491 .byte 0 492 .byte 1 493 .byte 0 494 .byte 1 495 .byte 0 496 .byte 1 497 .byte 0 498 .byte 1 499 .byte 0 500 .byte 1 501 .byte 0 502 .byte 1 503 .byte 0 504 .byte 1 505 .byte 0 506 .byte 1 507 .byte 0 508 .byte 1 509 .byte 0 510 .byte 1 511 .byte 0 512 .byte 1 513 .byte 0 514 .byte 1 515 .byte 0 516 .byte 1 517 .byte 0 518 .byte 1 519 .byte 0 520 .byte 1 521 .byte 0 522 .byte 1 523 .byte 0 524 .byte 1 525 .byte 0 526 .byte 1 527 .byte 0 528 .byte 1 529 .byte 0 530 .byte 1 531 .byte 0 532 .byte 1 533 .byte 0 534 .byte 1 535 .byte 0 536 .byte 1 537 .byte 0 538 .byte 1 539 .byte 0 540 .byte 1 541 .byte 0 542 .byte 1 543 .byte 0 544 .byte 1 545 .byte 0 546 .byte 1 547 .byte 0 548 .byte 1 549 .byte 0 550 .byte 1 551 .byte 0 552 .byte 1 553 .byte 0 554 .byte 1 555 .byte 0 556 .byte 1 557 .byte 0 558 .byte 1 559 .byte 0 560 .text 561 .align 16 562.globl freebl_cpuid 563 .type freebl_cpuid, @function 564freebl_cpuid: 565.LFB2: 566 movq %rdx, %r10 567 pushq %rbx 568.LCFI0: 569 movq %rcx, %r11 570 movq %rdi, %rax 571/APP 572 cpuid 573 574/NO_APP 575 movq %rax, (%rsi) 576 movq %rbx, (%r10) 577 popq %rbx 578 movq %rcx, (%r11) 579 movq %rdx, (%r8) 580 ret 581.LFE2: 582 .size freebl_cpuid, .-freebl_cpuid 583 .align 16 584 .type getIntelCacheEntryLineSize, @function 585getIntelCacheEntryLineSize: 586.LFB3: 587 leaq CacheMap(%rip), %r9 588 movq %rdx, %r10 589 movzbl 1(%r9,%rdi,2), %ecx 590 movzbl (%r9,%rdi,2), %r8d 591 testb %cl, %cl 592 je .L2 593 cmpl $6, %r8d 594 sete %dl 595 cmpl $8, %r8d 596 sete %al 597 orl %edx, %eax 598 testb $1, %al 599 je .L4 600 movl $1, (%rsi) 601.L9: 602 movzbl %cl, %eax 603 movq %rax, (%r10) 604 ret 605 .align 16 606.L4: 607 movl (%rsi), %r11d 608 cmpl $1, %r11d 609 jg .L11 610.L6: 611 cmpl $2, %r11d 612 jle .L2 613 cmpl $12, %r8d 614 sete %dl 615 cmpl $14, %r8d 616 sete %al 617 orl %edx, %eax 618 testb $1, %al 619 je .L2 620 movzbq 1(%r9,%rdi,2), %rax 621 movl $3, (%rsi) 622 movq %rax, (%r10) 623 .align 16 624.L2: 625 rep ; ret 626 .align 16 627.L11: 628 cmpl $9, %r8d 629 sete %dl 630 cmpl $11, %r8d 631 sete %al 632 orl %edx, %eax 633 testb $1, %al 634 je .L6 635 movl $2, (%rsi) 636 jmp .L9 637.LFE3: 638 .size getIntelCacheEntryLineSize, .-getIntelCacheEntryLineSize 639 .align 16 640 .type getIntelRegisterCacheLineSize, @function 641getIntelRegisterCacheLineSize: 642.LFB4: 643 pushq %rbp 644.LCFI1: 645 movq %rsp, %rbp 646.LCFI2: 647 movq %rbx, -24(%rbp) 648.LCFI3: 649 movq %rdi, %rbx 650 shrq $24, %rdi 651 movq %r12, -16(%rbp) 652.LCFI4: 653 movq %r13, -8(%rbp) 654.LCFI5: 655 andl $255, %edi 656 subq $24, %rsp 657.LCFI6: 658 movq %rsi, %r13 659 movq %rdx, %r12 660 call getIntelCacheEntryLineSize 661 movq %rbx, %rdi 662 movq %r12, %rdx 663 movq %r13, %rsi 664 shrq $16, %rdi 665 andl $255, %edi 666 call getIntelCacheEntryLineSize 667 movq %rbx, %rdi 668 movq %r12, %rdx 669 movq %r13, %rsi 670 shrq $8, %rdi 671 andl $255, %ebx 672 andl $255, %edi 673 call getIntelCacheEntryLineSize 674 movq %r12, %rdx 675 movq %r13, %rsi 676 movq %rbx, %rdi 677 movq 8(%rsp), %r12 678 movq (%rsp), %rbx 679 movq 16(%rsp), %r13 680 leave 681 jmp getIntelCacheEntryLineSize 682.LFE4: 683 .size getIntelRegisterCacheLineSize, .-getIntelRegisterCacheLineSize 684 .align 16 685.globl s_mpi_getProcessorLineSize 686 .type s_mpi_getProcessorLineSize, @function 687s_mpi_getProcessorLineSize: 688.LFB7: 689 pushq %rbp 690.LCFI7: 691 xorl %edi, %edi 692 movq %rsp, %rbp 693.LCFI8: 694 pushq %r15 695.LCFI9: 696 leaq -136(%rbp), %r8 697 leaq -144(%rbp), %rcx 698 leaq -152(%rbp), %rdx 699 pushq %r14 700.LCFI10: 701 leaq -160(%rbp), %rsi 702 leaq -128(%rbp), %r14 703 pushq %r13 704.LCFI11: 705 leaq manMap(%rip), %r13 706 pushq %r12 707.LCFI12: 708 movl $9, %r12d 709 pushq %rbx 710.LCFI13: 711 xorl %ebx, %ebx 712 subq $200, %rsp 713.LCFI14: 714 call freebl_cpuid 715 movq -152(%rbp), %rax 716 movq -160(%rbp), %r15 717 movb $0, -116(%rbp) 718 movl %eax, -128(%rbp) 719 movq -136(%rbp), %rax 720 movl %eax, -124(%rbp) 721 movq -144(%rbp), %rax 722 movl %eax, -120(%rbp) 723 .align 16 724.L18: 725 movslq %ebx,%rax 726 movq %r14, %rsi 727 movq (%r13,%rax,8), %rdi 728 call strcmp@PLT 729 testl %eax, %eax 730 cmove %ebx, %r12d 731 incl %ebx 732 cmpl $9, %ebx 733 jle .L18 734 testl %r12d, %r12d 735 jne .L19 736 xorl %eax, %eax 737 decl %r15d 738 movl $4, -204(%rbp) 739 movq $0, -200(%rbp) 740 jle .L21 741 leaq -168(%rbp), %r8 742 leaq -176(%rbp), %rcx 743 leaq -184(%rbp), %rdx 744 leaq -192(%rbp), %rsi 745 movl $2, %edi 746 xorl %ebx, %ebx 747 call freebl_cpuid 748 movq -192(%rbp), %rdi 749 movl %edi, %r12d 750 andl $15, %r12d 751 cmpl %r12d, %ebx 752 jl .L30 753 jmp .L38 754 .align 16 755.L25: 756 movq -184(%rbp), %rdi 757 testl $2147483648, %edi 758 je .L40 759.L26: 760 movq -176(%rbp), %rdi 761 testl $2147483648, %edi 762 je .L41 763.L27: 764 movq -168(%rbp), %rdi 765 testl $2147483648, %edi 766 je .L42 767.L28: 768 incl %ebx 769 cmpl %r12d, %ebx 770 je .L24 771 leaq -168(%rbp), %r8 772 leaq -176(%rbp), %rcx 773 leaq -184(%rbp), %rdx 774 leaq -192(%rbp), %rsi 775 movl $2, %edi 776 call freebl_cpuid 777.L24: 778 cmpl %r12d, %ebx 779 jge .L38 780 movq -192(%rbp), %rdi 781.L30: 782 testl $2147483648, %edi 783 jne .L25 784 leaq -200(%rbp), %rdx 785 leaq -204(%rbp), %rsi 786 andl $4294967040, %edi 787 call getIntelRegisterCacheLineSize 788 movq -184(%rbp), %rdi 789 testl $2147483648, %edi 790 jne .L26 791.L40: 792 leaq -200(%rbp), %rdx 793 leaq -204(%rbp), %rsi 794 call getIntelRegisterCacheLineSize 795 movq -176(%rbp), %rdi 796 testl $2147483648, %edi 797 jne .L27 798.L41: 799 leaq -200(%rbp), %rdx 800 leaq -204(%rbp), %rsi 801 call getIntelRegisterCacheLineSize 802 movq -168(%rbp), %rdi 803 testl $2147483648, %edi 804 jne .L28 805.L42: 806 leaq -200(%rbp), %rdx 807 leaq -204(%rbp), %rsi 808 call getIntelRegisterCacheLineSize 809 jmp .L28 810.L38: 811 movq -200(%rbp), %rax 812.L21: 813 movq %rax, %rdx 814 movl $32, %eax 815 testq %rdx, %rdx 816 cmoveq %rax, %rdx 817 addq $200, %rsp 818 popq %rbx 819 popq %r12 820 popq %r13 821 popq %r14 822 popq %r15 823 leave 824 movq %rdx, %rax 825 ret 826.L19: 827 leaq -216(%rbp), %r8 828 leaq -224(%rbp), %rcx 829 leaq -232(%rbp), %rdx 830 leaq -240(%rbp), %rsi 831 movl $2147483648, %edi 832 xorl %ebx, %ebx 833 call freebl_cpuid 834 movl $2147483652, %eax 835 cmpq %rax, -240(%rbp) 836 ja .L43 837.L32: 838 movq %rbx, %rdx 839 movl $32, %eax 840 testq %rdx, %rdx 841 cmoveq %rax, %rdx 842 addq $200, %rsp 843 popq %rbx 844 popq %r12 845 popq %r13 846 popq %r14 847 popq %r15 848 leave 849 movq %rdx, %rax 850 ret 851.L43: 852 leaq -216(%rbp), %r8 853 leaq -224(%rbp), %rcx 854 leaq -232(%rbp), %rdx 855 leaq -240(%rbp), %rsi 856 movl $2147483653, %edi 857 call freebl_cpuid 858 movzbq -224(%rbp), %rbx 859 jmp .L32 860.LFE7: 861 .size s_mpi_getProcessorLineSize, .-s_mpi_getProcessorLineSize 862