S390 Debug Feature
==================

files: arch/s390/kernel/debug.c
       arch/s390/include/asm/debug.h

Description:
------------
The goal of this feature is to provide a kernel debug logging API 
where log records can be stored efficiently in memory, where each component 
(e.g. device drivers) can have one separate debug log.
One purpose of this is to inspect the debug logs after a production system crash
in order to analyze the reason for the crash.
If the system still runs but only a subcomponent which uses dbf fails,
it is possible to look at the debug logs on a live system via the Linux
debugfs filesystem.
The debug feature may also very useful for kernel and driver development.

Design:
-------
Kernel components (e.g. device drivers) can register themselves at the debug 
feature with the function call debug_register(). This function initializes a 
debug log for the caller. For each debug log exists a number of debug areas 
where exactly one is active at one time.  Each debug area consists of contiguous
pages in memory. In the debug areas there are stored debug entries (log records)
which are written by event- and exception-calls. 

An event-call writes the specified debug entry to the active debug
area and updates the log pointer for the active area. If the end 
of the active debug area is reached, a wrap around is done (ring buffer) 
and the next debug entry will be written at the beginning of the active 
debug area.

An exception-call writes the specified debug entry to the log and
switches to the next debug area. This is done in order to be sure
that the records which describe the origin of the exception are not
overwritten when a wrap around for the current area occurs.

The debug areas themselves are also ordered in form of a ring buffer.
When an exception is thrown in the last debug area, the following debug 
entries are then written again in the very first area.

There are three versions for the event- and exception-calls: One for
logging raw data, one for text and one for numbers.

Each debug entry contains the following data:

- Timestamp
- Cpu-Number of calling task
- Level of debug entry (0...6)
- Return Address to caller
- Flag, if entry is an exception or not

The debug logs can be inspected in a live system through entries in
the debugfs-filesystem. Under the toplevel directory "s390dbf" there is
a directory for each registered component, which is named like the
corresponding component. The debugfs normally should be mounted to
/sys/kernel/debug therefore the debug feature can be accessed under
/sys/kernel/debug/s390dbf.

The content of the directories are files which represent different views
to the debug log. Each component can decide which views should be
used through registering them with the function debug_register_view().
Predefined views for hex/ascii, sprintf and raw binary data are provided.
It is also possible to define other views. The content of
a view can be inspected simply by reading the corresponding debugfs file.

All debug logs have an actual debug level (range from 0 to 6).
The default level is 3. Event and Exception functions have a 'level'
parameter. Only debug entries with a level that is lower or equal
than the actual level are written to the log. This means, when
writing events, high priority log entries should have a low level
value whereas low priority entries should have a high one.
The actual debug level can be changed with the help of the debugfs-filesystem
through writing a number string "x" to the 'level' debugfs file which is
provided for every debug log. Debugging can be switched off completely
by using "-" on the 'level' debugfs file.

Example:

> echo "-" > /sys/kernel/debug/s390dbf/dasd/level

It is also possible to deactivate the debug feature globally for every
debug log. You can change the behavior using  2 sysctl parameters in
/proc/sys/s390dbf:
There are currently 2 possible triggers, which stop the debug feature
globally. The first possibility is to use the "debug_active" sysctl. If
set to 1 the debug feature is running. If "debug_active" is set to 0 the
debug feature is turned off.
The second trigger which stops the debug feature is a kernel oops.
That prevents the debug feature from overwriting debug information that
happened before the oops. After an oops you can reactivate the debug feature
by piping 1 to /proc/sys/s390dbf/debug_active. Nevertheless, its not
suggested to use an oopsed kernel in a production environment.
If you want to disallow the deactivation of the debug feature, you can use
the "debug_stoppable" sysctl. If you set "debug_stoppable" to 0 the debug
feature cannot be stopped. If the debug feature is already stopped, it
will stay deactivated.

Kernel Interfaces:
------------------

----------------------------------------------------------------------------
debug_info_t *debug_register(char *name, int pages, int nr_areas,
                             int buf_size);

