Commit 44bf4cea authored by Nigel Cunningham's avatar Nigel Cunningham Committed by Linus Torvalds

x86: PM_TRACE support

Signed-off-by: default avatarNigel Cunningham <nigel@nigel.suspend2.net>
Cc: Randy Dunlap <rdunlap@xenotime.net>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Pavel Machek <pavel@ucw.cz>
Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9ef231a4
...@@ -54,6 +54,13 @@ SECTIONS ...@@ -54,6 +54,13 @@ SECTIONS
RODATA RODATA
. = ALIGN(4);
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {
__tracedata_start = .;
*(.tracedata)
__tracedata_end = .;
}
. = ALIGN(PAGE_SIZE); /* Align data segment to page size boundary */ . = ALIGN(PAGE_SIZE); /* Align data segment to page size boundary */
/* Data */ /* Data */
.data : AT(ADDR(.data) - LOAD_OFFSET) { .data : AT(ADDR(.data) - LOAD_OFFSET) {
......
...@@ -142,6 +142,7 @@ void set_trace_device(struct device *dev) ...@@ -142,6 +142,7 @@ void set_trace_device(struct device *dev)
{ {
dev_hash_value = hash_string(DEVSEED, dev->bus_id, DEVHASH); dev_hash_value = hash_string(DEVSEED, dev->bus_id, DEVHASH);
} }
EXPORT_SYMBOL(set_trace_device);
/* /*
* We could just take the "tracedata" index into the .tracedata * We could just take the "tracedata" index into the .tracedata
...@@ -162,6 +163,7 @@ void generate_resume_trace(void *tracedata, unsigned int user) ...@@ -162,6 +163,7 @@ void generate_resume_trace(void *tracedata, unsigned int user)
file_hash_value = hash_string(lineno, file, FILEHASH); file_hash_value = hash_string(lineno, file, FILEHASH);
set_magic_time(user_hash_value, file_hash_value, dev_hash_value); set_magic_time(user_hash_value, file_hash_value, dev_hash_value);
} }
EXPORT_SYMBOL(generate_resume_trace);
extern char __tracedata_start, __tracedata_end; extern char __tracedata_start, __tracedata_end;
static int show_file_hash(unsigned int value) static int show_file_hash(unsigned int value)
...@@ -170,7 +172,8 @@ static int show_file_hash(unsigned int value) ...@@ -170,7 +172,8 @@ static int show_file_hash(unsigned int value)
char *tracedata; char *tracedata;
match = 0; match = 0;
for (tracedata = &__tracedata_start ; tracedata < &__tracedata_end ; tracedata += 6) { for (tracedata = &__tracedata_start ; tracedata < &__tracedata_end ;
tracedata += 2 + sizeof(unsigned long)) {
unsigned short lineno = *(unsigned short *)tracedata; unsigned short lineno = *(unsigned short *)tracedata;
const char *file = *(const char **)(tracedata + 2); const char *file = *(const char **)(tracedata + 2);
unsigned int hash = hash_string(lineno, file, FILEHASH); unsigned int hash = hash_string(lineno, file, FILEHASH);
......
#define TRACE_RESUME(user) do { \
if (pm_trace_enabled) { \
void *tracedata; \
asm volatile("movl $1f,%0\n" \
".section .tracedata,\"a\"\n" \
"1:\t.word %c1\n" \
"\t.long %c2\n" \
".previous" \
:"=r" (tracedata) \
: "i" (__LINE__), "i" (__FILE__)); \
generate_resume_trace(tracedata, user); \
} \
} while (0)
#define TRACE_RESUME(user) do { \
if (pm_trace_enabled) { \
void *tracedata; \
asm volatile("movq $1f,%0\n" \
".section .tracedata,\"a\"\n" \
"1:\t.word %c1\n" \
"\t.quad %c2\n" \
".previous" \
:"=r" (tracedata) \
: "i" (__LINE__), "i" (__FILE__)); \
generate_resume_trace(tracedata, user); \
} \
} while (0)
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define RESUME_TRACE_H #define RESUME_TRACE_H
#ifdef CONFIG_PM_TRACE #ifdef CONFIG_PM_TRACE
#include <asm/resume-trace.h>
extern int pm_trace_enabled; extern int pm_trace_enabled;
...@@ -9,20 +10,10 @@ struct device; ...@@ -9,20 +10,10 @@ struct device;
extern void set_trace_device(struct device *); extern void set_trace_device(struct device *);
extern void generate_resume_trace(void *tracedata, unsigned int user); extern void generate_resume_trace(void *tracedata, unsigned int user);
#define TRACE_DEVICE(dev) set_trace_device(dev) #define TRACE_DEVICE(dev) do { \
#define TRACE_RESUME(user) do { \ if (pm_trace_enabled) \
if (pm_trace_enabled) { \ set_trace_device(dev); \
void *tracedata; \ } while(0)
asm volatile("movl $1f,%0\n" \
".section .tracedata,\"a\"\n" \
"1:\t.word %c1\n" \
"\t.long %c2\n" \
".previous" \
:"=r" (tracedata) \
: "i" (__LINE__), "i" (__FILE__)); \
generate_resume_trace(tracedata, user); \
} \
} while (0)
#else #else
......
...@@ -57,7 +57,7 @@ config DISABLE_CONSOLE_SUSPEND ...@@ -57,7 +57,7 @@ config DISABLE_CONSOLE_SUSPEND
config PM_TRACE config PM_TRACE
bool "Suspend/resume event tracing" bool "Suspend/resume event tracing"
depends on PM_DEBUG && X86_32 && EXPERIMENTAL depends on PM_DEBUG && X86 && EXPERIMENTAL
default n default n
---help--- ---help---
This enables some cheesy code to save the last PM event point in the This enables some cheesy code to save the last PM event point in the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment