diff options
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.c | 97 |
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; +} |