Parameter:    name:        Name of debug log (e.g. used for debugfs entry)
              pages:       number of pages, which will be allocated per area
              nr_areas:    number of debug areas
              buf_size:    size of data area in each debug entry

Return Value: Handle for generated debug area   
              NULL if register failed 

Description:  Allocates memory for a debug log     
              Must not be called within an interrupt handler 

----------------------------------------------------------------------------
debug_info_t *debug_register_mode(char *name, int pages, int nr_areas,
				  int buf_size, mode_t mode, uid_t uid,
				  gid_t gid);

Parameter:    name:	   Name of debug log (e.g. used for debugfs entry)
	      pages:	   Number of pages, which will be allocated per area
	      nr_areas:    Number of debug areas
	      buf_size:    Size of data area in each debug entry
	      mode:	   File mode for debugfs files. E.g. S_IRWXUGO
	      uid:	   User ID for debugfs files. Currently only 0 is
			   supported.
	      gid:	   Group ID for debugfs files. Currently only 0 is
			   supported.

Return Value: Handle for generated debug area
	      NULL if register failed

Description:  Allocates memory for a debug log
	      Must not be called within an interrupt handler

---------------------------------------------------------------------------
void debug_unregister (debug_info_t * id);

Parameter:     id:   handle for debug log  

Return Value:  none 

Description:   frees memory for a debug log     
               Must not be called within an interrupt handler 

---------------------------------------------------------------------------
void debug_set_level (debug_info_t * id, int new_level);

Parameter:     id:        handle for debug log  
               new_level: new debug level 

Return Value:  none 

Description:   Sets new actual debug level if new_level is valid. 

---------------------------------------------------------------------------
void debug_stop_all(void);

Parameter:     none

Return Value:  none

Description:   stops the debug feature if stopping is allowed. Currently
               used in case of a kernel oops.

---------------------------------------------------------------------------
debug_entry_t* debug_event (debug_info_t* id, int level, void* data, 
                            int length);

Parameter:     id:     handle for debug log  
               level:  debug level           
               data:   pointer to data for debug entry  
               length: length of data in bytes       

Return Value:  Address of written debug entry 

Description:   writes debug entry to active debug area (if level <= actual 
               debug level)    

---------------------------------------------------------------------------
debug_entry_t* debug_int_event (debug_info_t * id, int level, 
                                unsigned int data);
debug_entry_t* debug_long_event(debug_info_t * id, int level,
                                unsigned long data);

Parameter:     id:     handle for debug log  
               level:  debug level           
               data:   integer value for debug entry           

Return Value:  Address of written debug entry 

Description:   writes debug entry to active debug area (if level <= actual 
               debug level)    

---------------------------------------------------------------------------
debug_entry_t* debug_text_event (debug_info_t * id, int level, 
                                 const char* data);

Parameter:     id:     handle for debug log  
               level:  debug level           
               data:   string for debug entry  

Return Value:  Address of written debug entry 

Description:   writes debug entry in ascii format to active debug area 
               (if level <= actual debug level)     

---------------------------------------------------------------------------
debug_entry_t* debug_sprintf_event (debug_info_t * id, int level, 
                                    char* string,...);

Parameter:     id:    handle for debug log 
               level: debug level
               string: format string for debug entry 
               ...: varargs used as in sprintf()

Return Value:  Address of written debug entry

Description:   writes debug entry with format string and varargs (longs) to 
               active debug area (if level $<=$ actual debug level). 
               floats and long long datatypes cannot be used as varargs.

---------------------------------------------------------------------------

debug_entry_t* debug_exception (debug_info_t* id, int level, void* data, 
                                int length);

Parameter:     id:     handle for debug log  
               level:  debug level           
               data:   pointer to data for debug entry  
               length: length of data in bytes       

Return Value:  Address of written debug entry 

Description:   writes debug entry to active debug area (if level <= actual 
               debug level) and switches to next debug area  

---------------------------------------------------------------------------
debug_entry_t* debug_int_exception (debug_info_t * id, int level, 
                                    unsigned int data);
debug_entry_t* debug_long_exception(debug_info_t * id, int level,
                                    unsigned long data);

Parameter:     id:     handle for debug log  
               level:  debug level           
               data:   integer value for debug entry           

Return Value:  Address of written debug entry 

Description:   writes debug entry to active debug area (if level <= actual 
               debug level) and switches to next debug area  

---------------------------------------------------------------------------
debug_entry_t* debug_text_exception (debug_info_t * id, int level, 
                                     const char* data);

Parameter:     id:     handle for debug log  
               level:  debug level           
               data:   string for debug entry  

Return Value:  Address of written debug entry 

Description:   writes debug entry in ascii format to active debug area 
               (if level <= actual debug level) and switches to next debug 
               area  

---------------------------------------------------------------------------
debug_entry_t* debug_sprintf_exception (debug_info_t * id, int level,
                                        char* string,...);

Parameter:     id:    handle for debug log  
               level: debug level  
               string: format string for debug entry  
               ...: varargs used as in sprintf()

Return Value:  Address of written debug entry 

Description:   writes debug entry with format string and varargs (longs) to 
               active debug area (if level $<=$ actual debug level) and
               switches to next debug area. 
               floats and long long datatypes cannot be used as varargs.

---------------------------------------------------------------------------

int debug_register_view (debug_info_t * id, struct debug_view *view);

Parameter:     id:    handle for debug log  
               view:  pointer to debug view struct 

Return Value:  0  : ok 
               < 0: Error 

Description:   registers new debug view and creates debugfs dir entry

---------------------------------------------------------------------------
int debug_unregister_view (debug_info_t * id, struct debug_view *view); 

Parameter:     id:    handle for debug log  
               view:  pointer to debug view struct 

Return Value:  0  : ok 
               < 0: Error 

Description:   unregisters debug view and removes debugfs dir entry



Predefined views:
-----------------

extern struct debug_view debug_hex_ascii_view;
extern struct debug_view debug_raw_view;
extern struct debug_view debug_sprintf_view;

Examples
--------

/*
 * hex_ascii- + raw-view Example
 */

#include <linux/init.h>
#include <asm/debug.h>

static debug_info_t* debug_info;

static int init(void)
{
    /* register 4 debug areas with one page each and 4 byte data field */

    debug_info = debug_register ("test", 1, 4, 4 );
    debug_register_view(debug_info,&debug_hex_ascii_view);
    debug_register_view(debug_info,&debug_raw_view);

    debug_text_event(debug_info, 4 , "one ");
    debug_int_exception(debug_info, 4, 4711);
    debug_event(debug_info, 3, &debug_info, 4);

    return 0;
}

static void cleanup(void)
{
    debug_unregister (debug_info);
}

module_init(init);
module_exit(cleanup);

---------------------------------------------------------------------------

/*
 * sprintf-view Example
 */

#include <linux/init.h>
#include <asm/debug.h>

static debug_info_t* debug_info;

static int init(void)
{
    /* register 4 debug areas with one page each and data field for */
    /* format string pointer + 2 varargs (= 3 * sizeof(long))       */

    debug_info = debug_register ("test", 1, 4, sizeof(long) * 3);
    debug_register_view(debug_info,&debug_sprintf_view);

    debug_sprintf_event(debug_info, 2 , "first event in %s:%i\n",__FILE__,__LINE__);
    debug_sprintf_exception(debug_info, 1, "pointer to debug info: %p\n",&debug_info);

    return 0;
}

static void cleanup(void)
{
    debug_unregister (debug_info);
}

module_init(init);
module_exit(cleanup);



Debugfs Interface
----------------
Views to the debug logs can be investigated through reading the corresponding 
debugfs-files:

Example:

