summaryrefslogtreecommitdiffstats
path: root/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c')
-rw-r--r--meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c97
1 files changed, 96 insertions, 1 deletions
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c
index e41690f..c638809 100644
--- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c
+++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.c
@@ -27,8 +27,51 @@
#include <fcntl.h>
#include <errno.h>
#include <syslog.h>
+#include <pthread.h>
+#include <string.h>
#include "yosemite_common.h"
+#define CRASHDUMP_BIN "/usr/local/bin/dump.sh"
+#define CRASHDUMP_FILE "/mnt/data/crashdump_"
+
+int
+yosemite_common_fru_name(uint8_t fru, char *str) {
+
+ switch(fru) {
+ case FRU_SLOT1:
+ sprintf(str, "slot1");
+ break;
+
+ case FRU_SLOT2:
+ sprintf(str, "slot2");
+ break;
+
+ case FRU_SLOT3:
+ sprintf(str, "slot3");
+ break;
+
+ case FRU_SLOT4:
+ sprintf(str, "slot4");
+ break;
+
+ case FRU_SPB:
+ sprintf(str, "spb");
+ break;
+
+ case FRU_NIC:
+ sprintf(str, "nic");
+ break;
+
+ default:
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_common_fru_id: Wrong fru id");
+#endif
+ return -1;
+ }
+
+ return 0;
+}
+
int
yosemite_common_fru_id(char *str, uint8_t *fru) {
@@ -47,9 +90,61 @@ yosemite_common_fru_id(char *str, uint8_t *fru) {
} else if (!strcmp(str, "nic")) {
*fru = FRU_NIC;
} else {
- syslog(LOG_ALERT, "yosemite_common_fru_id: Wrong fru id");
+#ifdef DEBUG
+ syslog(LOG_WARNING, "yosemite_common_fru_id: Wrong fru id");
+#endif
return -1;
}
return 0;
}
+
+void *
+generate_dump(void *arg) {
+
+ uint8_t fru = *(uint8_t *) arg;
+ char cmd[128];
+ char fruname[16];
+
+ yosemite_common_fru_name(fru, fruname);
+
+ // HEADER LINE for the dump
+ memset(cmd, 0, 128);
+ sprintf(cmd, "%s time > %s%s", CRASHDUMP_BIN, CRASHDUMP_FILE, fruname);
+ system(cmd);
+
+ // COREID dump
+ memset(cmd, 0, 128);
+ sprintf(cmd, "%s %s 48 coreid >> %s%s", CRASHDUMP_BIN, fruname,
+ CRASHDUMP_FILE, fruname);
+ system(cmd);
+
+ // MSR dump
+ memset(cmd, 0, 128);
+ sprintf(cmd, "%s %s 48 msr >> %s%s", CRASHDUMP_BIN, fruname,
+ CRASHDUMP_FILE, fruname);
+ system(cmd);
+
+ syslog(LOG_CRIT, "Crashdump for FRU: %d is generated.", fru);
+}
+
+int
+yosemite_common_crashdump(uint8_t fru) {
+
+ if (access(CRASHDUMP_BIN, F_OK) == -1) {
+ syslog(LOG_CRIT, "Crashdump for FRU: %d failed : "
+ "crashdump binary is not preset", fru);
+ return 0;
+ }
+
+ pthread_t t_dump;
+
+ if (pthread_create(&t_dump, NULL, generate_dump, (void*) &fru) < 0) {
+ syslog(LOG_WARNING, "pal_store_crashdump: pthread_create for"
+ " FRU %d failed\n", fru);
+ }
+
+ syslog(LOG_INFO, "Crashdump for FRU: %d is being generated.", fru);
+
+ return 0;
+}
OpenPOWER on IntegriCloud