@@ -845,9 +845,18 @@ static void per_thread_sanity_checks(void)
assert(cpu->state != cpu_state_no_cpu);
}
+extern char __nvram_str_start;
+extern char __nvram_str_end;
+
void pci_nvram_init(void)
{
const char *nvram_speed;
+ const char *p;
+
+ for (p = &__nvram_str_start; p <= &__nvram_str_end; p++) {
+ prerror("found nvram string: '%s'\n", p);
+ p += strlen(p);
+ }
verbose_eeh = nvram_query_eq_safe("pci-eeh-verbose", "true");
if (verbose_eeh)
@@ -287,12 +287,12 @@ static const char *__nvram_query(const char *key, bool dangerous)
return NULL;
}
-const char *nvram_query_safe(const char *key)
+const char *___nvram_query_safe(const char *key)
{
return __nvram_query(key, false);
}
-const char *nvram_query_dangerous(const char *key)
+const char *___nvram_query_dangerous(const char *key)
{
return __nvram_query(key, true);
}
@@ -319,12 +319,12 @@ static bool __nvram_query_eq(const char *key, const char *value, bool dangerous)
return !strcmp(s, value);
}
-bool nvram_query_eq_safe(const char *key, const char *value)
+bool ___nvram_query_eq_safe(const char *key, const char *value)
{
return __nvram_query_eq(key, value, false);
}
-bool nvram_query_eq_dangerous(const char *key, const char *value)
+bool ___nvram_query_eq_dangerous(const char *key, const char *value)
{
return __nvram_query_eq(key, value, true);
}
@@ -4,6 +4,16 @@
#ifndef __NVRAM_H
#define __NVRAM_H
+#define nvram_str(str) \
+ ({const char *d; asm volatile ( \
+ ".section .xxx,\"aS\"" "\n\t" \
+ "1: .string \"" str "\"" "\n\t" \
+ ".previous" "\n\t" \
+ "addis %0, 2,1b@toc@ha" "\n\t" \
+ "addi %0,%0,1b@toc@l" "\n\t" \
+ : "=r"(d)); d;})
+
+
int nvram_format(void *nvram_image, uint32_t nvram_size);
int nvram_check(void *nvram_image, uint32_t nvram_size);
void nvram_reinit(void);
@@ -11,9 +21,16 @@ bool nvram_validate(void);
bool nvram_has_loaded(void);
bool nvram_wait_for_load(void);
-const char *nvram_query_safe(const char *name);
-const char *nvram_query_dangerous(const char *name);
-bool nvram_query_eq_safe(const char *key, const char *value);
-bool nvram_query_eq_dangerous(const char *key, const char *value);
+const char *___nvram_query_safe(const char *name);
+const char *___nvram_query_dangerous(const char *name);
+bool ___nvram_query_eq_safe(const char *key, const char *value);
+bool ___nvram_query_eq_dangerous(const char *key, const char *value);
+
+
+#define nvram_query_safe(s) ___nvram_query_safe(nvram_str(s))
+#define nvram_query_dangerous(s) ___nvram_query_dangerous(nvram_str(s))
+
+#define nvram_query_eq_safe(s, v) ___nvram_query_eq_safe(nvram_str(s), v)
+#define nvram_query_eq_dangerous(s, v) ___nvram_query_eq_dangerous(nvram_str(s), v)
#endif /* __NVRAM_H */
@@ -142,6 +142,12 @@ SECTIONS
__platforms_end = .;
}
+ .xxx : {
+ __nvram_str_start = .;
+ KEEP(*(.xxx))
+ __nvram_str_end = .;
+ }
+
/* Do I need to keep these ? */
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }