#!/usr/bin/env/perl # # @(#) memconf - Identify sizes of SIMM/DIMM memory modules installed on a # @(#) Sun workstation or server. # @(#) Micron Technology, Inc. - Tom Schmidt 28-Jan-2000 V1.21.1 # # Maintained by Tom Schmidt (tschmidt@micron.com) # # If memconf does not recognize a system, then please send the output of # '/usr/sbin/prtconf -pv' (or '/usr/etc/devinfo -pv' on Solaris 1.X) and # '/usr/platform/`uname -i`/sbin/prtdiag -v' if available to # tschmidt@micron.com so that memconf can be enhanced to recognize it. # If the unrecognized system is a Sun clone, please also send any hardware # documentation on the memory layout that you may have. Check my website # at http://netnow.micron.net/~tschmidt/unix.html to get the latest version. # # Usage: memconf [ -v | -h ] # -v verbose mode # -h print help # # memconf reports the size of each SIMM/DIMM memory module installed in a # system. It also reports the system type and any empty memory sockets. # In verbose mode, it also reports: # - banner name, model, and CPU/system frequencies # - address range and bank numbers for each module # # memconf is Y2K compliant. There are no date calls in the program. Your # Operating System or Perl version may not be Y2K compliant. # # Based on SunManagers SUMMARY by Howard Modell (h.modell@ieee.org) # on 29-Jan-1997. # # Tested to work on: # - sun4c Sun SS2, IPX, ELC # - sun4c Sun IPC with Open Boot PROM V2.X # - sun4m Sun 4/6x0, SS4, SS5, SS10, SS10SX, SS20, LX/ZX, Classic, Voyager # - sun4d Sun SPARCserver-1000, 1000E, SPARCcenter-2000, 2000E # - sun4u Sun Ultra 1, 2, 5, 10, 30, 60, 250, 450 # - sun4u Sun Ultra Enterprise 3000, 3500, 4000/5000, 4500/5500, 6000, 6500 # - sun4u1 Sun Ultra Enterprise 10000 # - sun4u Sun SPARCengine Ultra AX, AXi # - sun4u Sun Netra t1 # - sun4m Tatung COMPstation 5 and 20SL clones # - sun4m transtec SPARCstation 20I clone # - sun4m Rave Axil-255 SPARCstation 5 clone # - sun4m Rave Axil-245, 311, and 320 clones (no verbose output) # - sun4u AXUS Ultra 250 # - sun4u AXUS Ultra 450 (no verbose output) # - Force Computers SPARC clones (no verbose output) # - Tadpole SPARCbook 3 (no verbose output) # - Auspex 7000/650 (no verbose output) # - Detects VSIMMs for SX graphics on SS10SX/SS20 (1st VSIMM only) # - Detects Prestoserve NVSIMMs on SS10/SS20/SS1000/SC2000 # # Untested systems that might work: # - sun4c Sun SS1, SS1+ with Open Boot PROM V2.X # - sun4u Sun SPARCengine Ultra AXmp # - sun4d Sun SPARCcenter & sun4u Enterprise systems running Solaris 8 beta; # does prtdiag output format change? # - sun4m Tatung COMPstation 20S, 20A and 20AL clones # - May not work properly on Sun clones # # Won't work on: # - sun4u Sun Ultra 80 and Ultra Enterprise 420R. Not enough information is # provided about the memory in the prtconf and prtdiag outputs by the # Open Boot PROM. # - Systems without /dev/openprom # - sun4c Sun SS1, SS1+, SLC, IPC with Open Boot PROM V1.X (no 'memory' lines in # devinfo/prtconf output) # - sun4 kernel architecture, and sun3 and older systems # - Perl 5.001 is known to have problems with hex number conversions # - Does not detect unused VSIMMs (another FB installed) or second VSIMM # # To Do: # - Report empty memory slots on Ultra Enterprise 3x00/4x00/5x00/6x00/10000 and # SS1000/SC2000 systems # - Suggest memory upgrade options in verbose mode # - Test on untested systems above, adding verbose to those that lack it # - Add sun4m Sun SPARCengine 5 and 20 # - Add sun4u Sun SPARCengine Ultra 1, 2, 20, and AXdp # - Add newer systems as they come out # - Recognize VME bus memory cards in 4/6x0 # - Add Sun clones # # Revision History: # - 29-Jan-1997 - V1.0 - From SunManagers SUMMARY by Howard Modell # (h.modell@ieee.org) # - 05-Feb-1997 - V1.1 - Ported to SunOS, added slot information, etc. # - 17-Aug-1998 - V1.2 - Added Ultra-30, Ultra Enterprise 4000/5000. # - 18-Aug-1998 - V1.2.1 - Added Ultra-5. # - 20-Aug-1998 - V1.3 - Fixed SS10SX. Added Ultra Enterprise 3000. # - 02-Sep-1998 - V1.3.1 - Cleanup Ultra 450 recognition. # - 15-Sep-1998 - V1.4 - Added verbose output for Sun 4/30 LX/ZX and Classic. # - 17-Sep-1998 - V1.5 - Added verbose output for SPARCserver 1000 & SPARCcenter # 2000. Added untested Ultra-60 verbose output. # - 17-Sep-1998 - V1.5.1 - Fixed Ultra 450. # - 18-Sep-1998 - V1.6 - Fixed Ultra-60 and Enterprise 3000/4000/5000. # - 25-Sep-1998 - V1.7 - Use prtdiag on Enterprise systems to handle multiple # system boards. # - 28-Sep-1998 - V1.8 - Fixed Enterprise systems running Solaris 2.6. Fixed # Ultra 5/10. Changed calculation of top address range. # - 29-Sep-1998 - V1.9 - Added SS2000. # - 19-Oct-1998 - V1.9.1 - Fixed stacked module detection. # - 30-Oct-1998 - V1.9.2 - Sort modules by address range (fixes some stacked # module detection). # - 04-Nov-1998 - V1.10 - Cleanup for perl4 backward compatibility. Enhanced # Ultra 450 to handle interleaving. Added Ultra 250. # - 19-Nov-1998 - V1.11 - Added -h for help. # - 08-Dec-1998 - V1.11.1 - Tested OK on SPARCclassic and SS4. # - 14-Dec-1998 - V1.12 - Improved Ultra 5/10 memory detection. # - 29-Dec-1998 - V1.12.1 - Test OK on Enterprise 6000. Cleanup of output on # Enterprise systems. # - 31-Dec-1998 - V1.12.2 - Test OK on Enterprise 4500/5500. # - 04-Jan-1999 - V1.12.3 - Cleanup of some minor perl warnings. # - 11-Jan-1999 - V1.12.4 - Solaris 7 tested OK on some systems, but not tested # on Ultra 250, 450, Enterprise, nor SPARCcenter. # - 27-Jan-1999 - V1.12.5 - Added verbose output for untested Voyager S240. # - 28-Jan-1999 - V1.12.6 - Added UltraStation 10. # - 04-Feb-1999 - V1.13 - Added AXUS 250/450. Fixed Voyager S240. # - 11-Feb-1999 - V1.13.1 - Detect perl 5.001 bugs. Added exit status. Check # for illegal memory stuffing in SS5 and Ultra 5/10. # - 15-Feb-1999 - V1.13.2 - Added verbose output for IPX. ELC and SLC untested. # - 22-Feb-1999 - V1.13.3 - Enhanced VSIMM detection. # - 12-Mar-1999 - V1.14 - Enhanced Ultra 250, AXUS 250/450. Report empty sockets # in verbose mode for most systems. Solaris 7 tested OK # on Ultra 250, 450. # - 15-Mar-1999 - V1.15 - Corrected and enhanced Ultra 5/10. Report CPU and # system frequencies in verbose mode. # - 13-Apr-1999 - V1.15.1 - Always report empty sockets. Tested OK so far on # Solaris 8 beta releases. # - 21-Apr-1999 - V1.15.2 - Tested OK on ELC running Solaris 2.X. Improved # model recognition. Added Force Computers. # - 11-May-1999 - V1.15.3 - Added Prestoserve NVSIMM detection. # - 16-Jun-1999 - V1.15.4 - Tested OK on Solaris 7 Enterprise systems. # Distinguish Ultra 5 from Ultra 10. # - 23-Jun-1999 - V1.16 - Added Ultra 80 and Enterprise 410 (untested). # - 24-Jun-1999 - V1.16.1 - Added Rave Axil-320 and Tatung SS5 and SS20 clones. # - 13-Jul-1999 - V1.17 - Added Premier-24 (SS10SX), Rave Axil-245 and Axil-311. # Does not work on IPC running Solaris 2.X. Improve # Ultra 5/10 distinction. # - 19-Jul-1999 - V1.18 - Added SPARCengine Ultra AX, AXi, AXmp. Does work on # IPC with Open Boot PROM V2.X. # - 21-Jul-1999 - V1.18.1 - Updated Sun 4/6x0 recognition. # - 17-Aug-1999 - V1.18.2 - Force C locale so that prtdiag output is in English. # - 20-Sep-1999 - V1.18.3 - Add SunOS/Solaris version to verbose output. # Improve Ultra 5/10 distinction. # - 24-Nov-1999 - V1.19 - Recognize 4GB and larger total memory. Added transtec # SS20 and Axil-255 clones and Sun Netra t1. Updated for # Enterprise 10000. # - 29-Nov-1999 - V1.19.1 - Added verbose output for AXUS 250. # - 08-Dec-1999 - V1.19.2 - Added Tadpole SPARCbook 3 and Auspex Netserver. # - 07-Jan-2000 - V1.20 - Updated Ultra 80 and Enterprise 420R detection. # Not enough information is provided about the memory in # their prtconf and prtdiag outputs to give an accurate # evaluation of the memory installed. Fix for some Netra # t1 256MB mezzanine boards. Detect unsupported memory # sizes. # - 13-Jan-2000 - V1.20.1 - Fix detection of number of CPUs. Improve # Ultra10/333MHz detection. Change 32MB SIMM detection # on SS10 from an error to a warning since according to # Sun, the 32MB SIMM is not supported, but it appears # to work fine (perhaps an OBP rev issue?). # - 25-Jan-2000 - V1.21 - Fixed Ultra-30. Updated SPARCengine detection. # Additional minor bug fixes. # - 28-Jan-2000 - V1.21.1 - Improve SPARCengine Ultra detection. # Uncomment for debugging (perl 5 only) #use diagnostics; $version = "V1.21.1"; $version_date = "28-Jan-2000"; $URL = "http://netnow.micron.net/~tschmidt/unix.html"; if (-f '/vmunix') { $BSD = 1; if (! -f '/usr/etc/devinfo') { print "ERROR: no 'devinfo' command. Aborting.\n"; exit 1; } $config_cmd = "/usr/etc/devinfo -pv"; } else { $BSD = 0; if (! -f '/usr/sbin/prtconf') { print "ERROR: no 'prtconf' command. Aborting.\n"; exit 1; } $config_cmd = "/usr/sbin/prtconf -pv"; } $hostname = `/usr/bin/uname -n`; chop $hostname; $machine = `/usr/bin/uname -m`; chop $machine; $sunos = `/usr/bin/uname -r`; chop $sunos; $solaris = ""; $kernbit = ""; if ($sunos eq "4.1.1") { $solaris = "1.0"; } if ($sunos eq "4.1.2") { $solaris = "1.0.1"; } if ($sunos =~ /4.1.3/) { $solaris = "1.1"; } if ($sunos eq "4.1.3_U1") { $solaris = "1.1.1"; } if ($sunos eq "4.1.4") { $solaris = "1.1.2"; } if ($sunos =~ /5./) { $sunosminor = $sunos; $sunosminor =~ s/5.//; if ($sunosminor =~ /[7-9]/) { $solaris = $sunosminor; $kernbit=32; if (-x '/bin/isainfo') { $cpuarch=`/bin/isainfo -k`; chop $cpuarch; if ($cpuarch eq "sparcv9" ) { $kernbit=64; } } } else { $solaris = "2.$sunosminor"; } } $platform = $machine; $prtdiag_cmd = ""; if (-d '/usr/platform') { $platform = `/usr/bin/uname -i`; chop $platform; $prtdiag_cmd = "/usr/platform/$platform/sbin/prtdiag"; } elsif (-f '/usr/kvm/prtdiag') { $platform = $machine; $prtdiag_cmd = '/usr/kvm/prtdiag'; } if ($prtdiag_cmd) { # Force C locale so that prtdiag output is in English $prtdiag_exec = "/bin/sh -c 'LC_ALL=C $prtdiag_cmd'"; } $buffer = ""; $filename = ""; $memory_size = ""; $installed_memory = 0; $ultra = 0; $simmbanks = 0; $simmspergroup = 1; $bankcnt = 0; $slot0 = 0; $smallestsimm = 16777216; $largestsimm = 0; $found32mb_ss10 = 0; $sxmem = 0; $nvmem = 0; $nvmem1 = 0; $nvmem2 = 0; $memtype = "SIMM"; $sockettype = "socket"; $verbose = 0; $recognized = 1; $untested = 1; $perlhexbug = 0; $exitstatus = 0; $meg = 1048576; @socketstr = (""); @orderstr = (""); @groupstr = (""); @bankstr = (""); @bytestr = (""); @simmsizes = (0,16777216); @simmsizesfound = (); $socket = ""; $order = ""; $group = ""; $bank = ""; $byte = ""; $gotmemory = ""; @boards = ""; $boardfound = 0; $flag = 0; $format = 0; $foundname = 0; $sockets_used = ""; $sockets_empty = ""; $sortslots = 1; $devtype = ""; $freq = 0; $sysfreq = 0; $cpufreq = 0; $ncpu = 0; $header_shown = 0; # # Parse options # if ($#ARGV >= 0) { foreach $name (@ARGV) { if ($name eq "-v") { # verbose mode $verbose = 1; } elsif ($name eq "-d") { # more verbose debug mode $verbose = 2; } elsif (-f $name) { open(FILE, "<$name"); # Test file with prtconf/devinfo output @config = ; # Test file with prtdiag output @prtdiag = @config; $hostname = ""; $filename = "$name"; } else { &show_help; } } } if ($filename eq "") { @config = `$config_cmd`; } sub show_help { print "Usage: memconf [ -v | -h ]\n"; print " -v verbose mode\n"; print " -h print help\n"; print "\nThis is memconf, $version $version_date\n\n"; print "Please send bug reports and enhancement requests along with "; print "the output of\n\"$config_cmd\" "; print "and \"$prtdiag_cmd -v\" " if ($prtdiag_cmd); print "\nto tschmidt\@micron.com as E-mail attachments so that "; print "memconf can be enhanced.\nCheck my website at "; print "$URL to get\n"; print "the latest version.\n"; exit; } sub show_header { if ($header_shown == 1) { return; } $header_shown = 1; print "memconf: $version $version_date $URL\n" if ($verbose); print "hostname: $hostname\n" if ($hostname); print "filename: $filename\n" if ($filename); if ($verbose) { if ($banner) { print "banner: $banner"; print " $bannermore" if ($bannermore); print "\n"; } if ($model) { print "model: "; print "$manufacturer " if ($manufacturer); print "$model"; print " $modelmore" if ($modelmore); print " $realmodel" if ($realmodel); print "\n"; } print "Solaris ${solaris}, " if ($solaris); print "${kernbit}-bit kernel, " if ($kernbit); print "SunOS ${sunos}\n"; print "$ncpu cpu" if ($ncpu > 0 & $cpufreq > 0); print "s" if ($ncpu > 1); print ", cpu freq: ${cpufreq}MHz, " if ($cpufreq); print "system freq: ${sysfreq}MHz\n" if ($sysfreq); } else { print "$manufacturer " if ($manufacturer); if ($bannermore) { print "$banner $bannermore"; } elsif ($modelmore) { print "$model $modelmore"; } elsif ($banner) { print "$banner"; print " $bannermore" if ($bannermore); } elsif ($model) { print "$model"; } print " $realmodel" if ($realmodel); print "\n"; } # debug output if ($verbose > 1) { print "manufacturer = $manufacturer\n" if ($manufacturer); print "banner = $banner\n" if ($banner); print "bannermore = $bannermore\n" if ($bannermore); print "model = $model\n" if ($model); print "modelmore = $modelmore\n" if ($modelmore); print "ultra = $ultra\n" if ($ultra); print "motherboard = $motherboard\n" if ($motherboard); print "memory line: $gotmemory\n" if ($gotmemory); # print "module info: $gotmodule\n" if ($gotmodule); } } sub show_unrecognized { print " This is most likely because memconf $version does not "; print "completely\n"; print " recognize this SunOS $sunos $platform system.\n"; &show_request if ($untested == 0); } sub show_untested { if ($untested == 2) { print "WARNING: This is an untested SunOS $sunos operating"; } else { print "ERROR: This is an untested"; } print " system by memconf $version\n"; print " Please let the author know how it works.\n"; $exitstatus = 1; &show_request; } sub show_request { print " Please send the output of \"$config_cmd\" "; print "and\n \"$prtdiag_cmd -v\" " if ($prtdiag_cmd); print "to Tom Schmidt\n (tschmidt\@micron.com) as E-mail "; print "attachments so that memconf $version can\n"; print " be enhanced to properly recognize this system. "; print "Please include the\n"; print " Sun Model and Operating System version. "; print "Check my website at\n"; print " $URL to get the latest version.\n"; if ($untested) { print " If this system is a Sun clone, "; print "please also send any hardware\n documentation "; print "on the memory layout that you may have.\n"; } } $i = 0; $banner = ""; $model = ""; $modelmore = ""; $bannermore = ""; $motherboard = ""; $realmodel = ""; $manufacturer = ""; foreach $line (@config) { if ($line =~ /banner-name:/ & $banner eq "") { $banner = $line; $banner =~ s/\s+banner-name:\s+//; $banner =~ s/'//g; $banner =~ s/SUNW,//g; chop $banner; $ultra = "ultra" if ($banner =~ /Ultra/); $ultra = "e" if ($banner =~ /Enterprise/); $ultra = 1 if ($banner =~ /Ultra 1\b/); $ultra = 2 if ($banner =~ /Ultra 2\b/); $ultra = 5 if ($banner =~ /Ultra 5\b/); $ultra = 10 if ($banner =~ /Ultra 10\b/); $ultra = 30 if ($banner =~ /Ultra 30\b/); $ultra = 60 if ($banner =~ /Ultra 60\b/); $ultra = 80 if ($banner =~ /Ultra 80\b/); $ultra = "420R" if ($banner =~ /\bEnterprise 420R\b/); $ultra = 250 if ($banner =~ /\b250\b/); $ultra = 450 if ($banner =~ /\b450\b/); $ultra = "t1" if ($banner =~ /Netra t1\b/); if ($banner =~ /\bMP-250\b/) { $ultra = "axus250"; $bannermore = "(Ultra-250 clone)"; $modelmore = "(Ultra-250)"; } $ultra = "axus450" if ($banner =~ /UltraAX-MP\b/); $manufacturer = "AXUS" if ($ultra =~ /axus/); $manufacturer = "Rave" if ($banner =~ /Axil/); $manufacturer = "Tadpole" if ($banner =~ /Tadpole/); $manufacturer = "Tatung" if ($banner =~ /COMPstation/); # Only add "Sun" to those that don't already have it $manufacturer = "Sun" if ($banner =~ /^SPARCstation/ | $banner =~ /^SPARCsystem/ | $banner =~ /^SPARCclassic/ | $banner =~ /^SPARCserver/ | $banner =~ /^SPARCcenter/ | $banner =~ /Enterprise/ | $banner =~ /Premier 24/); } if ($line =~ /model:.*AXUS/ ) { # AXUS clones with their name on OBP $manufacturer = "AXUS"; } if ($line =~ /SUNW,Ultra-/ | $line =~ /SUNW,SPARC/ | $line =~ /Sun 4/ | $line =~ /SUNW,S240/ | $line =~ /SUNW,UltraSPARC-IIi-Engine/ | $line =~ /SUNW,UltraAX-MP/ | $line =~ /SUNW,Premier-24/ | $line =~ /model:\s+'SPARC CPU-/ | $line =~ /model:\s+'SPARC CPCI-/ | $line =~ /SUNW,Axil-/ | $line =~ /\s+name:.*COMPstation/ | $line =~ /\s+name:.*Tadpole/ | $line =~ /\s+name:.*Auspex/ ) { $model = $line; $model =~ s/\s+name:\s+//; $model =~ s/\s+model:\s+//; $model =~ s/'//g; $model =~ s/SUNW,//g; $model =~ s/TWS,//g; $model =~ s/Tadpole_//g; $model =~ s/ASPX,//g; chop $model; $ultra = "ultra" if ($banner =~ /Ultra/); $ultra = 1 if ($model =~ /Ultra-1\b/); $ultra = 2 if ($model =~ /Ultra-2\b/); $ultra = 5 if ($model =~ /Ultra-5\b/); $ultra = 5 if ($model =~ /Ultra-5_10\b/); $ultra = 30 if ($model =~ /Ultra-30\b/); $ultra = 60 if ($model =~ /Ultra-60\b/); $ultra = 80 if ($model =~ /Ultra-80\b/); $ultra = 250 if ($model =~ /Ultra-250\b/); $ultra = 450 if ($model =~ /Ultra-4\b/); $ultra = "e" if ($model =~ /Ultra-Enterprise/); if ($banner =~ /\bMP-250\b/) { $ultra = "axus250"; $bannermore = "(Ultra-250 clone)"; $modelmore = "(Ultra-250)"; } $ultra = "axus450" if ($banner =~ /UltraAX-MP\b/); $manufacturer = "AXUS" if ($ultra =~ /axus/); $modelmore = "SPARCstation SLC" if ($model eq "Sun 4/20"); $modelmore = "SPARCstation ELC" if ($model eq "Sun 4/25"); $modelmore = "SPARCstation IPC" if ($model eq "Sun 4/40"); $modelmore = "SPARCstation IPX" if ($model eq "Sun 4/50"); $modelmore = "SPARCstation 1" if ($model eq "Sun 4/60"); $modelmore = "SPARCstation 1+" if ($model eq "Sun 4/65"); $modelmore = "SPARCstation 2" if ($model eq "Sun 4/75"); $modelmore = "(SPARCsystem 600)" if ($model eq "Sun 4/600"); $modelmore = "Sun 4/30" if ($model =~ /SPARCstation-LX/); $modelmore = "Sun 4/15" if ($model =~ /SPARCclassic/); $modelmore = "Sun 4/10" if ($model =~ /SPARCclassic-X/); $modelmore = "(SPARCstation 10SX)" if ($model =~ /Premier-24/); if ($model eq "S240") { $manufacturer = "Sun"; $modelmore = "SPARCstation Voyager"; } if ($model =~ /SPARC CP/) { $manufacturer = "Force Computers"; } $modelmore = "(SPARCbook 3GX)" if ($model eq "S3GX"); $modelmore = "(SPARCbook 3XP)" if ($model eq "S3XP"); $manufacturer = "Sun" if ($model =~ /^SPARCstation/ | $model =~ /^SPARCsystem/ | $model =~ /^SPARCclassic/ | $model =~ /^SPARCserver/ | $model =~ /^SPARCcenter/ | $model =~ /Enterprise/ | $model =~ /Premier 24/); if ($model =~ /Auspex/) { $manufacturer = "Auspex"; $model =~ s/Auspex //g; $modelmore = "Netserver"; } } $foundname = 1 if ($line =~ /\s+name:\s+/ ); if ($line =~ /\s+model:\s+'SUNW,/ & $foundname == 0) { # Ultra 5/10 motherboard is 375-xxxx part number # SS10/SS20 motherboard is Sxx,501-xxxx part number if ($line =~ /,375-/ | $line =~ /,500-/ | $line =~ /,501-/) { $motherboard = $line; $motherboard =~ s/\s+model:\s+//; $motherboard =~ s/'//g; $motherboard =~ s/SUNW,//g; chop $motherboard; } } if ($line =~ /\sname:\s+'memory'/) { $j = $i - 2; if ($config[$j] =~ /\sreg:\s/) { $gotmemory = $config[$j]; chop $gotmemory; } elsif ($config[$j - 1] =~ /\sreg:\s/) { $gotmemory = $config[$j - 1]; chop $gotmemory; } elsif ($config[$j + 1] =~ /\sreg:\s/) { $gotmemory = $config[$j + 1]; chop $gotmemory; } } if ($line =~ /\sdevice_type:\s+'memory-bank'/) { $j = $i - 3; if ($config[$j] =~ /\sreg:\s/ & $config[$j] !~ /.00000000$/) { $config[$j] =~ s/\s+reg:\s+//; if ($gotmemory) { $gotmemory .= ".$config[$j]"; } else { $gotmemory = $config[$j]; } chop $gotmemory; } } # The following is not used yet #if ($line =~ /\sdevice_type:\s+'memory-module'/) { # if ($config[$i - 2] =~ /\sreg:\s/) { # $config[$i - 3] =~ s/\s+socket-name:\s+//; # if ($gotmodule) { # $gotmodule .= ".$config[$i - 3]"; # } else { # $gotmodule = $config[$i - 3]; # } # chop $gotmodule; # $config[$i - 2] =~ s/\s+reg:\s+//; # @module = split(/\./, $config[$i - 2]); # $gotmodule .= ".$module[3]"; # chop $gotmodule; # $config[$i + 1] =~ s/\s+name:\s+//; # $config[$i + 1] =~ y/[a-z]/[A-Z]/; # $gotmodule .= ".$config[$i + 1]"; # chop $gotmodule; # $gotmodule =~ s/'//g; # } #} if ($line =~ /\sname:\s+'cgfourteen'/) { # Determine size of VSIMM # Currently assumes only one VSIMM is installed if ($config[$i - 2] =~ /\sreg:\s/) { $sx_line = $config[$i - 2]; chop $sx_line; } elsif ($config[$i - 3] =~ /\sreg:\s/) { $sx_line = $config[$i - 3]; chop $sx_line; } @sxline = split(/\./, $sx_line); $sxmem = hex("0x$sxline[5]") / $meg; } if ($line =~ /501-2197/) { # 1MB Prestoserve NVSIMMs (SS1000/SC2000) if ($config[$i + 1] =~ /\sreg:\s/) { $nv_line = $config[$i + 1]; chop $nv_line; } elsif ($config[$i + 2] =~ /\sreg:\s/) { $nv_line = $config[$i + 2]; chop $nv_line; } @nvline = split(/\./, $nv_line); $nvmem += hex("0x$nvline[2]") / $meg; } if ($line =~ /501-2001/) { # 2MB Prestoserve NVSIMMs (SS10/SS20) if ($config[$i + 1] =~ /\sreg:\s/) { $nv_line = $config[$i + 1]; chop $nv_line; } elsif ($config[$i + 2] =~ /\sreg:\s/) { $nv_line = $config[$i + 2]; chop $nv_line; } @nvline = split(/\./, $nv_line); $nvmem += hex("0x$nvline[2]") / $meg; $nvmem1 = 1 if ($nvline[1] eq "10000000"); $nvmem2 = 1 if ($nvline[1] eq "14000000" | $nvline[1] eq "1c000000"); } if ($line =~ /Memory size:\s/ & $installed_memory == 0) { $memory_size = $line; chop $memory_size; @memory = split(/\s/, $memory_size); $installed_memory = $memory[2]; $installed_memory =~ s/Mb//; $BSD = 0; # prtconf and prtdiag only have this output $config_cmd = "/usr/sbin/prtconf -pv"; } if ($sysfreq == 0 & $freq > 0) { $sysfreq = $freq; $freq = 0; } if ($devtype eq "cpu") { $cpufreq = $freq; $freq = 0; $devtype = ""; $ncpu++; } if ($line =~ /device_type:/) { @dev_line = split(/\'/, $line); $devtype = $dev_line[1]; } if ($line =~ /clock-frequency:/) { @freq_line = split(' ', $line); $freq = int(hex("0x$freq_line[1]") / 1000000 + 0.5); } $i++; } $sysfreq = $freq if ($sysfreq == 0 & $freq > 0); $cpufreq = $sysfreq if ($sysfreq > $cpufreq & $ncpu > 0); # # SPARCengine systems # $ultra = "AX" if ($motherboard eq "501-3043"); $ultra = "AX-300" if ($motherboard eq "501-5037"); $ultra = "AXi" if ($motherboard eq "501-4559"); $ultra = "AXmp" if ($motherboard eq "501-5296"); if ($ultra =~ /AX/) { if ($banner !~ /SPARCengine.*Ultra/) { if ($bannermore) { $bannermore = "(SPARCengine Ultra $ultra) $bannermore"; } else { $bannermore = "(SPARCengine Ultra $ultra)"; } } } if ($gotmemory eq "") { &show_header; print "total memory = ${installed_memory}MB\n" if ($installed_memory); print "ERROR: no 'memory' line in \"$config_cmd\" output.\n"; print " This is an unsupported system by memconf.\n"; exit 1; } $gotmemory =~ s/\s+reg:\s+//; $gotmemory =~ s/'//g; @slots = split(/\./, $gotmemory); $slot = 1; $totmem = 0; #$startx = 0; $manufacturer = "" if (($banner =~ /^Sun\b/ | $model =~ /^Sun\b/) & $manufacturer eq "Sun"); if ($manufacturer ne "" & $manufacturer ne "Sun") { $modelmore = ($modelmore) ? "$modelmore clone" : "clone"; } # DIMMs are installed in pairs on Ultra 1, 5, and 10; quads on # Ultra 2, 60, 80, 420R, 450; 8's in Ultra Enterprise # # On 64-bit systems, prtconf format is AAAAAAAA.AAAAAAAA.SSSSSSSS.SSSSSSSS # and on 32-bit systems, prtconf format is AAAAAAAA.AAAAAAAA.SSSSSSSS # where A is for Address, S is for Size. # Minimum module size is 1MB (0x00100000), so strip off last 5 hex digits of LSB # and prepend last 5 digits of MSB, which allows recognizing up to 4500TB! # if ($ultra) { $val0 = 3; # simmsize is in 3rd and 4th fields $valaddr = 2; # address is 2 fields before simmsize $valinc = 4; # fields per simm $memtype = "DIMM"; } else { $val0 = 2; # simmsize is in 3rd field $valaddr = 1; # address is 1 field before simmsize $valinc = 3; # fields per simm } # # Define memory layout for specific systems # if ($model eq "Sun 4/20") { # SLC accepts 4MB SIMMs on motherboard # Does not support Open Boot PROM V2.X, so devinfo/prtconf output will # not have memory lines. $untested = 1; $simmrangex = "01000000"; $simmbanks = 4; $simmsperbank = 1; @simmsizes = (4); @socketstr = ("U0502","U0501","U0602","U0601"); } if ($model eq "Sun 4/25") { # ELC accepts 4MB or 16MB SIMMs on motherboard $untested = 0; $simmrangex = "01000000"; $simmbanks = 4; $simmsperbank = 1; @simmsizes = (4,16); @socketstr = ("U0407","U0408","U0409","U0410"); @bankstr = ("MEM1","MEM2","MEM3","MEM4"); } if ($model eq "Sun 4/40") { # IPC accepts 1MB or 4MB SIMMs on motherboard # Does not show memory with Open Boot PROM V1.X, but does with OBP V2.X $untested = 0; $simmrangex = "01000000"; $simmbanks = 3; $simmsperbank = 4; @simmsizes = (1,4); @socketstr = ("U0588","U0587","U0586","U0585","U0584","U0591","U0590","U0589","U0678","U0676","U0683","U0677"); @bankstr = (0,0,0,0,1,1,1,1,2,2,2,2); @bytestr = (0,1,2,3,0,1,2,3,0,1,2,3); } if ($model eq "Sun 4/50") { # IPX accepts 4MB or 16MB SIMMs on motherboard $untested = 0; $simmrangex = "01000000"; $simmbanks = 4; $simmsperbank = 1; @simmsizes = (4,16); @socketstr = ("U0310","U0309","U0308","U0307"); @bankstr = (0,1,2,3); } if ($model eq "Sun 4/60") { # SS1 accepts 1MB or 4MB SIMMs on motherboard # Does not show memory with Open Boot PROM V1.X, but may with OBP V2.X $untested = 1; $simmrangex = "01000000"; # ??? untested $simmbanks = 4; $simmsperbank = 4; @simmsizes = (1,4); @socketstr = ("U0588","U0587","U0586","U0585","U0584","U0591","U0590","U0589","U0678","U0676","U0683","U0677","U0682","U0681","U0680","U0679"); @bankstr = (0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); @bytestr = (0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3); } if ($model eq "Sun 4/65") { # SS1+ accepts 1MB or 4MB SIMMs on motherboard # Does not show memory with Open Boot PROM V1.X, but may with OBP V2.X $untested = 1; $simmrangex = "01000000"; # ??? untested $simmbanks = 4; $simmsperbank = 4; @simmsizes = (1,4); @socketstr = ("U0588","U0587","U0586","U0585","U0584","U0591","U0590","U0589","U0678","U0676","U0683","U0677","U0682","U0681","U0680","U0679"); @bankstr = (0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); @bytestr = (0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3); } if ($model eq "Sun 4/75") { # SS2 accepts 4MB SIMMs on motherboard and 32MB or 64MB SBus expansion # card $untested = 0; $simmrangex = "01000000"; $simmbanks = 4; $simmsperbank = 4; @simmsizes = (4); @socketstr = ("U0311","U0309","U0307","U0322","U0312","U0310","U0308","U0321","U0313","U0314","U0315","U0320","U0319","U0318","U0317","U0316"); @bankstr = (0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); @bytestr = (0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3); } if ($model =~ /SPARCstation-LX/) { # LX (4/30) accepts 4MB and 16MB SIMMs on motherboard # LX can accept 32MB SIMMs in bank 1, allowing 128MB total (2x32, 4x16) $untested = 0; $simmrangex = "02000000"; $simmbanks = 3; $simmsperbank = 2; @simmsizes = (4,16,32); @socketstr = ("U0304","U0303","U0301","U0302","U0402","U0401"); @bankstr = (1,1,2,2,3,3); } if ($model =~ /SPARCclassic-X/) { # Classic-X (4/10) accepts 1MB, 2MB and 4MB SIMMs on motherboard $untested = 1; $simmrangex = "02000000"; $simmbanks = 3; $simmsperbank = 2; @simmsizes = (1,2,4); @socketstr = ("U0304","U0303","U0301","U0302","U0402","U0401"); @bankstr = (1,1,2,2,3,3); } if ($model =~ /SPARCclassic/) { # Classic (4/15) accepts 4MB and 16MB SIMMs on motherboard $untested = 0; $simmrangex = "02000000"; $simmbanks = 3; $simmsperbank = 2; @simmsizes = (4,16); @socketstr = ("U0304","U0303","U0301","U0302","U0402","U0401"); @bankstr = (1,1,2,2,3,3); } if ($model eq "S240") { # Voyager has 16MB on motherboard, plus accepts one or two 16MB or 32MB # Memory cards # Motherboard, address 0x00000000-0x007fffff, 0x01000000-0x017fffff # Lower slot = Mem 1, address 0x02000000-0x07ffffff # Upper slot = Mem 2, address 0x0a000000-0x0fffffff $untested = 0; $memtype = "memory card"; $sockettype = "slot"; $simmrangex = "02000000"; $simmbanks = 8; # Count the skipped address range $simmsperbank = 1; @simmsizes = (16,32); @socketstr = ("motherboard","Mem 1","Mem 1","Mem 1","?","Mem 2","Mem 2","Mem 2"); @orderstr = ("","lower slot","lower slot","lower slot","?","upper slot","upper slot","upper slot"); } if ($model eq "SPARCstation-4") { # Accepts 8MB and 32MB SIMMs on motherboard $untested = 0; $simmrangex = "02000000"; $simmbanks = 5; $simmsperbank = 1; @simmsizes = (8,32); @socketstr = ("J0301","J0302","J0303","J0304","J0305"); @bankstr = (0,1,2,3,4); } if ($model eq "SPARCstation-5" | $model eq "micro COMPstation 5" | $model =~ /Axil-255/) { # Accepts 8MB and 32MB SIMMs on motherboard $untested = 0; $simmrangex = "02000000"; $simmbanks = 8; $simmsperbank = 1; @simmsizes = (8,32); @socketstr = ("J0300","J0301","J0302","J0303","J0400","J0401","J0402","J0403"); @bankstr = (0,1,2,3,4,5,6,7); $modelmore = "SPARCstation 5 clone" if ($model =~ /Axil-255/); } if ($model =~ /SPARCstation-10/ | $model eq "Premier-24") { # Accepts 16MB and 64MB SIMMs on motherboard # 32MB SIMMs not supported according to Sun, but appears to work fine. $untested = 0; $simmrangex = "04000000"; $simmbanks = 8; $simmsperbank = 1; @simmsizes = (16,64); @socketstr = ("J0201","J0203","J0302","J0304","J0202","J0301","J0303","J0305"); @orderstr = ("1st","3rd","4th","2nd","8th","6th","5th","7th"); @bankstr = (0,1,2,3,4,5,6,7); } if ($model =~ /SPARCstation-20/ | $model =~ /COMPstation-20S/) { # Accepts 16MB, 32MB and 64MB SIMMs on motherboard $untested = 0; $simmrangex = "04000000"; $simmbanks = 8; $simmsperbank = 1; @simmsizes = (16,32,64); @socketstr = ("J0201","J0303","J0202","J0301","J0305","J0203","J0302","J0304"); @orderstr = ("1st","2nd","3rd","4th","5th","6th","7th","8th"); @bankstr = (0,1,2,3,4,5,6,7); if ($model eq "SPARCstation-20I") { $modelmore = ($modelmore) ? "$modelmore clone" : "clone"; } } if ($model eq "SPARCsystem-600" | $model eq "Sun 4/600") { # Accepts 4MB or 16MB SIMMs on motherboard, 1MB or 4MB SIMMs on VME # expansion card $untested = 0; $simmrangex = "10000000"; $simmbanks = 2; $simmsperbank = 16; @simmsizes = (4,16); @socketstr = ("U1107","U1307","U1105","U1305","U1103","U1303","U1101","U1301","U1207","U1407","U1205","U1405","U1203","U1403","U1201","U1401","U1108","U1308","U1106","U1306","U1104","U1304","U1102","U1302","U1208","U1408","U1206","U1406","U1204","U1404","U1202","U1402"); @bankstr = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); @bytestr = ("0L0","0L1","1L0","1L1","2L0","2L1","3L0","3L1","4L0","4L1","5L0","5L1","6L0","6L1","7L0","7L1","0H0","0H1","1H0","1H1","2H0","2H1","3H0","3H1","4H0","4H1","5H0","5H1","6H0","6H1","7H0","7H1"); } if ($model eq "Ultra-1" | $ultra eq 1) { # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard $untested = 0; $memtype = "DIMM"; $simmrangex = "10000000"; $simmbanks = 4; $simmsperbank = 2; @simmsizes = (16,32,64,128); @socketstr = ("U0701","U0601","U0702","U0602","U0703","U0603","U0704","U0604"); @bankstr = ("0L","0H","1L","1H","2L","2H","3L","3H"); @bytestr = ("00-15","16-31","00-15","16-31","00-15","16-31","00-15","16-31"); } if ($model eq "Ultra-2" | $ultra eq 2) { # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard $untested = 0; $memtype = "DIMM"; $simmrangex = "20000000"; $simmbanks = 4; $simmsperbank = 4; @simmsizes = (16,32,64,128); @socketstr = ("U0501","U0401","U0701","U0601","U0502","U0402","U0702","U0602","U0503","U0403","U0703","U0603","U0504","U0404","U0704","U0604"); @groupstr = (0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3); @bankstr = ("0L","0H","1L","1H","0L","0H","1L","1H","0L","0H","1L","1H","0L","0H","1L","1H"); @bytestr = ("00-15","16-31","32-47","48-63","00-15","16-31","32-47","48-63","00-15","16-31","32-47","48-63","00-15","16-31","32-47","48-63"); } if ($model eq "Ultra-30" | $ultra eq 30) { # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard # Two DIMMs form a pair, two pairs of DIMMs form a quad. # Minumum requirements is two DIMMs in any adjacent pair. # DIMMs can be installed in any order of pairs. # Interleaving requires a fully populated quad. # Each quad addresses 512MB of memory. $untested = 0; $memtype = "DIMM"; $simmrangex = "10000000"; $simmbanks = 8; $simmsperbank = 2; @simmsizes = (16,32,64,128); @socketstr = ("U0701","U0801","U0901","U1001","U0702","U0802","U0902","U1002","U0703","U0803","U0903","U1003","U0704","U0804","U0904","U1004"); @bankstr = ("Quad 0 Pair 0","Quad 0 Pair 0","Quad 0 Pair 1","Quad 0 Pair 1","Quad 1 Pair 0","Quad 1 Pair 0","Quad 1 Pair 1","Quad 1 Pair 1","Quad 2 Pair 0","Quad 2 Pair 0","Quad 2 Pair 1","Quad 2 Pair 1","Quad 3 Pair 0","Quad 3 Pair 0","Quad 3 Pair 1","Quad 3 Pair 1"); } if ($model eq "Ultra-5_10" | $ultra eq 5 | $ultra eq 10) { # Accepts 16MB, 32MB, 64MB, 128MB, or 256MB DIMMs on motherboard # 16MB DIMM uses 10-bit column addressing and was not sold # 32, 64, 128, and 256MB DIMMs use 11-bit column addressing # Do not mix 16MB DIMMs with other sizes # 256MB DIMM not supported in Ultra 5 # Memory speed is 60ns if 50ns and 60ns DIMMs are mixed # 50ns DIMMs supported on 375-0066 & 375-0079 motherboards # Bank 0 DIMM1/DIMM2 0x00000000-0x0fffffff, 0x20000000-0x2fffffff # Bank 1 DIMM3/DIMM4 0x10000000-0x1fffffff, 0x30000000-0x3fffffff $untested = 0; $memtype = "DIMM"; $simmrangex = "10000000"; $simmbanks = 2; $simmsperbank = 2; @simmsizes = (16,32,64,128,256); @socketstr = ("DIMM1","DIMM2","DIMM3","DIMM4"); @bankstr = ("0L","0H","1L","1H"); $sortslots = 0; } if ($model eq "Ultra-60" | $ultra eq 60) { # Accepts 16MB, 32MB, 64MB or 128MB DIMMs on motherboard # U1001-U1004 bank 3 address 0xa0000000-0xbfffffff # U0901-U0904 bank 2 address 0x80000000-0x9fffffff # U0801-U0804 bank 1 address 0x20000000-0x3fffffff # U0701-U0704 bank 0 address 0x00000000-0x1fffffff $untested = 0; $memtype = "DIMM"; $simmrangex = "20000000"; $simmbanks = 6; # Count the skipped address range $simmsperbank = 4; @simmsizes = (16,32,64,128); @socketstr = ("U0701","U0702","U0703","U0704","U0801","U0802","U0803","U0804","?","?","?","?","?","?","?","?","U0901","U0902","U0903","U0904","U1001","U1002","U1003","U1004"); @bankstr = ("0","0","0","0","1","1","1","1","?","?","?","?","?","?","?","?","2","2","2","2","3","3","3","3"); } if ($banner =~ /Netra t1\b/ | $ultra eq "t1") { # Accepts 1 or 2 64MB, 256MB, or 512MB mezzanine memory cards # Lower board, address 0x00000000-0x0fffffff, 0x20000000-0x2fffffff # upper board, address 0x10000000-0x1fffffff, 0x30000000-0x3fffffff $untested = 0; $memtype = "memory card"; $sockettype = ""; $simmrangex = "10000000"; $simmbanks = 2; $simmsperbank = 1; @simmsizes = (64,256,512); @socketstr = ("base mezzanine board","additional mezzanine board"); @orderstr = ("lower board","upper board"); $sortslots = 0; } # # SPARCengine systems # if ($ultra eq "AX" | $ultra eq "AX-300") { # SPARCengine Ultra AX and AX-300 # Accepts 8MB, 16MB, 32MB or 64MB DIMMs on motherboard # AX-300 also accepts 128MB DIMMs on motherboard $untested = 0; # unsure if socket order is correct $memtype = "DIMM"; $simmrangex = "20000000"; $simmbanks = 2; $simmsperbank = 4; @simmsizes = (8,16,32,64,128); @socketstr = ("U0301","U0302","U0303","U0304","U0401","U0402","U0403","U0404"); @bankstr = ("0","0","0","0","1","1","1","1"); } if ($ultra eq "AXi") { # SPARCengine Ultra AXi # Accepts 8MB, 16MB, 32MB, 64MB or 128MB DIMMs on motherboard # Accepts 256MB DIMMs in Pairs 0 & 2 (leave Pairs 1 & 3 empty) $untested = 0; # unsure if socket order is correct $memtype = "DIMM"; $simmrangex = "10000000"; $simmbanks = 4; $simmsperbank = 2; @simmsizes = (8,16,32,64,128); @socketstr = ("U0404","U0403","U0402","U0401","U0304","U0303","U0302","U0301"); @bankstr = ("0","0","1","1","2","2","3","3"); } if ($ultra eq "AXmp") { # SPARCengine Ultra AXmp # Accepts 8MB, 16MB, 32MB, 64MB or 128MB DIMMs on motherboard $untested = 1; $memtype = "DIMM"; $simmrangex = "40000000"; # ??? untested $simmbanks = 2; $simmsperbank = 8; @simmsizes = (8,16,32,64,128); @socketstr = ("U0701","U0702","U0703","U0704","U0801","U0802","U0803","U0804","U0901","U0902","U0903","U0904","U1001","U1002","U1003","U1004"); @bankstr = ("0","0","0","0","0","0","0","0","1","1","1","1","1","1","1","1"); } # # Clones: most do not have verbose output since I don't have any socket data # on them # if ($ultra eq "axus250" | $modelmore =~ /Ultra-250/) { $untested = 0; # AXUS 250 clone # accepts up to 128MB DIMMs on motherboard $untested = 0; $memtype = "DIMM"; $simmrangex = "20000000"; $simmbanks = 4; $simmsperbank = 4; @simmsizes = (8,16,32,64,128); @socketstr = ("U0501","U0601","U0701","U0801","U0502","U0602","U0702","U0802","U0503","U0603","U0703","U0803","U0504","U0604","U0704","U0804"); @bankstr = ("0","0","0","0","1","1","1","1","2","2","2","2","3","3","3","3"); } if ($ultra eq "axus450") { $untested = 0; # AXUS 450 clone @socketstr = (""); $totmem = $installed_memory; goto finish; } if ($model =~ /SPARC CPU-/) { # Force Computers, http://www.forcecomputers.com $untested = 0; } if ($model =~ /SPARC CPCI-/) { # Force Computers, http://www.forcecomputers.com $untested = 1; } if ($model =~ /Axil/) { # RAVE Computer Association, http://rave.com $untested = 1; $untested = 0 if ($model =~ /Axil-245/); $untested = 0 if ($model =~ /Axil-255/); $untested = 0 if ($model =~ /Axil-311/); $untested = 0 if ($model =~ /Axil-320/); } if ($manufacturer eq "Tadpole") { # Tadpole RDI, http://www.tadpole.com $untested = 1; $untested = 0 if ($banner =~ /Tadpole S3/); } if ($manufacturer eq "Auspex") { # Auspex Netserver, http://www.auspex.com $memtype = "Memory Module"; $untested = 1; $untested = 0 if ($model eq "SPARC Processor"); } if ($model =~ /COMPstation-20A\b/) { # Tatung Science and Technology, http://www.tsti.com # Accepts 16MB, 32MB and 64MB SIMMs on motherboard $untested = 1; $simmrangex = "04000000"; $simmbanks = 8; $simmsperbank = 1; @simmsizes = (16,32,64); @socketstr = ("J0201","J0304","J0203","J0302","J0303","J0301","J0305","J0202"); @orderstr = ("1st","2nd","3rd","4th","5th","6th","7th","8th"); @bankstr = (1,2,3,4,5,6,7,8); } if ($model =~ /COMPstation-20AL/) { # Tatung Science and Technology, http://www.tsti.com # Accepts 16MB, 32MB and 64MB SIMMs on motherboard $untested = 1; $simmrangex = "04000000"; $simmbanks = 8; $simmsperbank = 1; @simmsizes = (16,32,64); @socketstr = ("J0201","J0203","J0302","J0304","J0202","J0301","J0303","J0305"); @orderstr = ("1st","2nd","3rd","4th","5th","6th","7th","8th"); @bankstr = (0,1,2,3,4,5,6,7); } if ($model =~ /COMPstation/) { # Tatung Science and Technology, http://www.tsti.com $untested = 1; $untested = 0 if ($model eq "micro COMPstation 5"); $untested = 0 if ($model eq "SuperCOMPstation-20SL"); } # # systems below may have memory information available in prtdiag output # if ($model eq "SPARCserver-1000" | $model eq "SPARCcenter-2000") { &show_header; # Accepts 8MB and 32MB SIMMs on motherboard $untested = 0; $untested = 2 if ($sunos =~ /5.[8-9]/); # Future/Beta SunOS releases @prtdiag = `$prtdiag_exec` if ($filename eq ""); foreach $line (@prtdiag) { if ($line =~ /Memory Units:/ | $line =~ /===== Memory =====/) { # Start of memory section $flag = 1; } if ($line =~ /IO Cards/ | $line =~ /SBus Cards/) { # End of memory section $flag = 0; } if ($flag == 1) { @boards = "@boards$line"; $boardfound = 1; } } if ($boardfound) { print "@boards"; print "Each memory unit group is comprised of 4 SIMMs\n"; } else { $recognized = 0; } $totmem = $installed_memory; goto finish; } if ($model eq "Ultra-4" | $model eq "Ultra-250" | $ultra eq 250 | $ultra eq 450 | $model eq "Ultra-80" | $ultra eq 80 | $ultra eq "420R") { &show_header; $untested = 0; $untested = 2 if ($sunos =~ /5.[8-9]/); # Future/Beta SunOS releases @prtdiag = `$prtdiag_exec` if ($filename eq ""); foreach $line (@prtdiag) { if ($line =~ /IO Cards/) { # End of memory section $flag = 0; } if ($flag >= 1) { if ($line ne "\n") { @boards = "@boards$line" if ($line ne "\n"); $boardfound = 1; @linearr = split(' ', $line); if ($linearr[2] =~ /\bU\d\d\d\d\b/) { $sockets_used = "$sockets_used $linearr[2]"; } elsif ($linearr[2] =~ /\b\d\d\d\d\b/) { $sockets_used = "$sockets_used U$linearr[2]"; } } } if ($line =~ /Memory Units:/ | $line =~ /===== Memory =====/) { # Start of memory section $flag = 1; } if ($flag == 1 & $line =~ /------/) { # Next lines are the memory on each system board $flag = 2; } } if ($model eq "Ultra-4" | $ultra eq 450) { # Accepts 16MB, 32MB, 64MB, 128MB or 256MB DIMMs on motherboard $memtype = "DIMM"; $simmrangex = "40000000"; $simmbanks = 4; $simmsperbank = 4; @simmsizes = (16,32,64,128,256); @socketstr = ("U1901","U1902","U1903","U1904","U1801","U1802","U1803","U1804","U1701","U1702","U1703","U1704","U1601","U1602","U1603","U1604"); @groupstr = ("A","A","A","A","B","B","B","B","C","C","C","C","D","D","D","D"); @bankstr = (2,2,2,2,3,3,3,3,0,0,0,0,1,1,1,1); } elsif ($model eq "Ultra-250" | $ultra eq 250) { # Accepts 16MB, 32MB, 64MB, 128MB or 256MB DIMMs on motherboard $memtype = "DIMM"; $simmrangex = "40000000"; $simmbanks = 4; $simmsperbank = 4; @simmsizes = (16,32,64,128,256); @socketstr = ("U0701","U0801","U0901","U1001","U0702","U0802","U0902","U1002","U0703","U0803","U0903","U1003","U0704","U0804","U0904","U1004"); @bankstr = ("A","A","A","A","B","B","B","B","C","C","C","C","D","D","D","D"); } elsif ($model eq "Ultra-80" | $ultra eq 80 | $ultra eq "420R") { # Accepts 32MB, 64MB, 128MB, or 256MB DIMMs on motherboard # DIMMs are 60ns 5V ECC, 576 bits data width; 64MB DIMMs same # as in Ultra-60, 256MB DIMMs same as in Enterprise-450 # U0403,U0404,U1403,U1404 bank 3 address 0xc0000000-0xffffffff # U0303,U0304,U1303,U1304 bank 2 address 0x80000000-0xbfffffff # U0401,U0402,U1401,U1402 bank 1 address 0x40000000-0x7fffffff # U0301,U0302,U1301,U1302 bank 0 address 0x00000000-0x3fffffff # prtconf does not reliably show the size of DIMMs in each slot. # It shows this: # 4096MB system: 00000000.00000000.00000001.00000000 # 1536MB system: 00000000.00000000.00000000.60000000 # 1024MB system: 00000000.00000000.00000000.40000000 # 512MB system: 00000000.00000000.00000000.20000000 # 256MB system: 00000000.00000000.00000000.10000000 # which is useless! A system with 4GB is reported as having # 4 1GB DIMMs instead of 16 256MB DIMMs. # This is apparently an issue that Sun may fix in the OBP. $untested = 0; $recognized = -1; $memtype = "DIMM"; $simmrangex = "40000000"; $simmbanks = 4; $simmsperbank = 4; @simmsizes = (32,64,128,256); @socketstr = ("U0301","U0302","U1301","U1302","U0401","U0402","U1401","U1402","U0303","U0304","U1303","U1304","U0403","U0404","U1403","U1404"); @bankstr = ("0","0","0","0","1","1","1","1","2","2","2","2","3","3","3","3"); } if ($boardfound) { print "@boards"; $totmem = $installed_memory; goto finish; } } if ($model =~ /Ultra-Enterprise/ | $ultra eq "e") { # E3x00/E4x00/E5x00/E6x00 accepts 8MB, 32MB or 128MB DIMMs on # motherboard, 2 banks of 8 DIMMs per board. # E10000 accepts 32MB or 128MB DIMMs on motherboard, # using 2 or 4 banks of 8 DIMMs per board. &show_header; $untested = 1; $untested = 0 if ($banner =~ /\bE?[3-6][05]00\b/); $untested = 0 if ($model =~ /-10000\b/); $untested = 2 if ($sunos =~ /5.[8-9]/); # Future/Beta SunOS releases @prtdiag = `$prtdiag_exec` if ($filename eq ""); foreach $line (@prtdiag) { if ($line =~ /Memory Units:/) { # Start of memory section, Solaris 2.5.1 format $flag = 1; $format = 1; } if ($line =~ /===== Memory =====/) { # Start of memory section, Solaris 2.6 and later format $flag = 1; $format = 2; } if ($line =~ /Factor/) { # No interleave factor on E10000 $format += 2 if ($format == 1 | $format == 2); } if ($line =~ /IO Cards/) { # End of memory section $flag = 0; } if ($flag == 2 & $line ne "\n") { if ($format == 1) { # Memory on each system board, E10000 $mem0 = substr($line,12,4); $mem0 = 0 if ($mem0 !~ /\d+/); $dimm0 = $mem0 / 8; if ($dimm0 > 0) { $dimms0 = sprintf("8x%3d", $dimm0); } else { $dimms0 = " "; } $mem1 = substr($line,20,4); $mem1 = 0 if ($mem1 !~ /\d+/); $dimm1 = $mem1 / 8; if ($dimm1 > 0) { $dimms1 = sprintf("8x%3d", $dimm1); } else { $dimms1 = " "; } $mem2 = substr($line,28,4); $mem2 = 0 if ($mem2 !~ /\d+/); $dimm2 = $mem2 / 8; if ($dimm2 > 0) { $dimms2 = sprintf("8x%3d", $dimm2); } else { $dimms2 = " "; } $mem3 = substr($line,36,4); $mem3 = 0 if ($mem3 !~ /\d+/); $dimm3 = $mem3 / 8; if ($dimm3 > 0) { $dimms3 = sprintf("8x%3d", $dimm3); } else { $dimms3 = " "; } if ($dimm0 == 0 & $dimm1 == 0 & $dimm2 == 0 & $dimm3 == 0) { $newline = ""; } else { $newline = substr($line,0,10); $newline .= " " . $mem0 . " " . $dimms0; $newline .= " " . $mem1 . " " . $dimms1; $newline .= " " . $mem2 . " " . $dimms2; $newline .= " " . $mem3 . " " . $dimms3; $newline .= "\n"; } @boards = "@boards$newline"; $boardfound = 1; } if ($format == 2) { # Memory on each system board, E10000 $untested = 1; $mem = substr($line,12,4); $mem = 0 if ($mem !~ /\d+/); $dimm = $mem / 8; if ($dimm > 0) { $dimms = sprintf("8x%3d", $dimm); $newline = substr($line,0,18) . $dimms; $newline .= substr($line,16,47); @boards = "@boards$newline"; $boardfound = 1; } else { $flag = 0; } } if ($format == 3) { # Memory on each system board, E[3456]x00 $mem0 = substr($line,10,4); $mem0 = 0 if ($mem0 !~ /\d+/); $dimm0 = $mem0 / 8; if ($dimm0 > 0) { $dimms0 = sprintf("8x%3d", $dimm0); } else { $dimms0 = " "; } $memlength = length $line; if ($memlength > 34) { $mem1 = substr($line,34,4); } else { $mem1 = 0; } $mem1 = 0 if ($mem1 !~ /\d+/); $dimm1 = $mem1 / 8; if ($dimm1 > 0) { $dimms1 = sprintf("8x%3d", $dimm1); } else { $dimms1 = " "; } if ($dimm0 == 0 & $dimm1 == 0) { $newline = ""; } else { $newline = substr($line,0,16) . $dimms0; $newline .= substr($line,16,24); if ($dimm1 > 0) { $newline .= $dimms1; $newline .= substr($line,39,16); } } @boards = "@boards$newline"; $boardfound = 1; } if ($format == 4) { # Memory on each system board, E[3456]x00 $mem = substr($line,12,4); $mem = 0 if ($mem !~ /\d+/); $dimm = $mem / 8; if ($dimm > 0) { $dimms = sprintf("8x%3d", $dimm); $newline = substr($line,0,18) . $dimms; $newline .= substr($line,16,47); @boards = "@boards$newline"; $boardfound = 1; } else { $flag = 0; } } } if ($flag == 1 & $line =~ /-----/) { # Next lines are the memory on each system board $flag = 2; } } if ($boardfound) { if ($format == 1) { # E10000 running Solaris 2.5.1 print " Bank 0 Bank 1 Bank 2 Bank 3\n"; print " MB DIMMs MB DIMMs MB DIMMs MB DIMMs\n"; print " ---- ----- ---- ----- ---- ----- ---- -----\n"; print "@boards"; } if ($format == 2) { # E10000 running Solaris 2.6 or later print "Brd Bank MB DIMMs Status Condition Speed\n"; print "--- ----- ---- ----- ------- ---------- -----\n"; print "@boards"; } if ($format == 3) { # E3x00/E4x00/E5x00/E6x00 running Solaris 2.5.1 print " Bank 0 Bank 1\n"; print " J3100-J3800 Interleave J3101-J3801 Interleave\n"; print " MB DIMMs Factor With MB DIMMs Factor With\n"; print " ---- ----- ------ ---- ---- ----- ------ ----\n"; print "@boards"; } if ($format == 4) { # E3x00/E4x00/E5x00/E6x00 running Solaris 2.6 or later print " Intrlv. Intrlv.\n"; print "Brd Bank MB DIMMs Status Condition Speed Factor With\n"; print "--- ----- ---- ----- ------- ---------- ----- ------- -------\n"; print "@boards"; print "Bank 0 uses sockets J3100-J3800, Bank 1 uses sockets J3101-J3801\n"; } } else { $recognized = 0; } $totmem = $installed_memory; goto finish; } # # OK, get ready to print out results # for($val=$val0; $val < scalar(@slots); $val += $valinc) { $newaddrmsb = substr($slots[$val - $valaddr - 1],3,5); $newaddrlsb = substr($slots[$val - $valaddr],0,3); if ($valinc == 4) { $newsizemsb = substr($slots[$val - 1],3,5); } else { $newsizemsb = ""; } $newsizelsb = substr($slots[$val],0,3); if ($sortslots) { $mods{"$newaddrmsb$newaddrlsb"} = "$newsizemsb$newsizelsb"; } else { push(@newslots, "$newaddrmsb$newaddrlsb"); push(@newslots, "$newsizemsb$newsizelsb"); } } if ($sortslots) { for(sort keys %mods) { push(@newslots, $_); push(@newslots, $mods{$_}); } } # Hack: If Ultra-80 or Enterprise 420R has 4GB of memory (maximum allowed), # then rewrite memory line to show memory stuffing. if ($model eq "Ultra-80" | $ultra eq 80 | $ultra eq "420R") { if ($newslots[1] eq "00001000") { $newslots[1] = "00000400"; $newslots[2] = "00000400"; $newslots[3] = "00000400"; $newslots[4] = "00000800"; $newslots[5] = "00000400"; $newslots[6] = "00000c00"; $newslots[7] = "00000400"; $recognized = -2; } } for($val=0; $val < scalar(@newslots); $val += 2) { $simmaddr = $newslots[$val]; $simmsz = $newslots[$val + 1]; $simmsize = hex("0x$simmsz"); $perlhexbug = 1 if ($simmsize < 0); $totmem += $simmsize; if ($model eq "Sun 4/75" & $simmbanks < $bankcnt + 2) { # SS2 SBus memory card if ($simmaddr eq "00000080") { $buffer .= "SBus primary contains "; } else { $buffer .= "SBus secondary contains "; } $simmstart = hex("0x$simmaddr") * $meg; $perlhexbug = 1 if ($simmstart < 0); $simmrange = hex("0x$simmrangex"); $perlhexbug = 1 if ($simmrange < 0); $simmstartx = sprintf("%08lx", $simmstart); $simmstop = sprintf("%08lx", $simmstart + (2 * $simmrange) - 1); $totmem += $simmsize; $simmsize *= 2; $val += 2; $buffer .= "${simmsize}MB"; $buffer .= " (address 0x${simmstartx}-0x$simmstop)" if ($verbose); $buffer .= "\n"; } elsif ($simmbanks > 0) { $simmstart = hex("0x$simmaddr") * $meg; $perlhexbug = 1 if ($simmstart < 0); $simmrange = hex("0x$simmrangex"); $perlhexbug = 1 if ($simmrange < 0); $simmstartx = sprintf("%08lx", $simmstart); $simmstop = sprintf("%08lx", $simmstart + ($simmsize * $meg) - 1); $cnt = 0; $maxcnt = $simmbanks * $simmsperbank / $simmspergroup; while ($cnt < $maxcnt) { if ($simmstart >= ($simmrange * $cnt) & $simmstart < ($simmrange * ($cnt + 1))) { $bankcnt = $cnt; $cnt3 = ($bankcnt * $simmsperbank / $simmspergroup); $socket = $socketstr[$cnt3] if ($#socketstr); $order = $orderstr[$cnt3] if ($#orderstr); $group = $groupstr[$cnt3] if ($#groupstr); $bank = $bankstr[$cnt3] if ($#bankstr); $byte = $bytestr[$cnt3] if ($#bytestr); } $cnt++; } # # Check for stacked DIMMs. A 128MB DIMM is sometimes seen as 2 # 64MB DIMMs with a hole in the address range. This may report # more slots than are really in a system. (i.e. a SS20 with # 8 32MB SIMMs reports 16 slots of 16MB each). # Special handling for $sortslots == 0 systems (Ultra 5/10, # Netra t1) # $stacked = 0; if ($val < $#newslots - 2) { if ($sortslots == 0) { $start2 = $simmstart + ($simmrange * 2); $start2x = sprintf("%08lx", $start2 / $meg); $stacked = 2 if ($stacked == 0 & $newslots[$val + 2] eq $start2x & $newslots[$val + 3] eq $simmsz); # Some Netra t1 256MB mezzanine boards are seen # as 4 64MB memory blocks with holes in the # address range. $start3 = $simmstart + ($simmsize * 2 * $meg); $start3x = sprintf("%08lx", $start3 / $meg); if ($val < $#newslots - 6 & $stacked != 0) { $stacked = 4 if ($newslots[$val + 4] eq $start3x & $newslots[$val + 5] eq $simmsz & $simmrange != $start3 ); } } else { $start2 = $simmstart + ($simmrange / 2); $start2x = sprintf("%08lx", $start2 / $meg); $stacked = 2 if ($newslots[$val + 2] eq $start2x & $newslots[$val + 3] eq $simmsz & ($simmsize ne 64)); } if ($stacked == 2) { $totmem += $simmsize; $start2 = hex("0x$newslots[$val + 2]") * $meg; $start2x = sprintf("%08lx", $start2); $simm2stop = sprintf("%08lx", $start2 + ($simmsize * $meg) - 1); $simmstop .= ", 0x${start2x}-0x$simm2stop"; $simmsize *= 2; $val += 2; if ($model =~ /SPARCstation-10/ | $model eq "Premier-24") { $found32mb_ss10 = 1 if ($simmsize == 32); } } if ($stacked == 4) { $totmem += $simmsize * 3; $start2 = hex("0x$newslots[$val + 2]") * $meg; $start2x = sprintf("%08lx", $start2); $simm2stop = sprintf("%08lx", $start2 + ($simmsize * $meg) - 1); $simmstop .= ", 0x${start2x}-0x$simm2stop"; $start3 = hex("0x$newslots[$val + 4]") * $meg; $start3x = sprintf("%08lx", $start3); $simm3stop = sprintf("%08lx", $start3 + ($simmsize * $meg) - 1); $simmstop .= ", 0x${start3x}-0x$simm3stop"; $start4 = hex("0x$newslots[$val + 6]") * $meg; $start4x = sprintf("%08lx", $start4); $simm4stop = sprintf("%08lx", $start4 + ($simmsize * $meg) - 1); $simmstop .= ", 0x${start4x}-0x$simm4stop"; $simmsize *= 4; $val += 6; } } # # Check for Voyager memory cards. A 32MB memory card is seen # as 4 8MB memory blocks with holes in the address range. # if ($model eq "S240" & $simmstart > 0 & $simmsize == 16 & $val < $#newslots - 4) { $start = hex("0x$newslots[$val + 4]") - hex("0x$newslots[$val]"); $perlhexbug = 1 if ($start < 0); $startx = sprintf("%08lx", $start); if ($newslots[$val + 1] eq "008" & $newslots[$val + 3] eq "008" & $startx eq "00000040") { $totmem += $simmsize; $startx = $newslots[$val + 2]; $start = hex("0x$startx") * $meg; $startx = sprintf("%08lx", $start); $perlhexbug = 1 if ($start < 0); $simm2stop = sprintf("%08lx", $start + ($simmsize * $meg) - 1); $simmstop .= ", 0x${startx}-0x$simm2stop"; $startx = $newslots[$val + 4]; $start = hex("0x$startx") * $meg; $startx = sprintf("%08lx", $start); $perlhexbug = 1 if ($start < 0); $simm2stop = sprintf("%08lx", $start + ($simmsize * $meg) - 1); $simmstop .= ", 0x${startx}-0x$simm2stop"; $simmsize *= 2; $val += 4; } } $slot0 = $simmsize if ($simmstart == 0); $simmsizeperbank = $simmsize / $simmsperbank; $smallestsimm = $simmsizeperbank if ($simmsize < $smallestsimm); $largestsimm = $simmsizeperbank if ($simmsize > $largestsimm); push(@simmsizesfound, "$simmsizeperbank"); $cnt2 = 0; $maxcnt2 = $simmsperbank / $simmspergroup; while ($cnt2 < $maxcnt2) { $socket = '?' if ($socket eq ""); $recognized = 0 if ($socket eq "?"); $sockets_used = "$sockets_used $socket"; if ($simmspergroup > 1) { $buffer .= "${sockettype}s $socket have $simmsperbank "; $buffer .= $simmsize/$simmsperbank . "MB ${memtype}s"; } else { if ($socket eq "motherboard") { $buffer .= "$socket has "; $buffer .= $simmsize/$simmsperbank . "MB"; } else { if ($sockettype) { $buffer .= "${sockettype} $socket has a "; } else { $buffer .= "$socket is a "; } $buffer .= $simmsize/$simmsperbank . "MB $memtype"; } } if ($verbose) { $buffer .= " ("; if ($order ne "") { if ($memtype =~ /memory card/) { $buffer .= "$order, "; } else { $buffer .= "$order $memtype, "; } } $buffer .= "group $group, " if ($group ne ""); if ($bank ne "") { if ($bank =~ /Quad/) { $buffer .= "$bank, "; } else { $buffer .= "bank $bank, "; } } $buffer .= "byte $byte, " if ($byte ne ""); $buffer .= "address 0x${simmstartx}-0x$simmstop)"; } $buffer .= "\n"; $cnt2++; $cnt3 = ($bankcnt * $simmsperbank / $simmspergroup) + $cnt2; $socket = $socketstr[$cnt3] if ($#socketstr); $order = $orderstr[$cnt3] if ($#orderstr); $group = $groupstr[$cnt3] if ($#groupstr); $bank = $bankstr[$cnt3] if ($#bankstr); $byte = $bytestr[$cnt3] if ($#bytestr); } } elsif ($ultra eq 1 | $ultra eq 5 | $ultra eq 10 | $ultra eq 30) { $buffer .= "bank $slot has a pair of " . $simmsize/2 . "MB DIMMs\n"; } elsif ($ultra eq 2 | $ultra eq 250 | $ultra eq 450 | $ultra eq 80 | $ultra eq "420R") { $buffer .= "group $slot has four " . $simmsize/4 . "MB DIMMs\n"; } elsif ($ultra eq 60) { $buffer .= "group $slot has four " . $simmsize/2 . "MB DIMMs\n"; } elsif ($ultra eq "e") { $buffer .= "group $slot has eight " . $simmsize/8 . "MB DIMMs\n"; } elsif ($socket eq "motherboard") { $buffer .= "$slot has ${simmsize}MB\n"; } else { $buffer .= "slot $slot has a ${simmsize}MB $memtype\n"; } $slot++; } # # Try to distinguish Ultra 5 from Ultra 10 # Cannot distinguish Ultra 5/333MHz from Ultra 10/333MHz (375-0066 motherboard) # Cannot distinguish Ultra 5/440MHz from Ultra 10/440MHz (375-0079 motherboard) # if ($model eq "Ultra-5_10" | $ultra eq 5 | $ultra eq 10) { if ($motherboard eq "375-0009") { $ultra = ($sysfreq > 91) ? 10 : 5; $realmodel = ($ultra eq 5) ? "(Ultra 5)" : "(Ultra 10)"; } if ($sysfreq <= 91) { $ultra = 5; $realmodel = "(Ultra 5)"; } if ($sysfreq > 112) { $ultra = 10; $realmodel = "(Ultra 10)"; } if ($motherboard eq "375-0066" | $motherboard eq "375-0079") { if ($largestsimm == 256) { # Assume this is an Ultra 10 since Ultra 5 # does not support 256MB DIMMs $ultra = 10; $realmodel = "(Ultra 10)"; } } } finish: &show_header; print $buffer if ($buffer ne ""); # # Special memory options # if ($sxmem) { # Currently assumes only one VSIMM is installed. # Auxiliary Video Board 501-2020 (SS10SX) or 501-2488 (SS20) required # if two VSIMMs are installed. if ($model eq "SPARCstation-20" | $model eq "SuperCOMPstation-20S") { # SS20 first VSIMM in J0304/J0407, second in J0305/J0406 print "sockets J0304/J0407 have"; $sockets_used = "$sockets_used J0304"; } elsif ($model =~ /COMPstation-20A\b/) { # first VSIMM in J0202, second in J0301 print "socket J0202 has"; $sockets_used = "$sockets_used J0202"; } else { # SS10SX first VSIMM in J0301/J1203, second in J0202/J1201 print "sockets J0301/J1203 have"; $sockets_used = "$sockets_used J0301"; } print " a ${sxmem}MB VSIMM installed for SX (CG14) graphics\n"; } if ($nvmem) { # NVSIMMs for Prestoserve if ($model eq "SPARCstation-20" | $model eq "SuperCOMPstation-20S") { # SS20 first 2MB NVSIMM in J0305/J0406, second in J0304/J0407 if ($nvmem1) { $sockets_used = "$sockets_used J0305"; print "sockets J0305/J0406"; print " have a 2MB NVSIMM installed for Prestoserve\n"; } if ($nvmem2) { $sockets_used = "$sockets_used J0304"; print "sockets J0304/J0407"; print " have a 2MB NVSIMM installed for Prestoserve\n"; } } elsif ($model =~ /COMPstation-20A\b/) { # first 2MB NVSIMM in J0301, second in J0202 if ($nvmem1) { $sockets_used = "$sockets_used J0301"; print "socket J0301"; print " has a 2MB NVSIMM installed for Prestoserve\n"; } if ($nvmem2) { $sockets_used = "$sockets_used J0202"; print "socket J0202"; print " has a 2MB NVSIMM installed for Prestoserve\n"; } } elsif ($model =~ /SPARCstation-10/ | $model eq "Premier-24") { # SS10 first 2MB NVSIMM in J0202/J1201, second in J0301/J1203 if ($nvmem1) { $sockets_used = "$sockets_used J0202"; print "sockets J0202/J1201"; print " have a 2MB NVSIMM installed for Prestoserve\n"; } if ($nvmem2) { $sockets_used = "$sockets_used J0301"; print "sockets J0301/J1203"; print " have a 2MB NVSIMM installed for Prestoserve\n"; } } else { # SS1000 supports two banks of four 1MB NVSIMMs # SC2000 supports one bank of eight 1MB NVSIMMs print "has ${nvmem}MB of NVSIMM installed for Prestoserve\n"; } } # # Check for empty sockets # if ($#socketstr > 0) { if ($sockettype) { print "empty ${sockettype}s:"; } else { print "empty memory slots:"; } foreach $socket (@socketstr) { if ($socket ne "?") { if ($sockets_used !~ /\b$socket\b/ & $sockets_empty !~ /\b$socket\b/) { $sockets_empty = "$sockets_empty $socket"; } } } if ($sockets_empty ne "") { print "$sockets_empty\n"; } else { print " None\n"; } } # # Print total memory # print "total memory = ${totmem}MB"; if ($totmem > 1023) { print " (", $totmem / 1024, "GB)"; } print "\n"; # # Check for illegal memory stuffings # if ($model eq "Sun 4/50" | $model eq "Sun 4/25") { # IPX, ELC if ($slot0 != 16 & $largestsimm == 16 & $sunos =~ /4.1.1/) { print "ERROR: Install the highest capacity 16MB SIMM in "; print "socket $socketstr[0] under SunOS 4.1.1.\n"; $exitstatus = 1; } } if ($model =~ /SPARCstation-10/ | $model eq "Premier-24") { if ($slot0 < $largestsimm & $BSD) { print "ERROR: Install the highest capacity SIMM in socket "; print "$socketstr[0] under Solaris 1.X.\n"; $exitstatus = 1; } if ($found32mb_ss10) { print "WARNING: The 32MB SIMM is not supported in the SS10 "; print "or SS10SX according to\n"; print " Sun. However it does appear to work correctly.\n"; } if (! $nvmem1 & $nvmem2) { print "ERROR: First NVSIMM should be installed in socket J0202, not socket J0301\n"; $exitstatus = 1; } } if ($model eq "SPARCstation-20" | $model eq "SuperCOMPstation-20S") { if (! $nvmem1 & $nvmem2) { print "ERROR: First NVSIMM should be installed in socket J0305, not socket J0304\n"; $exitstatus = 1; } } if ($model eq "SPARCstation-5") { if ($slot0 < $largestsimm & $BSD) { print "ERROR: Install the highest capacity SIMM in socket "; print "$socketstr[0] under Solaris 1.X.\n"; $exitstatus = 1; } } if ($model eq "Ultra-5_10" | $ultra eq 5 | $ultra eq 10) { # Look for 16MB DIMMs if ($smallestsimm == 16 & $largestsimm > 16) { print "ERROR: 16MB DIMMs cannot be mixed with larger DIMMs "; print "on Ultra 5/10 systems.\n"; $exitstatus = 1; } } if ($ultra eq 5) { # Look for 256MB DIMMs if ($largestsimm == 256) { print "ERROR: 256MB DIMMs cannot be used on Ultra 5 systems.\n"; $exitstatus = 1; } } # # Check for buggy perl version # if ($perlhexbug) { $_ = $]; ($VERS) = /(\d\.\d{3}).*/; print "ERROR: Perl V5.001 is known to be buggy.\n" if ($VERS == 5.001); print "ERROR: Perl V5.002 or later is recommended for best results.\n" if ($VERS < 5.002); exit 1; } # # Check for unsupported memory sizes # if ($smallestsimm < $simmsizes[0]) { print "ERROR: Smaller than expected $memtype found "; print "(found ${smallestsimm}MB, smallest expected "; print "${simmsizes[0]}MB)\n"; $exitstatus = 1; } if ($largestsimm > $simmsizes[$#simmsizes]) { print "ERROR: Larger than expected $memtype found "; print "(found ${largestsimm}MB, largest expected "; print "${simmsizes[$#simmsizes]}MB)\n"; $exitstatus = 1; } undef %saw; @saw{@simmsizesfound} = (); @simmsizesfound = sort keys %saw; foreach $i (@simmsizesfound) { $simmsizelegal = 0; foreach $j (@simmsizes) { if ($i == $j) { $simmsizelegal = 1; } } if ($simmsizelegal == 0 & $found32mb_ss10 == 0) { print "ERROR: Unsupported ${i}MB $memtype found (supported "; if ($#simmsizes == 0) { print "size is @{simmsizes}MB)\n"; } else { print "MB sizes are: @simmsizes)\n"; } $exitstatus = 1; } } # # Check for possible memory detection errors by this program # if ($recognized == 0) { print "ERROR: Layout of memory ${sockettype}s not completely "; print "recognized on this system.\n"; $exitstatus = 1; } if ($recognized < 0) { print "WARNING: Layout of memory ${sockettype}s not completely "; print "recognized on this system.\n"; if ($recognized == -2) { # Hack: If Ultra-80 or Enterprise 420R has 4GB of memory # (maximum allowed), then memory line was rewritten to show # memory stuffing. print " The memory configuration displayed should be"; print " correct though since this\n"; print " is a fully stuffed system.\n"; } print " This is a known bug due to Sun's 'prtconf' "; if ($prtdiag_cmd) { print "and 'prtdiag' commands not\n"; } else { print "command not\n"; } print " providing enough detail for the memory layout of this\n"; print " SunOS $sunos $platform system to be determined.\n"; print " A newer version of Open Boot PROM may improve this.\n"; $exitstatus = 1; } if ($installed_memory > 0) { if ($installed_memory != $totmem) { print "ERROR: Total memory installed (${installed_memory}MB) "; print "does not match total memory found.\n"; $recognized = 0; $exitstatus = 1; } } &show_unrecognized if ($recognized == 0); $untested = 2 if ($sunos =~ /5.9/); # Future/Beta SunOS releases &show_untested if ($untested); exit $exitstatus;