Add help for mainsize, xpndsize, defstore. Message cleanup for locate command.

git-svn-id: file:///home/jj/hercules.svn/trunk@7073 956126f8-22a0-4046-8f4a-272fa8102e63
This commit is contained in:
Paul Gorlinsky
2010-11-07 22:17:36 +00:00
parent a3f6b3fb89
commit 863e774ef4
5 changed files with 251 additions and 177 deletions
+2 -2
View File
@@ -253,8 +253,6 @@ int ProcessCmdLine (char* pszCmdLine)
obtain_lock(&ProcessConsoleCommandLock);
CommandLockCounter++;
if (MLVL(DEBUG))
{
char msgbuf[64];
@@ -262,6 +260,8 @@ int ProcessCmdLine (char* pszCmdLine)
WRMSG( HHC90000, "D", msgbuf );
}
CommandLockCounter++;
if (!pszCmdLine || !*pszCmdLine)
{
/* [enter key] by itself: start the CPU
+60 -5
View File
@@ -344,15 +344,70 @@ COMMAND("yroffset", SYSCONFIG|SYSNDIAG, yroffset_cmd,
CMDABBR("defstore",7,SYSCONFIG|SYSNDIAG, defstore_cmd,
"Define/Display main and expanded storage values",
NULL)
"Format: defstorE [ mAIN | xSTORE | eXPANDED [ ssss[S] [ lOCK | unlOCK ] ] ]\n"
" Without any options, display current settings\n"
" mAIN - define/display main storage allocations\n"
" xSTORE - define/display expanded storage allocations\n"
" eXPANDED\n"
"\n"
" ssssS - specify amount of storage in 'S' units\n"
" B = no multiplier - main only\n"
" K = 2**10 (kilo/kibi) - main only\n"
" M = 2**20 (mega/mebi)\n"
" G = 2**30 (giga/gibi)\n"
" T = 2**40 (tera/tebi) - not 32-bit\n"
" P = 2**50 (peta/pebi) - not 32-bit\n"
" E = 2**60 (exa/exbi) - not 32-bit\n"
"\n"
" lOCK - attempt to lock storage (pages lock by host OS)\n"
" unlOCK - leave storage unlocked (pagable by host OS)\n"
"\n"
" (none) - display current mainsize value\n"
"\n"
" Note: Multipliers 'T', 'P', and 'E' are not available on 32bit machines\n"
" Expanded Storage is allocated in minimum of 1M units\n"
"")
COMMAND("mainsize", SYSCONFIG|SYSNDIAG, mainsize_cmd,
"Set mainsize parameter",
NULL)
"Define/Display mainsize parameter",
"Format: mainsize [ mmmm | nnnS [ lOCK | unlOCK ] ]\n"
" mmmm - define main storage size mmmm Megabytes\n"
"\n"
" nnnS - define main storage size nnn S where S is the multiplier\n"
" B = no multiplier\n"
" K = 2**10 (kilo/kibi)\n"
" M = 2**20 (mega/mebi)\n"
" G = 2**30 (giga/gibi)\n"
" T = 2**40 (tera/tebi)\n"
" P = 2**50 (peta/pebi)\n"
" E = 2**60 (exa/exbi)\n"
"\n"
" lOCK - attempt to lock storage (pages lock by host OS)\n"
" unlOCK - leave storage unlocked (pagable by host OS)\n"
"\n"
" (none) - display current mainsize value\n"
"\n"
" Note: Multipliers 'T', 'P', and 'E' are not available on 32bit machines\n"
"")
COMMAND("xpndsize", SYSCONFIG|SYSNDIAG, xpndsize_cmd,
"Set xpndsize parameter",
NULL)
"Define/Display mainsize parameter",
"Format: xpndsize [ mmmm | nnnS ]\n"
" mmmm - define expanded storage size mmmm Megabytes\n"
"\n"
" nnnS - define expanded storage size nnn S where S is the multiplier\n"
" M = 2**20 (mega/mebi)\n"
" G = 2**30 (giga/gibi)\n"
" T = 2**40 (tera/tebi)\n"
"\n"
" (none) - display current mainsize value\n"
"\n"
" lOCK - attempt to lock storage (pages lock by host OS)\n"
" unlOCK - leave storage unlocked (pagable by host OS)\n"
"\n"
" Note: Multiplier 'T' is not available on 32bit machines\n"
" Expanded storage is limited to 1G on 32bit machines\n"
"")
COMMAND("hercprio", SYSCONFIG|SYSNDIAG, hercprio_cmd,
"Set/Display hercprio parameter",
+84 -83
View File
@@ -2537,7 +2537,12 @@ int defstore_cmd(int argc, char *argv[], char *cmdline)
UNREFERENCED(cmdline);
if ( argc < 2 || argc > 4 )
if ( argc == 1 )
{
rc = qstor_cmd( argc, argv, cmdline );
}
else
if ( argc > 4 )
{
WRMSG( HHC02299, "E", argv[0] );
rc = -1;
@@ -2570,13 +2575,13 @@ int defstore_cmd(int argc, char *argv[], char *cmdline)
rc = mainsize_cmd( ac, av, NULL );
}
else
if ( CMD(argv[1],xpanded,1) || CMD(argv[1],expanded,1) )
if ( CMD(argv[1],xstore,1) || CMD(argv[1],expanded,1) )
{
rc = xpndsize_cmd( ac, av, NULL );
}
else
{
WRMSG( HHC02205, "E", argv[1], "; must be main, xpanded, or expanded" );
WRMSG( HHC02205, "E", argv[1], "; must be main, xstore, or expanded" );
rc = -1;
}
}
@@ -2617,18 +2622,28 @@ char *q_argv[2] = { "qstor", "main" };
{
switch (toupper(f))
{
case 'B':
if ( mainsize < 4096 )
mainsize = 4096;
break;
case 'K':
mainsize <<= SHIFT_KILOBYTE;
mainsize <<= SHIFT_KIBIBYTE;
break;
case 'M':
mainsize <<= SHIFT_MEGABYTE;
mainsize <<= SHIFT_MEBIBYTE;
break;
case 'G':
mainsize <<= SHIFT_GIGABYTE;
mainsize <<= SHIFT_GIBIBYTE;
break;
#if SIZEOF_SIZE_T >= 8
case 'T':
mainsize <<= SHIFT_TERABYTE;
mainsize <<= SHIFT_TEBIBYTE;
break;
case 'P':
mainsize <<= SHIFT_PEBIBYTE;
break;
case 'E':
mainsize <<= SHIFT_EXBIBYTE;
break;
#endif
default:
@@ -7433,113 +7448,99 @@ int qproc_cmd(int argc, char *argv[], char *cmdline)
return 0;
}
/*-------------------------------------------------------------------*/
/* fmt_memsize routine for qstor */
/*-------------------------------------------------------------------*/
static char *fmt_memsize( const U64 memsize )
{
static char fmt_mem[64];
double mem = (double)memsize;
BYTE size;
int i;
// Mainframe memory and DASD amounts are reported in 2**(10*n)
// values, (x_iB international format, and shown as x_ or x_B, when
// x >= 1024; x when x < 1024). Open Systems and Windows report
// memory in the same format, but report DASD storage in 10**(3*n)
// values. (Thank you, various marketing groups and international
// standards committees...)
bzero(fmt_mem, sizeof(fmt_mem));
// For Hercules, mainframe oriented reporting characteristics will
// be formatted and shown as x_, when x >= 1024, and as x when x <
// 1024. Reporting of Open Systems and Windows specifics should
// follow the international format, shown as x_iB, when x >= 1024,
// and x or xB when x < 1024. Reporting is done at the highest
// integral boundary.
if ( mem >= (double)ONE_EXBIBYTE )
{
mem /= (double)ONE_EXBIBYTE;
size = 'E';
}
if ( mem >= (double)ONE_PEBIBYTE )
{
mem /= (double)ONE_PEBIBYTE;
size = 'P';
}
if ( mem >= (double)ONE_TEBIBYTE )
{
mem /= (double)ONE_TEBIBYTE;
size = 'T';
}
else if ( mem >= ONE_GIBIBYTE )
{
mem /= (double)ONE_GIBIBYTE;
size = 'G';
}
else if ( mem >= (double)ONE_MEBIBYTE )
{
mem /= (double)ONE_MEBIBYTE;
size = 'M';
}
else
{
mem /= (double)ONE_KIBIBYTE;
size = 'K';
}
// Format storage in 2**(10*n) values at the highest integral
// integer boundary.
MSGBUF( fmt_mem, "%9.4f", mem );
i = (int)strlen(fmt_mem);
const char suffix[9] = {0x00, 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'};
static char fmt_mem[128]; // Max of 21 bytes used for U64
u_int i = 0;
U64 mem = memsize;
if ( i > 0 )
{
for ( i--; i > 0; i-- )
{
if ( fmt_mem[i] == '0' ) fmt_mem[i] = '\0';
else if ( fmt_mem[i] == '.' ) { fmt_mem[i] = '\0'; break; }
else break;
}
}
if (mem)
for (i = 0; i < sizeof(suffix); i++)
{
if (mem & 0x3FF)
break;
mem >>= 10;
}
fmt_mem[strlen(fmt_mem)] = '\0';
fmt_mem[strlen(fmt_mem)+1] = '\0';
fmt_mem[strlen(fmt_mem)+2] = '\0';
fmt_mem[strlen(fmt_mem)] = ' ';
fmt_mem[strlen(fmt_mem)] = size;
MSGBUF( fmt_mem, "%"I64_FMT"u %c", mem, suffix[i]);
return fmt_mem;
}
/*-------------------------------------------------------------------*/
/* qstor command */
/*-------------------------------------------------------------------*/
int qstor_cmd(int argc, char *argv[], char *cmdline)
{
BYTE display_main = TRUE;
BYTE display_xpnd = TRUE;
char buf[64];
U64 xpndsize = (U64)(sysblk.xpndsize) << 12;
BYTE display_main = FALSE;
BYTE display_xpnd = FALSE;
UNREFERENCED(cmdline);
if (argc > 2)
if ( argc < 2 )
display_main = display_xpnd = TRUE;
else
{
WRMSG( HHC02299, "E", argv[0] );
return -1;
}
if ( argc == 2 && CMD(argv[1],mainsize,1) )
display_xpnd = FALSE;
else if ( argc == 2 && ( CMD(argv[1],xpndsize,1) || CMD(argv[1],expanded,2) ) )
display_main = FALSE;
else if ( argc == 2 )
{
WRMSG( HHC02205, "E", argv[1], "; either 'mainsize' or 'xpndsize' is valid" );
return -1;
u_int i;
for (i = 1; i < (u_int)argc; i++)
{
char check[16];
strnupper(check, argv[i], (u_int)sizeof(check)); // Uppercase for multiple checks
if ( strabbrev("MAINSIZE", check, 1) )
display_main = TRUE;
else if ( strabbrev("XPNDSIZE", check, 1) ||
strabbrev("EXPANDED", check, 1) )
display_xpnd = TRUE;
else
{
WRMSG( HHC02205, "E", argv[1], "; either 'mainsize' or 'xpndsize' is valid" );
return -1;
}
}
}
if ( display_main )
{
MSGBUF( buf, "%s", fmt_memsize((U64)sysblk.mainsize) );
WRMSG( HHC17003, "I", "MAIN", buf, "main", sysblk.mainstor_locked ? "":"not " );
U64 mainsize = sysblk.mainsize;
if (!sysblk.maxcpu && mainsize <= _64_KILOBYTE )
mainsize = 0;
WRMSG( HHC17003, "I", "MAIN", fmt_memsize((U64)mainsize),
"main", sysblk.mainstor_locked ? "":"not " );
}
if ( display_xpnd )
{
MSGBUF( buf, "%s", fmt_memsize((U64)xpndsize) );
WRMSG( HHC17003, "I", "EXPANDED", buf, "xpnd", sysblk.xpndstor_locked ? "":"not " );
WRMSG( HHC17003, "I", "EXPANDED", fmt_memsize((U64)sysblk.xpndsize << 12),
"xpnd", sysblk.xpndstor_locked ? "":"not " );
}
return 0;
}
/*-------------------------------------------------------------------*/
/* cmdlevel - display/set the current command level group(s) */
/*-------------------------------------------------------------------*/
+104 -86
View File
@@ -13,57 +13,63 @@
#include "hercules.h"
/*-------------------------------------------------------------------*/
/* fmt_memsize routine for qstor */
/*-------------------------------------------------------------------*/
static char *fmt_memsize( const U64 memsize )
{
static char fmt_mem[64];
double mem = (double)memsize;
BYTE size;
int i;
// Mainframe memory and DASD amounts are reported in 2**(10*n)
// values, (x_iB international format, and shown as x_ or x_B, when
// x >= 1024; x when x < 1024). Open Systems and Windows report
// memory in the same format, but report DASD storage in 10**(3*n)
// values. (Thank you, various marketing groups and international
// standards committees...)
bzero(fmt_mem, sizeof(fmt_mem));
// For Hercules, mainframe oriented reporting characteristics will
// be formatted and shown as x_, when x >= 1024, and as x when x <
// 1024. Reporting of Open Systems and Windows specifics should
// follow the international format, shown as x_iB, when x >= 1024,
// and x or xB when x < 1024. Reporting is done at the highest
// integral boundary.
if ( mem >= (double)ONE_TEBIBYTE )
{
mem /= (double)ONE_TEBIBYTE;
size = 'T';
}
else if ( mem >= ONE_GIBIBYTE )
{
mem /= (double)ONE_GIBIBYTE;
size = 'G';
}
else if ( mem >= (double)ONE_MEBIBYTE )
{
mem /= (double)ONE_MEBIBYTE;
size = 'M';
}
else
{
mem /= (double)ONE_KIBIBYTE;
size = 'K';
}
// Format storage in 2**(10*n) values at the highest integral
// integer boundary.
MSGBUF( fmt_mem, "%9.4f", mem );
i = (int)strlen(fmt_mem);
const char suffix[9] = {0x00, 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'};
static char fmt_mem[128]; // Max of 21 bytes used for U64
U64 mem = memsize;
u_int i = 0;
if ( i > 0 )
{
for ( i--; i > 0; i-- )
{
if ( fmt_mem[i] == '0' ) fmt_mem[i] = '\0';
else if ( fmt_mem[i] == '.' ) { fmt_mem[i] = '\0'; break; }
else break;
}
}
if (mem)
for (i = 0; i < sizeof(suffix); i++)
{
/* if ( mem > ONE_YOBIBYTE )
mem &= 0xFFFFFFFFC0000000ULL;
if ( mem > ONE_ZEBIBYTE )
mem &= 0xFFFFFFFFC0000000ULL;
else
*/
if ( mem > ONE_EXBIBYTE )
mem &= 0xFFFC000000000000ULL;
else if ( mem > ONE_PEBIBYTE )
mem &= 0xFFFFFF0000000000ULL;
else if ( mem > ONE_TEBIBYTE )
mem &= 0xFFFFFFFFC0000000ULL;
else if ( mem > ONE_GIBIBYTE )
mem &= 0xFFFFFFFFFFF00000ULL;
else if ( mem > ONE_MEBIBYTE )
mem &= 0xFFFFFFFFFFFFFC00ULL;
if (mem & 0x03FF)
break;
mem >>= 10;
}
fmt_mem[strlen(fmt_mem)] = '\0';
fmt_mem[strlen(fmt_mem)+1] = '\0';
fmt_mem[strlen(fmt_mem)] = size;
MSGBUF( fmt_mem, "%5"I64_FMT"u %c", mem, suffix[i]);
return fmt_mem;
}
static char *fmt_decimal( const U64 number )
{
static char fmt_dec[64];
@@ -73,44 +79,54 @@ static char *fmt_decimal( const U64 number )
bzero(fmt_dec, sizeof(fmt_dec));
if ( num >= (double)ONE_TRILLION )
if ( num > 0 )
{
num /= (double)ONE_TRILLION;
size = 'T';
}
else if ( num >= ONE_BILLION )
{
num /= (double)ONE_BILLION;
size = 'G';
}
else if ( num >= (double)ONE_MILLION )
{
num /= (double)ONE_MILLION;
size = 'M';
}
else
{
num /= (double)ONE_THOUSAND;
size = 'K';
}
MSGBUF( fmt_dec, "%7.3f", num );
i = (int)strlen(fmt_dec);
if ( i > 0 )
{
for ( i--; i > 0; i-- )
if ( num >= (double)ONE_TRILLION )
{
if ( fmt_dec[i] == '0' ) fmt_dec[i] = '\0';
else if ( fmt_dec[i] == '.' ) { fmt_dec[i] = '\0'; break; }
else break;
num /= (double)ONE_TRILLION;
size = 'T';
}
else if ( num >= ONE_BILLION )
{
num /= (double)ONE_BILLION;
size = 'G';
}
else if ( num >= (double)ONE_MILLION )
{
num /= (double)ONE_MILLION;
size = 'M';
}
else
{
num /= (double)ONE_THOUSAND;
size = 'K';
}
}
fmt_dec[strlen(fmt_dec)] = '\0';
fmt_dec[strlen(fmt_dec)+1] = '\0';
fmt_dec[strlen(fmt_dec)] = size;
MSGBUF( fmt_dec, "%7.3f", num );
i = (int)strlen(fmt_dec);
if ( i > 0 )
{
for ( i--; i > 0; i-- )
{
if ( fmt_dec[i] == '0' ) fmt_dec[i] = '\0';
else if ( fmt_dec[i] == '.' ) { fmt_dec[i] = '\0'; break; }
else break;
}
}
fmt_dec[strlen(fmt_dec)] = '\0';
fmt_dec[strlen(fmt_dec)+1] = '\0';
fmt_dec[strlen(fmt_dec)+2] = '\0';
fmt_dec[strlen(fmt_dec)] = ' ';
fmt_dec[strlen(fmt_dec)] = size;
}
else
{
MSGBUF( fmt_dec, "%3d ", 0 );
size = ' ';
}
return fmt_dec;
}
@@ -545,42 +561,42 @@ int locate_hostinfo(int argc, char *argv[], char *cmdline)
WRMSG( HHC90000, "D", "" );
MSGBUF( msgbuf, "%-17s = %d", "num_procs", pHostInfo->num_procs );
MSGBUF( msgbuf, "%-17s = %3d", "num_procs", pHostInfo->num_procs );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %d", "num_packages", pHostInfo->num_packages );
MSGBUF( msgbuf, "%-17s = %3d", "num_packages", pHostInfo->num_packages );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %d", "num_physical_cpu", pHostInfo->num_physical_cpu );
MSGBUF( msgbuf, "%-17s = %3d", "num_physical_cpu", pHostInfo->num_physical_cpu );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %d", "num_logical_cpu", pHostInfo->num_logical_cpu );
MSGBUF( msgbuf, "%-17s = %3d", "num_logical_cpu", pHostInfo->num_logical_cpu );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %shz", "bus_speed", fmt_decimal((U64)pHostInfo->bus_speed) );
MSGBUF( msgbuf, "%-17s = %sHz", "bus_speed", fmt_decimal((U64)pHostInfo->bus_speed) );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %shz", "cpu_speed", fmt_decimal((U64)pHostInfo->cpu_speed) );
MSGBUF( msgbuf, "%-17s = %sHz", "cpu_speed", fmt_decimal((U64)pHostInfo->cpu_speed) );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %s", "vector_unit", pHostInfo->vector_unit ? "YES" : "NO" );
MSGBUF( msgbuf, "%-17s = %s", "vector_unit", pHostInfo->vector_unit ? "YES" : " NO" );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %s", "fp_unit", pHostInfo->fp_unit ? "YES" : "NO" );
MSGBUF( msgbuf, "%-17s = %s", "fp_unit", pHostInfo->fp_unit ? "YES" : " NO" );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %s", "cpu_64bits", pHostInfo->cpu_64bits ? "YES" : "NO" );
MSGBUF( msgbuf, "%-17s = %s", "cpu_64bits", pHostInfo->cpu_64bits ? "YES" : " NO" );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %s", "cpu_aes_extns", pHostInfo->cpu_aes_extns ? "YES" : "NO" );
MSGBUF( msgbuf, "%-17s = %s", "cpu_aes_extns", pHostInfo->cpu_aes_extns ? "YES" : " NO" );
WRMSG( HHC90000, "D", msgbuf );
WRMSG( HHC90000, "D", "" );
MSGBUF( msgbuf, "%-17s = %s", "valid_cache_nums", pHostInfo->valid_cache_nums ? "YES" : "NO" );
MSGBUF( msgbuf, "%-17s = %s", "valid_cache_nums", pHostInfo->valid_cache_nums ? "YES" : " NO" );
WRMSG( HHC90000, "D", msgbuf );
MSGBUF( msgbuf, "%-17s = %"FRADR"u", "cachelinesz", pHostInfo->cachelinesz );
MSGBUF( msgbuf, "%-17s = %5"FRADR"u B", "cachelinesz", pHostInfo->cachelinesz );
WRMSG( HHC90000, "D", msgbuf );
if ( pHostInfo->L1Dcachesz != 0 )
@@ -615,6 +631,8 @@ int locate_hostinfo(int argc, char *argv[], char *cmdline)
MSGBUF( msgbuf, "%-17s = %siB", "AllocGran", fmt_memsize((U64)pHostInfo->AllocationGranularity) );
WRMSG( HHC90000, "D", msgbuf );
WRMSG( HHC90000, "D", "" );
MSGBUF( msgbuf, "%-17s = %siB", "TotalPhys", fmt_memsize((U64)pHostInfo->TotalPhys) );
WRMSG( HHC90000, "D", msgbuf );
+1 -1
View File
@@ -1765,7 +1765,7 @@ int have_lock = 0; try_lock = 10; \
#define HHC17000 "Missing or invalid argument(s)"
#define HHC17001 "%s server listening %s"
#define HHC17002 "%s server inactive"
#define HHC17003 "%-8s storage is %siBytes '%ssize'; storage is %slocked"
#define HHC17003 "%-8s storage is %s (%ssize); storage is %slocked"
#define HHC17004 "CPUID = "I64_FMTX""
#define HHC17005 "CPC SI = %4.4X.%s.%s.%s.%16.16X"
#define HHC17006 "LPARNAME[%2.2X] = %s"