提交 44bf4cea 编写于 作者: N Nigel Cunningham 提交者: Linus Torvalds

x86: PM_TRACE support

Signed-off-by: NNigel 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: NLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NAndi Kleen <ak@suse.de>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册