> ls /sys/kernel/debug/s390dbf/dasd
flush  hex_ascii  level pages raw
> cat /sys/kernel/debug/s390dbf/dasd/hex_ascii | sort +1
00 00974733272:680099 2 - 02 0006ad7e  07 ea 4a 90 | ....
00 00974733272:682210 2 - 02 0006ade6  46 52 45 45 | FREE
00 00974733272:682213 2 - 02 0006adf6  07 ea 4a 90 | ....
00 00974733272:682281 1 * 02 0006ab08  41 4c 4c 43 | EXCP 
01 00974733272:682284 2 - 02 0006ab16  45 43 4b 44 | ECKD
01 00974733272:682287 2 - 02 0006ab28  00 00 00 04 | ....
01 00974733272:682289 2 - 02 0006ab3e  00 00 00 20 | ... 
01 00974733272:682297 2 - 02 0006ad7e  07 ea 4a 90 | ....
01 00974733272:684384 2 - 00 0006ade6  46 52 45 45 | FREE
01 00974733272:684388 2 - 00 0006adf6  07 ea 4a 90 | ....

See section about predefined views for explanation of the above output!

Changing the debug level
------------------------

Example:


> cat /sys/kernel/debug/s390dbf/dasd/level
3
> echo "5" > /sys/kernel/debug/s390dbf/dasd/level
> cat /sys/kernel/debug/s390dbf/dasd/level
5

Flushing debug areas
--------------------
Debug areas can be flushed with piping the number of the desired
area (0...n) to the debugfs file "flush". When using "-" all debug areas
are flushed.

Examples:

1. Flush debug area 0:
> echo "0" > /sys/kernel/debug/s390dbf/dasd/flush

2. Flush all debug areas:
> echo "-" > /sys/kernel/debug/s390dbf/dasd/flush

Changing the size of debug areas
------------------------------------
It is possible the change the size of debug areas through piping
the number of pages to the debugfs file "pages". The resize request will
also flush the debug areas.

Example:

Define 4 pages for the debug areas of debug feature "dasd":
> echo "4" > /sys/kernel/debug/s390dbf/dasd/pages

Stooping the debug feature
--------------------------
Example:

1. Check if stopping is allowed
> cat /proc/sys/s390dbf/debug_stoppable
2. Stop debug feature
> echo 0 > /proc/sys/s390dbf/debug_active

lcrash Interface
----------------
It is planned that the dump analysis tool lcrash gets an additional command
's390dbf' to display all the debug logs. With this tool it will be possible 
to investigate the debug logs on a live system and with a memory dump after 
a system crash.

Investigating raw memory
------------------------
One last possibility to investigate the debug logs at a live
system and after a system crash is to look at the raw memory
under VM or at the Service Element.
It is possible to find the anker of the debug-logs through
the 'debug_area_first' symbol in the System map. Then one has
to follow the correct pointers of the data-structures defined
in debug.h and find the debug-areas in memory.
Normally modules which use the debug feature will also have
a global variable with the pointer to the debug-logs. Following
this pointer it will also be possible to find the debug logs in
memory.

For this method it is recommended to use '16 * x + 4' byte (x = 0..n)
for the length of the data field in debug_register() in
order to see the debug entries well formatted.


Predefined Views
----------------

There are three predefined views: hex_ascii, raw and sprintf. 
The hex_ascii view shows the data field in hex and ascii representation 
(e.g. '45 43 4b 44 | ECKD'). 
The raw view returns a bytestream as the debug areas are stored in memory.

The sprintf view formats the debug entries in the same way as the sprintf
function would do. The sprintf event/exception functions write to the
debug entry a pointer to the format string (size = sizeof(long)) 
and for each vararg a long value. So e.g. for a debug entry with a format 
string plus two varargs one would need to allocate a (3 * sizeof(long)) 
byte data area in the debug_register() function.

IMPORTANT: Using "%s" in sprintf event functions is dangerous. You can only
use "%s" in the sprintf event functions, if the memory for the passed string is
available as long as the debug feature exists. The reason behind this is that
due to performance considerations only a pointer to the string is stored in
the debug feature. If you log a string that is freed afterwards, you will get
an OOPS when inspecting the debug feature, because then the debug feature will
access the already freed memory.

NOTE: If using the sprintf view do NOT use other event/exception functions
than the sprintf-event and -exception functions.

