blob: cf6fa439ee1372cc606bc7d971bb2c556b19ee8f [file] [log] [blame]
/*
* linux/kernel/info.c
*
* Copyright (C) 1992 Darren Senn
*/
/* This implements the sysinfo() system call */
#include <asm/segment.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/unistd.h>
#include <linux/types.h>
#include <linux/mm.h>
extern "C" int sys_sysinfo(struct sysinfo *info)
{
int error;
struct sysinfo val;
struct task_struct **p;
error = verify_area(VERIFY_WRITE, info, sizeof(struct sysinfo));
if (error)
return error;
memset((char *)&val, 0, sizeof(struct sysinfo));
val.uptime = (jiffies + jiffies_offset) / HZ;
val.loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT);
val.loads[1] = avenrun[1] << (SI_LOAD_SHIFT - FSHIFT);
val.loads[2] = avenrun[2] << (SI_LOAD_SHIFT - FSHIFT);
for (p = &LAST_TASK; p > &FIRST_TASK; p--)
if (*p) val.procs++;
si_meminfo(&val);
si_swapinfo(&val);
memcpy_tofs(info, &val, sizeof(struct sysinfo));
return 0;
}