//-------------------------------------------------------------------
//	footprint.c
//
//	For showing the amount of memory used by the current task. 
//
//	programmer: ALLAN CRUSE
//	written on: 15 FEB 2005
//-------------------------------------------------------------------

#include <linux/module.h>	// for init_module() 
#include <linux/proc_fs.h>	// for create_proc_info_entry() 
#include <linux/mm.h>		// for 'vm_area_struct'

static char modname[] = "footprint";

static int my_get_info( char *buf, char **start, off_t off, int count )
{
	struct task_struct	*task = current;
	struct vm_area_struct	*vma;
	unsigned int		areasize, tasksize, i = 0, len = 0;

	len += sprintf( buf+len, "\nUserspace memory-footprint for task " );
	len += sprintf( buf+len, "\'%s\' (pid=%d)\n\n", task->comm, task->pid );

	tasksize = 0;
	if ( task->mm != NULL )
		{
		vma = task->mm->mmap;
		while ( vma != NULL )
			{
			++i;
			areasize = vma->vm_end - vma->vm_start;
			len += sprintf( buf+len, "%6d  ", i );
			len += sprintf( buf+len, "%08lX-", vma->vm_start );
			len += sprintf( buf+len, "%08lX  ", vma->vm_end );
			len += sprintf( buf+len, "areasize=%08X\n", areasize );
			tasksize += areasize;
			vma = vma->vm_next;
			}
		}

	len += sprintf( buf+len, "\nTotal size of the memory-footprint: " );
	len += sprintf( buf+len, "%08X \n", tasksize );
	len += sprintf( buf+len, "\n" );
	return	len;
}

int init_module( void )
{
	create_proc_info_entry( modname, 0, NULL, my_get_info );
	return	0;  //SUCCESS
}

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

MODULE_LICENSE("GPL");