src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp

Tue, 23 Nov 2010 13:22:55 -0800

author
stefank
date
Tue, 23 Nov 2010 13:22:55 -0800
changeset 2314
f95d63e2154a
parent 2269
ae065c367d93
child 2403
c04052fd6ae1
permissions
-rw-r--r--

6989984: Use standard include model for Hospot
Summary: Replaced MakeDeps and the includeDB files with more standardized solutions.
Reviewed-by: coleenp, kvn, kamg

     1 /*
     2  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "runtime/os.hpp"
    27 #include "vm_version_sparc.hpp"
    29 # include <sys/auxv.h>
    30 # include <sys/auxv_SPARC.h>
    31 # include <sys/systeminfo.h>
    33 // We need to keep these here as long as we have to build on Solaris
    34 // versions before 10.
    35 #ifndef SI_ARCHITECTURE_32
    36 #define SI_ARCHITECTURE_32      516     /* basic 32-bit SI_ARCHITECTURE */
    37 #endif
    39 #ifndef SI_ARCHITECTURE_64
    40 #define SI_ARCHITECTURE_64      517     /* basic 64-bit SI_ARCHITECTURE */
    41 #endif
    43 static void do_sysinfo(int si, const char* string, int* features, int mask) {
    44   char   tmp;
    45   size_t bufsize = sysinfo(si, &tmp, 1);
    47   // All SI defines used below must be supported.
    48   guarantee(bufsize != -1, "must be supported");
    50   char* buf = (char*) malloc(bufsize);
    52   if (buf == NULL)
    53     return;
    55   if (sysinfo(si, buf, bufsize) == bufsize) {
    56     // Compare the string.
    57     if (strcmp(buf, string) == 0) {
    58       *features |= mask;
    59     }
    60   }
    62   free(buf);
    63 }
    65 int VM_Version::platform_features(int features) {
    66   // getisax(2), SI_ARCHITECTURE_32, and SI_ARCHITECTURE_64 are
    67   // supported on Solaris 10 and later.
    68   if (os::Solaris::supports_getisax()) {
    70     // Check 32-bit architecture.
    71     do_sysinfo(SI_ARCHITECTURE_32, "sparc", &features, v8_instructions_m);
    73     // Check 64-bit architecture.
    74     do_sysinfo(SI_ARCHITECTURE_64, "sparcv9", &features, generic_v9_m);
    76     // Extract valid instruction set extensions.
    77     uint_t av;
    78     uint_t avn = os::Solaris::getisax(&av, 1);
    79     assert(avn == 1, "should only return one av");
    81 #ifndef PRODUCT
    82     if (PrintMiscellaneous && Verbose)
    83       tty->print_cr("getisax(2) returned: " PTR32_FORMAT, av);
    84 #endif
    86     if (av & AV_SPARC_MUL32)  features |= hardware_mul32_m;
    87     if (av & AV_SPARC_DIV32)  features |= hardware_div32_m;
    88     if (av & AV_SPARC_FSMULD) features |= hardware_fsmuld_m;
    89     if (av & AV_SPARC_V8PLUS) features |= v9_instructions_m;
    90     if (av & AV_SPARC_POPC)   features |= hardware_popc_m;
    91     if (av & AV_SPARC_VIS)    features |= vis1_instructions_m;
    92     if (av & AV_SPARC_VIS2)   features |= vis2_instructions_m;
    94     // Next values are not defined before Solaris 10
    95     // but Solaris 8 is used for jdk6 update builds.
    96 #ifndef AV_SPARC_ASI_BLK_INIT
    97 #define AV_SPARC_ASI_BLK_INIT 0x0080  /* ASI_BLK_INIT_xxx ASI */
    98 #endif
    99 #ifndef AV_SPARC_FMAF
   100 #define AV_SPARC_FMAF 0x0100  /* Sparc64 Fused Multiply-Add */
   101 #endif
   102     if (av & AV_SPARC_ASI_BLK_INIT) features |= blk_init_instructions_m;
   103     if (av & AV_SPARC_FMAF)         features |= fmaf_instructions_m;
   104   } else {
   105     // getisax(2) failed, use the old legacy code.
   106 #ifndef PRODUCT
   107     if (PrintMiscellaneous && Verbose)
   108       tty->print_cr("getisax(2) is not supported.");
   109 #endif
   111     char   tmp;
   112     size_t bufsize = sysinfo(SI_ISALIST, &tmp, 1);
   113     char*  buf     = (char*) malloc(bufsize);
   115     if (buf != NULL) {
   116       if (sysinfo(SI_ISALIST, buf, bufsize) == bufsize) {
   117         // Figure out what kind of sparc we have
   118         char *sparc_string = strstr(buf, "sparc");
   119         if (sparc_string != NULL) {              features |= v8_instructions_m;
   120           if (sparc_string[5] == 'v') {
   121             if (sparc_string[6] == '8') {
   122               if (sparc_string[7] == '-') {      features |= hardware_mul32_m;
   123                                                  features |= hardware_div32_m;
   124               } else if (sparc_string[7] == 'p') features |= generic_v9_m;
   125               else                               features |= generic_v8_m;
   126             } else if (sparc_string[6] == '9')   features |= generic_v9_m;
   127           }
   128         }
   130         // Check for visualization instructions
   131         char *vis = strstr(buf, "vis");
   132         if (vis != NULL) {                       features |= vis1_instructions_m;
   133           if (vis[3] == '2')                     features |= vis2_instructions_m;
   134         }
   135       }
   136       free(buf);
   137     }
   138   }
   140   // Determine the machine type.
   141   do_sysinfo(SI_MACHINE, "sun4v", &features, sun4v_m);
   143   return features;
   144 }

mercurial