1 /*
2  *  blname.c - determine the freebl library name.
3  *  This Source Code Form is subject to the terms of the Mozilla Public
4  *  License, v. 2.0. If a copy of the MPL was not distributed with this
5  *  file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #if defined(FREEBL_LOWHASH)
8 static const char* default_name =
9     SHLIB_PREFIX "freeblpriv" SHLIB_VERSION "." SHLIB_SUFFIX;
10 #else
11 static const char* default_name =
12     SHLIB_PREFIX "freebl" SHLIB_VERSION "." SHLIB_SUFFIX;
13 #endif
14 
15 /* getLibName() returns the name of the library to load. */
16 
17 #if defined(SOLARIS) && defined(__sparc)
18 #include <stddef.h>
19 #include <strings.h>
20 #include <sys/systeminfo.h>
21 
22 #if defined(NSS_USE_64)
23 
24 const static char fpu_hybrid_shared_lib[] = "libfreebl_64fpu_3.so";
25 const static char int_hybrid_shared_lib[] = "libfreebl_64int_3.so";
26 const static char non_hybrid_shared_lib[] = "libfreebl_64fpu_3.so";
27 
28 const static char int_hybrid_isa[] = "sparcv9";
29 const static char fpu_hybrid_isa[] = "sparcv9+vis";
30 
31 #else
32 
33 const static char fpu_hybrid_shared_lib[] = "libfreebl_32fpu_3.so";
34 const static char int_hybrid_shared_lib[] = "libfreebl_32int64_3.so";
35 /* This was for SPARC V8, now obsolete. */
36 const static char* const non_hybrid_shared_lib = NULL;
37 
38 const static char int_hybrid_isa[] = "sparcv8plus";
39 const static char fpu_hybrid_isa[] = "sparcv8plus+vis";
40 
41 #endif
42 
43 static const char*
getLibName(void)44 getLibName(void)
45 {
46     char* found_int_hybrid;
47     char* found_fpu_hybrid;
48     long buflen;
49     char buf[256];
50 
51     buflen = sysinfo(SI_ISALIST, buf, sizeof buf);
52     if (buflen <= 0)
53         return NULL;
54     /* sysinfo output is always supposed to be NUL terminated, but ... */
55     if (buflen < sizeof buf)
56         buf[buflen] = '\0';
57     else
58         buf[(sizeof buf) - 1] = '\0';
59     /* The ISA list is a space separated string of names of ISAs and
60      * ISA extensions, in order of decreasing performance.
61      * There are two different ISAs with which NSS's crypto code can be
62      * accelerated. If both are in the list, we take the first one.
63      * If one is in the list, we use it, and if neither then we use
64      * the base unaccelerated code.
65      */
66     found_int_hybrid = strstr(buf, int_hybrid_isa);
67     found_fpu_hybrid = strstr(buf, fpu_hybrid_isa);
68     if (found_fpu_hybrid &&
69         (!found_int_hybrid ||
70          (found_int_hybrid - found_fpu_hybrid) >= 0)) {
71         return fpu_hybrid_shared_lib;
72     }
73     if (found_int_hybrid) {
74         return int_hybrid_shared_lib;
75     }
76     return non_hybrid_shared_lib;
77 }
78 
79 #elif defined(HPUX) && !defined(NSS_USE_64) && !defined(__ia64)
80 #include <unistd.h>
81 
82 /* This code tests to see if we're running on a PA2.x CPU.
83 ** It returns true (1) if so, and false (0) otherwise.
84 */
85 static const char*
getLibName(void)86 getLibName(void)
87 {
88     long cpu = sysconf(_SC_CPU_VERSION);
89     return (cpu == CPU_PA_RISC2_0)
90                ? "libfreebl_32fpu_3.sl"
91                : "libfreebl_32int_3.sl";
92 }
93 #else
94 /* default case, for platforms/ABIs that have only one freebl shared lib. */
95 static const char*
getLibName(void)96 getLibName(void)
97 {
98     return default_name;
99 }
100 #endif
101