src/os/linux/vm/os_linux.cpp

Print this page
rev 9503 : 8073139: PPC64: User-visible arch directory and os.arch value on ppc64le cause issues with Java tooling
Contributed-by: Andrew Hughes gnu.andrew@redhat.com


1753 
1754 #ifndef EM_486
1755   #define EM_486          6               /* Intel 80486 */
1756 #endif
1757 #ifndef EM_AARCH64
1758   #define EM_AARCH64    183               /* ARM AARCH64 */
1759 #endif
1760 
1761   static const arch_t arch_array[]={
1762     {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1763     {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1764     {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
1765     {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
1766     {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1767     {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1768     {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
1769     {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
1770 #if defined(VM_LITTLE_ENDIAN)
1771     {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2LSB, (char*)"Power PC 64"},
1772 #else
1773     {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64"},
1774 #endif
1775     {EM_ARM,         EM_ARM,     ELFCLASS32,   ELFDATA2LSB, (char*)"ARM"},
1776     {EM_S390,        EM_S390,    ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
1777     {EM_ALPHA,       EM_ALPHA,   ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
1778     {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
1779     {EM_MIPS,        EM_MIPS,    ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
1780     {EM_PARISC,      EM_PARISC,  ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
1781     {EM_68K,         EM_68K,     ELFCLASS32, ELFDATA2MSB, (char*)"M68k"},
1782     {EM_AARCH64,     EM_AARCH64, ELFCLASS64, ELFDATA2LSB, (char*)"AARCH64"},
1783   };
1784 
1785 #if  (defined IA32)
1786   static  Elf32_Half running_arch_code=EM_386;
1787 #elif   (defined AMD64)
1788   static  Elf32_Half running_arch_code=EM_X86_64;
1789 #elif  (defined IA64)
1790   static  Elf32_Half running_arch_code=EM_IA_64;
1791 #elif  (defined __sparc) && (defined _LP64)
1792   static  Elf32_Half running_arch_code=EM_SPARCV9;
1793 #elif  (defined __sparc) && (!defined _LP64)


2196     }
2197     fclose(fp);
2198   }
2199 #endif // x86 platforms
2200   return false;
2201 }
2202 
2203 void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
2204   // Only print the model name if the platform provides this as a summary
2205   if (!print_model_name_and_flags(st, buf, buflen)) {
2206     st->print("\n/proc/cpuinfo:\n");
2207     if (!_print_ascii_file("/proc/cpuinfo", st)) {
2208       st->print_cr("  <Not Available>");
2209     }
2210   }
2211 }
2212 
2213 #if defined(AMD64) || defined(IA32) || defined(X32)
2214 const char* search_string = "model name";
2215 #elif defined(SPARC)


2216 const char* search_string = "cpu";
2217 #else
2218 const char* search_string = "Processor";
2219 #endif
2220 
2221 // Parses the cpuinfo file for string representing the model name.
2222 void os::get_summary_cpu_info(char* cpuinfo, size_t length) {
2223   FILE* fp = fopen("/proc/cpuinfo", "r");
2224   if (fp != NULL) {
2225     while (!feof(fp)) {
2226       char buf[256];
2227       if (fgets(buf, sizeof(buf), fp)) {
2228         char* start = strstr(buf, search_string);
2229         if (start != NULL) {
2230           char *ptr = start + strlen(search_string);
2231           char *end = buf + strlen(buf);
2232           while (ptr != end) {
2233              // skip whitespace and colon for the rest of the name.
2234              if (*ptr != ' ' && *ptr != '\t' && *ptr != ':') {
2235                break;




1753 
1754 #ifndef EM_486
1755   #define EM_486          6               /* Intel 80486 */
1756 #endif
1757 #ifndef EM_AARCH64
1758   #define EM_AARCH64    183               /* ARM AARCH64 */
1759 #endif
1760 
1761   static const arch_t arch_array[]={
1762     {EM_386,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1763     {EM_486,         EM_386,     ELFCLASS32, ELFDATA2LSB, (char*)"IA 32"},
1764     {EM_IA_64,       EM_IA_64,   ELFCLASS64, ELFDATA2LSB, (char*)"IA 64"},
1765     {EM_X86_64,      EM_X86_64,  ELFCLASS64, ELFDATA2LSB, (char*)"AMD 64"},
1766     {EM_SPARC,       EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1767     {EM_SPARC32PLUS, EM_SPARC,   ELFCLASS32, ELFDATA2MSB, (char*)"Sparc 32"},
1768     {EM_SPARCV9,     EM_SPARCV9, ELFCLASS64, ELFDATA2MSB, (char*)"Sparc v9 64"},
1769     {EM_PPC,         EM_PPC,     ELFCLASS32, ELFDATA2MSB, (char*)"Power PC 32"},
1770 #if defined(VM_LITTLE_ENDIAN)
1771     {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2LSB, (char*)"Power PC 64"},
1772 #else
1773     {EM_PPC64,       EM_PPC64,   ELFCLASS64, ELFDATA2MSB, (char*)"Power PC 64 LE"},
1774 #endif
1775     {EM_ARM,         EM_ARM,     ELFCLASS32,   ELFDATA2LSB, (char*)"ARM"},
1776     {EM_S390,        EM_S390,    ELFCLASSNONE, ELFDATA2MSB, (char*)"IBM System/390"},
1777     {EM_ALPHA,       EM_ALPHA,   ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"},
1778     {EM_MIPS_RS3_LE, EM_MIPS_RS3_LE, ELFCLASS32, ELFDATA2LSB, (char*)"MIPSel"},
1779     {EM_MIPS,        EM_MIPS,    ELFCLASS32, ELFDATA2MSB, (char*)"MIPS"},
1780     {EM_PARISC,      EM_PARISC,  ELFCLASS32, ELFDATA2MSB, (char*)"PARISC"},
1781     {EM_68K,         EM_68K,     ELFCLASS32, ELFDATA2MSB, (char*)"M68k"},
1782     {EM_AARCH64,     EM_AARCH64, ELFCLASS64, ELFDATA2LSB, (char*)"AARCH64"},
1783   };
1784 
1785 #if  (defined IA32)
1786   static  Elf32_Half running_arch_code=EM_386;
1787 #elif   (defined AMD64)
1788   static  Elf32_Half running_arch_code=EM_X86_64;
1789 #elif  (defined IA64)
1790   static  Elf32_Half running_arch_code=EM_IA_64;
1791 #elif  (defined __sparc) && (defined _LP64)
1792   static  Elf32_Half running_arch_code=EM_SPARCV9;
1793 #elif  (defined __sparc) && (!defined _LP64)


2196     }
2197     fclose(fp);
2198   }
2199 #endif // x86 platforms
2200   return false;
2201 }
2202 
2203 void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
2204   // Only print the model name if the platform provides this as a summary
2205   if (!print_model_name_and_flags(st, buf, buflen)) {
2206     st->print("\n/proc/cpuinfo:\n");
2207     if (!_print_ascii_file("/proc/cpuinfo", st)) {
2208       st->print_cr("  <Not Available>");
2209     }
2210   }
2211 }
2212 
2213 #if defined(AMD64) || defined(IA32) || defined(X32)
2214 const char* search_string = "model name";
2215 #elif defined(SPARC)
2216 const char* search_string = "cpu";
2217 #elif defined(PPC64)
2218 const char* search_string = "cpu";
2219 #else
2220 const char* search_string = "Processor";
2221 #endif
2222 
2223 // Parses the cpuinfo file for string representing the model name.
2224 void os::get_summary_cpu_info(char* cpuinfo, size_t length) {
2225   FILE* fp = fopen("/proc/cpuinfo", "r");
2226   if (fp != NULL) {
2227     while (!feof(fp)) {
2228       char buf[256];
2229       if (fgets(buf, sizeof(buf), fp)) {
2230         char* start = strstr(buf, search_string);
2231         if (start != NULL) {
2232           char *ptr = start + strlen(search_string);
2233           char *end = buf + strlen(buf);
2234           while (ptr != end) {
2235              // skip whitespace and colon for the rest of the name.
2236              if (*ptr != ' ' && *ptr != '\t' && *ptr != ':') {
2237                break;