x86: PM_TRACE support
Signed-off-by: Nigel 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: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
9ef231a436
commit
44bf4cea43
6 changed files with 43 additions and 16 deletions
|
@ -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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
13
include/asm-i386/resume-trace.h
Normal file
13
include/asm-i386/resume-trace.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#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)
|
13
include/asm-x86_64/resume-trace.h
Normal file
13
include/asm-x86_64/resume-trace.h
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
#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 @@
|
||||||
#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;
|
||||||
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
|
||||||
|
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue