2005-04-17 02:20:36 +04:00
/*
* include / asm - s390 / debug . h
* S / 390 debug facility
*
* Copyright ( C ) 1999 , 2000 IBM Deutschland Entwicklung GmbH ,
* IBM Corporation
*/
# ifndef DEBUG_H
# define DEBUG_H
2005-06-26 01:55:33 +04:00
# include <linux/fs.h>
2005-04-17 02:20:36 +04:00
/* Note:
* struct __debug_entry must be defined outside of # ifdef __KERNEL__
* in order to allow a user program to analyze the ' raw ' - view .
*/
struct __debug_entry {
union {
struct {
unsigned long long clock : 52 ;
unsigned long long exception : 1 ;
unsigned long long level : 3 ;
unsigned long long cpuid : 8 ;
} fields ;
unsigned long long stck ;
} id ;
void * caller ;
} __attribute__ ( ( packed ) ) ;
2005-06-26 01:55:33 +04:00
# define __DEBUG_FEATURE_VERSION 2 /* version of debug feature */
2005-04-17 02:20:36 +04:00
# ifdef __KERNEL__
2006-09-16 23:15:46 +04:00
# include <linux/string.h>
2005-04-17 02:20:36 +04:00
# include <linux/spinlock.h>
# include <linux/kernel.h>
# include <linux/time.h>
# define DEBUG_MAX_LEVEL 6 /* debug levels range from 0 to 6 */
# define DEBUG_OFF_LEVEL -1 /* level where debug is switched off */
# define DEBUG_FLUSH_ALL -1 /* parameter to flush all areas */
# define DEBUG_MAX_VIEWS 10 /* max number of views in proc fs */
2005-06-26 01:55:33 +04:00
# define DEBUG_MAX_NAME_LEN 64 /* max length for a debugfs file name */
2005-04-17 02:20:36 +04:00
# define DEBUG_DEFAULT_LEVEL 3 /* initial debug level */
# define DEBUG_DIR_ROOT "s390dbf" /* name of debug root directory in proc fs */
# define DEBUG_DATA(entry) (char*)(entry + 1) /* data is stored behind */
/* the entry information */
typedef struct __debug_entry debug_entry_t ;
struct debug_view ;
typedef struct debug_info {
struct debug_info * next ;
struct debug_info * prev ;
atomic_t ref_count ;
spinlock_t lock ;
int level ;
int nr_areas ;
2005-06-26 01:55:33 +04:00
int pages_per_area ;
2005-04-17 02:20:36 +04:00
int buf_size ;
int entry_size ;
2005-06-26 01:55:33 +04:00
debug_entry_t * * * areas ;
2005-04-17 02:20:36 +04:00
int active_area ;
2005-06-26 01:55:33 +04:00
int * active_pages ;
int * active_entries ;
struct dentry * debugfs_root_entry ;
struct dentry * debugfs_entries [ DEBUG_MAX_VIEWS ] ;
2005-04-17 02:20:36 +04:00
struct debug_view * views [ DEBUG_MAX_VIEWS ] ;
2005-06-26 01:55:33 +04:00
char name [ DEBUG_MAX_NAME_LEN ] ;
2008-04-17 09:46:18 +04:00
mode_t mode ;
2005-04-17 02:20:36 +04:00
} debug_info_t ;
typedef int ( debug_header_proc_t ) ( debug_info_t * id ,
struct debug_view * view ,
int area ,
debug_entry_t * entry ,
char * out_buf ) ;
typedef int ( debug_format_proc_t ) ( debug_info_t * id ,
struct debug_view * view , char * out_buf ,
const char * in_buf ) ;
typedef int ( debug_prolog_proc_t ) ( debug_info_t * id ,
struct debug_view * view ,
char * out_buf ) ;
typedef int ( debug_input_proc_t ) ( debug_info_t * id ,
struct debug_view * view ,
struct file * file ,
const char __user * user_buf ,
size_t in_buf_size , loff_t * offset ) ;
int debug_dflt_header_fn ( debug_info_t * id , struct debug_view * view ,
int area , debug_entry_t * entry , char * out_buf ) ;
struct debug_view {
2005-06-26 01:55:33 +04:00
char name [ DEBUG_MAX_NAME_LEN ] ;
2005-04-17 02:20:36 +04:00
debug_prolog_proc_t * prolog_proc ;
debug_header_proc_t * header_proc ;
debug_format_proc_t * format_proc ;
debug_input_proc_t * input_proc ;
void * private_data ;
} ;
extern struct debug_view debug_hex_ascii_view ;
extern struct debug_view debug_raw_view ;
extern struct debug_view debug_sprintf_view ;
/* do NOT use the _common functions */
debug_entry_t * debug_event_common ( debug_info_t * id , int level ,
const void * data , int length ) ;
debug_entry_t * debug_exception_common ( debug_info_t * id , int level ,
const void * data , int length ) ;
/* Debug Feature API: */
2008-05-15 18:52:35 +04:00
debug_info_t * debug_register ( const char * name , int pages , int nr_areas ,
2005-04-17 02:20:36 +04:00
int buf_size ) ;
2008-05-15 18:52:35 +04:00
debug_info_t * debug_register_mode ( const char * name , int pages , int nr_areas ,
2008-04-17 09:46:18 +04:00
int buf_size , mode_t mode , uid_t uid ,
gid_t gid ) ;
2005-04-17 02:20:36 +04:00
void debug_unregister ( debug_info_t * id ) ;
void debug_set_level ( debug_info_t * id , int new_level ) ;
void debug_stop_all ( void ) ;
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_event ( debug_info_t * id , int level , void * data , int length )
{
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_event_common ( id , level , data , length ) ;
}
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_int_event ( debug_info_t * id , int level , unsigned int tag )
{
unsigned int t = tag ;
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_event_common ( id , level , & t , sizeof ( unsigned int ) ) ;
}
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_long_event ( debug_info_t * id , int level , unsigned long tag )
{
unsigned long t = tag ;
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_event_common ( id , level , & t , sizeof ( unsigned long ) ) ;
}
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_text_event ( debug_info_t * id , int level , const char * txt )
{
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_event_common ( id , level , txt , strlen ( txt ) ) ;
}
extern debug_entry_t *
debug_sprintf_event ( debug_info_t * id , int level , char * string , . . . )
__attribute__ ( ( format ( printf , 3 , 4 ) ) ) ;
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_exception ( debug_info_t * id , int level , void * data , int length )
{
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_exception_common ( id , level , data , length ) ;
}
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_int_exception ( debug_info_t * id , int level , unsigned int tag )
{
unsigned int t = tag ;
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_exception_common ( id , level , & t , sizeof ( unsigned int ) ) ;
}
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_long_exception ( debug_info_t * id , int level , unsigned long tag )
{
unsigned long t = tag ;
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_exception_common ( id , level , & t , sizeof ( unsigned long ) ) ;
}
2005-11-09 08:34:42 +03:00
static inline debug_entry_t *
2005-04-17 02:20:36 +04:00
debug_text_exception ( debug_info_t * id , int level , const char * txt )
{
2005-06-26 01:55:33 +04:00
if ( ( ! id ) | | ( level > id - > level ) | | ( id - > pages_per_area = = 0 ) )
return NULL ;
2005-04-17 02:20:36 +04:00
return debug_exception_common ( id , level , txt , strlen ( txt ) ) ;
}
extern debug_entry_t *
debug_sprintf_exception ( debug_info_t * id , int level , char * string , . . . )
__attribute__ ( ( format ( printf , 3 , 4 ) ) ) ;
int debug_register_view ( debug_info_t * id , struct debug_view * view ) ;
int debug_unregister_view ( debug_info_t * id , struct debug_view * view ) ;
/*
define the debug levels :
- 0 No debugging output to console or syslog
- 1 Log internal errors to syslog , ignore check conditions
- 2 Log internal errors and check conditions to syslog
- 3 Log internal errors to console , log check conditions to syslog
- 4 Log internal errors and check conditions to console
- 5 panic on internal errors , log check conditions to console
- 6 panic on both , internal errors and check conditions
*/
# ifndef DEBUG_LEVEL
# define DEBUG_LEVEL 4
# endif
# define INTERNAL_ERRMSG(x,y...) "E" __FILE__ "%d: " x, __LINE__, y
# define INTERNAL_WRNMSG(x,y...) "W" __FILE__ "%d: " x, __LINE__, y
# define INTERNAL_INFMSG(x,y...) "I" __FILE__ "%d: " x, __LINE__, y
# define INTERNAL_DEBMSG(x,y...) "D" __FILE__ "%d: " x, __LINE__, y
# if DEBUG_LEVEL > 0
# define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
# define PRINT_INFO(x...) printk ( KERN_INFO PRINTK_HEADER x )
# define PRINT_WARN(x...) printk ( KERN_WARNING PRINTK_HEADER x )
# define PRINT_ERR(x...) printk ( KERN_ERR PRINTK_HEADER x )
# define PRINT_FATAL(x...) panic ( PRINTK_HEADER x )
# else
# define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
# define PRINT_INFO(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
# define PRINT_WARN(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
# define PRINT_ERR(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
# define PRINT_FATAL(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
# endif /* DASD_DEBUG */
# endif /* __KERNEL__ */
# endif /* DEBUG_H */