//-------------------------------------------------------------------
//	timerinfo.c
//	
//	This module creates a pseudo-file (named '/proc/timerinfo')
//	which shows some timer-related fields in the 'task_struct'.
//
//	programmer: ALLAN CRUSE
//	written on: 18 SEP 2004
//-------------------------------------------------------------------

#include <linux/module.h>	// for init_module() 
#include <linux/proc_fs.h>	// for create_proc_read_entry() 

static char modname[] = "timerinfo";

static int my_proc_read( char *buf, char **start, off_t off,
			int count, int *eof, void *data )
{
	struct task_struct	*tsk = current;
	unsigned long	*lp = (unsigned long*)&tsk->real_timer;
	int		i, len;
	
	len = sprintf( buf, "\ntask_struct information (pid=%d)", tsk->pid );
	len += sprintf( buf+len, " jiffies=%08X ", jiffies );
	len += sprintf( buf+len, " start_time=%08X ", tsk->start_time );

	len += sprintf( buf+len, "\nit_real_value=%08X ", 
		  				  tsk->it_real_value );
	len += sprintf( buf+len, "it_real_incr=%08X ", 
		  				  tsk->it_real_incr );

	len += sprintf( buf+len, "\nit_prof_value=%08X ", 
		  				  tsk->it_prof_value );
	len += sprintf( buf+len, "it_prof_incr=%08X ", 
		  				  tsk->it_prof_incr );

	len += sprintf( buf+len, "\nit_virt_value=%08X ", 
		  				  tsk->it_virt_value );
	len += sprintf( buf+len, "it_virt_incr=%08X ", 
		  				  tsk->it_virt_incr );

	len += sprintf( buf+len, "\nreal_timer: " );
	for (i = 0; i < 5; i++) len += sprintf( buf+len, "%08X ", lp[i] );
	len += sprintf( buf+len, "\n" );
	return	len;
}

void cleanup_module( void )
{
	remove_proc_entry( modname, NULL );
}

int init_module( void )
{
	create_proc_read_entry( modname, 0, NULL, my_proc_read, NULL );
	return	0;  //SUCCESS;
}

MODULE_LICENSE("GPL");