The format of the hex_ascii and sprintf view is as follows:
- Number of area
- Timestamp (formatted as seconds and microseconds since 00:00:00 Coordinated 
  Universal Time (UTC), January 1, 1970)
- level of debug entry
- Exception flag (* = Exception)
- Cpu-Number of calling task
- Return Address to caller
- data field

The format of the raw view is:
- Header as described in debug.h
- datafield 

A typical line of the hex_ascii view will look like the following (first line 
is only for explanation and will not be displayed when 'cating' the view):

area  time           level exception cpu caller    data (hex + ascii)
--------------------------------------------------------------------------
00    00964419409:440690 1 -         00  88023fe   


Defining views
--------------

Views are specified with the 'debug_view' structure. There are defined
callback functions which are used for reading and writing the debugfs files:

struct debug_view {
        char name[DEBUG_MAX_PROCF_LEN];  
        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;
};

where

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_buf,
                                  size_t in_buf_size, loff_t* offset);


The "private_data" member can be used as pointer to view specific data.
It is not used by the debug feature itself.

The output when reading a debugfs file is structured like this:

"prolog_proc output"

"header_proc output 1"  "format_proc output 1"
"header_proc output 2"  "format_proc output 2"
"header_proc output 3"  "format_proc output 3"
...

When a view is read from the debugfs, the Debug Feature calls the
'prolog_proc' once for writing the prolog.
Then 'header_proc' and 'format_proc' are called for each 
existing debug entry.

The input_proc can be used to implement functionality when it is written to 
the view (e.g. like with 'echo "0" > /sys/kernel/debug/s390dbf/dasd/level).

For header_proc there can be used the default function
debug_dflt_header_fn() which is defined in debug.h.
and which produces the same header output as the predefined views.
E.g:
00 00964419409:440761 2 - 00 88023ec

In order to see how to use the callback functions check the implementation
of the default views!

Example

#include <asm/debug.h>

#define UNKNOWNSTR "data: %08x"

const char* messages[] =
{"This error...........\n",
 "That error...........\n",
 "Problem..............\n",
 "Something went wrong.\n",
 "Everything ok........\n",
 NULL
};

static int debug_test_format_fn(
   debug_info_t * id, struct debug_view *view, 
   char *out_buf, const char *in_buf
)
{
  int i, rc = 0;

  if(id->buf_size >= 4) {
     int msg_nr = *((int*)in_buf);
     if(msg_nr < sizeof(messages)/sizeof(char*) - 1)
        rc += sprintf(out_buf, "%s", messages[msg_nr]);	
     else
        rc += sprintf(out_buf, UNKNOWNSTR, msg_nr);
  }
 out:
   return rc;
}

struct debug_view debug_test_view = {
  "myview",                 /* name of view */
  NULL,                     /* no prolog */
  &debug_dflt_header_fn,    /* default header for each entry */
  &debug_test_format_fn,    /* our own format function */
  NULL,                     /* no input function */
  NULL                      /* no private data */
};

=====
test:
=====
debug_info_t *debug_info;
...
debug_info = debug_register ("test", 0, 4, 4 ));
debug_register_view(debug_info, &debug_test_view);
for(i = 0; i < 10; i ++) debug_int_event(debug_info, 1, i);

> cat /sys/kernel/debug/s390dbf/test/myview
00 00964419734:611402 1 - 00 88042ca   This error...........
00 00964419734:611405 1 - 00 88042ca   That error...........
00 00964419734:611408 1 - 00 88042ca   Problem..............
00 00964419734:611411 1 - 00 88042ca   Something went wrong.
00 00964419734:611414 1 - 00 88042ca   Everything ok........
00 00964419734:611417 1 - 00 88042ca   data: 00000005
00 00964419734:611419 1 - 00 88042ca   data: 00000006
00 00964419734:611422 1 - 00 88042ca   data: 00000007
00 00964419734:611425 1 - 00 88042ca   data: 00000008
00 00964419734:611428 1 - 00 88042ca   data: 00000009
