4 * Copyright (C) 1992 Darren Senn
7 /* This implements the sysinfo() system call */
10 #include <linux/unistd.h>
11 #include <linux/swap.h>
12 #include <linux/smp_lock.h>
14 #include <asm/uaccess.h>
16 asmlinkage
long sys_sysinfo(struct sysinfo
*info
)
20 memset((char *)&val
, 0, sizeof(struct sysinfo
));
23 val
.uptime
= jiffies
/ HZ
;
25 val
.loads
[0] = avenrun
[0] << (SI_LOAD_SHIFT
- FSHIFT
);
26 val
.loads
[1] = avenrun
[1] << (SI_LOAD_SHIFT
- FSHIFT
);
27 val
.loads
[2] = avenrun
[2] << (SI_LOAD_SHIFT
- FSHIFT
);
29 val
.procs
= nr_threads
-1;
36 /* If the sum of all the available memory (i.e. ram + swap +
37 * highmem) is less then can be stored in a 32 bit unsigned long
38 * then we can be binary compatible with 2.2.x kernels. If not,
39 * well, who cares since in that case 2.2.x was broken anyways...
41 * -Erik Andersen <andersee@debian.org> */
43 unsigned long mem_total
= val
.totalram
+ val
.totalswap
;
44 if ( !(mem_total
< val
.totalram
|| mem_total
< val
.totalswap
)) {
45 unsigned long mem_total2
= mem_total
+ val
.totalhigh
;
46 if (!(mem_total2
< mem_total
|| mem_total2
< val
.totalhigh
))
48 /* If mem_total did not overflow. Divide all memory values by
49 * mem_unit and set mem_unit=1. This leaves things compatible with
50 * 2.2.x, and also retains compatibility with earlier 2.4.x
54 while (val
.mem_unit
> 1)
59 val
.totalram
<<= bitcount
;
60 val
.freeram
<<= bitcount
;
61 val
.sharedram
<<= bitcount
;
62 val
.bufferram
<<= bitcount
;
63 val
.totalswap
<<= bitcount
;
64 val
.freeswap
<<= bitcount
;
65 val
.totalhigh
<<= bitcount
;
66 val
.freehigh
<<= bitcount
;
71 if (copy_to_user(info
, &val
, sizeof(struct sysinfo
)))