mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 16:52:06 +10:00 
			
		
		
		
	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
					
				@ -54,6 +54,13 @@ SECTIONS
 | 
			
		||||
 | 
			
		||||
  RODATA
 | 
			
		||||
 | 
			
		||||
  . = ALIGN(4);
 | 
			
		||||
  .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {
 | 
			
		||||
  	__tracedata_start = .;
 | 
			
		||||
	*(.tracedata)
 | 
			
		||||
  	__tracedata_end = .;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  . = ALIGN(PAGE_SIZE);        /* Align data segment to page size boundary */
 | 
			
		||||
				/* Data */
 | 
			
		||||
  .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);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(set_trace_device);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 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);
 | 
			
		||||
	set_magic_time(user_hash_value, file_hash_value, dev_hash_value);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(generate_resume_trace);
 | 
			
		||||
 | 
			
		||||
extern char __tracedata_start, __tracedata_end;
 | 
			
		||||
static int show_file_hash(unsigned int value)
 | 
			
		||||
@ -170,7 +172,8 @@ static int show_file_hash(unsigned int value)
 | 
			
		||||
	char *tracedata;
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
		const char *file = *(const char **)(tracedata + 2);
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_PM_TRACE
 | 
			
		||||
#include <asm/resume-trace.h>
 | 
			
		||||
 | 
			
		||||
extern int pm_trace_enabled;
 | 
			
		||||
 | 
			
		||||
@ -9,20 +10,10 @@ struct device;
 | 
			
		||||
extern void set_trace_device(struct device *);
 | 
			
		||||
extern void generate_resume_trace(void *tracedata, unsigned int user);
 | 
			
		||||
 | 
			
		||||
#define TRACE_DEVICE(dev) set_trace_device(dev)
 | 
			
		||||
#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_DEVICE(dev) do { \
 | 
			
		||||
	if (pm_trace_enabled) \
 | 
			
		||||
		set_trace_device(dev); \
 | 
			
		||||
	} while(0)
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -57,7 +57,7 @@ config DISABLE_CONSOLE_SUSPEND
 | 
			
		||||
 | 
			
		||||
config PM_TRACE
 | 
			
		||||
	bool "Suspend/resume event tracing"
 | 
			
		||||
	depends on PM_DEBUG && X86_32 && EXPERIMENTAL
 | 
			
		||||
	depends on PM_DEBUG && X86 && EXPERIMENTAL
 | 
			
		||||
	default n
 | 
			
		||||
	---help---
 | 
			
		||||
	This enables some cheesy code to save the last PM event point in the
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user