diff options
Diffstat (limited to 'meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common')
3 files changed, 101 insertions, 3 deletions
diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile index 76bf61f..40ea2a8 100644 --- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile +++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/Makefile @@ -2,8 +2,8 @@ lib: libyosemite_common.so libyosemite_common.so: yosemite_common.c - $(CC) $(CFLAGS) -fPIC -c -o yosemite_common.o yosemite_common.c - $(CC) -shared -o libyosemite_common.so yosemite_common.o -lc + $(CC) $(CFLAGS) -fPIC -pthread -c -o yosemite_common.o yosemite_common.c + $(CC) -lpthread -shared -o libyosemite_common.so yosemite_common.o -lc .PHONY: clean 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; +} diff --git a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h index 85d8638..f2128ef 100644 --- a/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h +++ b/meta-facebook/meta-yosemite/recipes-yosemite/fblibs/files/yosemite_common/yosemite_common.h @@ -25,6 +25,7 @@ extern "C" { #endif +#define MAX_NUM_FRUS 6 enum { FRU_ALL = 0, FRU_SLOT1 = 1, @@ -35,7 +36,9 @@ enum { FRU_NIC = 6, }; +int yosemite_common_fru_name(uint8_t fru, char *str); int yosemite_common_fru_id(char *str, uint8_t *fru); +int yosemite_common_crashdump(uint8_t fru); #ifdef __cplusplus } // extern "C" |