|
@@ -62,6 +62,28 @@ static ssize_t kexec_crash_loaded_show(struct kset *kset, char *page)
|
|
|
KERNEL_ATTR_RO(kexec_crash_loaded);
|
|
|
#endif /* CONFIG_KEXEC */
|
|
|
|
|
|
+/*
|
|
|
+ * Make /sys/kernel/notes give the raw contents of our kernel .notes section.
|
|
|
+ */
|
|
|
+extern const char __start_notes __attribute__((weak));
|
|
|
+extern const char __stop_notes __attribute__((weak));
|
|
|
+#define notes_size (&__stop_notes - &__start_notes)
|
|
|
+
|
|
|
+static ssize_t notes_read(struct kobject *kobj, struct bin_attribute *bin_attr,
|
|
|
+ char *buf, loff_t off, size_t count)
|
|
|
+{
|
|
|
+ memcpy(buf, &__start_notes + off, count);
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
+static struct bin_attribute notes_attr = {
|
|
|
+ .attr = {
|
|
|
+ .name = "notes",
|
|
|
+ .mode = S_IRUGO,
|
|
|
+ },
|
|
|
+ .read = ¬es_read,
|
|
|
+};
|
|
|
+
|
|
|
decl_subsys(kernel, NULL, NULL);
|
|
|
EXPORT_SYMBOL_GPL(kernel_subsys);
|
|
|
|
|
@@ -88,6 +110,12 @@ static int __init ksysfs_init(void)
|
|
|
error = sysfs_create_group(&kernel_subsys.kobj,
|
|
|
&kernel_attr_group);
|
|
|
|
|
|
+ if (!error && notes_size > 0) {
|
|
|
+ notes_attr.size = notes_size;
|
|
|
+ error = sysfs_create_bin_file(&kernel_subsys.kobj,
|
|
|
+ ¬es_attr);
|
|
|
+ }
|
|
|
+
|
|
|
return error;
|
|
|
}
|
|
|
|