[SATYR PATCH 1/2] koops: add flag names to taint flag table

Martin Milata mmilata at redhat.com
Fri Jun 7 10:48:30 UTC 2013


The table of kernel taint flags has been extended to include the flag
name, and it has been exposed in the koops header so other compilation
units can use it.

Signed-off-by: Martin Milata <mmilata at redhat.com>
---
 lib/koops_stacktrace.c | 83 ++++++++++++++++++++++----------------------------
 lib/koops_stacktrace.h | 11 +++++++
 2 files changed, 47 insertions(+), 47 deletions(-)

diff --git a/lib/koops_stacktrace.c b/lib/koops_stacktrace.c
index e094bf6..822d99a 100644
--- a/lib/koops_stacktrace.c
+++ b/lib/koops_stacktrace.c
@@ -26,6 +26,31 @@
 #include <string.h>
 #include <stddef.h>
 
+/* http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/kernel/panic.c?id=HEAD */
+
+#define FLAG_OFFSET(flag) offsetof(struct sr_koops_stacktrace, taint_ ## flag)
+#define FLAG(letter, name)  { letter, FLAG_OFFSET(name), #name }
+
+struct sr_taint_flag sr_flags[] = {
+    FLAG('P', module_proprietary),
+    FLAG('F', forced_module),
+    FLAG('S', smp_unsafe),
+    FLAG('R', forced_removal),
+    FLAG('M', mce),
+    FLAG('B', page_release),
+    FLAG('U', userspace),
+    FLAG('D', died_recently),
+    FLAG('A', acpi_overridden),
+    FLAG('W', warning),
+    FLAG('C', staging_driver),
+    FLAG('I', firmware_workaround),
+    FLAG('O', module_out_of_tree),
+    { '\0', 0, NULL} /* sentinel */
+};
+
+#undef FLAG
+#undef FLAG_OFFSET
+
 struct sr_koops_stacktrace *
 sr_koops_stacktrace_new()
 {
@@ -103,32 +128,6 @@ sr_koops_stacktrace_remove_frame(struct sr_koops_stacktrace *stacktrace,
 
 }
 
-struct taint_flag {
-    char letter;
-    size_t member_offset;
-};
-
-/* http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/kernel/panic.c?id=HEAD */
-
-#define FLAG_OFFSET(flag) offsetof(struct sr_koops_stacktrace, taint_ ## flag)
-static struct taint_flag flags[] = {
-    { 'P', FLAG_OFFSET(module_proprietary)  },
-    { 'F', FLAG_OFFSET(forced_module)       },
-    { 'S', FLAG_OFFSET(smp_unsafe)          },
-    { 'R', FLAG_OFFSET(forced_removal)      },
-    { 'M', FLAG_OFFSET(mce)                 },
-    { 'B', FLAG_OFFSET(page_release)        },
-    { 'U', FLAG_OFFSET(userspace)           },
-    { 'D', FLAG_OFFSET(died_recently)       },
-    { 'A', FLAG_OFFSET(acpi_overridden)     },
-    { 'W', FLAG_OFFSET(warning)             },
-    { 'C', FLAG_OFFSET(staging_driver)      },
-    { 'I', FLAG_OFFSET(firmware_workaround) },
-    { 'O', FLAG_OFFSET(module_out_of_tree)  },
-    { '\0', 0 /* sentinel */                }
-};
-#undef FLAG_OFFSET
-
 /* Based on function kernel_tainted_short from abrt/src/lib/kernel.c */
 static bool
 parse_taint_flags(const char *input, struct sr_koops_stacktrace *stacktrace)
@@ -145,8 +144,8 @@ parse_taint_flags(const char *input, struct sr_koops_stacktrace *stacktrace)
         if (tainted[0] >= 'A' && tainted[0] <= 'Z')
         {
             /* set the appropriate flag */
-            struct taint_flag *f;
-            for (f = flags; f->letter; f++)
+            struct sr_taint_flag *f;
+            for (f = sr_flags; f->letter; f++)
             {
                 if (tainted[0] == f->letter)
                 {
@@ -373,25 +372,15 @@ taint_flags_to_json(struct sr_koops_stacktrace *stacktrace)
 {
     struct sr_strbuf *strbuf = sr_strbuf_new();
 
-#define FLAG_APPEND(flag)                                   \
-    if (stacktrace->taint_ ## flag)                         \
-        sr_strbuf_append_strf(strbuf, ", \"" #flag "\"\n"); \
-
-    FLAG_APPEND(module_proprietary)
-    FLAG_APPEND(forced_module)
-    FLAG_APPEND(forced_removal)
-    FLAG_APPEND(smp_unsafe)
-    FLAG_APPEND(mce)
-    FLAG_APPEND(page_release)
-    FLAG_APPEND(userspace)
-    FLAG_APPEND(died_recently)
-    FLAG_APPEND(acpi_overridden)
-    FLAG_APPEND(warning)
-    FLAG_APPEND(staging_driver)
-    FLAG_APPEND(firmware_workaround)
-    FLAG_APPEND(module_out_of_tree)
-
-#undef FLAG_APPEND
+    struct sr_taint_flag *f;
+    for (f = sr_flags; f->letter; f++)
+    {
+        bool val = *(bool *)((void *)stacktrace + f->member_offset);
+        if (val == true)
+        {
+            sr_strbuf_append_strf(strbuf, ", \"%s\"\n", f->name);
+        }
+    }
 
     if (strbuf->len == 0)
         return sr_strdup("[]");
diff --git a/lib/koops_stacktrace.h b/lib/koops_stacktrace.h
index 4d77b31..580610f 100644
--- a/lib/koops_stacktrace.h
+++ b/lib/koops_stacktrace.h
@@ -33,6 +33,7 @@ extern "C" {
 #include "report_type.h"
 #include <stdbool.h>
 #include <inttypes.h>
+#include <stddef.h>
 
 struct sr_location;
 
@@ -158,6 +159,16 @@ sr_koops_stacktrace_get_reason(struct sr_koops_stacktrace *stacktrace);
 char *
 sr_koops_stacktrace_to_json(struct sr_koops_stacktrace *stacktrace);
 
+
+/* TODO: this needs to go in a _private_ header and should not be exported */
+struct sr_taint_flag
+{
+    char letter;
+    size_t member_offset;
+    char *name;
+};
+extern struct sr_taint_flag sr_flags[];
+
 #ifdef __cplusplus
 }
 #endif
-- 
1.7.11.7



More information about the Crash-catcher mailing list