OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 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 | 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/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | 4 |
5 #include "mpi.h" | 5 #include "mpi.h" |
| 6 #include "prtypes.h" |
6 | 7 |
7 /* | 8 /* |
8 * This file implements a single function: s_mpi_getProcessorLineSize(); | 9 * This file implements a single function: s_mpi_getProcessorLineSize(); |
9 * s_mpi_getProcessorLineSize() returns the size in bytes of the cache line | 10 * s_mpi_getProcessorLineSize() returns the size in bytes of the cache line |
10 * if a cache exists, or zero if there is no cache. If more than one | 11 * if a cache exists, or zero if there is no cache. If more than one |
11 * cache line exists, it should return the smallest line size (which is | 12 * cache line exists, it should return the smallest line size (which is |
12 * usually the L1 cache). | 13 * usually the L1 cache). |
13 * | 14 * |
14 * mp_modexp uses this information to make sure that private key information | 15 * mp_modexp uses this information to make sure that private key information |
15 * isn't being leaked through the cache. | 16 * isn't being leaked through the cache. |
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 | 613 |
613 | 614 |
614 #define MAN_UNKNOWN 9 | 615 #define MAN_UNKNOWN 9 |
615 | 616 |
616 #if !defined(AMD_64) | 617 #if !defined(AMD_64) |
617 #define SSE2_FLAG (1<<26) | 618 #define SSE2_FLAG (1<<26) |
618 unsigned long | 619 unsigned long |
619 s_mpi_is_sse2() | 620 s_mpi_is_sse2() |
620 { | 621 { |
621 unsigned long eax, ebx, ecx, edx; | 622 unsigned long eax, ebx, ecx, edx; |
622 int manufacturer = MAN_UNKNOWN; | |
623 int i; | |
624 char string[13]; | |
625 | 623 |
626 if (is386() || is486()) { | 624 if (is386() || is486()) { |
627 return 0; | 625 return 0; |
628 } | 626 } |
629 freebl_cpuid(0, &eax, &ebx, &ecx, &edx); | 627 freebl_cpuid(0, &eax, &ebx, &ecx, &edx); |
630 /* string holds the CPU's manufacturer ID string - a twelve | |
631 * character ASCII string stored in ebx, edx, ecx, and | |
632 * the 32-bit extended feature flags are in edx, ecx. | |
633 */ | |
634 *(int *)string = ebx; | |
635 *(int *)&string[4] = (int)edx; | |
636 *(int *)&string[8] = (int)ecx; | |
637 string[12] = 0; | |
638 | 628 |
639 /* has no SSE2 extensions */ | 629 /* has no SSE2 extensions */ |
640 if (eax == 0) { | 630 if (eax == 0) { |
641 return 0; | 631 return 0; |
642 } | 632 } |
643 | 633 |
644 for (i=0; i < n_manufacturers; i++) { | |
645 if ( strcmp(manMap[i],string) == 0) { | |
646 manufacturer = i; | |
647 break; | |
648 } | |
649 } | |
650 | |
651 freebl_cpuid(1,&eax,&ebx,&ecx,&edx); | 634 freebl_cpuid(1,&eax,&ebx,&ecx,&edx); |
652 return (edx & SSE2_FLAG) == SSE2_FLAG; | 635 return (edx & SSE2_FLAG) == SSE2_FLAG; |
653 } | 636 } |
654 #endif | 637 #endif |
655 | 638 |
656 unsigned long | 639 unsigned long |
657 s_mpi_getProcessorLineSize() | 640 s_mpi_getProcessorLineSize() |
658 { | 641 { |
659 unsigned long eax, ebx, ecx, edx; | 642 unsigned long eax, ebx, ecx, edx; |
| 643 PRUint32 cpuid[3]; |
660 unsigned long cpuidLevel; | 644 unsigned long cpuidLevel; |
661 unsigned long cacheLineSize = 0; | 645 unsigned long cacheLineSize = 0; |
662 int manufacturer = MAN_UNKNOWN; | 646 int manufacturer = MAN_UNKNOWN; |
663 int i; | 647 int i; |
664 char string[65]; | 648 char string[13]; |
665 | 649 |
666 #if !defined(AMD_64) | 650 #if !defined(AMD_64) |
667 if (is386()) { | 651 if (is386()) { |
668 return 0; /* 386 had no cache */ | 652 return 0; /* 386 had no cache */ |
669 } if (is486()) { | 653 } if (is486()) { |
670 return 32; /* really? need more info */ | 654 return 32; /* really? need more info */ |
671 } | 655 } |
672 #endif | 656 #endif |
673 | 657 |
674 /* Pentium, cpuid command is available */ | 658 /* Pentium, cpuid command is available */ |
675 freebl_cpuid(0, &eax, &ebx, &ecx, &edx); | 659 freebl_cpuid(0, &eax, &ebx, &ecx, &edx); |
676 cpuidLevel = eax; | 660 cpuidLevel = eax; |
677 /* string holds the CPU's manufacturer ID string - a twelve | 661 /* string holds the CPU's manufacturer ID string - a twelve |
678 * character ASCII string stored in ebx, edx, ecx, and | 662 * character ASCII string stored in ebx, edx, ecx, and |
679 * the 32-bit extended feature flags are in edx, ecx. | 663 * the 32-bit extended feature flags are in edx, ecx. |
680 */ | 664 */ |
681 *(int *)string = ebx; | 665 cpuid[0] = ebx; |
682 *(int *)&string[4] = (int)edx; | 666 cpuid[1] = ecx; |
683 *(int *)&string[8] = (int)ecx; | 667 cpuid[2] = edx; |
| 668 memcpy(string, cpuid, sizeof(cpuid)); |
684 string[12] = 0; | 669 string[12] = 0; |
685 | 670 |
686 manufacturer = MAN_UNKNOWN; | 671 manufacturer = MAN_UNKNOWN; |
687 for (i=0; i < n_manufacturers; i++) { | 672 for (i=0; i < n_manufacturers; i++) { |
688 if ( strcmp(manMap[i],string) == 0) { | 673 if ( strcmp(manMap[i],string) == 0) { |
689 manufacturer = i; | 674 manufacturer = i; |
690 } | 675 } |
691 } | 676 } |
692 | 677 |
693 if (manufacturer == INTEL) { | 678 if (manufacturer == INTEL) { |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 #endif | 789 #endif |
805 | 790 |
806 #ifdef TEST_IT | 791 #ifdef TEST_IT |
807 #include <stdio.h> | 792 #include <stdio.h> |
808 | 793 |
809 main() | 794 main() |
810 { | 795 { |
811 printf("line size = %d\n", s_mpi_getProcessorLineSize()); | 796 printf("line size = %d\n", s_mpi_getProcessorLineSize()); |
812 } | 797 } |
813 #endif | 798 #endif |
OLD | NEW |