sysinfo.c raw

   1  #include <sys/sysinfo.h>
   2  #include "syscall.h"
   3  
   4  #define klong long long
   5  #define kulong unsigned long long
   6  
   7  struct kernel_sysinfo {
   8  	klong uptime;
   9  	kulong loads[3];
  10  	kulong totalram;
  11  	kulong freeram;
  12  	kulong sharedram;
  13  	kulong bufferram;
  14  	kulong totalswap;
  15  	kulong freeswap;
  16  	short procs;
  17  	short pad;
  18  	kulong totalhigh;
  19  	kulong freehigh;
  20  	unsigned mem_unit;
  21  };
  22  
  23  int __lsysinfo(struct sysinfo *info)
  24  {
  25  	struct kernel_sysinfo tmp;
  26  	int ret = syscall(SYS_sysinfo, &tmp);
  27  	if(ret == -1) return ret;
  28  	info->uptime = tmp.uptime;
  29  	info->loads[0] = tmp.loads[0];
  30  	info->loads[1] = tmp.loads[1];
  31  	info->loads[2] = tmp.loads[2];
  32  	kulong shifts;
  33  	kulong max = tmp.totalram | tmp.totalswap;
  34  	__asm__("bsr %1,%0" : "=r"(shifts) : "r"(max));
  35  	shifts = shifts >= 32 ? shifts - 31 : 0;
  36  	info->totalram = tmp.totalram >> shifts;
  37  	info->freeram = tmp.freeram >> shifts;
  38  	info->sharedram = tmp.sharedram >> shifts;
  39  	info->bufferram = tmp.bufferram >> shifts;
  40  	info->totalswap = tmp.totalswap >> shifts;
  41  	info->freeswap = tmp.freeswap >> shifts;
  42  	info->procs = tmp.procs ;
  43  	info->totalhigh = tmp.totalhigh >> shifts;
  44  	info->freehigh = tmp.freehigh >> shifts;
  45  	info->mem_unit = (tmp.mem_unit ? tmp.mem_unit : 1) << shifts;
  46  	return ret;
  47  }
  48  
  49  weak_alias(__lsysinfo, sysinfo);
  50