Merge pull request #34 from causten/bettersensors
Fix bugs from test runs
diff --git a/ipmisensor.C b/ipmisensor.C
index 513e485..6d3d3bd 100644
--- a/ipmisensor.C
+++ b/ipmisensor.C
@@ -1,6 +1,7 @@
#include <stdio.h>
#include <string.h>
#include <stdint.h>
+#include <malloc.h>
extern uint8_t find_sensor(uint8_t);
@@ -30,8 +31,8 @@
uint8_t offset;
int (*func)(const sensorRES_t *, const lookup_t *, const char *);
char method[16];
- char assertion[16];
- char deassertion[16];
+ char assertion[64];
+ char deassertion[64];
};
@@ -46,7 +47,7 @@
struct event_data_t {
uint8_t data;
- char text[32];
+ char text[64];
};
event_data_t g_fwprogress02h[] = {
@@ -79,10 +80,26 @@
{0xFF, "Unknown"}
};
+event_data_t g_fwprogress00h[] = {
+ {0x00, "Unspecified."},
+ {0x01, "No system memory detected"},
+ {0x02, "No usable system memory"},
+ {0x03, "Unrecoverable hard-disk/ATAPI/IDE"},
+ {0x04, "Unrecoverable system-board"},
+ {0x05, "Unrecoverable diskette"},
+ {0x06, "Unrecoverable hard-disk controller"},
+ {0x07, "Unrecoverable PS/2 or USB keyboard"},
+ {0x08, "Removable boot media not found"},
+ {0x09, "Unrecoverable video controller"},
+ {0x0A, "No video device detected"},
+ {0x0B, "Firmware ROM corruption detected"},
+ {0x0C, "CPU voltage mismatch"},
+ {0x0D, "CPU speed matching"},
+ {0xFF, "unknown"},
+};
-char *getfw02string(uint8_t b) {
- event_data_t *p = g_fwprogress02h;
+char *event_data_lookup(event_data_t *p, uint8_t b) {
while(p->data != 0xFF) {
if (p->data == b) {
@@ -93,20 +110,24 @@
return p->text;
}
+
+
+
// The fw progress sensor contains some additional information that needs to be processed
// prior to calling the dbus code.
int set_sensor_dbus_state_fwprogress(const sensorRES_t *pRec, const lookup_t *pTable, const char *value) {
- char valuestring[64];
+ char valuestring[128];
char* p = valuestring;
switch (pTable->offset) {
- case 0x00 : snprintf(p, sizeof(valuestring), "POST Error, 0x%02x", pRec->event_data2);
+ case 0x00 : snprintf(p, sizeof(valuestring), "POST Error, %s", event_data_lookup(g_fwprogress00h, pRec->event_data2));
break;
- case 0x01 : snprintf(p, sizeof(valuestring), "FW Hang, 0x%02x", pRec->event_data2);
+ case 0x01 : /* Using g_fwprogress02h for 0x01 because thats what the ipmi spec says to do */
+ snprintf(p, sizeof(valuestring), "FW Hang, %s", event_data_lookup(g_fwprogress02h, pRec->event_data2));
break;
- case 0x02 : snprintf(p, sizeof(valuestring), "FW Progress, %s", getfw02string(pRec->event_data2));
+ case 0x02 : snprintf(p, sizeof(valuestring), "FW Progress, %s", event_data_lookup(g_fwprogress02h, pRec->event_data2));
break;
}
@@ -115,7 +136,7 @@
// Handling this special OEM sensor by coping what is in byte 4. I also think that is odd
// considering byte 3 is for sensor reading. This seems like a misuse of the IPMI spec
-int set_sensor_dbus_state_osboot(const sensorRES_t *pRec, const lookup_t *pTable, const char *value) {
+int set_sensor_dbus_state_osbootcount(const sensorRES_t *pRec, const lookup_t *pTable, const char *value) {
char valuestring[32];
char* pStr = valuestring;
@@ -125,13 +146,14 @@
}
+
// This table lists only senors we care about telling dbus about.
// Offset definition cab be found in section 42.2 of the IPMI 2.0
// spec. Add more if/when there are more items of interest.
lookup_t g_ipmidbuslookup[] = {
- {0x07, 0x00, set_sensor_dbus_state_simple, "setPresent", "False", "False"}, // OCC Inactive 0
- {0x07, 0x01, set_sensor_dbus_state_simple, "setPresent", "True", "True"}, // OCC Active 1
+ {0xe9, 0x00, set_sensor_dbus_state_simple, "setValue", "Disabled", ""}, // OCC Inactive 0
+ {0xe9, 0x01, set_sensor_dbus_state_simple, "setValue", "Enabled", ""}, // OCC Active 1
{0x07, 0x07, set_sensor_dbus_state_simple, "setPresent", "True", "False"},
{0x07, 0x08, set_sensor_dbus_state_simple, "setFault", "True", ""},
{0x0C, 0x06, set_sensor_dbus_state_simple, "setPresent", "True", "False"},
@@ -140,13 +162,19 @@
{0x0F, 0x01, set_sensor_dbus_state_fwprogress, "setValue", "True", "False"},
{0x0F, 0x00, set_sensor_dbus_state_fwprogress, "setValue", "True", "False"},
{0xC7, 0x01, set_sensor_dbus_state_simple, "setFault", "True", ""},
- {0xc3, 0x00, set_sensor_dbus_state_osboot, "setValue", "" ,""},
+ {0xc3, 0x00, set_sensor_dbus_state_osbootcount, "setValue", "" ,""},
+ {0x1F, 0x00, set_sensor_dbus_state_simple, "setValue", "Boot completed (00)", ""},
+ {0x1F, 0x01, set_sensor_dbus_state_simple, "setValue", "Boot completed (01)", ""},
+ {0x1F, 0x02, set_sensor_dbus_state_simple, "setValue", "PXE boot completed", ""},
+ {0x1F, 0x03, set_sensor_dbus_state_simple, "setValue", "Diagnostic boot completed", ""},
+ {0x1F, 0x04, set_sensor_dbus_state_simple, "setValue", "CD-ROM boot completed", ""},
+ {0x1F, 0x05, set_sensor_dbus_state_simple, "setValue", "ROM boot completed", ""},
+ {0x1F, 0x06, set_sensor_dbus_state_simple, "setValue", "Boot completed (06)", ""},
{0xFF, 0xFF, NULL, "", "", ""}
};
-
void reportSensorEventAssert(sensorRES_t *pRec, int index) {
lookup_t *pTable = &g_ipmidbuslookup[index];
(*pTable->func)(pRec, pTable, pTable->assertion);
@@ -198,8 +226,8 @@
sensorRES_t *pRec = (sensorRES_t *) record;
uint8_t stype;
int index, i=0;
- stype = find_sensor(pRec->sensor_number);
+ stype = find_sensor(pRec->sensor_number);
// 0xC3 types use the assertion7_0 for the value to be set
// so skip the reseach and call the correct event reporting
@@ -213,6 +241,7 @@
// Scroll through each bit position . Determine
// if any bit is either asserted or Deasserted.
for(i=0;i<8;i++) {
+
if ((ISBITSET(pRec->assert_state7_0,i)) &&
(shouldReport(stype, i, &index)))
{
diff --git a/sensorhandler.C b/sensorhandler.C
index 9344abd..cd57dd4 100644
--- a/sensorhandler.C
+++ b/sensorhandler.C
@@ -12,22 +12,24 @@
struct sensorTypemap_t {
uint8_t number;
+ uint8_t typecode;
char dbusname[32];
} ;
sensorTypemap_t g_SensorTypeMap[] = {
- {0x01, "Temp"},
- {0x0C, "DIMM"},
- {0x0C, "MEMORY_BUFFER"},
- {0x07, "PROC"},
- {0x07, "CORE"},
- {0x07, "CPU"},
- {0x0F, "BootProgress"},
- {0xC3, "OccStatus"},
- {0xC3, "BootCount"},
- {0xFF, ""}
+ {0x01, 0x6F, "Temp"},
+ {0x0C, 0x6F, "DIMM"},
+ {0x0C, 0x6F, "MEMORY_BUFFER"},
+ {0x07, 0x6F, "PROC"},
+ {0x07, 0x6F, "CORE"},
+ {0x07, 0x6F, "CPU"},
+ {0x0F, 0x6F, "BootProgress"},
+ {0xe9, 0x09, "OccStatus"}, // E9 is an internal mapping to handle sensor type code os 0x09
+ {0xC3, 0x6F, "BootCount"},
+ {0x1F, 0x6F, "OperatingSystemStatus"},
+ {0xFF, 0x00, ""},
};
@@ -50,6 +52,7 @@
s++;
}
+
if (s->number == 0xFF)
printf("Failed to find Sensor Type %s\n", p);
@@ -84,7 +87,7 @@
// This is where sensors that do not exist in dbus but do
// exist in the host code stop. This should indicate it
// is not a supported sensor
- if (a.bus[0] == 0) { return 0;}
+ if (a.interface[0] == 0) { return 0;}
if (strstr(a.interface, "InventoryItem")) {
// InventoryItems are real frus. So need to get the