aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/core/test/run-pel.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/skiboot/core/test/run-pel.c')
-rw-r--r--roms/skiboot/core/test/run-pel.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/roms/skiboot/core/test/run-pel.c b/roms/skiboot/core/test/run-pel.c
new file mode 100644
index 000000000..812c8996c
--- /dev/null
+++ b/roms/skiboot/core/test/run-pel.c
@@ -0,0 +1,120 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/*
+ * Test for our PEL record generation. Currently this doesn't actually
+ * test that the records we generate are correct, but it at least lets
+ * us run valgrind over the generation routines to check for buffer
+ * overflows, etc.
+ *
+ * Copyright 2013-2016 IBM Corp.
+ */
+
+#include <skiboot.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <pel.h>
+#include <errorlog.h>
+#include <device.h>
+
+#define TEST_ERROR 0x1234
+#define TEST_SUBSYS 0x5678
+
+DEFINE_LOG_ENTRY(TEST_ERROR, OPAL_PLATFORM_ERR_EVT, TEST_SUBSYS,
+ OPAL_PLATFORM_FIRMWARE, OPAL_INFO,
+ OPAL_NA);
+
+/* Override this for testing. */
+#define is_rodata(p) fake_is_rodata(p)
+
+char __rodata_start[16];
+#define __rodata_end (__rodata_start + sizeof(__rodata_start))
+
+static inline bool fake_is_rodata(const void *p)
+{
+ return ((char *)p >= __rodata_start && (char *)p < __rodata_end);
+}
+
+#define zalloc(bytes) calloc((bytes), 1)
+
+#include "../device.c"
+#include "../pel.c"
+
+struct dt_node *dt_root = NULL;
+char dt_prop[] = "DUMMY DT PROP";
+
+int rtc_cache_get_datetime(uint32_t *year_month_day,
+ uint64_t *hour_minute_second_millisecond)
+{
+ *year_month_day = 0;
+ *hour_minute_second_millisecond = 0;
+
+ return 0;
+}
+
+int main(void)
+{
+ char *pel_buf;
+ size_t size;
+ struct errorlog *elog;
+ struct opal_err_info *opal_err_info = &err_TEST_ERROR;
+ char *buffer;
+ struct elog_user_data_section *tmp;
+
+ dt_root = dt_new_root("");
+ dt_add_property_string(dt_root, "model", "run-pel-unittest");
+
+ elog = malloc(sizeof(struct errorlog));
+ pel_buf = malloc(PEL_MIN_SIZE + 4);
+ assert(elog);
+ assert(pel_buf);
+
+ memset(elog, 0, sizeof(struct errorlog));
+
+ elog->error_event_type = opal_err_info->err_type;
+ elog->component_id = opal_err_info->cmp_id;
+ elog->subsystem_id = opal_err_info->subsystem;
+ elog->event_severity = opal_err_info->sev;
+ elog->event_subtype = opal_err_info->event_subtype;
+ elog->reason_code = opal_err_info->reason_code;
+ elog->elog_origin = ORG_SAPPHIRE;
+
+ size = pel_size(elog);
+
+ printf("Test buffer too small: ");
+ assert(0 == create_pel_log(elog, NULL, size - 1));
+
+ assert(size <= PEL_MIN_SIZE + 4);
+ assert(size == create_pel_log(elog, pel_buf, size));
+
+ memset(elog, 0, sizeof(struct errorlog));
+
+ elog->error_event_type = opal_err_info->err_type;
+ elog->component_id = opal_err_info->cmp_id;
+ elog->subsystem_id = opal_err_info->subsystem;
+ elog->event_severity = opal_err_info->sev;
+ elog->event_subtype = opal_err_info->event_subtype;
+ elog->reason_code = opal_err_info->reason_code;
+ elog->elog_origin = ORG_SAPPHIRE;
+
+ size = pel_size(elog);
+ pel_buf = realloc(pel_buf, size);
+ assert(pel_buf);
+
+ buffer = elog->user_data_dump + elog->user_section_size;
+ tmp = (struct elog_user_data_section *)buffer;
+ tmp->tag = OPAL_ELOG_SEC_DESC; /* ASCII of DESC */
+ tmp->size = size + sizeof(struct elog_user_data_section) - 1;
+ strcpy(tmp->data_dump, "Hello World!");
+ elog->user_section_size += tmp->size;
+ elog->user_section_count++;
+
+ size = pel_size(elog);
+ pel_buf = realloc(pel_buf, size);
+ assert(pel_buf);
+
+ assert(size == create_pel_log(elog, pel_buf, size));
+
+ free(pel_buf);
+ free(elog);
+
+ return 0;
+}