/* * Written using information from: * * http://service.software.ibm.com/cgi-bin/support/rs6000.support/techbrowse/tbgaus?gaus_mode=8&documents=B93576892313352&database=task * * Not fully implemented. In particular there are ways to resolve the * "(unknown)" clock speeds of many of these models. See page for details. * */ bool GetInfo_CPU( QListView *lBox ) { struct utsname info; struct model *table = _models; /* table of model information */ char model_ID[21] = ""; /* information for table lookup */ char cpu_ID[7] = ""; /* unique CPU ID */ int i; QListViewItem *lastitem = NULL; lBox->addColumn(i18n("Information")); lBox->addColumn(i18n("Value")); if (uname(&info) == -1) { kdError(0) << "uname() failed: errno = " << errno << endl; return false; } strncat(model_ID, info.machine+8, 2); /* we want the ninth and tenth digits */ strncat(cpu_ID, info.machine+2, 6); if (strcmp(model_ID, "4C") == 0) /* need to use a different model_ID and model table */ { if (odm_initialize() == -1) kdError(0) << "odm_initialize() failed: odmerrno = " << odmerrno << endl; else { struct CuAt cuat; /* Customized Device attribute */ /* equivalent to uname -M */ if ( odm_get_first(CuAt_CLASS, (char *)"name='sys0' and attribute='modelname'", &cuat) ) { strcpy(model_ID, cuat.value); table = _4C_models; } odm_terminate(); } } lastitem = new QListViewItem(lBox, lastitem, QString("CPU ID"), QString(cpu_ID)); lastitem = new QListViewItem(lBox, lastitem, QString("Node"), QString(info.nodename)); lastitem = new QListViewItem(lBox, lastitem, QString("OS"), QString(info.sysname) + QString(" ") + QString(info.version) + QString(".") + QString(info.release)); for (i=0; *(table[i].model_ID); i++) if (strcmp(model_ID, table[i].model_ID) == 0) { lastitem = new QListViewItem(lBox, lastitem, QString("Machine Type"), QString(table[i].machine_type)); lastitem = new QListViewItem(lBox, lastitem, QString("Architecture"), QString(chip_name[table[i].architecture])); lastitem = new QListViewItem(lBox, lastitem, QString("Speed"), QString(table[i].processor_speed) + QString(" Mhz")); break; } return(true); }
int main(int argc, char **argv) { char *logical_name, *ptr; char sstring[256]; struct CuDv cudvobj; struct PdDv pddvobj; int rc, how_many, errflg, c, majorno, minorno, unit, verbose; struct cfg_dd cfg; struct cfg_load load; int *minor_list; extern int optind; extern char *optarg; verbose = errflg = 0; logical_name = NULL; while ((c = getopt(argc,argv,"vl:")) != EOF) { switch (c) { case 'v': verbose++; break; case 'l': if (logical_name != NULL) errflg++; logical_name = optarg; break; default: errflg++; } } if (errflg) exit(E_ARGS); if (logical_name == NULL) exit(E_LNAME); if (odm_initialize() == -1) exit(E_ODMINIT); /* Get Customized Device Object for this device */ sprintf(sstring,"name = '%s'",logical_name); rc = (int) odm_get_first(CuDv_CLASS, sstring, &cudvobj); if (rc == 0) { err_exit(E_NOCuDv); } else if (rc == -1) { err_exit(E_ODMGET); } if (cudvobj.status == DEFINED) err_exit(E_OK); /* already unconf'd */ /* get device's predefined object */ sprintf(sstring,"uniquetype = '%s'", cudvobj.PdDvLn_Lvalue); rc = (int) odm_get_first(PdDv_CLASS, sstring, &pddvobj); if (rc == 0) err_exit(E_NOPdDv); else if (rc == -1) err_exit(E_ODMGET); /* * Call sysconfig() to "terminate" the device. * If fails with EBUSY, then device instance is "open", * and device cannot be "unconfigured". Any other errno * returned will be ignored since we MUST unconfigure the * device even if it reports some other error. */ /* get major number of device */ majorno = genmajor(pddvobj.DvDr); if (majorno == -1) { return(E_MAJORNO); } /* get minor number */ minor_list = getminor(majorno, &how_many, pddvobj.DvDr); if (minor_list == NULL || how_many == 0) err_exit (E_MINORNO); vprintf("how_many=%d\n", how_many); ptr = logical_name; ptr += strlen(pddvobj.prefix); unit = atoi(ptr); if (unit >= how_many) { err_exit (E_MINORNO); } minorno = minor_list[unit]; vprintf("unit %d minorno %d\n", unit, minorno); /* create devno for this device */ cfg.devno = makedev(majorno, minorno); cfg.kmid = 0; cfg.ddsptr = (caddr_t) NULL; cfg.ddslen = (int) 0; cfg.cmd = CFG_TERM; if (sysconfig(SYS_CFGDD, &cfg, sizeof(struct cfg_dd)) == -1) { if (errno == EBUSY) err_exit(E_BUSY); } cfg.kmid = loadext(pddvobj.DvDr, FALSE, FALSE); if (cfg.kmid == NULL) err_exit(E_UNLOADEXT); /* Change the status field of device to "DEFINED" */ cudvobj.status = DEFINED; if (odm_change_obj(CuDv_CLASS, &cudvobj) == -1) err_exit(E_ODMUPDATE); /* * Terminate ODM */ odm_terminate(); return (E_OK); }