Compare commits
24 Commits
LIBGTOP_ST
...
sysctl_mar
Author | SHA1 | Date | |
---|---|---|---|
|
76441b1d5f | ||
|
d2e3577784 | ||
|
4a0344182f | ||
|
ddc496cdaa | ||
|
746981611b | ||
|
c1beefce3a | ||
|
1667cc8a8d | ||
|
0aea46a643 | ||
|
820ab2210e | ||
|
f40e8a57b4 | ||
|
005357e821 | ||
|
5fcfc95280 | ||
|
dfc9e912b5 | ||
|
a6385288aa | ||
|
2f6457b3f7 | ||
|
ba2f0f753b | ||
|
38554dbcbe | ||
|
fe98fde338 | ||
|
c3ea69f26a | ||
|
367e1f047c | ||
|
7db1ed695c | ||
|
26b4615262 | ||
|
c4ccf53aad | ||
|
8fe9163e6b |
@@ -32,3 +32,8 @@ ABOUT-NLS
|
|||||||
libgtop.spec
|
libgtop.spec
|
||||||
libgtop-0.99.*.tar.gz
|
libgtop-0.99.*.tar.gz
|
||||||
libgtop-0.99.*
|
libgtop-0.99.*
|
||||||
|
install-sh
|
||||||
|
mkinstalldirs
|
||||||
|
missing
|
||||||
|
INSTALL
|
||||||
|
COPYING
|
||||||
|
39
ChangeLog
39
ChangeLog
@@ -1,3 +1,42 @@
|
|||||||
|
1999-03-21 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
Added a new sysctl () interface to the Linux Kernel.
|
||||||
|
|
||||||
|
* kernel/sysctl: Imported.
|
||||||
|
|
||||||
|
* libgtop-sysdeps.m4: If `--enable-hacker-mode' is given, check
|
||||||
|
for my new sysctl () interface.
|
||||||
|
|
||||||
|
1999-03-20 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
Removed all traces of my old table () Linux kernel hack.
|
||||||
|
|
||||||
|
* kernel: Removed.
|
||||||
|
* sysdeps/kernel: Removed.
|
||||||
|
* libgtop-sysdeps.m4: Don't check for table (); it does not
|
||||||
|
exist any longer.
|
||||||
|
|
||||||
|
1999-03-19 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
This is *untested* - please read "sysdeps/freebsd/ChangeLog" !
|
||||||
|
|
||||||
|
* libgtop-sysdeps.m4: Use the `freebsd' sysdeps directory for
|
||||||
|
BSDI as well if the `--enable-hacker-mode' parameter was given.
|
||||||
|
|
||||||
|
1999-03-18 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
* LIBGTOP-VERSION: Set version number to 1.0.2 binary age 1,
|
||||||
|
intergace age 1.
|
||||||
|
|
||||||
|
1999-03-17 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
Imported first version of my Solaris port.
|
||||||
|
|
||||||
|
* configure.in: Check for `kstat_open' in `-lkstat'.
|
||||||
|
|
||||||
|
* libgtop-sysdeps.m4: Recognize the `solaris' sysdeps directory
|
||||||
|
when the `--enable-hacker-mode' parameter was given.
|
||||||
|
|
||||||
1999-03-01 Martin Baulig <martin@home-of-linux.org>
|
1999-03-01 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
Released LibGTop 1.0.1.
|
Released LibGTop 1.0.1.
|
||||||
|
@@ -8,10 +8,10 @@
|
|||||||
#
|
#
|
||||||
LIBGTOP_MAJOR_VERSION=1
|
LIBGTOP_MAJOR_VERSION=1
|
||||||
LIBGTOP_MINOR_VERSION=0
|
LIBGTOP_MINOR_VERSION=0
|
||||||
LIBGTOP_MICRO_VERSION=1
|
LIBGTOP_MICRO_VERSION=2
|
||||||
|
|
||||||
LIBGTOP_INTERFACE_AGE=0
|
LIBGTOP_INTERFACE_AGE=1
|
||||||
LIBGTOP_BINARY_AGE=0
|
LIBGTOP_BINARY_AGE=1
|
||||||
|
|
||||||
# Increase each time you change the client/server protocol.
|
# Increase each time you change the client/server protocol.
|
||||||
LIBGTOP_SERVER_VERSION=5
|
LIBGTOP_SERVER_VERSION=5
|
||||||
|
@@ -138,7 +138,7 @@
|
|||||||
|
|
||||||
#undef NEED_LIBGTOP
|
#undef NEED_LIBGTOP
|
||||||
|
|
||||||
#undef HAVE_LINUX_TABLE
|
#undef HAVE_LINUX_SYSCTL
|
||||||
#undef HAVE_LIBGTOP_SMP
|
#undef HAVE_LIBGTOP_SMP
|
||||||
|
|
||||||
#undef HAVE_XAUTH
|
#undef HAVE_XAUTH
|
||||||
|
@@ -183,6 +183,9 @@ AC_CHECK_HEADERS(string.h strings.h, break)
|
|||||||
AC_REPLACE_FUNCS(strerror)
|
AC_REPLACE_FUNCS(strerror)
|
||||||
AC_CHECK_LIB(kvm, kvm_open)
|
AC_CHECK_LIB(kvm, kvm_open)
|
||||||
|
|
||||||
|
dnl Solaris 7
|
||||||
|
AC_CHECK_LIB(kstat, kstat_open)
|
||||||
|
|
||||||
dnl For DEC OSF1
|
dnl For DEC OSF1
|
||||||
AC_CHECK_LIB(mach, vm_statistics)
|
AC_CHECK_LIB(mach, vm_statistics)
|
||||||
|
|
||||||
@@ -399,8 +402,8 @@ sysdeps/stub_suid/Makefile
|
|||||||
sysdeps/sun4/Makefile
|
sysdeps/sun4/Makefile
|
||||||
sysdeps/osf1/Makefile
|
sysdeps/osf1/Makefile
|
||||||
sysdeps/linux/Makefile
|
sysdeps/linux/Makefile
|
||||||
sysdeps/kernel/Makefile
|
|
||||||
sysdeps/freebsd/Makefile
|
sysdeps/freebsd/Makefile
|
||||||
|
sysdeps/solaris/Makefile
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/daemon/Makefile
|
src/daemon/Makefile
|
||||||
src/inodedb/Makefile
|
src/inodedb/Makefile
|
||||||
|
@@ -11,4 +11,5 @@ third_linux
|
|||||||
third_static
|
third_static
|
||||||
second_static
|
second_static
|
||||||
second_linux
|
second_linux
|
||||||
|
smp_static sysdeps_static netload_static procmap_static mountlist_static
|
||||||
smp sysdeps netload procmap mountlist
|
smp sysdeps netload procmap mountlist
|
||||||
|
@@ -1,3 +1,8 @@
|
|||||||
|
1999-03-17 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
* first.c, second.c: Fixed a bug that caused a core dump when
|
||||||
|
the sysdeps code does not return all data.
|
||||||
|
|
||||||
1998-11-22 Martin Baulig <baulig@taurus.uni-trier.de>
|
1998-11-22 Martin Baulig <baulig@taurus.uni-trier.de>
|
||||||
|
|
||||||
* netload.c: Call inet_ntoa () to get address and subnet
|
* netload.c: Call inet_ntoa () to get address and subnet
|
||||||
|
@@ -344,7 +344,7 @@ main (int argc, char *argv [])
|
|||||||
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", (int) pid,
|
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", (int) pid,
|
||||||
(unsigned long) data.proc_args.flags,
|
(unsigned long) data.proc_args.flags,
|
||||||
(unsigned long) data.proc_args.size,
|
(unsigned long) data.proc_args.size,
|
||||||
args);
|
args ? args : "");
|
||||||
|
|
||||||
glibtop_free (args);
|
glibtop_free (args);
|
||||||
|
|
||||||
@@ -454,7 +454,7 @@ main (int argc, char *argv [])
|
|||||||
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", (int) ppid,
|
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", (int) ppid,
|
||||||
(unsigned long) data.proc_args.flags,
|
(unsigned long) data.proc_args.flags,
|
||||||
(unsigned long) data.proc_args.size,
|
(unsigned long) data.proc_args.size,
|
||||||
args);
|
args ? args : "");
|
||||||
|
|
||||||
glibtop_free (args);
|
glibtop_free (args);
|
||||||
|
|
||||||
@@ -565,7 +565,7 @@ main (int argc, char *argv [])
|
|||||||
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", 1,
|
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", 1,
|
||||||
(unsigned long) data.proc_args.flags,
|
(unsigned long) data.proc_args.flags,
|
||||||
(unsigned long) data.proc_args.size,
|
(unsigned long) data.proc_args.size,
|
||||||
args);
|
args ? args : "");
|
||||||
|
|
||||||
glibtop_free (args);
|
glibtop_free (args);
|
||||||
|
|
||||||
|
@@ -150,7 +150,7 @@ output (pid_t pid)
|
|||||||
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", (int) pid,
|
printf ("Proc_Args PID %5d (0x%08lx): %lu - '%s'\n", (int) pid,
|
||||||
(unsigned long) data.proc_args.flags,
|
(unsigned long) data.proc_args.flags,
|
||||||
(unsigned long) data.proc_args.size,
|
(unsigned long) data.proc_args.size,
|
||||||
args);
|
args ? args : "");
|
||||||
|
|
||||||
glibtop_free (args);
|
glibtop_free (args);
|
||||||
|
|
||||||
|
@@ -1,14 +0,0 @@
|
|||||||
1998-07-21 Martin Baulig <martin@home-of-linux.org>
|
|
||||||
|
|
||||||
* table20: New directory for 2.0.xx kernels.
|
|
||||||
|
|
||||||
* table21: New directory for 2.1.xx kernels.
|
|
||||||
|
|
||||||
* *: Moved into `table20' and `table21'.
|
|
||||||
|
|
||||||
1998-06-14 Martin Baulig <baulig@taurus.uni-trier.de>
|
|
||||||
|
|
||||||
* README: Added README.
|
|
||||||
|
|
||||||
* kernel.patch: Patch for the Linux kernel to add the
|
|
||||||
new system call.
|
|
@@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Makefile for the linux system information tables.
|
# Makefile for the LibGTop linux sysctl interface.
|
||||||
#
|
#
|
||||||
# Note! Dependencies are done automagically by 'make dep', which also
|
# Note! Dependencies are done automagically by 'make dep', which also
|
||||||
# removes any old dependencies. DON'T put your own dependencies here
|
# removes any old dependencies. DON'T put your own dependencies here
|
||||||
@@ -7,7 +7,16 @@
|
|||||||
#
|
#
|
||||||
# Note 2! The CFLAGS definition is now in the main makefile...
|
# Note 2! The CFLAGS definition is now in the main makefile...
|
||||||
|
|
||||||
O_TARGET := table.o
|
O_TARGET := kernel.o
|
||||||
|
ifeq ($(CONFIG_LIBGTOP),y)
|
||||||
|
O_OJBS := main.o libgtop.o
|
||||||
|
else
|
||||||
O_OBJS := main.o
|
O_OBJS := main.o
|
||||||
|
endif
|
||||||
|
OX_OBJS := libgtop_syms.o
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_LIBGTOP),m)
|
||||||
|
M_OBJS := libgtop.o
|
||||||
|
endif
|
||||||
|
|
||||||
include $(TOPDIR)/Rules.make
|
include $(TOPDIR)/Rules.make
|
320
kernel/sysctl/libgtop.c
Normal file
320
kernel/sysctl/libgtop.c
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
/*
|
||||||
|
* linux/libgtop/module.c
|
||||||
|
* Copyright (C) 1999 Martin Baulig
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/kernel_stat.h>
|
||||||
|
#include <linux/tty.h>
|
||||||
|
#include <linux/user.h>
|
||||||
|
#include <linux/a.out.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
#include <linux/mman.h>
|
||||||
|
#include <linux/proc_fs.h>
|
||||||
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/pagemap.h>
|
||||||
|
#include <linux/swap.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/smp.h>
|
||||||
|
#include <linux/signal.h>
|
||||||
|
|
||||||
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
#include <linux/libgtop.h>
|
||||||
|
|
||||||
|
EXPORT_NO_SYMBOLS;
|
||||||
|
|
||||||
|
static int system_ctl_handler (ctl_table *table, int *name, int nlen,
|
||||||
|
void *oldval, size_t *oldlenp, void *newval,
|
||||||
|
size_t newlen, void **context);
|
||||||
|
|
||||||
|
static int proc_ctl_handler (ctl_table *table, int *name, int nlen,
|
||||||
|
void *oldval, size_t *oldlenp, void *newval,
|
||||||
|
size_t newlen, void **context);
|
||||||
|
|
||||||
|
static int libgtop_sysctl_version = 1;
|
||||||
|
static int libgtop_update_expensive = 5000;
|
||||||
|
|
||||||
|
static struct ctl_table_header *libgtop_sysctl_header = NULL;
|
||||||
|
|
||||||
|
static libgtop_stat_t libgtop_stat;
|
||||||
|
static unsigned int libgtop_mem_timestamp = 0;
|
||||||
|
static libgtop_mem_t libgtop_mem;
|
||||||
|
static unsigned int libgtop_swap_timestamp = 0;
|
||||||
|
static libgtop_swap_t libgtop_swap;
|
||||||
|
static libgtop_proclist_t libgtop_proclist;
|
||||||
|
|
||||||
|
static ctl_table libgtop_table[];
|
||||||
|
static ctl_table proc_table[];
|
||||||
|
|
||||||
|
static ctl_table libgtop_root_table[] = {
|
||||||
|
{CTL_LIBGTOP, "libgtop", NULL, 0, 0555, libgtop_table},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef MODULE
|
||||||
|
static
|
||||||
|
#endif
|
||||||
|
ctl_table libgtop_table[] = {
|
||||||
|
{LIBGTOP_VERSION, "version", &libgtop_sysctl_version,
|
||||||
|
sizeof (int), 0444, NULL, &proc_dointvec},
|
||||||
|
{LIBGTOP_PROC, NULL, NULL, 0, 0555, proc_table},
|
||||||
|
{LIBGTOP_UPDATE_EXPENSIVE, "update_expensive",
|
||||||
|
&libgtop_update_expensive, sizeof (int), 0664, NULL, &proc_dointvec},
|
||||||
|
{LIBGTOP_STAT, NULL, &libgtop_stat, sizeof (libgtop_stat),
|
||||||
|
0444, NULL, NULL, &system_ctl_handler},
|
||||||
|
{LIBGTOP_MEM, NULL, &libgtop_mem, sizeof (libgtop_mem),
|
||||||
|
0444, NULL, NULL, &system_ctl_handler},
|
||||||
|
{LIBGTOP_SWAP, NULL, &libgtop_swap, sizeof (libgtop_swap),
|
||||||
|
0444, NULL, NULL, &system_ctl_handler},
|
||||||
|
{LIBGTOP_PROCLIST, NULL, &libgtop_proclist, sizeof (libgtop_proclist),
|
||||||
|
0444, NULL, NULL, &system_ctl_handler},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static ctl_table proc_table[] = {
|
||||||
|
{CTL_ANY, NULL, NULL, 0, 04444, NULL, NULL, &proc_ctl_handler},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef MODULE
|
||||||
|
static void
|
||||||
|
libgtop_sysctl_register(void)
|
||||||
|
{
|
||||||
|
static int initialized = 0;
|
||||||
|
|
||||||
|
if (initialized == 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
libgtop_sysctl_header = register_sysctl_table(libgtop_root_table, 1);
|
||||||
|
initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
libgtop_sysctl_unregister(void)
|
||||||
|
{
|
||||||
|
unregister_sysctl_table(libgtop_sysctl_header);
|
||||||
|
}
|
||||||
|
|
||||||
|
int init_module(void)
|
||||||
|
{
|
||||||
|
libgtop_sysctl_register();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup_module(void)
|
||||||
|
{
|
||||||
|
libgtop_sysctl_unregister();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* MODULE */
|
||||||
|
|
||||||
|
static int
|
||||||
|
libgtop_sysctl (ctl_table *table, int nlen, int *name)
|
||||||
|
{
|
||||||
|
extern unsigned long total_forks;
|
||||||
|
int index, tindex, tty, which, arg;
|
||||||
|
libgtop_stat_t *lstat;
|
||||||
|
libgtop_mem_t *mem;
|
||||||
|
libgtop_swap_t *swap;
|
||||||
|
libgtop_proclist_t *proclist;
|
||||||
|
struct task_struct *tsk = NULL;
|
||||||
|
struct sysinfo i;
|
||||||
|
|
||||||
|
switch (table->ctl_name) {
|
||||||
|
case LIBGTOP_STAT:
|
||||||
|
lstat = table->data;
|
||||||
|
lstat->cpu.total = jiffies;
|
||||||
|
lstat->cpu.user = kstat.cpu_user;
|
||||||
|
lstat->cpu.nice = kstat.cpu_nice;
|
||||||
|
lstat->cpu.sys = kstat.cpu_system;
|
||||||
|
lstat->cpu.idle = jiffies*smp_num_cpus -
|
||||||
|
(lstat->cpu.user + lstat->cpu.nice + lstat->cpu.sys);
|
||||||
|
#ifdef __SMP__
|
||||||
|
for (i = 0; i < smp_num_cpus; i++) {
|
||||||
|
lstat->xcpu[i].user = kstat.per_cpu_user[cpu_logical_map(i)];
|
||||||
|
lstat->xcpu[i].nice = kstat.per_cpu_nice[cpu_logical_map(i)];
|
||||||
|
lstat->xcpu[i].sys = kstat.per_cpu_system[cpu_logical_map(i)];
|
||||||
|
lstat->xcpu[i].idle = jiffies -
|
||||||
|
(lstat->xcpu[i].user + lstat->xcpu[i].nice +
|
||||||
|
lstat->xcpu[i].sys);
|
||||||
|
}
|
||||||
|
|
||||||
|
lstat->ncpu = smp_num_cpus;
|
||||||
|
#else
|
||||||
|
lstat->ncpu = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
lstat->frequency = HZ;
|
||||||
|
|
||||||
|
lstat->loadavg [0] = (double) avenrun [0] / (1 << FSHIFT);
|
||||||
|
lstat->loadavg [1] = (double) avenrun [1] / (1 << FSHIFT);
|
||||||
|
lstat->loadavg [2] = (double) avenrun [2] / (1 << FSHIFT);
|
||||||
|
|
||||||
|
lstat->pgpgin = kstat.pgpgin;
|
||||||
|
lstat->pgpgout = kstat.pgpgout;
|
||||||
|
lstat->pswpin = kstat.pswpin;
|
||||||
|
lstat->pswpout = kstat.pswpout;
|
||||||
|
|
||||||
|
lstat->context_swtch = kstat.context_swtch;
|
||||||
|
lstat->boot_time = xtime.tv_sec - jiffies / HZ;
|
||||||
|
lstat->total_forks = total_forks;
|
||||||
|
break;
|
||||||
|
case LIBGTOP_MEM:
|
||||||
|
if (jiffies - libgtop_mem_timestamp < libgtop_update_expensive)
|
||||||
|
return 0;
|
||||||
|
libgtop_mem_timestamp = jiffies;
|
||||||
|
|
||||||
|
mem = table->data;
|
||||||
|
si_meminfo (&i);
|
||||||
|
|
||||||
|
mem->totalram = i.totalram;
|
||||||
|
mem->freeram = i.freeram;
|
||||||
|
mem->sharedram = i.sharedram;
|
||||||
|
mem->bufferram = i.bufferram;
|
||||||
|
return 0;
|
||||||
|
case LIBGTOP_SWAP:
|
||||||
|
if (jiffies - libgtop_swap_timestamp < libgtop_update_expensive)
|
||||||
|
return 0;
|
||||||
|
libgtop_swap_timestamp = jiffies;
|
||||||
|
|
||||||
|
swap = table->data;
|
||||||
|
si_swapinfo (&i);
|
||||||
|
|
||||||
|
swap->totalswap = i.totalswap;
|
||||||
|
swap->freeswap = i.freeswap;
|
||||||
|
return 0;
|
||||||
|
case LIBGTOP_PROCLIST:
|
||||||
|
proclist = table->data;
|
||||||
|
|
||||||
|
if (nlen == 1) {
|
||||||
|
which = 0;
|
||||||
|
arg = 0;
|
||||||
|
} else if (nlen == 2) {
|
||||||
|
which = name [1];
|
||||||
|
arg = 0;
|
||||||
|
} else if (nlen == 3) {
|
||||||
|
which = name [1];
|
||||||
|
arg = name [2];
|
||||||
|
} else {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
tsk = task [0];
|
||||||
|
read_lock (&tasklist_lock);
|
||||||
|
for (index = tindex = 0; index < nr_tasks;
|
||||||
|
index++, tsk = tsk->next_task) {
|
||||||
|
if (tsk->pid == 0) continue;
|
||||||
|
switch (which & LIBGTOP_PROCLIST_MASK) {
|
||||||
|
case LIBGTOP_PROCLIST_PID:
|
||||||
|
if (tsk->pid != arg) continue;
|
||||||
|
break;
|
||||||
|
case LIBGTOP_PROCLIST_PGRP:
|
||||||
|
if (tsk->pgrp != arg) continue;
|
||||||
|
break;
|
||||||
|
case LIBGTOP_PROCLIST_SESSION:
|
||||||
|
if (tsk->session != arg) continue;
|
||||||
|
break;
|
||||||
|
case LIBGTOP_PROCLIST_TTY:
|
||||||
|
tty = tsk->tty ?
|
||||||
|
kdev_t_to_nr (tsk->tty->device) : 0;
|
||||||
|
if (tty != arg) continue;
|
||||||
|
break;
|
||||||
|
case LIBGTOP_PROCLIST_UID:
|
||||||
|
if (tsk->uid != arg) continue;
|
||||||
|
break;
|
||||||
|
case LIBGTOP_PROCLIST_RUID:
|
||||||
|
if (tsk->euid != arg) continue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((which & LIBGTOP_EXCLUDE_IDLE) && (tsk->state != 0))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((which & LIBGTOP_EXCLUDE_NOTTY) && (tsk->tty == NULL))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
proclist->pids [tindex++] = tsk->pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
proclist->nr_running = nr_running;
|
||||||
|
proclist->last_pid = last_pid;
|
||||||
|
proclist->nr_tasks = tindex;
|
||||||
|
read_unlock(&tasklist_lock);
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
system_ctl_handler (ctl_table *table, int *name, int nlen,
|
||||||
|
void *oldval, size_t *oldlenp, void *newval,
|
||||||
|
size_t newlen, void **context)
|
||||||
|
{
|
||||||
|
int ret, len, len_name;
|
||||||
|
|
||||||
|
if (!table->data || !table->maxlen)
|
||||||
|
return -ENOTDIR;
|
||||||
|
|
||||||
|
if (!oldval || !oldlenp || get_user(len, oldlenp))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (!name || !nlen || get_user(len_name, name))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (len != table->maxlen)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
ret = libgtop_sysctl (table, nlen, name);
|
||||||
|
if (ret) return ret;
|
||||||
|
|
||||||
|
if(copy_to_user(oldval, table->data, len))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
proc_ctl_handler (ctl_table *table, int *name, int nlen,
|
||||||
|
void *oldval, size_t *oldlenp, void *newval,
|
||||||
|
size_t newlen, void **context)
|
||||||
|
{
|
||||||
|
int ret, len;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
printk ("proc_ctl_handler: %p - %p - %d - (%p,%p) - (%p,%d) - %p\n",
|
||||||
|
table, name, nlen, oldval, oldlenp, newval, newlen, context);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!name || !nlen || get_user(len, name))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
printk ("FUNCTION: %d - %d - %p\n", table->ctl_name,
|
||||||
|
*name, table->de);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!table->data || !table->maxlen)
|
||||||
|
return -ENOTDIR;
|
||||||
|
|
||||||
|
if (!oldval || !oldlenp || get_user(len, oldlenp))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
if (len != table->maxlen)
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
82
kernel/sysctl/libgtop.h
Normal file
82
kernel/sysctl/libgtop.h
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#ifndef _LINUX_LIBGTOP_H
|
||||||
|
#define _LINUX_LIBGTOP_H 1
|
||||||
|
|
||||||
|
#include <linux/tasks.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
LIBGTOP_VERSION = 1,
|
||||||
|
LIBGTOP_PROC,
|
||||||
|
LIBGTOP_UPDATE_EXPENSIVE,
|
||||||
|
LIBGTOP_STAT,
|
||||||
|
LIBGTOP_MEM,
|
||||||
|
LIBGTOP_SWAP,
|
||||||
|
LIBGTOP_PROCLIST
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
LIBGTOP_PROCLIST_ALL = 0,
|
||||||
|
LIBGTOP_PROCLIST_PID,
|
||||||
|
LIBGTOP_PROCLIST_PGRP,
|
||||||
|
LIBGTOP_PROCLIST_SESSION,
|
||||||
|
LIBGTOP_PROCLIST_TTY,
|
||||||
|
LIBGTOP_PROCLIST_UID,
|
||||||
|
LIBGTOP_PROCLIST_RUID
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LIBGTOP_PROCLIST_MASK 15
|
||||||
|
|
||||||
|
#define LIBGTOP_EXCLUDE_IDLE 0x1000
|
||||||
|
#define LIBGTOP_EXCLUDE_SYSTEM 0x2000
|
||||||
|
#define LIBGTOP_EXCLUDE_NOTTY 0x4000
|
||||||
|
|
||||||
|
typedef struct libgtop_stat libgtop_stat_t;
|
||||||
|
|
||||||
|
typedef struct libgtop_cpu libgtop_cpu_t;
|
||||||
|
typedef struct libgtop_mem libgtop_mem_t;
|
||||||
|
typedef struct libgtop_swap libgtop_swap_t;
|
||||||
|
typedef struct libgtop_proclist libgtop_proclist_t;
|
||||||
|
|
||||||
|
struct libgtop_cpu
|
||||||
|
{
|
||||||
|
unsigned long total; /* Total CPU Time */
|
||||||
|
unsigned long user; /* CPU Time in User Mode */
|
||||||
|
unsigned long nice; /* CPU Time in User Mode (nice) */
|
||||||
|
unsigned long sys; /* CPU Time in System Mode */
|
||||||
|
unsigned long idle; /* CPU Time in the Idle Task */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct libgtop_mem
|
||||||
|
{
|
||||||
|
unsigned long totalram; /* Total usable main memory size */
|
||||||
|
unsigned long freeram; /* Available memory size */
|
||||||
|
unsigned long sharedram; /* Amount of shared memory */
|
||||||
|
unsigned long bufferram; /* Memory used by buffers */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct libgtop_swap
|
||||||
|
{
|
||||||
|
unsigned long totalswap; /* Total swap space size */
|
||||||
|
unsigned long freeswap; /* swap space still available */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct libgtop_proclist
|
||||||
|
{
|
||||||
|
int nr_running, nr_tasks, last_pid;
|
||||||
|
unsigned pids [NR_TASKS];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct libgtop_stat
|
||||||
|
{
|
||||||
|
int ncpu; /* Number of CPUs */
|
||||||
|
unsigned long frequency; /* Tick frequency (HZ) */
|
||||||
|
libgtop_cpu_t cpu; /* CPU statistics */
|
||||||
|
libgtop_cpu_t xcpu [NR_CPUS]; /* SMP per-CPU statistics */
|
||||||
|
double loadavg [3]; /* Load average */
|
||||||
|
unsigned long total_forks; /* Total # of forks */
|
||||||
|
unsigned int context_swtch; /* Total # of context switches */
|
||||||
|
unsigned long boot_time; /* Boot time (seconds s. epoch) */
|
||||||
|
unsigned int pgpgin, pgpgout; /* # of pages paged in/out */
|
||||||
|
unsigned int pswpin, pswpout; /* # of swap pgs brought in/out */
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
24
kernel/sysctl/libgtop_syms.c
Normal file
24
kernel/sysctl/libgtop_syms.c
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* linux/libgtop/libgtop_syms.c
|
||||||
|
* Copyright (C) 1999 Martin Baulig
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/config.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
#include <linux/sched.h>
|
||||||
|
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <linux/pagemap.h>
|
||||||
|
#include <linux/swap.h>
|
||||||
|
|
||||||
|
extern unsigned long total_forks;
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(task);
|
||||||
|
EXPORT_SYMBOL(avenrun);
|
||||||
|
EXPORT_SYMBOL(nr_running);
|
||||||
|
EXPORT_SYMBOL(nr_tasks);
|
||||||
|
EXPORT_SYMBOL(last_pid);
|
||||||
|
EXPORT_SYMBOL(total_forks);
|
||||||
|
EXPORT_SYMBOL(si_swapinfo);
|
||||||
|
|
4
kernel/sysctl/main.c
Normal file
4
kernel/sysctl/main.c
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
/*
|
||||||
|
* linux/libgtop/main.c
|
||||||
|
* Copyright (C) 1999 Martin Baulig
|
||||||
|
*/
|
81
kernel/sysctl/patch-2.2.1
Normal file
81
kernel/sysctl/patch-2.2.1
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
diff -ru linux-2.2.1/Makefile hacker/Makefile
|
||||||
|
--- linux-2.2.1/Makefile Sun Jan 31 22:45:42 1999
|
||||||
|
+++ hacker/Makefile Sun Mar 21 16:10:41 1999
|
||||||
|
@@ -109,6 +109,7 @@
|
||||||
|
DRIVERS =drivers/block/block.a \
|
||||||
|
drivers/char/char.a \
|
||||||
|
drivers/misc/misc.a
|
||||||
|
+EXTRAS =
|
||||||
|
LIBS =$(TOPDIR)/lib/lib.a
|
||||||
|
SUBDIRS =kernel drivers mm fs net ipc lib
|
||||||
|
|
||||||
|
@@ -186,6 +187,11 @@
|
||||||
|
DRIVERS := $(DRIVERS) drivers/net/irda/irda_drivers.a
|
||||||
|
endif
|
||||||
|
|
||||||
|
+ifdef CONFIG_LIBGTOP
|
||||||
|
+SUBDIRS := $(SUBDIRS) libgtop
|
||||||
|
+EXTRAS := $(EXTRAS) libgtop/kernel.o
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
include arch/$(ARCH)/Makefile
|
||||||
|
|
||||||
|
.S.s:
|
||||||
|
@@ -206,6 +212,7 @@
|
||||||
|
$(FILESYSTEMS) \
|
||||||
|
$(NETWORKS) \
|
||||||
|
$(DRIVERS) \
|
||||||
|
+ $(EXTRAS) \
|
||||||
|
$(LIBS) \
|
||||||
|
--end-group \
|
||||||
|
-o vmlinux
|
||||||
|
diff -ru linux-2.2.1/arch/i386/config.in hacker/arch/i386/config.in
|
||||||
|
--- linux-2.2.1/arch/i386/config.in Sun Jan 31 22:25:25 1999
|
||||||
|
+++ hacker/arch/i386/config.in Sat Mar 20 18:26:18 1999
|
||||||
|
@@ -84,6 +84,9 @@
|
||||||
|
bool 'System V IPC' CONFIG_SYSVIPC
|
||||||
|
bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
|
||||||
|
bool 'Sysctl support' CONFIG_SYSCTL
|
||||||
|
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
|
||||||
|
+ tristate 'LibGTop support' CONFIG_LIBGTOP
|
||||||
|
+fi
|
||||||
|
tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
|
||||||
|
tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
|
||||||
|
tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
|
||||||
|
diff -ru linux-2.2.1/include/linux/sysctl.h hacker/include/linux/sysctl.h
|
||||||
|
--- linux-2.2.1/include/linux/sysctl.h Sun Jan 31 22:24:14 1999
|
||||||
|
+++ hacker/include/linux/sysctl.h Sat Mar 20 19:12:54 1999
|
||||||
|
@@ -56,7 +56,8 @@
|
||||||
|
CTL_PROC=4, /* Process info */
|
||||||
|
CTL_FS=5, /* Filesystems */
|
||||||
|
CTL_DEBUG=6, /* Debugging */
|
||||||
|
- CTL_DEV=7 /* Devices */
|
||||||
|
+ CTL_DEV=7, /* Devices */
|
||||||
|
+ CTL_LIBGTOP=408 /* LibGTop */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
diff -ru linux-2.2.1/kernel/sysctl.c hacker/kernel/sysctl.c
|
||||||
|
--- linux-2.2.1/kernel/sysctl.c Sun Jan 31 22:24:43 1999
|
||||||
|
+++ hacker/kernel/sysctl.c Sat Mar 20 19:24:34 1999
|
||||||
|
@@ -82,7 +82,9 @@
|
||||||
|
static ctl_table fs_table[];
|
||||||
|
static ctl_table debug_table[];
|
||||||
|
static ctl_table dev_table[];
|
||||||
|
-
|
||||||
|
+#ifdef CONFIG_LIBGTOP
|
||||||
|
+extern ctl_table libgtop_table[];
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/* /proc declarations: */
|
||||||
|
|
||||||
|
@@ -148,6 +150,9 @@
|
||||||
|
{CTL_FS, "fs", NULL, 0, 0555, fs_table},
|
||||||
|
{CTL_DEBUG, "debug", NULL, 0, 0555, debug_table},
|
||||||
|
{CTL_DEV, "dev", NULL, 0, 0555, dev_table},
|
||||||
|
+#ifdef CONFIG_LIBGTOP
|
||||||
|
+ {CTL_LIBGTOP, "libgtop", NULL, 0, 0555, libgtop_table},
|
||||||
|
+#endif
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
188
kernel/table.h
188
kernel/table.h
@@ -1,188 +0,0 @@
|
|||||||
#ifndef _LINUX_TABLE_H
|
|
||||||
#define _LINUX_TABLE_H
|
|
||||||
|
|
||||||
#ifdef _KERNEL
|
|
||||||
#include <linux/types.h>
|
|
||||||
#else
|
|
||||||
#define NR_TASKS 512
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define TABLE_KERN_PROC_ALL 0 /* all processes */
|
|
||||||
#define TABLE_KERN_PROC_PID 1
|
|
||||||
#define TABLE_KERN_PROC_PGRP 2
|
|
||||||
#define TABLE_KERN_PROC_SESSION 3
|
|
||||||
#define TABLE_KERN_PROC_TTY 4
|
|
||||||
#define TABLE_KERN_PROC_UID 5
|
|
||||||
#define TABLE_KERN_PROC_RUID 6
|
|
||||||
|
|
||||||
#define TABLE_KERN_PROC_MASK 15
|
|
||||||
|
|
||||||
#define TABLE_EXCLUDE_IDLE 0x1000
|
|
||||||
#define TABLE_EXCLUDE_SYSTEM 0x2000
|
|
||||||
#define TABLE_EXCLUDE_NOTTY 0x4000
|
|
||||||
|
|
||||||
#define TABLE_VERSION 0
|
|
||||||
#define TABLE_CPU 1
|
|
||||||
#define TABLE_MEM 2
|
|
||||||
#define TABLE_SWAP 3
|
|
||||||
#define TABLE_LOADAVG 4
|
|
||||||
#define TABLE_UPTIME 5
|
|
||||||
#define TABLE_PROCLIST 6
|
|
||||||
#define TABLE_PROC_UID 7
|
|
||||||
#define TABLE_PROC_MEM 8
|
|
||||||
#define TABLE_PROC_SEGMENT 9
|
|
||||||
#define TABLE_PROC_TIME 10
|
|
||||||
#define TABLE_PROC_STATE 11
|
|
||||||
#define TABLE_PROC_SIGNAL 12
|
|
||||||
#define TABLE_PROC_KERNEL 13
|
|
||||||
|
|
||||||
/* CPU Usage (in jiffies = 1/100th seconds) */
|
|
||||||
|
|
||||||
struct table_cpu
|
|
||||||
{
|
|
||||||
unsigned long total; /* Total CPU Time */
|
|
||||||
unsigned long user; /* CPU Time in User Mode */
|
|
||||||
unsigned long nice; /* CPU Time in User Mode (nice) */
|
|
||||||
unsigned long sys; /* CPU Time in System Mode */
|
|
||||||
unsigned long idle; /* CPU Time in the Idle Task */
|
|
||||||
unsigned long frequency; /* Tick frequency */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Memory Usage (in bytes) */
|
|
||||||
|
|
||||||
struct table_mem
|
|
||||||
{
|
|
||||||
unsigned long total; /* Total physical memory */
|
|
||||||
unsigned long used; /* Used memory size */
|
|
||||||
unsigned long free; /* Free memory size */
|
|
||||||
unsigned long shared; /* Shared memory size */
|
|
||||||
unsigned long buffer; /* Size of buffers */
|
|
||||||
unsigned long cached; /* Size of cached memory */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Swap Space (in bytes) */
|
|
||||||
|
|
||||||
struct table_swap
|
|
||||||
{
|
|
||||||
unsigned long total; /* Total swap space */
|
|
||||||
unsigned long used; /* Used swap space */
|
|
||||||
unsigned long free; /* Free swap space */
|
|
||||||
unsigned long pagein; /* Total # of pages swapped in */
|
|
||||||
unsigned long pageout; /* Total # of pages swapped out */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Load average */
|
|
||||||
|
|
||||||
struct table_loadavg
|
|
||||||
{
|
|
||||||
double loadavg [3];
|
|
||||||
unsigned nr_running;
|
|
||||||
unsigned nr_tasks;
|
|
||||||
unsigned last_pid;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Uptime */
|
|
||||||
|
|
||||||
struct table_uptime
|
|
||||||
{
|
|
||||||
unsigned long uptime;
|
|
||||||
unsigned long idle;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Process list. */
|
|
||||||
|
|
||||||
struct proclist_args
|
|
||||||
{
|
|
||||||
int which, arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct table_proclist
|
|
||||||
{
|
|
||||||
int nr_running, nr_tasks, last_pid;
|
|
||||||
unsigned pids [NR_TASKS];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Information about processes. */
|
|
||||||
|
|
||||||
struct table_proc_state
|
|
||||||
{
|
|
||||||
long state;
|
|
||||||
unsigned long flags;
|
|
||||||
char comm[16];
|
|
||||||
int uid, gid;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct table_proc_uid
|
|
||||||
{
|
|
||||||
int uid, euid, suid, fsuid;
|
|
||||||
int gid, egid, sgid, fsgid;
|
|
||||||
int pid, pgrp, ppid;
|
|
||||||
int session;
|
|
||||||
unsigned int tty;
|
|
||||||
int tpgid;
|
|
||||||
long priority;
|
|
||||||
long counter;
|
|
||||||
long def_priority;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct table_proc_mem
|
|
||||||
{
|
|
||||||
unsigned long context;
|
|
||||||
unsigned long start_code, end_code, start_data, end_data;
|
|
||||||
unsigned long start_brk, brk, start_stack, start_mmap;
|
|
||||||
unsigned long arg_start, arg_end, env_start, env_end;
|
|
||||||
unsigned long rss, rlim, total_vm, locked_vm;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct table_proc_segment
|
|
||||||
{
|
|
||||||
unsigned long vsize;
|
|
||||||
unsigned long size, resident, shared;
|
|
||||||
unsigned long trs, lrs, drs, srs, dt;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct table_proc_time
|
|
||||||
{
|
|
||||||
long utime, stime, cutime, cstime, start_time;
|
|
||||||
unsigned long timeout, policy, rt_priority;
|
|
||||||
unsigned long it_real_value, it_prof_value, it_virt_value;
|
|
||||||
unsigned long it_real_incr, it_prof_incr, it_virt_incr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct table_proc_signal
|
|
||||||
{
|
|
||||||
unsigned long long signal,
|
|
||||||
blocked, /* bitmap of masked signals */
|
|
||||||
ignored, /* mask of ignored signals */
|
|
||||||
caught; /* mask of caught signals */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct table_proc_kernel
|
|
||||||
{
|
|
||||||
unsigned long keip, kesp, wchan;
|
|
||||||
unsigned long min_flt, maj_flt, cmin_flt, cmaj_flt;
|
|
||||||
unsigned long nswap, cnswap;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Union */
|
|
||||||
|
|
||||||
union table
|
|
||||||
{
|
|
||||||
struct table_cpu cpu;
|
|
||||||
struct table_mem mem;
|
|
||||||
struct table_swap swap;
|
|
||||||
struct table_loadavg loadavg;
|
|
||||||
struct table_uptime uptime;
|
|
||||||
struct table_proclist proclist;
|
|
||||||
struct table_proc_uid proc_uid;
|
|
||||||
struct table_proc_mem proc_mem;
|
|
||||||
struct table_proc_segment proc_segment;
|
|
||||||
struct table_proc_time proc_time;
|
|
||||||
struct table_proc_state proc_state;
|
|
||||||
struct table_proc_signal proc_signal;
|
|
||||||
struct table_proc_kernel proc_kernel;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* _LINUX_IPC_H */
|
|
||||||
|
|
||||||
|
|
@@ -1,21 +0,0 @@
|
|||||||
This is a new system call `table ()' for the Linux table. It is faster
|
|
||||||
than reading from /proc and can be used to fetch all information required
|
|
||||||
for libgtop until whe have some other function (extended sysctl, ...) in
|
|
||||||
standard kernels.
|
|
||||||
|
|
||||||
I didn't want to change sysctl or some other function myself cause this may
|
|
||||||
cause other applications relying upon those function to fail. This is
|
|
||||||
something for the ``real'' kernel gurus ...
|
|
||||||
|
|
||||||
To use this new system call for libgtop, do the following:
|
|
||||||
|
|
||||||
* Copy this directory to /usr/src/linux/table
|
|
||||||
* Make /usr/src/linux/include/linux/table.h symlink to /usr/src/linux/table/table.h
|
|
||||||
* Apply the patch `kernel.patch' to the kernel, compile, install and reboot
|
|
||||||
* Recompile libgtop (remove `config.cache' and run the `autogen.sh' again).
|
|
||||||
|
|
||||||
If you want to change and/or add something - feel free to do so !
|
|
||||||
|
|
||||||
Have fun,
|
|
||||||
|
|
||||||
Martin
|
|
@@ -1,706 +0,0 @@
|
|||||||
/*
|
|
||||||
* linux/arch/i386/entry.S
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* entry.S contains the system-call and fault low-level handling routines.
|
|
||||||
* This also contains the timer-interrupt handler, as well as all interrupts
|
|
||||||
* and faults that can result in a task-switch.
|
|
||||||
*
|
|
||||||
* NOTE: This code handles signal-recognition, which happens every time
|
|
||||||
* after a timer-interrupt and after each system call.
|
|
||||||
*
|
|
||||||
* I changed all the .align's to 4 (16 byte alignment), as that's faster
|
|
||||||
* on a 486.
|
|
||||||
*
|
|
||||||
* Stack layout in 'ret_from_system_call':
|
|
||||||
* ptrace needs to have all regs on the stack.
|
|
||||||
* if the order here is changed, it needs to be
|
|
||||||
* updated in fork.c:copy_process, signal.c:do_signal,
|
|
||||||
* ptrace.c and ptrace.h
|
|
||||||
*
|
|
||||||
* 0(%esp) - %ebx
|
|
||||||
* 4(%esp) - %ecx
|
|
||||||
* 8(%esp) - %edx
|
|
||||||
* C(%esp) - %esi
|
|
||||||
* 10(%esp) - %edi
|
|
||||||
* 14(%esp) - %ebp
|
|
||||||
* 18(%esp) - %eax
|
|
||||||
* 1C(%esp) - %ds
|
|
||||||
* 20(%esp) - %es
|
|
||||||
* 24(%esp) - %fs
|
|
||||||
* 28(%esp) - %gs
|
|
||||||
* 2C(%esp) - orig_eax
|
|
||||||
* 30(%esp) - %eip
|
|
||||||
* 34(%esp) - %cs
|
|
||||||
* 38(%esp) - %eflags
|
|
||||||
* 3C(%esp) - %oldesp
|
|
||||||
* 40(%esp) - %oldss
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/sys.h>
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
#include <asm/segment.h>
|
|
||||||
#define ASSEMBLY
|
|
||||||
#include <asm/smp.h>
|
|
||||||
|
|
||||||
EBX = 0x00
|
|
||||||
ECX = 0x04
|
|
||||||
EDX = 0x08
|
|
||||||
ESI = 0x0C
|
|
||||||
EDI = 0x10
|
|
||||||
EBP = 0x14
|
|
||||||
EAX = 0x18
|
|
||||||
DS = 0x1C
|
|
||||||
ES = 0x20
|
|
||||||
FS = 0x24
|
|
||||||
GS = 0x28
|
|
||||||
ORIG_EAX = 0x2C
|
|
||||||
EIP = 0x30
|
|
||||||
CS = 0x34
|
|
||||||
EFLAGS = 0x38
|
|
||||||
OLDESP = 0x3C
|
|
||||||
OLDSS = 0x40
|
|
||||||
|
|
||||||
CF_MASK = 0x00000001
|
|
||||||
IF_MASK = 0x00000200
|
|
||||||
NT_MASK = 0x00004000
|
|
||||||
VM_MASK = 0x00020000
|
|
||||||
|
|
||||||
/*
|
|
||||||
* these are offsets into the task-struct.
|
|
||||||
*/
|
|
||||||
state = 0
|
|
||||||
counter = 4
|
|
||||||
priority = 8
|
|
||||||
signal = 12
|
|
||||||
blocked = 16
|
|
||||||
flags = 20
|
|
||||||
dbgreg6 = 52
|
|
||||||
dbgreg7 = 56
|
|
||||||
exec_domain = 60
|
|
||||||
|
|
||||||
ENOSYS = 38
|
|
||||||
|
|
||||||
#define SAVE_ALL \
|
|
||||||
cld; \
|
|
||||||
push %gs; \
|
|
||||||
push %fs; \
|
|
||||||
push %es; \
|
|
||||||
push %ds; \
|
|
||||||
pushl %eax; \
|
|
||||||
pushl %ebp; \
|
|
||||||
pushl %edi; \
|
|
||||||
pushl %esi; \
|
|
||||||
pushl %edx; \
|
|
||||||
pushl %ecx; \
|
|
||||||
pushl %ebx; \
|
|
||||||
movl $(KERNEL_DS),%edx; \
|
|
||||||
mov %dx,%ds; \
|
|
||||||
mov %dx,%es; \
|
|
||||||
movl $(USER_DS),%edx; \
|
|
||||||
mov %dx,%fs;
|
|
||||||
|
|
||||||
#ifdef __SMP__
|
|
||||||
|
|
||||||
#define GET_PROCESSOR_ID \
|
|
||||||
movl SYMBOL_NAME(apic_reg), %edx; \
|
|
||||||
movl 32(%edx), %eax;\
|
|
||||||
movl %eax,SYMBOL_NAME(apic_retval); \
|
|
||||||
shrl $24,%eax; \
|
|
||||||
andb $0x0F,%al;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the processor ID multiplied by 4
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define GET_PROCESSOR_OFFSET(x) \
|
|
||||||
movl SYMBOL_NAME(apic_reg), x ; \
|
|
||||||
movl 32( x ), x ; \
|
|
||||||
shrl $22, x ; \
|
|
||||||
andl $0x3C, x ;
|
|
||||||
|
|
||||||
/* macro LEAVE_KERNEL decrements kernel_counter and resets kernel_flag and
|
|
||||||
saves processor variables if zero */
|
|
||||||
#define LEAVE_KERNEL \
|
|
||||||
pushfl; \
|
|
||||||
cli; \
|
|
||||||
GET_PROCESSOR_ID \
|
|
||||||
btrl $ SMP_FROM_SYSCALL,SYMBOL_NAME(smp_proc_in_lock)(,%eax,4); \
|
|
||||||
decl SYMBOL_NAME(syscall_count); \
|
|
||||||
decl SYMBOL_NAME(kernel_counter); \
|
|
||||||
jnz 1f; \
|
|
||||||
movb SYMBOL_NAME(saved_active_kernel_processor), %al; \
|
|
||||||
movb %al, SYMBOL_NAME(active_kernel_processor); \
|
|
||||||
cmpb $(NO_PROC_ID), %al; \
|
|
||||||
jnz 1f; \
|
|
||||||
lock; \
|
|
||||||
btrl $0, SYMBOL_NAME(kernel_flag); \
|
|
||||||
1: popfl;
|
|
||||||
|
|
||||||
/* macro ENTER_KERNEL waits for entering the kernel, increments
|
|
||||||
kernel_counter, and reloads the processor variables if necessary
|
|
||||||
uses : %eax, %edx (pushed and popped)
|
|
||||||
|
|
||||||
Note: We go to great pains to minimise the number of locked operations.
|
|
||||||
We want to spin without locking, and lock when we attempt an update.
|
|
||||||
The pentium has a MESI cache so the spin without lock will exit when
|
|
||||||
another CPU write invalidates our cache, and the lock is avoided when
|
|
||||||
possible so we don't play ping-pong games with the cache line.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SMP_PROF__
|
|
||||||
|
|
||||||
#define SMP_PROF_A
|
|
||||||
#define SMP_PROF_B
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define SMP_PROF_A movl $0,SYMBOL_NAME(smp_spins_syscall_cur)(,%eax,4);
|
|
||||||
#define SMP_PROF_B incl SYMBOL_NAME(smp_spins_syscall)(,%eax,4); \
|
|
||||||
incl SYMBOL_NAME(smp_spins_syscall_cur)(,%eax,4);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ENTER_KERNEL \
|
|
||||||
pushl %eax; \
|
|
||||||
pushl %ebx; \
|
|
||||||
pushl %ecx; \
|
|
||||||
pushl %edx; \
|
|
||||||
pushfl; \
|
|
||||||
cli; \
|
|
||||||
movl $6000, %ebx; \
|
|
||||||
movl SYMBOL_NAME(smp_loops_per_tick), %ecx; \
|
|
||||||
GET_PROCESSOR_ID \
|
|
||||||
btsl $ SMP_FROM_SYSCALL,SYMBOL_NAME(smp_proc_in_lock)(,%eax,4); \
|
|
||||||
SMP_PROF_A \
|
|
||||||
1: lock; \
|
|
||||||
btsl $0, SYMBOL_NAME(kernel_flag); \
|
|
||||||
jnc 3f; \
|
|
||||||
cmpb SYMBOL_NAME(active_kernel_processor), %al; \
|
|
||||||
je 4f; \
|
|
||||||
2: SMP_PROF_B \
|
|
||||||
btl %eax, SYMBOL_NAME(smp_invalidate_needed); \
|
|
||||||
jnc 5f; \
|
|
||||||
lock; \
|
|
||||||
btrl %eax, SYMBOL_NAME(smp_invalidate_needed); \
|
|
||||||
jnc 5f; \
|
|
||||||
movl %cr3,%edx; \
|
|
||||||
movl %edx,%cr3; \
|
|
||||||
5: sti; \
|
|
||||||
decl %ecx; \
|
|
||||||
cli; \
|
|
||||||
jne 7f; \
|
|
||||||
decl %ebx; \
|
|
||||||
jne 6f; \
|
|
||||||
call SYMBOL_NAME(non_irq_deadlock_detected); \
|
|
||||||
6: movl SYMBOL_NAME(smp_loops_per_tick), %ecx; \
|
|
||||||
cmpb SYMBOL_NAME(boot_cpu_id), %al; \
|
|
||||||
jne 7f; \
|
|
||||||
incl SYMBOL_NAME(jiffies); \
|
|
||||||
7: btl $0, SYMBOL_NAME(kernel_flag); \
|
|
||||||
jc 2b; \
|
|
||||||
jmp 1b; \
|
|
||||||
3: movb %al, SYMBOL_NAME(active_kernel_processor); \
|
|
||||||
4: incl SYMBOL_NAME(kernel_counter); \
|
|
||||||
incl SYMBOL_NAME(syscall_count); \
|
|
||||||
popfl; \
|
|
||||||
popl %edx; \
|
|
||||||
popl %ecx; \
|
|
||||||
popl %ebx; \
|
|
||||||
popl %eax;
|
|
||||||
|
|
||||||
|
|
||||||
#define RESTORE_ALL \
|
|
||||||
cmpw $(KERNEL_CS),CS(%esp); \
|
|
||||||
je 1f; \
|
|
||||||
GET_PROCESSOR_OFFSET(%edx) \
|
|
||||||
movl SYMBOL_NAME(current_set)(,%edx), %eax ; ; \
|
|
||||||
movl dbgreg7(%eax),%ebx; \
|
|
||||||
movl %ebx,%db7; \
|
|
||||||
1: LEAVE_KERNEL \
|
|
||||||
popl %ebx; \
|
|
||||||
popl %ecx; \
|
|
||||||
popl %edx; \
|
|
||||||
popl %esi; \
|
|
||||||
popl %edi; \
|
|
||||||
popl %ebp; \
|
|
||||||
popl %eax; \
|
|
||||||
pop %ds; \
|
|
||||||
pop %es; \
|
|
||||||
pop %fs; \
|
|
||||||
pop %gs; \
|
|
||||||
addl $4,%esp; \
|
|
||||||
iret
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define RESTORE_ALL \
|
|
||||||
cmpw $(KERNEL_CS),CS(%esp); \
|
|
||||||
je 1f; \
|
|
||||||
movl SYMBOL_NAME(current_set),%eax; \
|
|
||||||
movl dbgreg7(%eax),%ebx; \
|
|
||||||
movl %ebx,%db7; \
|
|
||||||
1: \
|
|
||||||
popl %ebx; \
|
|
||||||
popl %ecx; \
|
|
||||||
popl %edx; \
|
|
||||||
popl %esi; \
|
|
||||||
popl %edi; \
|
|
||||||
popl %ebp; \
|
|
||||||
popl %eax; \
|
|
||||||
pop %ds; \
|
|
||||||
pop %es; \
|
|
||||||
pop %fs; \
|
|
||||||
pop %gs; \
|
|
||||||
addl $4,%esp; \
|
|
||||||
iret
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ENTRY(lcall7)
|
|
||||||
pushfl # We get a different stack layout with call gates,
|
|
||||||
pushl %eax # which has to be cleaned up later..
|
|
||||||
SAVE_ALL
|
|
||||||
#ifdef __SMP__
|
|
||||||
ENTER_KERNEL
|
|
||||||
#endif
|
|
||||||
movl EIP(%esp),%eax # due to call gates, this is eflags, not eip..
|
|
||||||
movl CS(%esp),%edx # this is eip..
|
|
||||||
movl EFLAGS(%esp),%ecx # and this is cs..
|
|
||||||
movl %eax,EFLAGS(%esp) #
|
|
||||||
movl %edx,EIP(%esp) # Now we move them to their "normal" places
|
|
||||||
movl %ecx,CS(%esp) #
|
|
||||||
movl %esp,%eax
|
|
||||||
#ifdef __SMP__
|
|
||||||
GET_PROCESSOR_OFFSET(%edx) # Processor offset into edx
|
|
||||||
movl SYMBOL_NAME(current_set)(,%edx),%edx
|
|
||||||
#else
|
|
||||||
movl SYMBOL_NAME(current_set),%edx
|
|
||||||
#endif
|
|
||||||
pushl %eax
|
|
||||||
movl exec_domain(%edx),%edx # Get the execution domain
|
|
||||||
movl 4(%edx),%edx # Get the lcall7 handler for the domain
|
|
||||||
call *%edx
|
|
||||||
popl %eax
|
|
||||||
jmp ret_from_sys_call
|
|
||||||
|
|
||||||
ALIGN
|
|
||||||
handle_bottom_half:
|
|
||||||
incl SYMBOL_NAME(intr_count)
|
|
||||||
call SYMBOL_NAME(do_bottom_half)
|
|
||||||
decl SYMBOL_NAME(intr_count)
|
|
||||||
jmp 9f
|
|
||||||
ALIGN
|
|
||||||
reschedule:
|
|
||||||
pushl $ret_from_sys_call
|
|
||||||
jmp SYMBOL_NAME(schedule) # test
|
|
||||||
|
|
||||||
ENTRY(system_call)
|
|
||||||
pushl %eax # save orig_eax
|
|
||||||
SAVE_ALL
|
|
||||||
#ifdef __SMP__
|
|
||||||
ENTER_KERNEL
|
|
||||||
#endif
|
|
||||||
movl $-ENOSYS,EAX(%esp)
|
|
||||||
cmpl $(NR_syscalls),%eax
|
|
||||||
jae ret_from_sys_call
|
|
||||||
movl SYMBOL_NAME(sys_call_table)(,%eax,4),%eax
|
|
||||||
testl %eax,%eax
|
|
||||||
je ret_from_sys_call
|
|
||||||
#ifdef __SMP__
|
|
||||||
GET_PROCESSOR_OFFSET(%edx)
|
|
||||||
movl SYMBOL_NAME(current_set)(,%edx),%ebx
|
|
||||||
#else
|
|
||||||
movl SYMBOL_NAME(current_set),%ebx
|
|
||||||
#endif
|
|
||||||
andl $~CF_MASK,EFLAGS(%esp) # clear carry - assume no errors
|
|
||||||
movl %db6,%edx
|
|
||||||
movl %edx,dbgreg6(%ebx) # save current hardware debugging status
|
|
||||||
testb $0x20,flags(%ebx) # PF_TRACESYS
|
|
||||||
jne 1f
|
|
||||||
call *%eax
|
|
||||||
movl %eax,EAX(%esp) # save the return value
|
|
||||||
jmp ret_from_sys_call
|
|
||||||
ALIGN
|
|
||||||
1: call SYMBOL_NAME(syscall_trace)
|
|
||||||
movl ORIG_EAX(%esp),%eax
|
|
||||||
call SYMBOL_NAME(sys_call_table)(,%eax,4)
|
|
||||||
movl %eax,EAX(%esp) # save the return value
|
|
||||||
#ifdef __SMP__
|
|
||||||
GET_PROCESSOR_OFFSET(%eax)
|
|
||||||
movl SYMBOL_NAME(current_set)(,%eax),%eax
|
|
||||||
#else
|
|
||||||
movl SYMBOL_NAME(current_set),%eax
|
|
||||||
#endif
|
|
||||||
call SYMBOL_NAME(syscall_trace)
|
|
||||||
|
|
||||||
ALIGN
|
|
||||||
.globl ret_from_sys_call
|
|
||||||
ret_from_sys_call:
|
|
||||||
cmpl $0,SYMBOL_NAME(intr_count)
|
|
||||||
jne 2f
|
|
||||||
9: movl SYMBOL_NAME(bh_mask),%eax
|
|
||||||
andl SYMBOL_NAME(bh_active),%eax
|
|
||||||
jne handle_bottom_half
|
|
||||||
#ifdef __SMP__
|
|
||||||
cmpb $(NO_PROC_ID), SYMBOL_NAME(saved_active_kernel_processor)
|
|
||||||
jne 2f
|
|
||||||
#endif
|
|
||||||
movl EFLAGS(%esp),%eax # check VM86 flag: CS/SS are
|
|
||||||
testl $(VM_MASK),%eax # different then
|
|
||||||
jne 1f
|
|
||||||
cmpw $(KERNEL_CS),CS(%esp) # was old code segment supervisor ?
|
|
||||||
je 2f
|
|
||||||
1: sti
|
|
||||||
orl $(IF_MASK),%eax # these just try to make sure
|
|
||||||
andl $~NT_MASK,%eax # the program doesn't do anything
|
|
||||||
movl %eax,EFLAGS(%esp) # stupid
|
|
||||||
cmpl $0,SYMBOL_NAME(need_resched)
|
|
||||||
jne reschedule
|
|
||||||
#ifdef __SMP__
|
|
||||||
GET_PROCESSOR_OFFSET(%eax)
|
|
||||||
movl SYMBOL_NAME(current_set)(,%eax), %eax
|
|
||||||
#else
|
|
||||||
movl SYMBOL_NAME(current_set),%eax
|
|
||||||
#endif
|
|
||||||
cmpl SYMBOL_NAME(task),%eax # task[0] cannot have signals
|
|
||||||
je 2f
|
|
||||||
movl blocked(%eax),%ecx
|
|
||||||
movl %ecx,%ebx # save blocked in %ebx for signal handling
|
|
||||||
notl %ecx
|
|
||||||
andl signal(%eax),%ecx
|
|
||||||
jne signal_return
|
|
||||||
2: RESTORE_ALL
|
|
||||||
ALIGN
|
|
||||||
signal_return:
|
|
||||||
movl %esp,%ecx
|
|
||||||
pushl %ecx
|
|
||||||
testl $(VM_MASK),EFLAGS(%ecx)
|
|
||||||
jne v86_signal_return
|
|
||||||
pushl %ebx
|
|
||||||
call SYMBOL_NAME(do_signal)
|
|
||||||
popl %ebx
|
|
||||||
popl %ebx
|
|
||||||
RESTORE_ALL
|
|
||||||
ALIGN
|
|
||||||
v86_signal_return:
|
|
||||||
call SYMBOL_NAME(save_v86_state)
|
|
||||||
movl %eax,%esp
|
|
||||||
pushl %eax
|
|
||||||
pushl %ebx
|
|
||||||
call SYMBOL_NAME(do_signal)
|
|
||||||
popl %ebx
|
|
||||||
popl %ebx
|
|
||||||
RESTORE_ALL
|
|
||||||
|
|
||||||
ENTRY(divide_error)
|
|
||||||
pushl $0 # no error code
|
|
||||||
pushl $ SYMBOL_NAME(do_divide_error)
|
|
||||||
ALIGN
|
|
||||||
error_code:
|
|
||||||
push %fs
|
|
||||||
push %es
|
|
||||||
push %ds
|
|
||||||
pushl %eax
|
|
||||||
xorl %eax,%eax
|
|
||||||
pushl %ebp
|
|
||||||
pushl %edi
|
|
||||||
pushl %esi
|
|
||||||
pushl %edx
|
|
||||||
decl %eax # eax = -1
|
|
||||||
pushl %ecx
|
|
||||||
pushl %ebx
|
|
||||||
cld
|
|
||||||
xorl %ebx,%ebx # zero ebx
|
|
||||||
xchgl %eax, ORIG_EAX(%esp) # orig_eax (get the error code. )
|
|
||||||
mov %gs,%bx # get the lower order bits of gs
|
|
||||||
movl %esp,%edx
|
|
||||||
xchgl %ebx, GS(%esp) # get the address and save gs.
|
|
||||||
pushl %eax # push the error code
|
|
||||||
pushl %edx
|
|
||||||
movl $(KERNEL_DS),%edx
|
|
||||||
mov %dx,%ds
|
|
||||||
mov %dx,%es
|
|
||||||
movl $(USER_DS),%edx
|
|
||||||
mov %dx,%fs
|
|
||||||
#ifdef __SMP__
|
|
||||||
ENTER_KERNEL
|
|
||||||
GET_PROCESSOR_OFFSET(%eax)
|
|
||||||
movl SYMBOL_NAME(current_set)(,%eax), %eax
|
|
||||||
#else
|
|
||||||
movl SYMBOL_NAME(current_set),%eax
|
|
||||||
#endif
|
|
||||||
movl %db6,%edx
|
|
||||||
movl %edx,dbgreg6(%eax) # save current hardware debugging status
|
|
||||||
call *%ebx
|
|
||||||
addl $8,%esp
|
|
||||||
jmp ret_from_sys_call
|
|
||||||
|
|
||||||
ENTRY(coprocessor_error)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_coprocessor_error)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(device_not_available)
|
|
||||||
pushl $-1 # mark this as an int
|
|
||||||
SAVE_ALL
|
|
||||||
#ifdef __SMP__
|
|
||||||
ENTER_KERNEL
|
|
||||||
#endif
|
|
||||||
pushl $ret_from_sys_call
|
|
||||||
movl %cr0,%eax
|
|
||||||
testl $0x4,%eax # EM (math emulation bit)
|
|
||||||
je SYMBOL_NAME(math_state_restore)
|
|
||||||
pushl $0 # temporary storage for ORIG_EIP
|
|
||||||
call SYMBOL_NAME(math_emulate)
|
|
||||||
addl $4,%esp
|
|
||||||
ret
|
|
||||||
|
|
||||||
ENTRY(debug)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_debug)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(nmi)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_nmi)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(int3)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_int3)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(overflow)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_overflow)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(bounds)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_bounds)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(invalid_op)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_invalid_op)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(coprocessor_segment_overrun)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_coprocessor_segment_overrun)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(reserved)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_reserved)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(double_fault)
|
|
||||||
pushl $ SYMBOL_NAME(do_double_fault)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(invalid_TSS)
|
|
||||||
pushl $ SYMBOL_NAME(do_invalid_TSS)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(segment_not_present)
|
|
||||||
pushl $ SYMBOL_NAME(do_segment_not_present)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(stack_segment)
|
|
||||||
pushl $ SYMBOL_NAME(do_stack_segment)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(general_protection)
|
|
||||||
pushl $ SYMBOL_NAME(do_general_protection)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(alignment_check)
|
|
||||||
pushl $ SYMBOL_NAME(do_alignment_check)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(page_fault)
|
|
||||||
pushl $ SYMBOL_NAME(do_page_fault)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(spurious_interrupt_bug)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_spurious_interrupt_bug)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
.data
|
|
||||||
ENTRY(sys_call_table)
|
|
||||||
.long SYMBOL_NAME(sys_setup) /* 0 */
|
|
||||||
.long SYMBOL_NAME(sys_exit)
|
|
||||||
.long SYMBOL_NAME(sys_fork)
|
|
||||||
.long SYMBOL_NAME(sys_read)
|
|
||||||
.long SYMBOL_NAME(sys_write)
|
|
||||||
.long SYMBOL_NAME(sys_open) /* 5 */
|
|
||||||
.long SYMBOL_NAME(sys_close)
|
|
||||||
.long SYMBOL_NAME(sys_waitpid)
|
|
||||||
.long SYMBOL_NAME(sys_creat)
|
|
||||||
.long SYMBOL_NAME(sys_link)
|
|
||||||
.long SYMBOL_NAME(sys_unlink) /* 10 */
|
|
||||||
.long SYMBOL_NAME(sys_execve)
|
|
||||||
.long SYMBOL_NAME(sys_chdir)
|
|
||||||
.long SYMBOL_NAME(sys_time)
|
|
||||||
.long SYMBOL_NAME(sys_mknod)
|
|
||||||
.long SYMBOL_NAME(sys_chmod) /* 15 */
|
|
||||||
.long SYMBOL_NAME(sys_chown)
|
|
||||||
.long SYMBOL_NAME(sys_break)
|
|
||||||
.long SYMBOL_NAME(sys_stat)
|
|
||||||
.long SYMBOL_NAME(sys_lseek)
|
|
||||||
.long SYMBOL_NAME(sys_getpid) /* 20 */
|
|
||||||
.long SYMBOL_NAME(sys_mount)
|
|
||||||
.long SYMBOL_NAME(sys_umount)
|
|
||||||
.long SYMBOL_NAME(sys_setuid)
|
|
||||||
.long SYMBOL_NAME(sys_getuid)
|
|
||||||
.long SYMBOL_NAME(sys_stime) /* 25 */
|
|
||||||
.long SYMBOL_NAME(sys_ptrace)
|
|
||||||
.long SYMBOL_NAME(sys_alarm)
|
|
||||||
.long SYMBOL_NAME(sys_fstat)
|
|
||||||
.long SYMBOL_NAME(sys_pause)
|
|
||||||
.long SYMBOL_NAME(sys_utime) /* 30 */
|
|
||||||
.long SYMBOL_NAME(sys_stty)
|
|
||||||
.long SYMBOL_NAME(sys_gtty)
|
|
||||||
.long SYMBOL_NAME(sys_access)
|
|
||||||
.long SYMBOL_NAME(sys_nice)
|
|
||||||
.long SYMBOL_NAME(sys_ftime) /* 35 */
|
|
||||||
.long SYMBOL_NAME(sys_sync)
|
|
||||||
.long SYMBOL_NAME(sys_kill)
|
|
||||||
.long SYMBOL_NAME(sys_rename)
|
|
||||||
.long SYMBOL_NAME(sys_mkdir)
|
|
||||||
.long SYMBOL_NAME(sys_rmdir) /* 40 */
|
|
||||||
.long SYMBOL_NAME(sys_dup)
|
|
||||||
.long SYMBOL_NAME(sys_pipe)
|
|
||||||
.long SYMBOL_NAME(sys_times)
|
|
||||||
.long SYMBOL_NAME(sys_prof)
|
|
||||||
.long SYMBOL_NAME(sys_brk) /* 45 */
|
|
||||||
.long SYMBOL_NAME(sys_setgid)
|
|
||||||
.long SYMBOL_NAME(sys_getgid)
|
|
||||||
.long SYMBOL_NAME(sys_signal)
|
|
||||||
.long SYMBOL_NAME(sys_geteuid)
|
|
||||||
.long SYMBOL_NAME(sys_getegid) /* 50 */
|
|
||||||
.long SYMBOL_NAME(sys_acct)
|
|
||||||
.long SYMBOL_NAME(sys_phys)
|
|
||||||
.long SYMBOL_NAME(sys_lock)
|
|
||||||
.long SYMBOL_NAME(sys_ioctl)
|
|
||||||
.long SYMBOL_NAME(sys_fcntl) /* 55 */
|
|
||||||
.long SYMBOL_NAME(sys_mpx)
|
|
||||||
.long SYMBOL_NAME(sys_setpgid)
|
|
||||||
.long SYMBOL_NAME(sys_ulimit)
|
|
||||||
.long SYMBOL_NAME(sys_olduname)
|
|
||||||
.long SYMBOL_NAME(sys_umask) /* 60 */
|
|
||||||
.long SYMBOL_NAME(sys_chroot)
|
|
||||||
.long SYMBOL_NAME(sys_ustat)
|
|
||||||
.long SYMBOL_NAME(sys_dup2)
|
|
||||||
.long SYMBOL_NAME(sys_getppid)
|
|
||||||
.long SYMBOL_NAME(sys_getpgrp) /* 65 */
|
|
||||||
.long SYMBOL_NAME(sys_setsid)
|
|
||||||
.long SYMBOL_NAME(sys_sigaction)
|
|
||||||
.long SYMBOL_NAME(sys_sgetmask)
|
|
||||||
.long SYMBOL_NAME(sys_ssetmask)
|
|
||||||
.long SYMBOL_NAME(sys_setreuid) /* 70 */
|
|
||||||
.long SYMBOL_NAME(sys_setregid)
|
|
||||||
.long SYMBOL_NAME(sys_sigsuspend)
|
|
||||||
.long SYMBOL_NAME(sys_sigpending)
|
|
||||||
.long SYMBOL_NAME(sys_sethostname)
|
|
||||||
.long SYMBOL_NAME(sys_setrlimit) /* 75 */
|
|
||||||
.long SYMBOL_NAME(sys_getrlimit)
|
|
||||||
.long SYMBOL_NAME(sys_getrusage)
|
|
||||||
.long SYMBOL_NAME(sys_gettimeofday)
|
|
||||||
.long SYMBOL_NAME(sys_settimeofday)
|
|
||||||
.long SYMBOL_NAME(sys_getgroups) /* 80 */
|
|
||||||
.long SYMBOL_NAME(sys_setgroups)
|
|
||||||
.long SYMBOL_NAME(old_select)
|
|
||||||
.long SYMBOL_NAME(sys_symlink)
|
|
||||||
.long SYMBOL_NAME(sys_lstat)
|
|
||||||
.long SYMBOL_NAME(sys_readlink) /* 85 */
|
|
||||||
.long SYMBOL_NAME(sys_uselib)
|
|
||||||
.long SYMBOL_NAME(sys_swapon)
|
|
||||||
.long SYMBOL_NAME(sys_reboot)
|
|
||||||
.long SYMBOL_NAME(old_readdir)
|
|
||||||
.long SYMBOL_NAME(old_mmap) /* 90 */
|
|
||||||
.long SYMBOL_NAME(sys_munmap)
|
|
||||||
.long SYMBOL_NAME(sys_truncate)
|
|
||||||
.long SYMBOL_NAME(sys_ftruncate)
|
|
||||||
.long SYMBOL_NAME(sys_fchmod)
|
|
||||||
.long SYMBOL_NAME(sys_fchown) /* 95 */
|
|
||||||
.long SYMBOL_NAME(sys_getpriority)
|
|
||||||
.long SYMBOL_NAME(sys_setpriority)
|
|
||||||
.long SYMBOL_NAME(sys_profil)
|
|
||||||
.long SYMBOL_NAME(sys_statfs)
|
|
||||||
.long SYMBOL_NAME(sys_fstatfs) /* 100 */
|
|
||||||
.long SYMBOL_NAME(sys_ioperm)
|
|
||||||
.long SYMBOL_NAME(sys_socketcall)
|
|
||||||
.long SYMBOL_NAME(sys_syslog)
|
|
||||||
.long SYMBOL_NAME(sys_setitimer)
|
|
||||||
.long SYMBOL_NAME(sys_getitimer) /* 105 */
|
|
||||||
.long SYMBOL_NAME(sys_newstat)
|
|
||||||
.long SYMBOL_NAME(sys_newlstat)
|
|
||||||
.long SYMBOL_NAME(sys_newfstat)
|
|
||||||
.long SYMBOL_NAME(sys_uname)
|
|
||||||
.long SYMBOL_NAME(sys_iopl) /* 110 */
|
|
||||||
.long SYMBOL_NAME(sys_vhangup)
|
|
||||||
.long SYMBOL_NAME(sys_idle)
|
|
||||||
.long SYMBOL_NAME(sys_vm86old)
|
|
||||||
.long SYMBOL_NAME(sys_wait4)
|
|
||||||
.long SYMBOL_NAME(sys_swapoff) /* 115 */
|
|
||||||
.long SYMBOL_NAME(sys_sysinfo)
|
|
||||||
.long SYMBOL_NAME(sys_ipc)
|
|
||||||
.long SYMBOL_NAME(sys_fsync)
|
|
||||||
.long SYMBOL_NAME(sys_sigreturn)
|
|
||||||
.long SYMBOL_NAME(sys_clone) /* 120 */
|
|
||||||
.long SYMBOL_NAME(sys_setdomainname)
|
|
||||||
.long SYMBOL_NAME(sys_newuname)
|
|
||||||
.long SYMBOL_NAME(sys_modify_ldt)
|
|
||||||
.long SYMBOL_NAME(sys_adjtimex)
|
|
||||||
.long SYMBOL_NAME(sys_mprotect) /* 125 */
|
|
||||||
.long SYMBOL_NAME(sys_sigprocmask)
|
|
||||||
.long SYMBOL_NAME(sys_create_module)
|
|
||||||
.long SYMBOL_NAME(sys_init_module)
|
|
||||||
.long SYMBOL_NAME(sys_delete_module)
|
|
||||||
.long SYMBOL_NAME(sys_get_kernel_syms) /* 130 */
|
|
||||||
.long SYMBOL_NAME(sys_quotactl)
|
|
||||||
.long SYMBOL_NAME(sys_getpgid)
|
|
||||||
.long SYMBOL_NAME(sys_fchdir)
|
|
||||||
.long SYMBOL_NAME(sys_bdflush)
|
|
||||||
.long SYMBOL_NAME(sys_sysfs) /* 135 */
|
|
||||||
.long SYMBOL_NAME(sys_personality)
|
|
||||||
.long 0 /* for afs_syscall */
|
|
||||||
.long SYMBOL_NAME(sys_setfsuid)
|
|
||||||
.long SYMBOL_NAME(sys_setfsgid)
|
|
||||||
.long SYMBOL_NAME(sys_llseek) /* 140 */
|
|
||||||
.long SYMBOL_NAME(sys_getdents)
|
|
||||||
.long SYMBOL_NAME(sys_select)
|
|
||||||
.long SYMBOL_NAME(sys_flock)
|
|
||||||
.long SYMBOL_NAME(sys_msync)
|
|
||||||
.long SYMBOL_NAME(sys_readv) /* 145 */
|
|
||||||
.long SYMBOL_NAME(sys_writev)
|
|
||||||
.long SYMBOL_NAME(sys_getsid)
|
|
||||||
.long SYMBOL_NAME(sys_fdatasync)
|
|
||||||
.long SYMBOL_NAME(sys_sysctl)
|
|
||||||
.long SYMBOL_NAME(sys_mlock) /* 150 */
|
|
||||||
.long SYMBOL_NAME(sys_munlock)
|
|
||||||
.long SYMBOL_NAME(sys_mlockall)
|
|
||||||
.long SYMBOL_NAME(sys_munlockall)
|
|
||||||
.long SYMBOL_NAME(sys_sched_setparam)
|
|
||||||
.long SYMBOL_NAME(sys_sched_getparam) /* 155 */
|
|
||||||
.long SYMBOL_NAME(sys_sched_setscheduler)
|
|
||||||
.long SYMBOL_NAME(sys_sched_getscheduler)
|
|
||||||
.long SYMBOL_NAME(sys_sched_yield)
|
|
||||||
.long SYMBOL_NAME(sys_sched_get_priority_max)
|
|
||||||
.long SYMBOL_NAME(sys_sched_get_priority_min) /* 160 */
|
|
||||||
.long SYMBOL_NAME(sys_sched_rr_get_interval)
|
|
||||||
.long SYMBOL_NAME(sys_nanosleep)
|
|
||||||
.long SYMBOL_NAME(sys_mremap)
|
|
||||||
.long 0,0
|
|
||||||
.long SYMBOL_NAME(sys_vm86)
|
|
||||||
.long 0,0,0,0 /* 170 */
|
|
||||||
.long 0,0,0,0,0,0,0,0,0,0 /* 180 */
|
|
||||||
.long 0,0,0,0,0,0,0
|
|
||||||
.long SYMBOL_NAME(sys_table)
|
|
||||||
.space (NR_syscalls-188)*4
|
|
@@ -1,51 +0,0 @@
|
|||||||
diff -ur linux-2.0.32/Makefile linux-hacked/Makefile
|
|
||||||
--- linux-2.0.32/Makefile Fri Nov 7 19:51:05 1997
|
|
||||||
+++ linux-hacked/Makefile Thu Jun 11 20:41:12 1998
|
|
||||||
@@ -87,7 +87,7 @@
|
|
||||||
# standard CFLAGS
|
|
||||||
#
|
|
||||||
|
|
||||||
-CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strength-reduce
|
|
||||||
+CFLAGS = -Wall -Wstrict-prototypes -g -O2 -fomit-frame-pointer -fno-strength-reduce
|
|
||||||
|
|
||||||
ifdef CONFIG_CPP
|
|
||||||
CFLAGS := $(CFLAGS) -x c++
|
|
||||||
@@ -113,12 +113,12 @@
|
|
||||||
# Include the make variables (CC, etc...)
|
|
||||||
#
|
|
||||||
|
|
||||||
-ARCHIVES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o net/network.a
|
|
||||||
+ARCHIVES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o net/network.a table/table.o
|
|
||||||
FILESYSTEMS =fs/filesystems.a
|
|
||||||
DRIVERS =drivers/block/block.a \
|
|
||||||
drivers/char/char.a
|
|
||||||
LIBS =$(TOPDIR)/lib/lib.a
|
|
||||||
-SUBDIRS =kernel drivers mm fs net ipc lib
|
|
||||||
+SUBDIRS =kernel drivers mm fs net ipc lib table
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_ISDN),y)
|
|
||||||
DRIVERS := $(DRIVERS) drivers/isdn/isdn.a
|
|
||||||
diff -ur linux-2.0.32/arch/i386/kernel/entry.S linux-hacked/arch/i386/kernel/entry.S
|
|
||||||
--- linux-2.0.32/arch/i386/kernel/entry.S Tue Sep 16 23:42:45 1997
|
|
||||||
+++ linux-hacked/arch/i386/kernel/entry.S Thu Jun 11 21:37:20 1998
|
|
||||||
@@ -699,4 +699,8 @@
|
|
||||||
.long SYMBOL_NAME(sys_mremap)
|
|
||||||
.long 0,0
|
|
||||||
.long SYMBOL_NAME(sys_vm86)
|
|
||||||
- .space (NR_syscalls-166)*4
|
|
||||||
+ .long 0,0,0,0 /* 170 */
|
|
||||||
+ .long 0,0,0,0,0,0,0,0,0,0 /* 180 */
|
|
||||||
+ .long 0,0,0,0,0,0,0
|
|
||||||
+ .long SYMBOL_NAME(sys_table)
|
|
||||||
+ .space (NR_syscalls-188)*4
|
|
||||||
diff -ur linux-2.0.32/include/asm-i386/unistd.h linux-hacked/include/asm-i386/unistd.h
|
|
||||||
--- linux-2.0.32/include/asm-i386/unistd.h Fri Mar 22 07:34:02 1996
|
|
||||||
+++ linux-hacked/include/asm-i386/unistd.h Thu Jun 11 21:37:03 1998
|
|
||||||
@@ -169,6 +169,7 @@
|
|
||||||
#define __NR_sched_rr_get_interval 161
|
|
||||||
#define __NR_nanosleep 162
|
|
||||||
#define __NR_mremap 163
|
|
||||||
+#define __NR_table 188
|
|
||||||
|
|
||||||
/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
|
|
||||||
#define _syscall0(type,name) \
|
|
@@ -1,468 +0,0 @@
|
|||||||
/*
|
|
||||||
* linux/table/table_impl.c
|
|
||||||
* Copyright (C) 1998 Martin Baulig
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/errno.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/kernel_stat.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/user.h>
|
|
||||||
#include <linux/a.out.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include <linux/mman.h>
|
|
||||||
#include <linux/proc_fs.h>
|
|
||||||
#include <linux/ioport.h>
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/pagemap.h>
|
|
||||||
#include <linux/swap.h>
|
|
||||||
|
|
||||||
#include <asm/segment.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
#include <linux/table.h>
|
|
||||||
|
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
# define KSTK_EIP(tsk) (((unsigned long *)tsk->kernel_stack_page)[1019])
|
|
||||||
# define KSTK_ESP(tsk) (((unsigned long *)tsk->kernel_stack_page)[1022])
|
|
||||||
#elif defined(__alpha__)
|
|
||||||
/*
|
|
||||||
* See arch/alpha/kernel/ptrace.c for details.
|
|
||||||
*/
|
|
||||||
# define PT_REG(reg) (PAGE_SIZE - sizeof(struct pt_regs) \
|
|
||||||
+ (long)&((struct pt_regs *)0)->reg)
|
|
||||||
# define KSTK_EIP(tsk) (*(unsigned long *)(tsk->kernel_stack_page + PT_REG(pc)))
|
|
||||||
# define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->tss.usp)
|
|
||||||
#elif defined(__sparc__)
|
|
||||||
# define PT_REG(reg) (PAGE_SIZE - sizeof(struct pt_regs) \
|
|
||||||
+ (long)&((struct pt_regs *)0)->reg)
|
|
||||||
# define KSTK_EIP(tsk) (*(unsigned long *)(tsk->kernel_stack_page + PT_REG(pc)))
|
|
||||||
# define KSTK_ESP(tsk) (*(unsigned long *)(tsk->kernel_stack_page + PT_REG(u_regs[UREG_FP])))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct task_struct *
|
|
||||||
get_task (pid_t pid)
|
|
||||||
{
|
|
||||||
struct task_struct ** p;
|
|
||||||
|
|
||||||
p = task;
|
|
||||||
while (++p < task+NR_TASKS) {
|
|
||||||
if (*p && (*p)->pid == pid)
|
|
||||||
return *p;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void statm_pte_range(pmd_t * pmd, unsigned long address, unsigned long size,
|
|
||||||
int * pages, int * shared, int * dirty, int * total)
|
|
||||||
{
|
|
||||||
pte_t * pte;
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
if (pmd_none(*pmd))
|
|
||||||
return;
|
|
||||||
if (pmd_bad(*pmd)) {
|
|
||||||
printk("statm_pte_range: bad pmd (%08lx)\n", pmd_val(*pmd));
|
|
||||||
pmd_clear(pmd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pte = pte_offset(pmd, address);
|
|
||||||
address &= ~PMD_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PMD_SIZE)
|
|
||||||
end = PMD_SIZE;
|
|
||||||
do {
|
|
||||||
pte_t page = *pte;
|
|
||||||
|
|
||||||
address += PAGE_SIZE;
|
|
||||||
pte++;
|
|
||||||
if (pte_none(page))
|
|
||||||
continue;
|
|
||||||
++*total;
|
|
||||||
if (!pte_present(page))
|
|
||||||
continue;
|
|
||||||
++*pages;
|
|
||||||
if (pte_dirty(page))
|
|
||||||
++*dirty;
|
|
||||||
if (pte_page(page) >= high_memory)
|
|
||||||
continue;
|
|
||||||
if (mem_map[MAP_NR(pte_page(page))].count > 1)
|
|
||||||
++*shared;
|
|
||||||
} while (address < end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void statm_pmd_range(pgd_t * pgd, unsigned long address, unsigned long size,
|
|
||||||
int * pages, int * shared, int * dirty, int * total)
|
|
||||||
{
|
|
||||||
pmd_t * pmd;
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
if (pgd_none(*pgd))
|
|
||||||
return;
|
|
||||||
if (pgd_bad(*pgd)) {
|
|
||||||
printk("statm_pmd_range: bad pgd (%08lx)\n", pgd_val(*pgd));
|
|
||||||
pgd_clear(pgd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pmd = pmd_offset(pgd, address);
|
|
||||||
address &= ~PGDIR_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PGDIR_SIZE)
|
|
||||||
end = PGDIR_SIZE;
|
|
||||||
do {
|
|
||||||
statm_pte_range(pmd, address, end - address, pages, shared, dirty, total);
|
|
||||||
address = (address + PMD_SIZE) & PMD_MASK;
|
|
||||||
pmd++;
|
|
||||||
} while (address < end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void statm_pgd_range(pgd_t * pgd, unsigned long address, unsigned long end,
|
|
||||||
int * pages, int * shared, int * dirty, int * total)
|
|
||||||
{
|
|
||||||
while (address < end) {
|
|
||||||
statm_pmd_range(pgd, address, end - address, pages, shared, dirty, total);
|
|
||||||
address = (address + PGDIR_SIZE) & PGDIR_MASK;
|
|
||||||
pgd++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned long
|
|
||||||
get_wchan (struct task_struct *p)
|
|
||||||
{
|
|
||||||
if (!p || p == current || p->state == TASK_RUNNING)
|
|
||||||
return 0;
|
|
||||||
#if defined(__i386__)
|
|
||||||
{
|
|
||||||
unsigned long ebp, eip;
|
|
||||||
unsigned long stack_page;
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
stack_page = p->kernel_stack_page;
|
|
||||||
if (!stack_page)
|
|
||||||
return 0;
|
|
||||||
ebp = p->tss.ebp;
|
|
||||||
do {
|
|
||||||
if (ebp < stack_page || ebp >= 4092+stack_page)
|
|
||||||
return 0;
|
|
||||||
eip = *(unsigned long *) (ebp+4);
|
|
||||||
if (eip < (unsigned long) interruptible_sleep_on
|
|
||||||
|| eip >= (unsigned long) add_timer)
|
|
||||||
return eip;
|
|
||||||
ebp = *(unsigned long *) ebp;
|
|
||||||
} while (count++ < 16);
|
|
||||||
}
|
|
||||||
#elif defined(__alpha__)
|
|
||||||
/*
|
|
||||||
* This one depends on the frame size of schedule(). Do a
|
|
||||||
* "disass schedule" in gdb to find the frame size. Also, the
|
|
||||||
* code assumes that sleep_on() follows immediately after
|
|
||||||
* interruptible_sleep_on() and that add_timer() follows
|
|
||||||
* immediately after interruptible_sleep(). Ugly, isn't it?
|
|
||||||
* Maybe adding a wchan field to task_struct would be better,
|
|
||||||
* after all...
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
unsigned long schedule_frame;
|
|
||||||
unsigned long pc;
|
|
||||||
|
|
||||||
pc = thread_saved_pc(&p->tss);
|
|
||||||
if (pc >= (unsigned long) interruptible_sleep_on && pc < (unsigned long) add_timer) {
|
|
||||||
schedule_frame = ((unsigned long *)p->tss.ksp)[6];
|
|
||||||
return ((unsigned long *)schedule_frame)[12];
|
|
||||||
}
|
|
||||||
return pc;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage int
|
|
||||||
sys_table (int type, union table *buf, const void *param)
|
|
||||||
{
|
|
||||||
union table tbl;
|
|
||||||
struct sysinfo i;
|
|
||||||
struct task_struct *tsk = NULL;
|
|
||||||
struct ip_chain *chain;
|
|
||||||
struct ip_fwkernel *rule;
|
|
||||||
char devname [9];
|
|
||||||
int index, err;
|
|
||||||
pid_t pid;
|
|
||||||
|
|
||||||
if (type == TABLE_VERSION)
|
|
||||||
return _TABLE_VERSION;
|
|
||||||
|
|
||||||
if (!buf)
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
memset (&tbl, 0, sizeof (union table));
|
|
||||||
|
|
||||||
/* For TABLE_PROC_*, read pid and get task_struct */
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TABLE_PROC_UID:
|
|
||||||
case TABLE_PROC_MEM:
|
|
||||||
case TABLE_PROC_SEGMENT:
|
|
||||||
case TABLE_PROC_TIME:
|
|
||||||
case TABLE_PROC_STATE:
|
|
||||||
case TABLE_PROC_SIGNAL:
|
|
||||||
case TABLE_PROC_KERNEL:
|
|
||||||
err = verify_area (VERIFY_READ, param, sizeof (pid_t));
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
memcpy_fromfs (&pid, param, sizeof (pid_t));
|
|
||||||
|
|
||||||
tsk = get_task (pid);
|
|
||||||
if (tsk == NULL)
|
|
||||||
return -ESRCH;
|
|
||||||
break;
|
|
||||||
case TABLE_NETACCT:
|
|
||||||
err = verify_area (VERIFY_READ, param, 5);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
copy_from_user (devname, param, 5);
|
|
||||||
devname [5] = 0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Main function dispatcher */
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TABLE_PROCLIST:
|
|
||||||
tsk = task [0];
|
|
||||||
for (index = 0; index < nr_tasks; index++) {
|
|
||||||
tbl.proclist.pids [index] = tsk->pid;
|
|
||||||
tsk = tsk->next_task;
|
|
||||||
}
|
|
||||||
tbl.proclist.nr_running = nr_running;
|
|
||||||
tbl.proclist.nr_tasks = nr_tasks;
|
|
||||||
tbl.proclist.last_pid = last_pid;
|
|
||||||
break;
|
|
||||||
case TABLE_CPU:
|
|
||||||
tbl.cpu.total = jiffies;
|
|
||||||
tbl.cpu.user = kstat.cpu_user;
|
|
||||||
tbl.cpu.nice = kstat.cpu_nice;
|
|
||||||
tbl.cpu.sys = kstat.cpu_system;
|
|
||||||
tbl.cpu.idle = tbl.cpu.total -
|
|
||||||
(tbl.cpu.user + tbl.cpu.nice + tbl.cpu.sys);
|
|
||||||
tbl.cpu.frequency = HZ;
|
|
||||||
break;
|
|
||||||
case TABLE_MEM:
|
|
||||||
si_meminfo (&i);
|
|
||||||
tbl.mem.total = i.totalram;
|
|
||||||
tbl.mem.used = i.totalram - i.freeram;
|
|
||||||
tbl.mem.free = i.freeram;
|
|
||||||
tbl.mem.shared = i.sharedram;
|
|
||||||
tbl.mem.buffer = i.bufferram;
|
|
||||||
tbl.mem.cached = page_cache_size << PAGE_SHIFT;
|
|
||||||
break;
|
|
||||||
case TABLE_SWAP:
|
|
||||||
si_swapinfo (&i);
|
|
||||||
tbl.swap.total = i.totalswap;
|
|
||||||
tbl.swap.used = i.totalswap - i.freeswap;
|
|
||||||
tbl.swap.free = i.freeswap;
|
|
||||||
tbl.swap.pagein = kstat.pswpin;
|
|
||||||
tbl.swap.pageout = kstat.pswpout;
|
|
||||||
break;
|
|
||||||
case TABLE_LOADAVG:
|
|
||||||
tbl.loadavg.loadavg [0] = (double) avenrun [0] / (1 << FSHIFT);
|
|
||||||
tbl.loadavg.loadavg [1] = (double) avenrun [1] / (1 << FSHIFT);
|
|
||||||
tbl.loadavg.loadavg [2] = (double) avenrun [2] / (1 << FSHIFT);
|
|
||||||
tbl.loadavg.nr_running = nr_running;
|
|
||||||
tbl.loadavg.nr_tasks = nr_tasks;
|
|
||||||
tbl.loadavg.last_pid = last_pid;
|
|
||||||
break;
|
|
||||||
case TABLE_UPTIME:
|
|
||||||
tbl.uptime.uptime = jiffies;
|
|
||||||
tbl.uptime.idle = task[0]->utime + task[0]->stime;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_STATE:
|
|
||||||
tbl.proc_state.state = tsk->state;
|
|
||||||
tbl.proc_state.flags = tsk->flags;
|
|
||||||
memcpy (tbl.proc_state.comm, tsk->comm,
|
|
||||||
sizeof (tbl.proc_state.comm));
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_UID:
|
|
||||||
tbl.proc_uid.uid = tsk->uid;
|
|
||||||
tbl.proc_uid.euid = tsk->euid;
|
|
||||||
tbl.proc_uid.suid = tsk->suid;
|
|
||||||
tbl.proc_uid.fsuid = tsk->fsuid;
|
|
||||||
|
|
||||||
tbl.proc_uid.gid = tsk->gid;
|
|
||||||
tbl.proc_uid.egid = tsk->egid;
|
|
||||||
tbl.proc_uid.sgid = tsk->sgid;
|
|
||||||
tbl.proc_uid.fsgid = tsk->fsgid;
|
|
||||||
|
|
||||||
tbl.proc_uid.pid = tsk->pid;
|
|
||||||
tbl.proc_uid.pgrp = tsk->pgrp;
|
|
||||||
tbl.proc_uid.ppid = tsk->p_pptr->pid;
|
|
||||||
|
|
||||||
tbl.proc_uid.session = tsk->session;
|
|
||||||
tbl.proc_uid.tty = tsk->tty ?
|
|
||||||
kdev_t_to_nr (tsk->tty->device) : 0;
|
|
||||||
tbl.proc_uid.tpgid = tsk->tty ? tsk->tty->pgrp : -1;
|
|
||||||
|
|
||||||
tbl.proc_uid.priority = tsk->priority;
|
|
||||||
tbl.proc_uid.counter = tsk->counter;
|
|
||||||
tbl.proc_uid.def_priority = DEF_PRIORITY;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_SIGNAL:
|
|
||||||
tbl.proc_signal.signal = tsk->signal;
|
|
||||||
tbl.proc_signal.blocked = tsk->blocked;
|
|
||||||
|
|
||||||
if (tsk->sig) {
|
|
||||||
struct sigaction * action = tsk->sig->action;
|
|
||||||
unsigned long sig_ign = 0, sig_caught = 0;
|
|
||||||
unsigned long bit = 1;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 32; i++) {
|
|
||||||
switch((unsigned long) action->sa_handler) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
sig_ign |= bit;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
sig_caught |= bit;
|
|
||||||
}
|
|
||||||
bit <<= 1;
|
|
||||||
action++;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbl.proc_signal.ignored = sig_ign;
|
|
||||||
tbl.proc_signal.caught = sig_caught;
|
|
||||||
} else {
|
|
||||||
tbl.proc_signal.ignored = 0;
|
|
||||||
tbl.proc_signal.caught = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_MEM:
|
|
||||||
if (tsk->mm && tsk->mm != &init_mm) {
|
|
||||||
tbl.proc_mem.context = tsk->mm->context;
|
|
||||||
tbl.proc_mem.start_code = tsk->mm->start_code;
|
|
||||||
tbl.proc_mem.end_code = tsk->mm->end_code;
|
|
||||||
tbl.proc_mem.start_data = tsk->mm-> start_data;
|
|
||||||
tbl.proc_mem.end_data = tsk->mm->end_data;
|
|
||||||
tbl.proc_mem.start_brk = tsk->mm->start_brk;
|
|
||||||
tbl.proc_mem.brk = tsk->mm->brk;
|
|
||||||
tbl.proc_mem.start_stack = tsk->mm->start_stack;
|
|
||||||
tbl.proc_mem.start_mmap = tsk->mm->start_mmap;
|
|
||||||
tbl.proc_mem.arg_start = tsk->mm->arg_start;
|
|
||||||
tbl.proc_mem.arg_end = tsk->mm->arg_end;
|
|
||||||
tbl.proc_mem.env_start = tsk->mm->env_start;
|
|
||||||
tbl.proc_mem.env_end = tsk->mm->env_end;
|
|
||||||
tbl.proc_mem.rss = tsk->mm->rss;
|
|
||||||
tbl.proc_mem.total_vm = tsk->mm->total_vm;
|
|
||||||
tbl.proc_mem.locked_vm = tsk->mm->locked_vm;
|
|
||||||
}
|
|
||||||
tbl.proc_mem.rlim = tsk->rlim ?
|
|
||||||
tsk->rlim[RLIMIT_RSS].rlim_cur : 0;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_SEGMENT:
|
|
||||||
if (tsk->mm && tsk->mm != &init_mm) {
|
|
||||||
unsigned long vsize = 0;
|
|
||||||
int size = 0, resident = 0, share = 0;
|
|
||||||
int trs = 0, lrs = 0, drs = 0, dt = 0;
|
|
||||||
struct vm_area_struct * vma = tsk->mm->mmap;
|
|
||||||
|
|
||||||
while (vma) {
|
|
||||||
pgd_t *pgd = pgd_offset(tsk->mm, vma->vm_start);
|
|
||||||
int pages = 0, shared = 0, dirty = 0, total = 0;
|
|
||||||
|
|
||||||
vsize += vma->vm_end - vma->vm_start;
|
|
||||||
|
|
||||||
statm_pgd_range (pgd, vma->vm_start, vma->vm_end,
|
|
||||||
&pages, &shared, &dirty, &total);
|
|
||||||
resident += pages;
|
|
||||||
share += shared;
|
|
||||||
dt += dirty;
|
|
||||||
size += total;
|
|
||||||
if (vma->vm_flags & VM_EXECUTABLE)
|
|
||||||
trs += pages; /* text */
|
|
||||||
else if (vma->vm_flags & VM_GROWSDOWN)
|
|
||||||
drs += pages; /* stack */
|
|
||||||
else if (vma->vm_end > 0x60000000)
|
|
||||||
lrs += pages; /* library */
|
|
||||||
else
|
|
||||||
drs += pages;
|
|
||||||
vma = vma->vm_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbl.proc_segment.vsize = vsize;
|
|
||||||
tbl.proc_segment.size = size;
|
|
||||||
tbl.proc_segment.resident = resident;
|
|
||||||
tbl.proc_segment.shared = share;
|
|
||||||
tbl.proc_segment.trs = trs;
|
|
||||||
tbl.proc_segment.lrs = lrs;
|
|
||||||
tbl.proc_segment.dt = dt;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_TIME:
|
|
||||||
tbl.proc_time.utime = tsk->utime;
|
|
||||||
tbl.proc_time.stime = tsk->stime;
|
|
||||||
tbl.proc_time.cutime = tsk->cutime;
|
|
||||||
tbl.proc_time.cstime = tsk->cstime;
|
|
||||||
|
|
||||||
tbl.proc_time.start_time = tsk->start_time;
|
|
||||||
tbl.proc_time.timeout = tsk->timeout;
|
|
||||||
tbl.proc_time.policy = tsk->policy;
|
|
||||||
tbl.proc_time.rt_priority = tsk->rt_priority;
|
|
||||||
|
|
||||||
tbl.proc_time.it_real_value = tsk->it_real_value;
|
|
||||||
tbl.proc_time.it_prof_value = tsk->it_prof_value;
|
|
||||||
tbl.proc_time.it_virt_value = tsk->it_virt_value;
|
|
||||||
tbl.proc_time.it_real_incr = tsk->it_real_incr;
|
|
||||||
tbl.proc_time.it_prof_incr = tsk->it_prof_incr;
|
|
||||||
tbl.proc_time.it_virt_incr = tsk->it_virt_incr;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_KERNEL:
|
|
||||||
tbl.proc_kernel.min_flt = tsk->min_flt;
|
|
||||||
tbl.proc_kernel.cmin_flt = tsk->cmin_flt;
|
|
||||||
tbl.proc_kernel.maj_flt = tsk->maj_flt;
|
|
||||||
tbl.proc_kernel.cmaj_flt = tsk->cmaj_flt;
|
|
||||||
|
|
||||||
tbl.proc_kernel.kesp = tsk->kernel_stack_page ? KSTK_EIP(tsk) : 0;
|
|
||||||
tbl.proc_kernel.keip = tsk->kernel_stack_page ? KSTK_ESP(tsk) : 0;
|
|
||||||
|
|
||||||
tbl.proc_kernel.nswap = tsk->nswap;
|
|
||||||
tbl.proc_kernel.cnswap = tsk->cnswap;
|
|
||||||
|
|
||||||
tbl.proc_kernel.wchan = get_wchan (tsk);
|
|
||||||
break;
|
|
||||||
case TABLE_NETACCT:
|
|
||||||
for (chain = ip_fw_chains; chain; chain = chain->next) {
|
|
||||||
for (rule = chain->chain; rule; rule = rule->next) {
|
|
||||||
const char *name = rule->ipfw.fw_vianame;
|
|
||||||
int k;
|
|
||||||
|
|
||||||
if (name [0] && !strncmp (param, name, 5))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (k = 0; k < NUM_SLOTS; k++) {
|
|
||||||
tbl.netacct.packets +=
|
|
||||||
rule->counters[k].pcnt;
|
|
||||||
tbl.netacct.bytes +=
|
|
||||||
rule->counters[k].bcnt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = verify_area (VERIFY_WRITE, buf, sizeof (struct table));
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
memcpy_tofs (buf, &tbl, sizeof (union table));
|
|
||||||
return 0;
|
|
||||||
}
|
|
@@ -1,324 +0,0 @@
|
|||||||
#ifndef _ASM_I386_UNISTD_H_
|
|
||||||
#define _ASM_I386_UNISTD_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file contains the system call numbers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define __NR_setup 0 /* used only by init, to get system going */
|
|
||||||
#define __NR_exit 1
|
|
||||||
#define __NR_fork 2
|
|
||||||
#define __NR_read 3
|
|
||||||
#define __NR_write 4
|
|
||||||
#define __NR_open 5
|
|
||||||
#define __NR_close 6
|
|
||||||
#define __NR_waitpid 7
|
|
||||||
#define __NR_creat 8
|
|
||||||
#define __NR_link 9
|
|
||||||
#define __NR_unlink 10
|
|
||||||
#define __NR_execve 11
|
|
||||||
#define __NR_chdir 12
|
|
||||||
#define __NR_time 13
|
|
||||||
#define __NR_mknod 14
|
|
||||||
#define __NR_chmod 15
|
|
||||||
#define __NR_chown 16
|
|
||||||
#define __NR_break 17
|
|
||||||
#define __NR_oldstat 18
|
|
||||||
#define __NR_lseek 19
|
|
||||||
#define __NR_getpid 20
|
|
||||||
#define __NR_mount 21
|
|
||||||
#define __NR_umount 22
|
|
||||||
#define __NR_setuid 23
|
|
||||||
#define __NR_getuid 24
|
|
||||||
#define __NR_stime 25
|
|
||||||
#define __NR_ptrace 26
|
|
||||||
#define __NR_alarm 27
|
|
||||||
#define __NR_oldfstat 28
|
|
||||||
#define __NR_pause 29
|
|
||||||
#define __NR_utime 30
|
|
||||||
#define __NR_stty 31
|
|
||||||
#define __NR_gtty 32
|
|
||||||
#define __NR_access 33
|
|
||||||
#define __NR_nice 34
|
|
||||||
#define __NR_ftime 35
|
|
||||||
#define __NR_sync 36
|
|
||||||
#define __NR_kill 37
|
|
||||||
#define __NR_rename 38
|
|
||||||
#define __NR_mkdir 39
|
|
||||||
#define __NR_rmdir 40
|
|
||||||
#define __NR_dup 41
|
|
||||||
#define __NR_pipe 42
|
|
||||||
#define __NR_times 43
|
|
||||||
#define __NR_prof 44
|
|
||||||
#define __NR_brk 45
|
|
||||||
#define __NR_setgid 46
|
|
||||||
#define __NR_getgid 47
|
|
||||||
#define __NR_signal 48
|
|
||||||
#define __NR_geteuid 49
|
|
||||||
#define __NR_getegid 50
|
|
||||||
#define __NR_acct 51
|
|
||||||
#define __NR_phys 52
|
|
||||||
#define __NR_lock 53
|
|
||||||
#define __NR_ioctl 54
|
|
||||||
#define __NR_fcntl 55
|
|
||||||
#define __NR_mpx 56
|
|
||||||
#define __NR_setpgid 57
|
|
||||||
#define __NR_ulimit 58
|
|
||||||
#define __NR_oldolduname 59
|
|
||||||
#define __NR_umask 60
|
|
||||||
#define __NR_chroot 61
|
|
||||||
#define __NR_ustat 62
|
|
||||||
#define __NR_dup2 63
|
|
||||||
#define __NR_getppid 64
|
|
||||||
#define __NR_getpgrp 65
|
|
||||||
#define __NR_setsid 66
|
|
||||||
#define __NR_sigaction 67
|
|
||||||
#define __NR_sgetmask 68
|
|
||||||
#define __NR_ssetmask 69
|
|
||||||
#define __NR_setreuid 70
|
|
||||||
#define __NR_setregid 71
|
|
||||||
#define __NR_sigsuspend 72
|
|
||||||
#define __NR_sigpending 73
|
|
||||||
#define __NR_sethostname 74
|
|
||||||
#define __NR_setrlimit 75
|
|
||||||
#define __NR_getrlimit 76
|
|
||||||
#define __NR_getrusage 77
|
|
||||||
#define __NR_gettimeofday 78
|
|
||||||
#define __NR_settimeofday 79
|
|
||||||
#define __NR_getgroups 80
|
|
||||||
#define __NR_setgroups 81
|
|
||||||
#define __NR_select 82
|
|
||||||
#define __NR_symlink 83
|
|
||||||
#define __NR_oldlstat 84
|
|
||||||
#define __NR_readlink 85
|
|
||||||
#define __NR_uselib 86
|
|
||||||
#define __NR_swapon 87
|
|
||||||
#define __NR_reboot 88
|
|
||||||
#define __NR_readdir 89
|
|
||||||
#define __NR_mmap 90
|
|
||||||
#define __NR_munmap 91
|
|
||||||
#define __NR_truncate 92
|
|
||||||
#define __NR_ftruncate 93
|
|
||||||
#define __NR_fchmod 94
|
|
||||||
#define __NR_fchown 95
|
|
||||||
#define __NR_getpriority 96
|
|
||||||
#define __NR_setpriority 97
|
|
||||||
#define __NR_profil 98
|
|
||||||
#define __NR_statfs 99
|
|
||||||
#define __NR_fstatfs 100
|
|
||||||
#define __NR_ioperm 101
|
|
||||||
#define __NR_socketcall 102
|
|
||||||
#define __NR_syslog 103
|
|
||||||
#define __NR_setitimer 104
|
|
||||||
#define __NR_getitimer 105
|
|
||||||
#define __NR_stat 106
|
|
||||||
#define __NR_lstat 107
|
|
||||||
#define __NR_fstat 108
|
|
||||||
#define __NR_olduname 109
|
|
||||||
#define __NR_iopl 110
|
|
||||||
#define __NR_vhangup 111
|
|
||||||
#define __NR_idle 112
|
|
||||||
#define __NR_vm86 113
|
|
||||||
#define __NR_wait4 114
|
|
||||||
#define __NR_swapoff 115
|
|
||||||
#define __NR_sysinfo 116
|
|
||||||
#define __NR_ipc 117
|
|
||||||
#define __NR_fsync 118
|
|
||||||
#define __NR_sigreturn 119
|
|
||||||
#define __NR_clone 120
|
|
||||||
#define __NR_setdomainname 121
|
|
||||||
#define __NR_uname 122
|
|
||||||
#define __NR_modify_ldt 123
|
|
||||||
#define __NR_adjtimex 124
|
|
||||||
#define __NR_mprotect 125
|
|
||||||
#define __NR_sigprocmask 126
|
|
||||||
#define __NR_create_module 127
|
|
||||||
#define __NR_init_module 128
|
|
||||||
#define __NR_delete_module 129
|
|
||||||
#define __NR_get_kernel_syms 130
|
|
||||||
#define __NR_quotactl 131
|
|
||||||
#define __NR_getpgid 132
|
|
||||||
#define __NR_fchdir 133
|
|
||||||
#define __NR_bdflush 134
|
|
||||||
#define __NR_sysfs 135
|
|
||||||
#define __NR_personality 136
|
|
||||||
#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
|
||||||
#define __NR_setfsuid 138
|
|
||||||
#define __NR_setfsgid 139
|
|
||||||
#define __NR__llseek 140
|
|
||||||
#define __NR_getdents 141
|
|
||||||
#define __NR__newselect 142
|
|
||||||
#define __NR_flock 143
|
|
||||||
#define __NR_msync 144
|
|
||||||
#define __NR_readv 145
|
|
||||||
#define __NR_writev 146
|
|
||||||
#define __NR_getsid 147
|
|
||||||
#define __NR_fdatasync 148
|
|
||||||
#define __NR__sysctl 149
|
|
||||||
#define __NR_mlock 150
|
|
||||||
#define __NR_munlock 151
|
|
||||||
#define __NR_mlockall 152
|
|
||||||
#define __NR_munlockall 153
|
|
||||||
#define __NR_sched_setparam 154
|
|
||||||
#define __NR_sched_getparam 155
|
|
||||||
#define __NR_sched_setscheduler 156
|
|
||||||
#define __NR_sched_getscheduler 157
|
|
||||||
#define __NR_sched_yield 158
|
|
||||||
#define __NR_sched_get_priority_max 159
|
|
||||||
#define __NR_sched_get_priority_min 160
|
|
||||||
#define __NR_sched_rr_get_interval 161
|
|
||||||
#define __NR_nanosleep 162
|
|
||||||
#define __NR_mremap 163
|
|
||||||
#define __NR_table 188
|
|
||||||
|
|
||||||
/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
|
|
||||||
#define _syscall0(type,name) \
|
|
||||||
type name(void) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name)); \
|
|
||||||
if (__res >= 0) \
|
|
||||||
return (type) __res; \
|
|
||||||
errno = -__res; \
|
|
||||||
return -1; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall1(type,name,type1,arg1) \
|
|
||||||
type name(type1 arg1) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1))); \
|
|
||||||
if (__res >= 0) \
|
|
||||||
return (type) __res; \
|
|
||||||
errno = -__res; \
|
|
||||||
return -1; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall2(type,name,type1,arg1,type2,arg2) \
|
|
||||||
type name(type1 arg1,type2 arg2) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \
|
|
||||||
if (__res >= 0) \
|
|
||||||
return (type) __res; \
|
|
||||||
errno = -__res; \
|
|
||||||
return -1; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
|
|
||||||
type name(type1 arg1,type2 arg2,type3 arg3) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
|
|
||||||
"d" ((long)(arg3))); \
|
|
||||||
if (__res>=0) \
|
|
||||||
return (type) __res; \
|
|
||||||
errno=-__res; \
|
|
||||||
return -1; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
|
|
||||||
type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
|
|
||||||
"d" ((long)(arg3)),"S" ((long)(arg4))); \
|
|
||||||
if (__res>=0) \
|
|
||||||
return (type) __res; \
|
|
||||||
errno=-__res; \
|
|
||||||
return -1; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
|
|
||||||
type5,arg5) \
|
|
||||||
type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
|
|
||||||
"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \
|
|
||||||
if (__res>=0) \
|
|
||||||
return (type) __res; \
|
|
||||||
errno=-__res; \
|
|
||||||
return -1; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __KERNEL_SYSCALLS__
|
|
||||||
|
|
||||||
/*
|
|
||||||
* we need this inline - forking from kernel space will result
|
|
||||||
* in NO COPY ON WRITE (!!!), until an execve is executed. This
|
|
||||||
* is no problem, but for the stack. This is handled by not letting
|
|
||||||
* main() use the stack at all after fork(). Thus, no function
|
|
||||||
* calls - which means inline code for fork too, as otherwise we
|
|
||||||
* would use the stack upon exit from 'fork()'.
|
|
||||||
*
|
|
||||||
* Actually only pause and fork are needed inline, so that there
|
|
||||||
* won't be any messing with the stack from main(), but we define
|
|
||||||
* some others too.
|
|
||||||
*/
|
|
||||||
#define __NR__exit __NR_exit
|
|
||||||
static inline _syscall0(int,idle)
|
|
||||||
static inline _syscall0(int,fork)
|
|
||||||
static inline _syscall2(int,clone,unsigned long,flags,char *,esp)
|
|
||||||
static inline _syscall0(int,pause)
|
|
||||||
static inline _syscall0(int,setup)
|
|
||||||
static inline _syscall0(int,sync)
|
|
||||||
static inline _syscall0(pid_t,setsid)
|
|
||||||
static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count)
|
|
||||||
static inline _syscall1(int,dup,int,fd)
|
|
||||||
static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp)
|
|
||||||
static inline _syscall3(int,open,const char *,file,int,flag,int,mode)
|
|
||||||
static inline _syscall1(int,close,int,fd)
|
|
||||||
static inline _syscall1(int,_exit,int,exitcode)
|
|
||||||
static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options)
|
|
||||||
|
|
||||||
static inline pid_t wait(int * wait_stat)
|
|
||||||
{
|
|
||||||
return waitpid(-1,wait_stat,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the mechanism for creating a new kernel thread.
|
|
||||||
*
|
|
||||||
* NOTE! Only a kernel-only process(ie the swapper or direct descendants
|
|
||||||
* who haven't done an "execve()") should use this: it will work within
|
|
||||||
* a system call from a "real" process, but the process memory space will
|
|
||||||
* not be free'd until both the parent and the child have exited.
|
|
||||||
*/
|
|
||||||
static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
|
|
||||||
{
|
|
||||||
long retval;
|
|
||||||
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"movl %%esp,%%esi\n\t"
|
|
||||||
"int $0x80\n\t" /* Linux/i386 system call */
|
|
||||||
"cmpl %%esp,%%esi\n\t" /* child or parent? */
|
|
||||||
"je 1f\n\t" /* parent - jump */
|
|
||||||
"pushl %3\n\t" /* push argument */
|
|
||||||
"call *%4\n\t" /* call fn */
|
|
||||||
"movl %2,%0\n\t" /* exit */
|
|
||||||
"int $0x80\n"
|
|
||||||
"1:\t"
|
|
||||||
:"=a" (retval)
|
|
||||||
:"0" (__NR_clone), "i" (__NR_exit),
|
|
||||||
"r" (arg), "r" (fn),
|
|
||||||
"b" (flags | CLONE_VM)
|
|
||||||
:"si");
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ASM_I386_UNISTD_H_ */
|
|
@@ -1 +0,0 @@
|
|||||||
#define _TABLE_VERSION 1
|
|
@@ -1,4 +0,0 @@
|
|||||||
kernel.patch
|
|
||||||
.main.o.flags
|
|
||||||
.table.o.flags
|
|
||||||
.module.o.flags
|
|
@@ -1,16 +0,0 @@
|
|||||||
#
|
|
||||||
# Makefile for the linux system information tables.
|
|
||||||
#
|
|
||||||
# Note! Dependencies are done automagically by 'make dep', which also
|
|
||||||
# removes any old dependencies. DON'T put your own dependencies here
|
|
||||||
# unless it's something special (ie not a .c file).
|
|
||||||
#
|
|
||||||
# Note 2! The CFLAGS definition is now in the main makefile...
|
|
||||||
|
|
||||||
O_TARGET := table.o
|
|
||||||
OX_OBJS := main.o
|
|
||||||
|
|
||||||
M_TARGET := table_mod.o
|
|
||||||
MX_OBJS := module.o
|
|
||||||
|
|
||||||
include $(TOPDIR)/Rules.make
|
|
@@ -1,21 +0,0 @@
|
|||||||
This is a new system call `table ()' for the Linux table. It is faster
|
|
||||||
than reading from /proc and can be used to fetch all information required
|
|
||||||
for libgtop until whe have some other function (extended sysctl, ...) in
|
|
||||||
standard kernels.
|
|
||||||
|
|
||||||
I didn't want to change sysctl or some other function myself cause this may
|
|
||||||
cause other applications relying upon those function to fail. This is
|
|
||||||
something for the ``real'' kernel gurus ...
|
|
||||||
|
|
||||||
To use this new system call for libgtop, do the following:
|
|
||||||
|
|
||||||
* Copy this directory to /usr/src/linux/table
|
|
||||||
* Make /usr/src/linux/include/linux/table.h symlink to /usr/src/linux/table/table.h
|
|
||||||
* Apply the patch `kernel.patch' to the kernel, compile, install and reboot
|
|
||||||
* Recompile libgtop (remove `config.cache' and run the `autogen.sh' again).
|
|
||||||
|
|
||||||
If you want to change and/or add something - feel free to do so !
|
|
||||||
|
|
||||||
Have fun,
|
|
||||||
|
|
||||||
Martin
|
|
@@ -1,571 +0,0 @@
|
|||||||
/*
|
|
||||||
* linux/arch/i386/entry.S
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* entry.S contains the system-call and fault low-level handling routines.
|
|
||||||
* This also contains the timer-interrupt handler, as well as all interrupts
|
|
||||||
* and faults that can result in a task-switch.
|
|
||||||
*
|
|
||||||
* NOTE: This code handles signal-recognition, which happens every time
|
|
||||||
* after a timer-interrupt and after each system call.
|
|
||||||
*
|
|
||||||
* I changed all the .align's to 4 (16 byte alignment), as that's faster
|
|
||||||
* on a 486.
|
|
||||||
*
|
|
||||||
* Stack layout in 'ret_from_system_call':
|
|
||||||
* ptrace needs to have all regs on the stack.
|
|
||||||
* if the order here is changed, it needs to be
|
|
||||||
* updated in fork.c:copy_process, signal.c:do_signal,
|
|
||||||
* ptrace.c and ptrace.h
|
|
||||||
*
|
|
||||||
* 0(%esp) - %ebx
|
|
||||||
* 4(%esp) - %ecx
|
|
||||||
* 8(%esp) - %edx
|
|
||||||
* C(%esp) - %esi
|
|
||||||
* 10(%esp) - %edi
|
|
||||||
* 14(%esp) - %ebp
|
|
||||||
* 18(%esp) - %eax
|
|
||||||
* 1C(%esp) - %ds
|
|
||||||
* 20(%esp) - %es
|
|
||||||
* 24(%esp) - orig_eax
|
|
||||||
* 28(%esp) - %eip
|
|
||||||
* 2C(%esp) - %cs
|
|
||||||
* 30(%esp) - %eflags
|
|
||||||
* 34(%esp) - %oldesp
|
|
||||||
* 38(%esp) - %oldss
|
|
||||||
*
|
|
||||||
* "current" is in register %ebx during any slow entries.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/sys.h>
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
#include <asm/segment.h>
|
|
||||||
#define ASSEMBLY
|
|
||||||
#include <asm/smp.h>
|
|
||||||
|
|
||||||
EBX = 0x00
|
|
||||||
ECX = 0x04
|
|
||||||
EDX = 0x08
|
|
||||||
ESI = 0x0C
|
|
||||||
EDI = 0x10
|
|
||||||
EBP = 0x14
|
|
||||||
EAX = 0x18
|
|
||||||
DS = 0x1C
|
|
||||||
ES = 0x20
|
|
||||||
ORIG_EAX = 0x24
|
|
||||||
EIP = 0x28
|
|
||||||
CS = 0x2C
|
|
||||||
EFLAGS = 0x30
|
|
||||||
OLDESP = 0x34
|
|
||||||
OLDSS = 0x38
|
|
||||||
|
|
||||||
CF_MASK = 0x00000001
|
|
||||||
IF_MASK = 0x00000200
|
|
||||||
NT_MASK = 0x00004000
|
|
||||||
VM_MASK = 0x00020000
|
|
||||||
|
|
||||||
/*
|
|
||||||
* these are offsets into the task-struct.
|
|
||||||
*/
|
|
||||||
state = 0
|
|
||||||
flags = 4
|
|
||||||
sigpending = 8
|
|
||||||
addr_limit = 12
|
|
||||||
exec_domain = 16
|
|
||||||
need_resched = 20
|
|
||||||
|
|
||||||
ENOSYS = 38
|
|
||||||
|
|
||||||
|
|
||||||
#define SAVE_ALL \
|
|
||||||
cld; \
|
|
||||||
pushl %es; \
|
|
||||||
pushl %ds; \
|
|
||||||
pushl %eax; \
|
|
||||||
pushl %ebp; \
|
|
||||||
pushl %edi; \
|
|
||||||
pushl %esi; \
|
|
||||||
pushl %edx; \
|
|
||||||
pushl %ecx; \
|
|
||||||
pushl %ebx; \
|
|
||||||
movl $(__KERNEL_DS),%edx; \
|
|
||||||
movl %dx,%ds; \
|
|
||||||
movl %dx,%es;
|
|
||||||
|
|
||||||
#define RESTORE_ALL \
|
|
||||||
popl %ebx; \
|
|
||||||
popl %ecx; \
|
|
||||||
popl %edx; \
|
|
||||||
popl %esi; \
|
|
||||||
popl %edi; \
|
|
||||||
popl %ebp; \
|
|
||||||
popl %eax; \
|
|
||||||
1: popl %ds; \
|
|
||||||
2: popl %es; \
|
|
||||||
3: addl $4,%esp; \
|
|
||||||
iret; \
|
|
||||||
.section fixup,"ax"; \
|
|
||||||
4: pushl $0; \
|
|
||||||
popl %ds; \
|
|
||||||
jmp 2b; \
|
|
||||||
5: pushl $0; \
|
|
||||||
popl %es; \
|
|
||||||
jmp 3b; \
|
|
||||||
.previous; \
|
|
||||||
.section __ex_table,"a";\
|
|
||||||
.align 4; \
|
|
||||||
.long 1b,4b; \
|
|
||||||
.long 2b,5b; \
|
|
||||||
.previous
|
|
||||||
|
|
||||||
#define GET_CURRENT(reg) \
|
|
||||||
movl %esp, reg; \
|
|
||||||
andl $-8192, reg;
|
|
||||||
|
|
||||||
ENTRY(lcall7)
|
|
||||||
pushfl # We get a different stack layout with call gates,
|
|
||||||
pushl %eax # which has to be cleaned up later..
|
|
||||||
SAVE_ALL
|
|
||||||
movl EIP(%esp),%eax # due to call gates, this is eflags, not eip..
|
|
||||||
movl CS(%esp),%edx # this is eip..
|
|
||||||
movl EFLAGS(%esp),%ecx # and this is cs..
|
|
||||||
movl %eax,EFLAGS(%esp) #
|
|
||||||
movl %edx,EIP(%esp) # Now we move them to their "normal" places
|
|
||||||
movl %ecx,CS(%esp) #
|
|
||||||
movl %esp,%ebx
|
|
||||||
pushl %ebx
|
|
||||||
andl $-8192,%ebx # GET_CURRENT
|
|
||||||
movl exec_domain(%ebx),%edx # Get the execution domain
|
|
||||||
movl 4(%edx),%edx # Get the lcall7 handler for the domain
|
|
||||||
call *%edx
|
|
||||||
popl %eax
|
|
||||||
jmp ret_from_sys_call
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __SMP__
|
|
||||||
ALIGN
|
|
||||||
.globl ret_from_smpfork
|
|
||||||
ret_from_smpfork:
|
|
||||||
GET_CURRENT(%ebx)
|
|
||||||
btrl $0, SYMBOL_NAME(scheduler_lock)
|
|
||||||
jmp ret_from_sys_call
|
|
||||||
#endif /* __SMP__ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return to user mode is not as complex as all this looks,
|
|
||||||
* but we want the default path for a system call return to
|
|
||||||
* go as quickly as possible which is why some of this is
|
|
||||||
* less clear than it otherwise should be.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ENTRY(system_call)
|
|
||||||
pushl %eax # save orig_eax
|
|
||||||
SAVE_ALL
|
|
||||||
GET_CURRENT(%ebx)
|
|
||||||
cmpl $(NR_syscalls),%eax
|
|
||||||
jae badsys
|
|
||||||
testb $0x20,flags(%ebx) # PF_TRACESYS
|
|
||||||
jne tracesys
|
|
||||||
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
|
|
||||||
movl %eax,EAX(%esp) # save the return value
|
|
||||||
ALIGN
|
|
||||||
.globl ret_from_sys_call
|
|
||||||
.globl ret_from_intr
|
|
||||||
ret_from_sys_call:
|
|
||||||
movl SYMBOL_NAME(bh_mask),%eax
|
|
||||||
andl SYMBOL_NAME(bh_active),%eax
|
|
||||||
jne handle_bottom_half
|
|
||||||
ret_with_reschedule:
|
|
||||||
cmpl $0,need_resched(%ebx)
|
|
||||||
jne reschedule
|
|
||||||
cmpl $0,sigpending(%ebx)
|
|
||||||
jne signal_return
|
|
||||||
RESTORE_ALL
|
|
||||||
ALIGN
|
|
||||||
signal_return:
|
|
||||||
testl $(VM_MASK),EFLAGS(%esp)
|
|
||||||
pushl %esp
|
|
||||||
jne v86_signal_return
|
|
||||||
pushl $0
|
|
||||||
call SYMBOL_NAME(do_signal)
|
|
||||||
addl $8,%esp
|
|
||||||
RESTORE_ALL
|
|
||||||
ALIGN
|
|
||||||
v86_signal_return:
|
|
||||||
call SYMBOL_NAME(save_v86_state)
|
|
||||||
movl %eax,%esp
|
|
||||||
pushl %eax
|
|
||||||
pushl $0
|
|
||||||
call SYMBOL_NAME(do_signal)
|
|
||||||
addl $8,%esp
|
|
||||||
RESTORE_ALL
|
|
||||||
ALIGN
|
|
||||||
tracesys:
|
|
||||||
movl $-ENOSYS,EAX(%esp)
|
|
||||||
call SYMBOL_NAME(syscall_trace)
|
|
||||||
movl ORIG_EAX(%esp),%eax
|
|
||||||
call *SYMBOL_NAME(sys_call_table)(,%eax,4)
|
|
||||||
movl %eax,EAX(%esp) # save the return value
|
|
||||||
call SYMBOL_NAME(syscall_trace)
|
|
||||||
jmp ret_from_sys_call
|
|
||||||
badsys:
|
|
||||||
movl $-ENOSYS,EAX(%esp)
|
|
||||||
jmp ret_from_sys_call
|
|
||||||
|
|
||||||
ALIGN
|
|
||||||
ret_from_exception:
|
|
||||||
movl SYMBOL_NAME(bh_mask),%eax
|
|
||||||
andl SYMBOL_NAME(bh_active),%eax
|
|
||||||
jne handle_bottom_half
|
|
||||||
ALIGN
|
|
||||||
ret_from_intr:
|
|
||||||
GET_CURRENT(%ebx)
|
|
||||||
movl EFLAGS(%esp),%eax # mix EFLAGS and CS
|
|
||||||
movb CS(%esp),%al
|
|
||||||
testl $(VM_MASK | 3),%eax # return to VM86 mode or non-supervisor?
|
|
||||||
jne ret_with_reschedule
|
|
||||||
RESTORE_ALL
|
|
||||||
|
|
||||||
ALIGN
|
|
||||||
handle_bottom_half:
|
|
||||||
pushl $ret_from_intr
|
|
||||||
jmp SYMBOL_NAME(do_bottom_half)
|
|
||||||
|
|
||||||
ALIGN
|
|
||||||
reschedule:
|
|
||||||
pushl $ret_from_sys_call
|
|
||||||
jmp SYMBOL_NAME(schedule) # test
|
|
||||||
|
|
||||||
|
|
||||||
ENTRY(divide_error)
|
|
||||||
pushl $0 # no error code
|
|
||||||
pushl $ SYMBOL_NAME(do_divide_error)
|
|
||||||
ALIGN
|
|
||||||
error_code:
|
|
||||||
pushl %ds
|
|
||||||
pushl %eax
|
|
||||||
xorl %eax,%eax
|
|
||||||
pushl %ebp
|
|
||||||
pushl %edi
|
|
||||||
pushl %esi
|
|
||||||
pushl %edx
|
|
||||||
decl %eax # eax = -1
|
|
||||||
pushl %ecx
|
|
||||||
pushl %ebx
|
|
||||||
#if 1
|
|
||||||
xorl %ecx,%ecx # zero ecx
|
|
||||||
cld
|
|
||||||
mov %es,%cx # get the lower order bits of es
|
|
||||||
#else
|
|
||||||
cld
|
|
||||||
# Some older processors leave the top 16 bits of the 32 bit destination
|
|
||||||
# register undefined, rather than zeroed in the following instruction.
|
|
||||||
# This won't matter when restoring or loading a segment register from the
|
|
||||||
# stack. It may be a problem if any code reads the full 32 bit value.
|
|
||||||
# dosemu? kernel? Would somebody like to verify that this way is really OK?
|
|
||||||
movl %es,%cx
|
|
||||||
#endif
|
|
||||||
xchgl %eax, ORIG_EAX(%esp) # orig_eax (get the error code. )
|
|
||||||
movl %esp,%edx
|
|
||||||
xchgl %ecx, ES(%esp) # get the address and save es.
|
|
||||||
pushl %eax # push the error code
|
|
||||||
pushl %edx
|
|
||||||
movl $(__KERNEL_DS),%edx
|
|
||||||
movl %dx,%ds
|
|
||||||
movl %dx,%es
|
|
||||||
GET_CURRENT(%ebx)
|
|
||||||
call *%ecx
|
|
||||||
addl $8,%esp
|
|
||||||
jmp ret_from_exception
|
|
||||||
|
|
||||||
ENTRY(coprocessor_error)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_coprocessor_error)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(device_not_available)
|
|
||||||
pushl $-1 # mark this as an int
|
|
||||||
SAVE_ALL
|
|
||||||
GET_CURRENT(%ebx)
|
|
||||||
pushl $ret_from_exception
|
|
||||||
movl %cr0,%eax
|
|
||||||
testl $0x4,%eax # EM (math emulation bit)
|
|
||||||
je SYMBOL_NAME(math_state_restore)
|
|
||||||
pushl $0 # temporary storage for ORIG_EIP
|
|
||||||
call SYMBOL_NAME(math_emulate)
|
|
||||||
addl $4,%esp
|
|
||||||
ret
|
|
||||||
|
|
||||||
ENTRY(debug)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_debug)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(nmi)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_nmi)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(int3)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_int3)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(overflow)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_overflow)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(bounds)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_bounds)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(invalid_op)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_invalid_op)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(coprocessor_segment_overrun)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_coprocessor_segment_overrun)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(reserved)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_reserved)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(double_fault)
|
|
||||||
pushl $ SYMBOL_NAME(do_double_fault)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(invalid_TSS)
|
|
||||||
pushl $ SYMBOL_NAME(do_invalid_TSS)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(segment_not_present)
|
|
||||||
pushl $ SYMBOL_NAME(do_segment_not_present)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(stack_segment)
|
|
||||||
pushl $ SYMBOL_NAME(do_stack_segment)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(general_protection)
|
|
||||||
pushl $ SYMBOL_NAME(do_general_protection)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(alignment_check)
|
|
||||||
pushl $ SYMBOL_NAME(do_alignment_check)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(page_fault)
|
|
||||||
pushl $ SYMBOL_NAME(do_page_fault)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
ENTRY(spurious_interrupt_bug)
|
|
||||||
pushl $0
|
|
||||||
pushl $ SYMBOL_NAME(do_spurious_interrupt_bug)
|
|
||||||
jmp error_code
|
|
||||||
|
|
||||||
.data
|
|
||||||
ENTRY(sys_call_table)
|
|
||||||
.long SYMBOL_NAME(sys_setup) /* 0 */
|
|
||||||
.long SYMBOL_NAME(sys_exit)
|
|
||||||
.long SYMBOL_NAME(sys_fork)
|
|
||||||
.long SYMBOL_NAME(sys_read)
|
|
||||||
.long SYMBOL_NAME(sys_write)
|
|
||||||
.long SYMBOL_NAME(sys_open) /* 5 */
|
|
||||||
.long SYMBOL_NAME(sys_close)
|
|
||||||
.long SYMBOL_NAME(sys_waitpid)
|
|
||||||
.long SYMBOL_NAME(sys_creat)
|
|
||||||
.long SYMBOL_NAME(sys_link)
|
|
||||||
.long SYMBOL_NAME(sys_unlink) /* 10 */
|
|
||||||
.long SYMBOL_NAME(sys_execve)
|
|
||||||
.long SYMBOL_NAME(sys_chdir)
|
|
||||||
.long SYMBOL_NAME(sys_time)
|
|
||||||
.long SYMBOL_NAME(sys_mknod)
|
|
||||||
.long SYMBOL_NAME(sys_chmod) /* 15 */
|
|
||||||
.long SYMBOL_NAME(sys_lchown)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old break syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_stat)
|
|
||||||
.long SYMBOL_NAME(sys_lseek)
|
|
||||||
.long SYMBOL_NAME(sys_getpid) /* 20 */
|
|
||||||
.long SYMBOL_NAME(sys_mount)
|
|
||||||
.long SYMBOL_NAME(sys_umount)
|
|
||||||
.long SYMBOL_NAME(sys_setuid)
|
|
||||||
.long SYMBOL_NAME(sys_getuid)
|
|
||||||
.long SYMBOL_NAME(sys_stime) /* 25 */
|
|
||||||
.long SYMBOL_NAME(sys_ptrace)
|
|
||||||
.long SYMBOL_NAME(sys_alarm)
|
|
||||||
.long SYMBOL_NAME(sys_fstat)
|
|
||||||
.long SYMBOL_NAME(sys_pause)
|
|
||||||
.long SYMBOL_NAME(sys_utime) /* 30 */
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old stty syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old gtty syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_access)
|
|
||||||
.long SYMBOL_NAME(sys_nice)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* 35 */ /* old ftime syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_sync)
|
|
||||||
.long SYMBOL_NAME(sys_kill)
|
|
||||||
.long SYMBOL_NAME(sys_rename)
|
|
||||||
.long SYMBOL_NAME(sys_mkdir)
|
|
||||||
.long SYMBOL_NAME(sys_rmdir) /* 40 */
|
|
||||||
.long SYMBOL_NAME(sys_dup)
|
|
||||||
.long SYMBOL_NAME(sys_pipe)
|
|
||||||
.long SYMBOL_NAME(sys_times)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old prof syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_brk) /* 45 */
|
|
||||||
.long SYMBOL_NAME(sys_setgid)
|
|
||||||
.long SYMBOL_NAME(sys_getgid)
|
|
||||||
.long SYMBOL_NAME(sys_signal)
|
|
||||||
.long SYMBOL_NAME(sys_geteuid)
|
|
||||||
.long SYMBOL_NAME(sys_getegid) /* 50 */
|
|
||||||
.long SYMBOL_NAME(sys_acct)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old phys syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old lock syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_ioctl)
|
|
||||||
.long SYMBOL_NAME(sys_fcntl) /* 55 */
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old mpx syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_setpgid)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old ulimit syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_olduname)
|
|
||||||
.long SYMBOL_NAME(sys_umask) /* 60 */
|
|
||||||
.long SYMBOL_NAME(sys_chroot)
|
|
||||||
.long SYMBOL_NAME(sys_ustat)
|
|
||||||
.long SYMBOL_NAME(sys_dup2)
|
|
||||||
.long SYMBOL_NAME(sys_getppid)
|
|
||||||
.long SYMBOL_NAME(sys_getpgrp) /* 65 */
|
|
||||||
.long SYMBOL_NAME(sys_setsid)
|
|
||||||
.long SYMBOL_NAME(sys_sigaction)
|
|
||||||
.long SYMBOL_NAME(sys_sgetmask)
|
|
||||||
.long SYMBOL_NAME(sys_ssetmask)
|
|
||||||
.long SYMBOL_NAME(sys_setreuid) /* 70 */
|
|
||||||
.long SYMBOL_NAME(sys_setregid)
|
|
||||||
.long SYMBOL_NAME(sys_sigsuspend)
|
|
||||||
.long SYMBOL_NAME(sys_sigpending)
|
|
||||||
.long SYMBOL_NAME(sys_sethostname)
|
|
||||||
.long SYMBOL_NAME(sys_setrlimit) /* 75 */
|
|
||||||
.long SYMBOL_NAME(sys_getrlimit)
|
|
||||||
.long SYMBOL_NAME(sys_getrusage)
|
|
||||||
.long SYMBOL_NAME(sys_gettimeofday)
|
|
||||||
.long SYMBOL_NAME(sys_settimeofday)
|
|
||||||
.long SYMBOL_NAME(sys_getgroups) /* 80 */
|
|
||||||
.long SYMBOL_NAME(sys_setgroups)
|
|
||||||
.long SYMBOL_NAME(old_select)
|
|
||||||
.long SYMBOL_NAME(sys_symlink)
|
|
||||||
.long SYMBOL_NAME(sys_lstat)
|
|
||||||
.long SYMBOL_NAME(sys_readlink) /* 85 */
|
|
||||||
.long SYMBOL_NAME(sys_uselib)
|
|
||||||
.long SYMBOL_NAME(sys_swapon)
|
|
||||||
.long SYMBOL_NAME(sys_reboot)
|
|
||||||
.long SYMBOL_NAME(old_readdir)
|
|
||||||
.long SYMBOL_NAME(old_mmap) /* 90 */
|
|
||||||
.long SYMBOL_NAME(sys_munmap)
|
|
||||||
.long SYMBOL_NAME(sys_truncate)
|
|
||||||
.long SYMBOL_NAME(sys_ftruncate)
|
|
||||||
.long SYMBOL_NAME(sys_fchmod)
|
|
||||||
.long SYMBOL_NAME(sys_fchown) /* 95 */
|
|
||||||
.long SYMBOL_NAME(sys_getpriority)
|
|
||||||
.long SYMBOL_NAME(sys_setpriority)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* old profil syscall holder */
|
|
||||||
.long SYMBOL_NAME(sys_statfs)
|
|
||||||
.long SYMBOL_NAME(sys_fstatfs) /* 100 */
|
|
||||||
.long SYMBOL_NAME(sys_ioperm)
|
|
||||||
.long SYMBOL_NAME(sys_socketcall)
|
|
||||||
.long SYMBOL_NAME(sys_syslog)
|
|
||||||
.long SYMBOL_NAME(sys_setitimer)
|
|
||||||
.long SYMBOL_NAME(sys_getitimer) /* 105 */
|
|
||||||
.long SYMBOL_NAME(sys_newstat)
|
|
||||||
.long SYMBOL_NAME(sys_newlstat)
|
|
||||||
.long SYMBOL_NAME(sys_newfstat)
|
|
||||||
.long SYMBOL_NAME(sys_uname)
|
|
||||||
.long SYMBOL_NAME(sys_iopl) /* 110 */
|
|
||||||
.long SYMBOL_NAME(sys_vhangup)
|
|
||||||
.long SYMBOL_NAME(sys_idle)
|
|
||||||
.long SYMBOL_NAME(sys_vm86old)
|
|
||||||
.long SYMBOL_NAME(sys_wait4)
|
|
||||||
.long SYMBOL_NAME(sys_swapoff) /* 115 */
|
|
||||||
.long SYMBOL_NAME(sys_sysinfo)
|
|
||||||
.long SYMBOL_NAME(sys_ipc)
|
|
||||||
.long SYMBOL_NAME(sys_fsync)
|
|
||||||
.long SYMBOL_NAME(sys_sigreturn)
|
|
||||||
.long SYMBOL_NAME(sys_clone) /* 120 */
|
|
||||||
.long SYMBOL_NAME(sys_setdomainname)
|
|
||||||
.long SYMBOL_NAME(sys_newuname)
|
|
||||||
.long SYMBOL_NAME(sys_modify_ldt)
|
|
||||||
.long SYMBOL_NAME(sys_adjtimex)
|
|
||||||
.long SYMBOL_NAME(sys_mprotect) /* 125 */
|
|
||||||
.long SYMBOL_NAME(sys_sigprocmask)
|
|
||||||
.long SYMBOL_NAME(sys_create_module)
|
|
||||||
.long SYMBOL_NAME(sys_init_module)
|
|
||||||
.long SYMBOL_NAME(sys_delete_module)
|
|
||||||
.long SYMBOL_NAME(sys_get_kernel_syms) /* 130 */
|
|
||||||
.long SYMBOL_NAME(sys_quotactl)
|
|
||||||
.long SYMBOL_NAME(sys_getpgid)
|
|
||||||
.long SYMBOL_NAME(sys_fchdir)
|
|
||||||
.long SYMBOL_NAME(sys_bdflush)
|
|
||||||
.long SYMBOL_NAME(sys_sysfs) /* 135 */
|
|
||||||
.long SYMBOL_NAME(sys_personality)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* for afs_syscall */
|
|
||||||
.long SYMBOL_NAME(sys_setfsuid)
|
|
||||||
.long SYMBOL_NAME(sys_setfsgid)
|
|
||||||
.long SYMBOL_NAME(sys_llseek) /* 140 */
|
|
||||||
.long SYMBOL_NAME(sys_getdents)
|
|
||||||
.long SYMBOL_NAME(sys_select)
|
|
||||||
.long SYMBOL_NAME(sys_flock)
|
|
||||||
.long SYMBOL_NAME(sys_msync)
|
|
||||||
.long SYMBOL_NAME(sys_readv) /* 145 */
|
|
||||||
.long SYMBOL_NAME(sys_writev)
|
|
||||||
.long SYMBOL_NAME(sys_getsid)
|
|
||||||
.long SYMBOL_NAME(sys_fdatasync)
|
|
||||||
.long SYMBOL_NAME(sys_sysctl)
|
|
||||||
.long SYMBOL_NAME(sys_mlock) /* 150 */
|
|
||||||
.long SYMBOL_NAME(sys_munlock)
|
|
||||||
.long SYMBOL_NAME(sys_mlockall)
|
|
||||||
.long SYMBOL_NAME(sys_munlockall)
|
|
||||||
.long SYMBOL_NAME(sys_sched_setparam)
|
|
||||||
.long SYMBOL_NAME(sys_sched_getparam) /* 155 */
|
|
||||||
.long SYMBOL_NAME(sys_sched_setscheduler)
|
|
||||||
.long SYMBOL_NAME(sys_sched_getscheduler)
|
|
||||||
.long SYMBOL_NAME(sys_sched_yield)
|
|
||||||
.long SYMBOL_NAME(sys_sched_get_priority_max)
|
|
||||||
.long SYMBOL_NAME(sys_sched_get_priority_min) /* 160 */
|
|
||||||
.long SYMBOL_NAME(sys_sched_rr_get_interval)
|
|
||||||
.long SYMBOL_NAME(sys_nanosleep)
|
|
||||||
.long SYMBOL_NAME(sys_mremap)
|
|
||||||
.long SYMBOL_NAME(sys_setresuid)
|
|
||||||
.long SYMBOL_NAME(sys_getresuid) /* 165 */
|
|
||||||
.long SYMBOL_NAME(sys_vm86)
|
|
||||||
.long SYMBOL_NAME(sys_query_module)
|
|
||||||
.long SYMBOL_NAME(sys_poll)
|
|
||||||
.long SYMBOL_NAME(sys_nfsservctl)
|
|
||||||
.long SYMBOL_NAME(sys_setresgid) /* 170 */
|
|
||||||
.long SYMBOL_NAME(sys_getresgid)
|
|
||||||
.long SYMBOL_NAME(sys_prctl)
|
|
||||||
.long SYMBOL_NAME(sys_rt_sigreturn)
|
|
||||||
.long SYMBOL_NAME(sys_rt_sigaction)
|
|
||||||
.long SYMBOL_NAME(sys_rt_sigprocmask) /* 175 */
|
|
||||||
.long SYMBOL_NAME(sys_rt_sigpending)
|
|
||||||
.long SYMBOL_NAME(sys_rt_sigtimedwait)
|
|
||||||
.long SYMBOL_NAME(sys_rt_sigqueueinfo)
|
|
||||||
.long SYMBOL_NAME(sys_rt_sigsuspend)
|
|
||||||
.long SYMBOL_NAME(sys_pread) /* 180 */
|
|
||||||
.long SYMBOL_NAME(sys_pwrite)
|
|
||||||
.long SYMBOL_NAME(sys_chown)
|
|
||||||
.long SYMBOL_NAME(sys_getcwd)
|
|
||||||
.long SYMBOL_NAME(sys_capget)
|
|
||||||
.long SYMBOL_NAME(sys_capset) /* 185 */
|
|
||||||
.long SYMBOL_NAME(sys_sigaltstack)
|
|
||||||
.long SYMBOL_NAME(sys_sendfile)
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
|
|
||||||
.long SYMBOL_NAME(sys_table) /* 190 */
|
|
||||||
|
|
||||||
.rept NR_syscalls-190
|
|
||||||
.long SYMBOL_NAME(sys_ni_syscall)
|
|
||||||
.endr
|
|
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* linux/table/table_impl.c
|
|
||||||
* Copyright (C) 1998 Martin Baulig
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/errno.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/kernel_stat.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/user.h>
|
|
||||||
#include <linux/a.out.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include <linux/mman.h>
|
|
||||||
#include <linux/proc_fs.h>
|
|
||||||
#include <linux/ioport.h>
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/pagemap.h>
|
|
||||||
#include <linux/swap.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/smp.h>
|
|
||||||
#include <linux/signal.h>
|
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/table.h>
|
|
||||||
|
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
extern void scheduling_functions_start_here(void);
|
|
||||||
extern void scheduling_functions_end_here(void);
|
|
||||||
|
|
||||||
int (*table_function_ptr) (int, union table *, const void *) = 0;
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(table_function_ptr);
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(nr_running);
|
|
||||||
EXPORT_SYMBOL(pidhash);
|
|
||||||
EXPORT_SYMBOL(task);
|
|
||||||
EXPORT_SYMBOL(si_swapinfo);
|
|
||||||
EXPORT_SYMBOL(scheduling_functions_start_here);
|
|
||||||
EXPORT_SYMBOL(scheduling_functions_end_here);
|
|
||||||
EXPORT_SYMBOL(avenrun);
|
|
||||||
EXPORT_SYMBOL(nr_tasks);
|
|
||||||
EXPORT_SYMBOL(last_pid);
|
|
||||||
EXPORT_SYMBOL(page_cache_size);
|
|
||||||
EXPORT_SYMBOL(init_mm);
|
|
||||||
|
|
||||||
asmlinkage int
|
|
||||||
sys_table (int type, union table *buf, const void *param)
|
|
||||||
{
|
|
||||||
if (table_function_ptr == 0)
|
|
||||||
return -ENOSYS;
|
|
||||||
|
|
||||||
return (*table_function_ptr) (type, buf, param);
|
|
||||||
}
|
|
@@ -1,607 +0,0 @@
|
|||||||
/*
|
|
||||||
* linux/table/table_impl.c
|
|
||||||
* Copyright (C) 1998 Martin Baulig
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/errno.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/kernel_stat.h>
|
|
||||||
#include <linux/tty.h>
|
|
||||||
#include <linux/user.h>
|
|
||||||
#include <linux/a.out.h>
|
|
||||||
#include <linux/string.h>
|
|
||||||
#include <linux/mman.h>
|
|
||||||
#include <linux/proc_fs.h>
|
|
||||||
#include <linux/ioport.h>
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/pagemap.h>
|
|
||||||
#include <linux/swap.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
#include <linux/smp.h>
|
|
||||||
#include <linux/signal.h>
|
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
|
||||||
#include <asm/pgtable.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/table.h>
|
|
||||||
|
|
||||||
#include "version.h"
|
|
||||||
|
|
||||||
extern int (*table_function_ptr) (int, union table *, const void *);
|
|
||||||
|
|
||||||
int table_fkt (int, union table *, const void *);
|
|
||||||
|
|
||||||
EXPORT_NO_SYMBOLS;
|
|
||||||
|
|
||||||
int
|
|
||||||
init_module(void)
|
|
||||||
{
|
|
||||||
printk ("init_module () = %p - %d, %d\n",
|
|
||||||
table_fkt, sizeof (union table), sizeof (sigset_t));
|
|
||||||
table_function_ptr = table_fkt;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cleanup_module(void)
|
|
||||||
{
|
|
||||||
table_function_ptr = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define LOAD_INT(x) ((x) >> FSHIFT)
|
|
||||||
#define LOAD_FRAC(x) LOAD_INT(((x) & (FIXED_1-1)) * 100)
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_MALLOC
|
|
||||||
int get_malloc(char * buffer);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void collect_sigign_sigcatch(struct task_struct *p, sigset_t *ign,
|
|
||||||
sigset_t *catch)
|
|
||||||
{
|
|
||||||
struct k_sigaction *k;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
sigemptyset(ign);
|
|
||||||
sigemptyset(catch);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
printk ("collect_sigign_sigcatch: %p - %p\n",
|
|
||||||
p, p->sig);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (p->sig) {
|
|
||||||
k = p->sig->action;
|
|
||||||
for (i = 1; i <= _NSIG; ++i, ++k) {
|
|
||||||
#if 0
|
|
||||||
printk ("signal: %d - %p (%p, %p)\n",
|
|
||||||
i, k->sa.sa_handler, SIG_IGN, SIG_DFL);
|
|
||||||
#endif
|
|
||||||
if (k->sa.sa_handler == SIG_IGN)
|
|
||||||
sigaddset(ign, i);
|
|
||||||
else if (k->sa.sa_handler != SIG_DFL)
|
|
||||||
sigaddset(catch, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These bracket the sleeping functions..
|
|
||||||
*/
|
|
||||||
extern void scheduling_functions_start_here(void);
|
|
||||||
extern void scheduling_functions_end_here(void);
|
|
||||||
#define first_sched ((unsigned long) scheduling_functions_start_here)
|
|
||||||
#define last_sched ((unsigned long) scheduling_functions_end_here)
|
|
||||||
|
|
||||||
static unsigned long get_wchan(struct task_struct *p)
|
|
||||||
{
|
|
||||||
if (!p || p == current || p->state == TASK_RUNNING)
|
|
||||||
return 0;
|
|
||||||
#if defined(__i386__)
|
|
||||||
{
|
|
||||||
unsigned long ebp, eip;
|
|
||||||
unsigned long stack_page;
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
stack_page = 4096 + (unsigned long)p;
|
|
||||||
if (!stack_page)
|
|
||||||
return 0;
|
|
||||||
ebp = p->tss.ebp;
|
|
||||||
do {
|
|
||||||
if (ebp < stack_page || ebp >= 4092+stack_page)
|
|
||||||
return 0;
|
|
||||||
eip = *(unsigned long *) (ebp+4);
|
|
||||||
if (eip < first_sched || eip >= last_sched)
|
|
||||||
return eip;
|
|
||||||
ebp = *(unsigned long *) ebp;
|
|
||||||
} while (count++ < 16);
|
|
||||||
}
|
|
||||||
#elif defined(__alpha__)
|
|
||||||
/*
|
|
||||||
* This one depends on the frame size of schedule(). Do a
|
|
||||||
* "disass schedule" in gdb to find the frame size. Also, the
|
|
||||||
* code assumes that sleep_on() follows immediately after
|
|
||||||
* interruptible_sleep_on() and that add_timer() follows
|
|
||||||
* immediately after interruptible_sleep(). Ugly, isn't it?
|
|
||||||
* Maybe adding a wchan field to task_struct would be better,
|
|
||||||
* after all...
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
unsigned long schedule_frame;
|
|
||||||
unsigned long pc;
|
|
||||||
|
|
||||||
pc = thread_saved_pc(&p->tss);
|
|
||||||
if (pc >= first_sched && pc < last_sched) {
|
|
||||||
schedule_frame = ((unsigned long *)p->tss.ksp)[6];
|
|
||||||
return ((unsigned long *)schedule_frame)[12];
|
|
||||||
}
|
|
||||||
return pc;
|
|
||||||
}
|
|
||||||
#elif defined(__mc68000__)
|
|
||||||
{
|
|
||||||
unsigned long fp, pc;
|
|
||||||
unsigned long stack_page;
|
|
||||||
int count = 0;
|
|
||||||
extern int sys_pause (void);
|
|
||||||
|
|
||||||
stack_page = p->kernel_stack_page;
|
|
||||||
if (!stack_page)
|
|
||||||
return 0;
|
|
||||||
fp = ((struct switch_stack *)p->tss.ksp)->a6;
|
|
||||||
do {
|
|
||||||
if (fp < stack_page || fp >= 4088+stack_page)
|
|
||||||
return 0;
|
|
||||||
pc = ((unsigned long *)fp)[1];
|
|
||||||
/* FIXME: This depends on the order of these functions. */
|
|
||||||
if (pc < first_sched || pc >= last_sched)
|
|
||||||
return pc;
|
|
||||||
fp = *(unsigned long *) fp;
|
|
||||||
} while (count++ < 16);
|
|
||||||
}
|
|
||||||
#elif defined(__powerpc__)
|
|
||||||
return (p->tss.wchan);
|
|
||||||
#elif defined (CONFIG_ARM)
|
|
||||||
{
|
|
||||||
unsigned long fp, lr;
|
|
||||||
unsigned long stack_page;
|
|
||||||
int count = 0;
|
|
||||||
|
|
||||||
stack_page = 4096 + (unsigned long)p;
|
|
||||||
fp = get_css_fp (&p->tss);
|
|
||||||
do {
|
|
||||||
if (fp < stack_page || fp > 4092+stack_page)
|
|
||||||
return 0;
|
|
||||||
lr = pc_pointer (((unsigned long *)fp)[-1]);
|
|
||||||
if (lr < first_sched || lr > last_sched)
|
|
||||||
return lr;
|
|
||||||
fp = *(unsigned long *) (fp - 12);
|
|
||||||
} while (count ++ < 16);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__i386__)
|
|
||||||
# define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1019])
|
|
||||||
# define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1022])
|
|
||||||
#elif defined(__alpha__)
|
|
||||||
/*
|
|
||||||
* See arch/alpha/kernel/ptrace.c for details.
|
|
||||||
*/
|
|
||||||
# define PT_REG(reg) (PAGE_SIZE - sizeof(struct pt_regs) \
|
|
||||||
+ (long)&((struct pt_regs *)0)->reg)
|
|
||||||
# define KSTK_EIP(tsk) \
|
|
||||||
(*(unsigned long *)(PT_REG(pc) + PAGE_SIZE + (unsigned long)(tsk)))
|
|
||||||
# define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->tss.usp)
|
|
||||||
#elif defined(CONFIG_ARM)
|
|
||||||
# define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1022])
|
|
||||||
# define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1020])
|
|
||||||
#elif defined(__mc68000__)
|
|
||||||
#define KSTK_EIP(tsk) \
|
|
||||||
({ \
|
|
||||||
unsigned long eip = 0; \
|
|
||||||
if ((tsk)->tss.esp0 > PAGE_SIZE && \
|
|
||||||
MAP_NR((tsk)->tss.esp0) < max_mapnr) \
|
|
||||||
eip = ((struct pt_regs *) (tsk)->tss.esp0)->pc; \
|
|
||||||
eip; })
|
|
||||||
#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->tss.usp)
|
|
||||||
#elif defined(__powerpc__)
|
|
||||||
#define KSTK_EIP(tsk) ((tsk)->tss.regs->nip)
|
|
||||||
#define KSTK_ESP(tsk) ((tsk)->tss.regs->gpr[1])
|
|
||||||
#elif defined (__sparc_v9__)
|
|
||||||
# define KSTK_EIP(tsk) ((tsk)->tss.kregs->tpc)
|
|
||||||
# define KSTK_ESP(tsk) ((tsk)->tss.kregs->u_regs[UREG_FP])
|
|
||||||
#elif defined(__sparc__)
|
|
||||||
# define KSTK_EIP(tsk) ((tsk)->tss.kregs->pc)
|
|
||||||
# define KSTK_ESP(tsk) ((tsk)->tss.kregs->u_regs[UREG_FP])
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Gcc optimizes away "strlen(x)" for constant x */
|
|
||||||
#define ADDBUF(buffer, string) \
|
|
||||||
do { memcpy(buffer, string, strlen(string)); \
|
|
||||||
buffer += strlen(string); } while (0)
|
|
||||||
|
|
||||||
static inline void statm_pte_range(pmd_t * pmd, unsigned long address, unsigned long size,
|
|
||||||
int * pages, int * shared, int * dirty, int * total)
|
|
||||||
{
|
|
||||||
pte_t * pte;
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
if (pmd_none(*pmd))
|
|
||||||
return;
|
|
||||||
if (pmd_bad(*pmd)) {
|
|
||||||
printk("statm_pte_range: bad pmd (%08lx)\n", pmd_val(*pmd));
|
|
||||||
pmd_clear(pmd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pte = pte_offset(pmd, address);
|
|
||||||
address &= ~PMD_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PMD_SIZE)
|
|
||||||
end = PMD_SIZE;
|
|
||||||
do {
|
|
||||||
pte_t page = *pte;
|
|
||||||
|
|
||||||
address += PAGE_SIZE;
|
|
||||||
pte++;
|
|
||||||
if (pte_none(page))
|
|
||||||
continue;
|
|
||||||
++*total;
|
|
||||||
if (!pte_present(page))
|
|
||||||
continue;
|
|
||||||
++*pages;
|
|
||||||
if (pte_dirty(page))
|
|
||||||
++*dirty;
|
|
||||||
if (MAP_NR(pte_page(page)) >= max_mapnr)
|
|
||||||
continue;
|
|
||||||
if (atomic_read(&mem_map[MAP_NR(pte_page(page))].count) > 1)
|
|
||||||
++*shared;
|
|
||||||
} while (address < end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void statm_pmd_range(pgd_t * pgd, unsigned long address, unsigned long size,
|
|
||||||
int * pages, int * shared, int * dirty, int * total)
|
|
||||||
{
|
|
||||||
pmd_t * pmd;
|
|
||||||
unsigned long end;
|
|
||||||
|
|
||||||
if (pgd_none(*pgd))
|
|
||||||
return;
|
|
||||||
if (pgd_bad(*pgd)) {
|
|
||||||
printk("statm_pmd_range: bad pgd (%08lx)\n", pgd_val(*pgd));
|
|
||||||
pgd_clear(pgd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
pmd = pmd_offset(pgd, address);
|
|
||||||
address &= ~PGDIR_MASK;
|
|
||||||
end = address + size;
|
|
||||||
if (end > PGDIR_SIZE)
|
|
||||||
end = PGDIR_SIZE;
|
|
||||||
do {
|
|
||||||
statm_pte_range(pmd, address, end - address, pages, shared, dirty, total);
|
|
||||||
address = (address + PMD_SIZE) & PMD_MASK;
|
|
||||||
pmd++;
|
|
||||||
} while (address < end);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void statm_pgd_range(pgd_t * pgd, unsigned long address, unsigned long end,
|
|
||||||
int * pages, int * shared, int * dirty, int * total)
|
|
||||||
{
|
|
||||||
while (address < end) {
|
|
||||||
statm_pmd_range(pgd, address, end - address, pages, shared, dirty, total);
|
|
||||||
address = (address + PGDIR_SIZE) & PGDIR_MASK;
|
|
||||||
pgd++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
table_fkt (int type, union table *buf, const void *param)
|
|
||||||
{
|
|
||||||
union table tbl;
|
|
||||||
struct sysinfo i;
|
|
||||||
struct task_struct *tsk = NULL;
|
|
||||||
struct proclist_args plistargs;
|
|
||||||
int index, tindex, err, tty;
|
|
||||||
sigset_t sigign, sigcatch;
|
|
||||||
pid_t pid;
|
|
||||||
|
|
||||||
if (type == TABLE_VERSION)
|
|
||||||
return _TABLE_VERSION;
|
|
||||||
|
|
||||||
if (!buf)
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
memset (&tbl, 0, sizeof (union table));
|
|
||||||
|
|
||||||
/* For TABLE_PROC_*, read pid and get task_struct */
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TABLE_PROC_UID:
|
|
||||||
case TABLE_PROC_MEM:
|
|
||||||
case TABLE_PROC_SEGMENT:
|
|
||||||
case TABLE_PROC_TIME:
|
|
||||||
case TABLE_PROC_STATE:
|
|
||||||
case TABLE_PROC_SIGNAL:
|
|
||||||
case TABLE_PROC_KERNEL:
|
|
||||||
err = verify_area (VERIFY_READ, param, sizeof (pid_t));
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
copy_from_user (&pid, param, sizeof (pid_t));
|
|
||||||
|
|
||||||
read_lock (&tasklist_lock);
|
|
||||||
tsk = find_task_by_pid (pid);
|
|
||||||
/* FIXME!! This should be done after the last use */
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
|
|
||||||
if (tsk == NULL)
|
|
||||||
return -ESRCH;
|
|
||||||
break;
|
|
||||||
case TABLE_PROCLIST:
|
|
||||||
err = verify_area (VERIFY_READ, param,
|
|
||||||
sizeof (struct proclist_args));
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
copy_from_user (&plistargs, param,
|
|
||||||
sizeof (struct proclist_args));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Main function dispatcher */
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TABLE_PROCLIST:
|
|
||||||
tsk = task [0];
|
|
||||||
read_lock (&tasklist_lock);
|
|
||||||
for (index = tindex = 0; index < nr_tasks;
|
|
||||||
index++, tsk = tsk->next_task) {
|
|
||||||
if (tsk->pid == 0) continue;
|
|
||||||
switch (plistargs.which & TABLE_KERN_PROC_MASK) {
|
|
||||||
case TABLE_KERN_PROC_PID:
|
|
||||||
if (tsk->pid != plistargs.arg) continue;
|
|
||||||
break;
|
|
||||||
case TABLE_KERN_PROC_PGRP:
|
|
||||||
if (tsk->pgrp != plistargs.arg) continue;
|
|
||||||
break;
|
|
||||||
case TABLE_KERN_PROC_SESSION:
|
|
||||||
if (tsk->session != plistargs.arg) continue;
|
|
||||||
case TABLE_KERN_PROC_TTY:
|
|
||||||
tty = tsk->tty ?
|
|
||||||
kdev_t_to_nr (tsk->tty->device) : 0;
|
|
||||||
if (tty != plistargs.arg) continue;
|
|
||||||
break;
|
|
||||||
case TABLE_KERN_PROC_UID:
|
|
||||||
if (tsk->uid != plistargs.arg) continue;
|
|
||||||
break;
|
|
||||||
case TABLE_KERN_PROC_RUID:
|
|
||||||
if (tsk->euid != plistargs.arg) continue;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((plistargs.which & TABLE_EXCLUDE_IDLE) &&
|
|
||||||
(tsk->state != 0))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if ((plistargs.which & TABLE_EXCLUDE_NOTTY) &&
|
|
||||||
(tsk->tty == NULL))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
tbl.proclist.pids [tindex++] = tsk->pid;
|
|
||||||
}
|
|
||||||
tbl.proclist.nr_running = nr_running;
|
|
||||||
tbl.proclist.last_pid = last_pid;
|
|
||||||
tbl.proclist.nr_tasks = tindex;
|
|
||||||
read_unlock(&tasklist_lock);
|
|
||||||
break;
|
|
||||||
case TABLE_CPU:
|
|
||||||
tbl.cpu.total = jiffies;
|
|
||||||
tbl.cpu.user = kstat.cpu_user;
|
|
||||||
tbl.cpu.nice = kstat.cpu_nice;
|
|
||||||
tbl.cpu.sys = kstat.cpu_system;
|
|
||||||
tbl.cpu.idle = tbl.cpu.total -
|
|
||||||
(tbl.cpu.user + tbl.cpu.nice + tbl.cpu.sys);
|
|
||||||
tbl.cpu.frequency = HZ;
|
|
||||||
break;
|
|
||||||
case TABLE_MEM:
|
|
||||||
si_meminfo (&i);
|
|
||||||
tbl.mem.total = i.totalram;
|
|
||||||
tbl.mem.used = i.totalram - i.freeram;
|
|
||||||
tbl.mem.free = i.freeram;
|
|
||||||
tbl.mem.shared = i.sharedram;
|
|
||||||
tbl.mem.buffer = i.bufferram;
|
|
||||||
tbl.mem.cached = page_cache_size << PAGE_SHIFT;
|
|
||||||
break;
|
|
||||||
case TABLE_SWAP:
|
|
||||||
si_swapinfo (&i);
|
|
||||||
tbl.swap.total = i.totalswap;
|
|
||||||
tbl.swap.used = i.totalswap - i.freeswap;
|
|
||||||
tbl.swap.free = i.freeswap;
|
|
||||||
break;
|
|
||||||
case TABLE_LOADAVG:
|
|
||||||
tbl.loadavg.loadavg [0] = (double) avenrun [0] / (1 << FSHIFT);
|
|
||||||
tbl.loadavg.loadavg [1] = (double) avenrun [1] / (1 << FSHIFT);
|
|
||||||
tbl.loadavg.loadavg [2] = (double) avenrun [2] / (1 << FSHIFT);
|
|
||||||
tbl.loadavg.nr_running = nr_running;
|
|
||||||
tbl.loadavg.nr_tasks = nr_tasks;
|
|
||||||
tbl.loadavg.last_pid = last_pid;
|
|
||||||
break;
|
|
||||||
case TABLE_UPTIME:
|
|
||||||
tbl.uptime.uptime = jiffies;
|
|
||||||
tbl.uptime.idle = task[0]->times.tms_utime +
|
|
||||||
task[0]->times.tms_stime;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_STATE:
|
|
||||||
tbl.proc_state.uid = tsk->uid;
|
|
||||||
tbl.proc_state.gid = tsk->gid;
|
|
||||||
tbl.proc_state.state = tsk->state;
|
|
||||||
tbl.proc_state.flags = tsk->flags;
|
|
||||||
memcpy (tbl.proc_state.comm, tsk->comm,
|
|
||||||
sizeof (tbl.proc_state.comm));
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_UID:
|
|
||||||
tbl.proc_uid.uid = tsk->uid;
|
|
||||||
tbl.proc_uid.euid = tsk->euid;
|
|
||||||
tbl.proc_uid.suid = tsk->suid;
|
|
||||||
tbl.proc_uid.fsuid = tsk->fsuid;
|
|
||||||
|
|
||||||
tbl.proc_uid.gid = tsk->gid;
|
|
||||||
tbl.proc_uid.egid = tsk->egid;
|
|
||||||
tbl.proc_uid.sgid = tsk->sgid;
|
|
||||||
tbl.proc_uid.fsgid = tsk->fsgid;
|
|
||||||
|
|
||||||
tbl.proc_uid.pid = tsk->pid;
|
|
||||||
tbl.proc_uid.pgrp = tsk->pgrp;
|
|
||||||
tbl.proc_uid.ppid = tsk->p_pptr->pid;
|
|
||||||
|
|
||||||
tbl.proc_uid.session = tsk->session;
|
|
||||||
tbl.proc_uid.tty = tsk->tty ?
|
|
||||||
kdev_t_to_nr (tsk->tty->device) : 0;
|
|
||||||
tbl.proc_uid.tpgid = tsk->tty ? tsk->tty->pgrp : -1;
|
|
||||||
|
|
||||||
tbl.proc_uid.priority = tsk->priority;
|
|
||||||
tbl.proc_uid.counter = tsk->counter;
|
|
||||||
tbl.proc_uid.def_priority = DEF_PRIORITY;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_SIGNAL:
|
|
||||||
memcpy (&tbl.proc_signal.signal, &tsk->signal,
|
|
||||||
sizeof (tbl.proc_signal.signal));
|
|
||||||
|
|
||||||
memcpy (&tbl.proc_signal.blocked, &tsk->blocked,
|
|
||||||
sizeof (tbl.proc_signal.blocked));
|
|
||||||
|
|
||||||
collect_sigign_sigcatch (tsk, &sigign, &sigcatch);
|
|
||||||
|
|
||||||
memcpy (&tbl.proc_signal.ignored, &sigign,
|
|
||||||
sizeof (tbl.proc_signal.ignored));
|
|
||||||
|
|
||||||
memcpy (&tbl.proc_signal.caught, &sigcatch,
|
|
||||||
sizeof (tbl.proc_signal.caught));
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
printk ("PROC_SIGNAL: (%lu, %lu) - (%lu, %lu)\n",
|
|
||||||
tbl.proc_signal.ignored.sig [0],
|
|
||||||
tbl.proc_signal.ignored.sig [1],
|
|
||||||
tbl.proc_signal.caught.sig [0],
|
|
||||||
tbl.proc_signal.caught.sig [1]);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_MEM:
|
|
||||||
if (tsk->mm && tsk->mm != &init_mm) {
|
|
||||||
tbl.proc_mem.context = tsk->mm->context;
|
|
||||||
tbl.proc_mem.start_code = tsk->mm->start_code;
|
|
||||||
tbl.proc_mem.end_code = tsk->mm->end_code;
|
|
||||||
tbl.proc_mem.start_data = tsk->mm-> start_data;
|
|
||||||
tbl.proc_mem.end_data = tsk->mm->end_data;
|
|
||||||
tbl.proc_mem.start_brk = tsk->mm->start_brk;
|
|
||||||
tbl.proc_mem.brk = tsk->mm->brk;
|
|
||||||
tbl.proc_mem.start_stack = tsk->mm->start_stack;
|
|
||||||
tbl.proc_mem.start_mmap = tsk->mm->mmap ?
|
|
||||||
tsk->mm->mmap->vm_start : 0;
|
|
||||||
tbl.proc_mem.arg_start = tsk->mm->arg_start;
|
|
||||||
tbl.proc_mem.arg_end = tsk->mm->arg_end;
|
|
||||||
tbl.proc_mem.env_start = tsk->mm->env_start;
|
|
||||||
tbl.proc_mem.env_end = tsk->mm->env_end;
|
|
||||||
tbl.proc_mem.rss = tsk->mm->rss << PAGE_SHIFT;
|
|
||||||
tbl.proc_mem.total_vm = tsk->mm->total_vm;
|
|
||||||
tbl.proc_mem.locked_vm = tsk->mm->locked_vm;
|
|
||||||
}
|
|
||||||
tbl.proc_mem.rlim = tsk->rlim ? tsk->rlim[RLIMIT_RSS].rlim_cur : 0;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_SEGMENT:
|
|
||||||
if (tsk->mm && tsk->mm != &init_mm) {
|
|
||||||
unsigned long vsize = 0;
|
|
||||||
int size = 0, resident = 0, share = 0;
|
|
||||||
int trs = 0, lrs = 0, drs = 0, srs = 0, dt = 0;
|
|
||||||
struct vm_area_struct * vma = tsk->mm->mmap;
|
|
||||||
|
|
||||||
while (vma) {
|
|
||||||
pgd_t *pgd = pgd_offset(tsk->mm, vma->vm_start);
|
|
||||||
int pages = 0, shared = 0, dirty = 0, total = 0;
|
|
||||||
|
|
||||||
vsize += vma->vm_end - vma->vm_start;
|
|
||||||
|
|
||||||
statm_pgd_range (pgd, vma->vm_start, vma->vm_end,
|
|
||||||
|
|
||||||
&pages, &shared, &dirty, &total);
|
|
||||||
|
|
||||||
resident += pages;
|
|
||||||
share += shared;
|
|
||||||
dt += dirty;
|
|
||||||
size += total;
|
|
||||||
|
|
||||||
/* Well, shared library seem to get mapped
|
|
||||||
* above 0x40000000 and are executable,
|
|
||||||
* so I use this hack to get their size.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (vma->vm_flags & VM_GROWSDOWN)
|
|
||||||
srs += pages; /* stack */
|
|
||||||
else if ((vma->vm_flags & VM_EXEC) &&
|
|
||||||
(vma->vm_start > 0x40000000))
|
|
||||||
lrs += pages; /* library */
|
|
||||||
else if (vma->vm_flags & VM_EXECUTABLE)
|
|
||||||
trs += pages; /* text */
|
|
||||||
else
|
|
||||||
drs += pages;
|
|
||||||
|
|
||||||
vma = vma->vm_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
tbl.proc_segment.vsize = vsize;
|
|
||||||
tbl.proc_segment.size = size << PAGE_SHIFT;
|
|
||||||
tbl.proc_segment.resident = resident << PAGE_SHIFT;
|
|
||||||
tbl.proc_segment.shared = share << PAGE_SHIFT;
|
|
||||||
tbl.proc_segment.trs = trs << PAGE_SHIFT;
|
|
||||||
tbl.proc_segment.lrs = lrs << PAGE_SHIFT;
|
|
||||||
tbl.proc_segment.drs = drs << PAGE_SHIFT;
|
|
||||||
tbl.proc_segment.srs = srs << PAGE_SHIFT;
|
|
||||||
tbl.proc_segment.dt = dt << PAGE_SHIFT;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_TIME:
|
|
||||||
tbl.proc_time.utime = tsk->times.tms_utime;
|
|
||||||
tbl.proc_time.stime = tsk->times.tms_stime;
|
|
||||||
tbl.proc_time.cutime = tsk->times.tms_cutime;
|
|
||||||
tbl.proc_time.cstime = tsk->times.tms_cstime;
|
|
||||||
|
|
||||||
tbl.proc_time.start_time = tsk->start_time;
|
|
||||||
tbl.proc_time.timeout = tsk->timeout;
|
|
||||||
tbl.proc_time.policy = tsk->policy;
|
|
||||||
tbl.proc_time.rt_priority = tsk->rt_priority;
|
|
||||||
|
|
||||||
tbl.proc_time.it_real_value = tsk->it_real_value;
|
|
||||||
tbl.proc_time.it_prof_value = tsk->it_prof_value;
|
|
||||||
tbl.proc_time.it_virt_value = tsk->it_virt_value;
|
|
||||||
tbl.proc_time.it_real_incr = tsk->it_real_incr;
|
|
||||||
tbl.proc_time.it_prof_incr = tsk->it_prof_incr;
|
|
||||||
tbl.proc_time.it_virt_incr = tsk->it_virt_incr;
|
|
||||||
break;
|
|
||||||
case TABLE_PROC_KERNEL:
|
|
||||||
tbl.proc_kernel.min_flt = tsk->min_flt;
|
|
||||||
tbl.proc_kernel.cmin_flt = tsk->cmin_flt;
|
|
||||||
tbl.proc_kernel.maj_flt = tsk->maj_flt;
|
|
||||||
tbl.proc_kernel.cmaj_flt = tsk->cmaj_flt;
|
|
||||||
|
|
||||||
tbl.proc_kernel.kesp = KSTK_ESP(tsk);
|
|
||||||
tbl.proc_kernel.keip = KSTK_EIP(tsk);
|
|
||||||
|
|
||||||
tbl.proc_kernel.nswap = tsk->nswap;
|
|
||||||
tbl.proc_kernel.cnswap = tsk->cnswap;
|
|
||||||
|
|
||||||
tbl.proc_kernel.wchan = get_wchan (tsk);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = verify_area (VERIFY_WRITE, buf, sizeof (struct table));
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
copy_to_user (buf, &tbl, sizeof (union table));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@@ -1,344 +0,0 @@
|
|||||||
#ifndef _ASM_I386_UNISTD_H_
|
|
||||||
#define _ASM_I386_UNISTD_H_
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file contains the system call numbers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define __NR_setup 0 /* used only by init, to get system going */
|
|
||||||
#define __NR_exit 1
|
|
||||||
#define __NR_fork 2
|
|
||||||
#define __NR_read 3
|
|
||||||
#define __NR_write 4
|
|
||||||
#define __NR_open 5
|
|
||||||
#define __NR_close 6
|
|
||||||
#define __NR_waitpid 7
|
|
||||||
#define __NR_creat 8
|
|
||||||
#define __NR_link 9
|
|
||||||
#define __NR_unlink 10
|
|
||||||
#define __NR_execve 11
|
|
||||||
#define __NR_chdir 12
|
|
||||||
#define __NR_time 13
|
|
||||||
#define __NR_mknod 14
|
|
||||||
#define __NR_chmod 15
|
|
||||||
#define __NR_lchown 16
|
|
||||||
#define __NR_break 17
|
|
||||||
#define __NR_oldstat 18
|
|
||||||
#define __NR_lseek 19
|
|
||||||
#define __NR_getpid 20
|
|
||||||
#define __NR_mount 21
|
|
||||||
#define __NR_umount 22
|
|
||||||
#define __NR_setuid 23
|
|
||||||
#define __NR_getuid 24
|
|
||||||
#define __NR_stime 25
|
|
||||||
#define __NR_ptrace 26
|
|
||||||
#define __NR_alarm 27
|
|
||||||
#define __NR_oldfstat 28
|
|
||||||
#define __NR_pause 29
|
|
||||||
#define __NR_utime 30
|
|
||||||
#define __NR_stty 31
|
|
||||||
#define __NR_gtty 32
|
|
||||||
#define __NR_access 33
|
|
||||||
#define __NR_nice 34
|
|
||||||
#define __NR_ftime 35
|
|
||||||
#define __NR_sync 36
|
|
||||||
#define __NR_kill 37
|
|
||||||
#define __NR_rename 38
|
|
||||||
#define __NR_mkdir 39
|
|
||||||
#define __NR_rmdir 40
|
|
||||||
#define __NR_dup 41
|
|
||||||
#define __NR_pipe 42
|
|
||||||
#define __NR_times 43
|
|
||||||
#define __NR_prof 44
|
|
||||||
#define __NR_brk 45
|
|
||||||
#define __NR_setgid 46
|
|
||||||
#define __NR_getgid 47
|
|
||||||
#define __NR_signal 48
|
|
||||||
#define __NR_geteuid 49
|
|
||||||
#define __NR_getegid 50
|
|
||||||
#define __NR_acct 51
|
|
||||||
#define __NR_phys 52
|
|
||||||
#define __NR_lock 53
|
|
||||||
#define __NR_ioctl 54
|
|
||||||
#define __NR_fcntl 55
|
|
||||||
#define __NR_mpx 56
|
|
||||||
#define __NR_setpgid 57
|
|
||||||
#define __NR_ulimit 58
|
|
||||||
#define __NR_oldolduname 59
|
|
||||||
#define __NR_umask 60
|
|
||||||
#define __NR_chroot 61
|
|
||||||
#define __NR_ustat 62
|
|
||||||
#define __NR_dup2 63
|
|
||||||
#define __NR_getppid 64
|
|
||||||
#define __NR_getpgrp 65
|
|
||||||
#define __NR_setsid 66
|
|
||||||
#define __NR_sigaction 67
|
|
||||||
#define __NR_sgetmask 68
|
|
||||||
#define __NR_ssetmask 69
|
|
||||||
#define __NR_setreuid 70
|
|
||||||
#define __NR_setregid 71
|
|
||||||
#define __NR_sigsuspend 72
|
|
||||||
#define __NR_sigpending 73
|
|
||||||
#define __NR_sethostname 74
|
|
||||||
#define __NR_setrlimit 75
|
|
||||||
#define __NR_getrlimit 76
|
|
||||||
#define __NR_getrusage 77
|
|
||||||
#define __NR_gettimeofday 78
|
|
||||||
#define __NR_settimeofday 79
|
|
||||||
#define __NR_getgroups 80
|
|
||||||
#define __NR_setgroups 81
|
|
||||||
#define __NR_select 82
|
|
||||||
#define __NR_symlink 83
|
|
||||||
#define __NR_oldlstat 84
|
|
||||||
#define __NR_readlink 85
|
|
||||||
#define __NR_uselib 86
|
|
||||||
#define __NR_swapon 87
|
|
||||||
#define __NR_reboot 88
|
|
||||||
#define __NR_readdir 89
|
|
||||||
#define __NR_mmap 90
|
|
||||||
#define __NR_munmap 91
|
|
||||||
#define __NR_truncate 92
|
|
||||||
#define __NR_ftruncate 93
|
|
||||||
#define __NR_fchmod 94
|
|
||||||
#define __NR_fchown 95
|
|
||||||
#define __NR_getpriority 96
|
|
||||||
#define __NR_setpriority 97
|
|
||||||
#define __NR_profil 98
|
|
||||||
#define __NR_statfs 99
|
|
||||||
#define __NR_fstatfs 100
|
|
||||||
#define __NR_ioperm 101
|
|
||||||
#define __NR_socketcall 102
|
|
||||||
#define __NR_syslog 103
|
|
||||||
#define __NR_setitimer 104
|
|
||||||
#define __NR_getitimer 105
|
|
||||||
#define __NR_stat 106
|
|
||||||
#define __NR_lstat 107
|
|
||||||
#define __NR_fstat 108
|
|
||||||
#define __NR_olduname 109
|
|
||||||
#define __NR_iopl 110
|
|
||||||
#define __NR_vhangup 111
|
|
||||||
#define __NR_idle 112
|
|
||||||
#define __NR_vm86old 113
|
|
||||||
#define __NR_wait4 114
|
|
||||||
#define __NR_swapoff 115
|
|
||||||
#define __NR_sysinfo 116
|
|
||||||
#define __NR_ipc 117
|
|
||||||
#define __NR_fsync 118
|
|
||||||
#define __NR_sigreturn 119
|
|
||||||
#define __NR_clone 120
|
|
||||||
#define __NR_setdomainname 121
|
|
||||||
#define __NR_uname 122
|
|
||||||
#define __NR_modify_ldt 123
|
|
||||||
#define __NR_adjtimex 124
|
|
||||||
#define __NR_mprotect 125
|
|
||||||
#define __NR_sigprocmask 126
|
|
||||||
#define __NR_create_module 127
|
|
||||||
#define __NR_init_module 128
|
|
||||||
#define __NR_delete_module 129
|
|
||||||
#define __NR_get_kernel_syms 130
|
|
||||||
#define __NR_quotactl 131
|
|
||||||
#define __NR_getpgid 132
|
|
||||||
#define __NR_fchdir 133
|
|
||||||
#define __NR_bdflush 134
|
|
||||||
#define __NR_sysfs 135
|
|
||||||
#define __NR_personality 136
|
|
||||||
#define __NR_afs_syscall 137 /* Syscall for Andrew File System */
|
|
||||||
#define __NR_setfsuid 138
|
|
||||||
#define __NR_setfsgid 139
|
|
||||||
#define __NR__llseek 140
|
|
||||||
#define __NR_getdents 141
|
|
||||||
#define __NR__newselect 142
|
|
||||||
#define __NR_flock 143
|
|
||||||
#define __NR_msync 144
|
|
||||||
#define __NR_readv 145
|
|
||||||
#define __NR_writev 146
|
|
||||||
#define __NR_getsid 147
|
|
||||||
#define __NR_fdatasync 148
|
|
||||||
#define __NR__sysctl 149
|
|
||||||
#define __NR_mlock 150
|
|
||||||
#define __NR_munlock 151
|
|
||||||
#define __NR_mlockall 152
|
|
||||||
#define __NR_munlockall 153
|
|
||||||
#define __NR_sched_setparam 154
|
|
||||||
#define __NR_sched_getparam 155
|
|
||||||
#define __NR_sched_setscheduler 156
|
|
||||||
#define __NR_sched_getscheduler 157
|
|
||||||
#define __NR_sched_yield 158
|
|
||||||
#define __NR_sched_get_priority_max 159
|
|
||||||
#define __NR_sched_get_priority_min 160
|
|
||||||
#define __NR_sched_rr_get_interval 161
|
|
||||||
#define __NR_nanosleep 162
|
|
||||||
#define __NR_mremap 163
|
|
||||||
#define __NR_setresuid 164
|
|
||||||
#define __NR_getresuid 165
|
|
||||||
#define __NR_vm86 166
|
|
||||||
#define __NR_query_module 167
|
|
||||||
#define __NR_poll 168
|
|
||||||
#define __NR_nfsservctl 169
|
|
||||||
#define __NR_setresgid 170
|
|
||||||
#define __NR_getresgid 171
|
|
||||||
#define __NR_prctl 172
|
|
||||||
#define __NR_rt_sigreturn 173
|
|
||||||
#define __NR_rt_sigaction 174
|
|
||||||
#define __NR_rt_sigprocmask 175
|
|
||||||
#define __NR_rt_sigpending 176
|
|
||||||
#define __NR_rt_sigtimedwait 177
|
|
||||||
#define __NR_rt_sigqueueinfo 178
|
|
||||||
#define __NR_rt_sigsuspend 179
|
|
||||||
#define __NR_pread 180
|
|
||||||
#define __NR_pwrite 181
|
|
||||||
#define __NR_chown 182
|
|
||||||
#define __NR_getcwd 183
|
|
||||||
#define __NR_capget 184
|
|
||||||
#define __NR_capset 185
|
|
||||||
#define __NR_sigaltstack 186
|
|
||||||
#define __NR_sendfile 187
|
|
||||||
#define __NR_streams1 188 /* some people actually want it */
|
|
||||||
#define __NR_streams2 189 /* some people actually want it */
|
|
||||||
#define __NR_table 190
|
|
||||||
|
|
||||||
/* user-visible error numbers are in the range -1 - -122: see <asm-i386/errno.h> */
|
|
||||||
|
|
||||||
#define __syscall_return(type, res) \
|
|
||||||
do { \
|
|
||||||
if ((unsigned long)(res) >= (unsigned long)(-125)) { \
|
|
||||||
errno = -(res); \
|
|
||||||
res = -1; \
|
|
||||||
} \
|
|
||||||
return (type) (res); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
|
|
||||||
#define _syscall0(type,name) \
|
|
||||||
type name(void) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name)); \
|
|
||||||
__syscall_return(type,__res); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall1(type,name,type1,arg1) \
|
|
||||||
type name(type1 arg1) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1))); \
|
|
||||||
__syscall_return(type,__res); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall2(type,name,type1,arg1,type2,arg2) \
|
|
||||||
type name(type1 arg1,type2 arg2) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2))); \
|
|
||||||
__syscall_return(type,__res); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
|
|
||||||
type name(type1 arg1,type2 arg2,type3 arg3) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
|
|
||||||
"d" ((long)(arg3))); \
|
|
||||||
__syscall_return(type,__res); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
|
|
||||||
type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
|
|
||||||
"d" ((long)(arg3)),"S" ((long)(arg4))); \
|
|
||||||
__syscall_return(type,__res); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
|
|
||||||
type5,arg5) \
|
|
||||||
type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
|
|
||||||
{ \
|
|
||||||
long __res; \
|
|
||||||
__asm__ volatile ("int $0x80" \
|
|
||||||
: "=a" (__res) \
|
|
||||||
: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), \
|
|
||||||
"d" ((long)(arg3)),"S" ((long)(arg4)),"D" ((long)(arg5))); \
|
|
||||||
__syscall_return(type,__res); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __KERNEL_SYSCALLS__
|
|
||||||
|
|
||||||
/*
|
|
||||||
* we need this inline - forking from kernel space will result
|
|
||||||
* in NO COPY ON WRITE (!!!), until an execve is executed. This
|
|
||||||
* is no problem, but for the stack. This is handled by not letting
|
|
||||||
* main() use the stack at all after fork(). Thus, no function
|
|
||||||
* calls - which means inline code for fork too, as otherwise we
|
|
||||||
* would use the stack upon exit from 'fork()'.
|
|
||||||
*
|
|
||||||
* Actually only pause and fork are needed inline, so that there
|
|
||||||
* won't be any messing with the stack from main(), but we define
|
|
||||||
* some others too.
|
|
||||||
*/
|
|
||||||
#define __NR__exit __NR_exit
|
|
||||||
static inline _syscall0(int,idle)
|
|
||||||
static inline _syscall0(int,pause)
|
|
||||||
static inline _syscall1(int,setup,int,magic)
|
|
||||||
static inline _syscall0(int,sync)
|
|
||||||
static inline _syscall0(pid_t,setsid)
|
|
||||||
static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count)
|
|
||||||
static inline _syscall3(int,read,int,fd,char *,buf,off_t,count)
|
|
||||||
static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count)
|
|
||||||
static inline _syscall1(int,dup,int,fd)
|
|
||||||
static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp)
|
|
||||||
static inline _syscall3(int,open,const char *,file,int,flag,int,mode)
|
|
||||||
static inline _syscall1(int,close,int,fd)
|
|
||||||
static inline _syscall1(int,_exit,int,exitcode)
|
|
||||||
static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options)
|
|
||||||
static inline _syscall1(int,delete_module,const char *,name)
|
|
||||||
|
|
||||||
static inline pid_t wait(int * wait_stat)
|
|
||||||
{
|
|
||||||
return waitpid(-1,wait_stat,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is the mechanism for creating a new kernel thread.
|
|
||||||
*
|
|
||||||
* NOTE! Only a kernel-only process(ie the swapper or direct descendants
|
|
||||||
* who haven't done an "execve()") should use this: it will work within
|
|
||||||
* a system call from a "real" process, but the process memory space will
|
|
||||||
* not be free'd until both the parent and the child have exited.
|
|
||||||
*/
|
|
||||||
static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
|
|
||||||
{
|
|
||||||
long retval;
|
|
||||||
|
|
||||||
__asm__ __volatile__(
|
|
||||||
"movl %%esp,%%esi\n\t"
|
|
||||||
"int $0x80\n\t" /* Linux/i386 system call */
|
|
||||||
"cmpl %%esp,%%esi\n\t" /* child or parent? */
|
|
||||||
"je 1f\n\t" /* parent - jump */
|
|
||||||
"pushl %3\n\t" /* push argument */
|
|
||||||
"call *%4\n\t" /* call fn */
|
|
||||||
"movl %2,%0\n\t" /* exit */
|
|
||||||
"int $0x80\n"
|
|
||||||
"1:\t"
|
|
||||||
:"=a" (retval)
|
|
||||||
:"0" (__NR_clone), "i" (__NR_exit),
|
|
||||||
"r" (arg), "r" (fn),
|
|
||||||
"b" (flags | CLONE_VM)
|
|
||||||
:"si");
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ASM_I386_UNISTD_H_ */
|
|
@@ -1 +0,0 @@
|
|||||||
#define _TABLE_VERSION 1
|
|
@@ -1 +0,0 @@
|
|||||||
#define _TABLE_VERSION 1
|
|
@@ -36,6 +36,10 @@ print 'static void';
|
|||||||
print '_glibtop_missing_feature (glibtop *server, const char *feature,';
|
print '_glibtop_missing_feature (glibtop *server, const char *feature,';
|
||||||
print "\t\t\t const u_int64_t present, u_int64_t *required)";
|
print "\t\t\t const u_int64_t present, u_int64_t *required)";
|
||||||
print '{';
|
print '{';
|
||||||
|
print "\tu_int64_t old_required = *required;\n";
|
||||||
|
print "\t/* Return if we have all required fields. */";
|
||||||
|
print "\tif ((~present & old_required) == 0)";
|
||||||
|
print "\t\treturn;\n";
|
||||||
print "\tswitch (server->error_method) {";
|
print "\tswitch (server->error_method) {";
|
||||||
print "\tcase GLIBTOP_ERROR_METHOD_WARN_ONCE:";
|
print "\tcase GLIBTOP_ERROR_METHOD_WARN_ONCE:";
|
||||||
print "\t\t*required &= present;";
|
print "\t\t*required &= present;";
|
||||||
@@ -43,13 +47,13 @@ print "\tcase GLIBTOP_ERROR_METHOD_WARN:";
|
|||||||
print "\t\tglibtop_warn_r (server,";
|
print "\t\tglibtop_warn_r (server,";
|
||||||
print "\t\t\t\t_(\"glibtop_get_%s (): Client requested \"";
|
print "\t\t\t\t_(\"glibtop_get_%s (): Client requested \"";
|
||||||
print "\t\t\t\t \"field mask %05Lx, but only have %05Lx.\"),";
|
print "\t\t\t\t \"field mask %05Lx, but only have %05Lx.\"),";
|
||||||
print "\t\t\t\t feature, required, present);";
|
print "\t\t\t\t feature, old_required, present);";
|
||||||
print "\t\tbreak;";
|
print "\t\tbreak;";
|
||||||
print "\tcase GLIBTOP_ERROR_METHOD_ABORT:";
|
print "\tcase GLIBTOP_ERROR_METHOD_ABORT:";
|
||||||
print "\t\tglibtop_error_r (server,";
|
print "\t\tglibtop_error_r (server,";
|
||||||
print "\t\t\t\t _(\"glibtop_get_%s (): Client requested \"";
|
print "\t\t\t\t _(\"glibtop_get_%s (): Client requested \"";
|
||||||
print "\t\t\t\t \"field mask %05x, but only have %05x.\"),";
|
print "\t\t\t\t \"field mask %05x, but only have %05x.\"),";
|
||||||
print "\t\t\t\t feature, required, present);";
|
print "\t\t\t\t feature, old_required, present);";
|
||||||
print "\t\tbreak;";
|
print "\t\tbreak;";
|
||||||
print "\t}";
|
print "\t}";
|
||||||
print '}';
|
print '}';
|
||||||
|
@@ -15,45 +15,44 @@ AC_DEFUN([LIBGTOP_HACKER_TESTS],[
|
|||||||
|
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
linux*)
|
linux*)
|
||||||
AC_ARG_WITH(linux-table,
|
AC_ARG_WITH(linux-sysctl,
|
||||||
[ --with-linux-table Use the table () function from Martin Baulig],[
|
[ --with-linux-sysctl Use the sysctl () interface from Martin Baulig],[
|
||||||
linux_table="$withval"],[linux_table=auto])
|
linux_sysctl="$withval"],[linux_sysctl=auto])
|
||||||
if test $linux_table = yes ; then
|
if test $linux_sysctl = yes ; then
|
||||||
AC_CHECK_HEADER(linux/table.h, linux_table=yes, linux_table=no)
|
AC_CHECK_HEADER(linux/libgtop.h, linux_sysctl=yes, linux_sysctl=no)
|
||||||
elif test $linux_table = auto ; then
|
elif test $linux_sysctl = auto ; then
|
||||||
AC_MSG_CHECKING(for table function in Linux Kernel)
|
AC_MSG_CHECKING(for LibGTop sysctl support in Linux Kernel)
|
||||||
AC_TRY_RUN([
|
AC_TRY_RUN([
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <sys/sysctl.h>
|
||||||
#include <linux/unistd.h>
|
#include <linux/libgtop.h>
|
||||||
#include <linux/table.h>
|
|
||||||
|
|
||||||
#include <syscall.h>
|
#define SIZE(x) sizeof(x)/sizeof(x[0])
|
||||||
|
|
||||||
static inline _syscall3 (int, table, int, type, union table *, tbl, const void *, param);
|
int name[2] = { CTL_LIBGTOP, LIBGTOP_VERSION };
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
union table tbl;
|
unsigned version;
|
||||||
int ret;
|
size_t size = sizeof (version);
|
||||||
|
|
||||||
ret = table (TABLE_VERSION, NULL, NULL);
|
if (sysctl (name, SIZE (name), &version, &size, NULL, 0))
|
||||||
|
exit (1);
|
||||||
if (ret == -1)
|
else if (version < 1)
|
||||||
exit (-errno);
|
exit (2);
|
||||||
|
else
|
||||||
exit (ret < 1 ? ret : 0);
|
exit (0);
|
||||||
}
|
}
|
||||||
], linux_table=yes, linux_table=no, linux_table=no)
|
], linux_sysctl=yes, linux_sysctl=no, linux_sysctl=no)
|
||||||
AC_MSG_RESULT($linux_table)
|
AC_MSG_RESULT($linux_sysctl)
|
||||||
fi
|
fi
|
||||||
if test $linux_table = yes ; then
|
if test $linux_sysctl = yes ; then
|
||||||
AC_DEFINE(HAVE_LINUX_TABLE)
|
AC_DEFINE(HAVE_LINUX_SYSCTL)
|
||||||
fi
|
fi
|
||||||
AM_CONDITIONAL(LINUX_TABLE, test $linux_table = yes)
|
AM_CONDITIONAL(LINUX_SYSCTL, test $linux_sysctl = yes)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
])
|
])
|
||||||
@@ -108,14 +107,14 @@ AC_DEFUN([GNOME_LIBGTOP_SYSDEPS],[
|
|||||||
|
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
linux*)
|
linux*)
|
||||||
if test x$linux_table = xyes ; then
|
if test x$linux_sysctl = xyes ; then
|
||||||
libgtop_sysdeps_dir=kernel
|
libgtop_sysdeps_dir=kernel
|
||||||
libgtop_use_machine_h=no
|
libgtop_use_machine_h=no
|
||||||
else
|
else
|
||||||
libgtop_sysdeps_dir=linux
|
libgtop_sysdeps_dir=linux
|
||||||
libgtop_use_machine_h=no
|
libgtop_use_machine_h=no
|
||||||
libgtop_have_sysinfo=yes
|
|
||||||
fi
|
fi
|
||||||
|
libgtop_have_sysinfo=yes
|
||||||
libgtop_need_server=no
|
libgtop_need_server=no
|
||||||
;;
|
;;
|
||||||
freebsd*|netbsd*|openbsd*)
|
freebsd*|netbsd*|openbsd*)
|
||||||
@@ -127,9 +126,20 @@ AC_DEFUN([GNOME_LIBGTOP_SYSDEPS],[
|
|||||||
*)
|
*)
|
||||||
if test x$hacker_mode = xyes ; then
|
if test x$hacker_mode = xyes ; then
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
|
bsdi*)
|
||||||
|
libgtop_sysdeps_dir=freebsd
|
||||||
|
libgtop_use_machine_h=yes
|
||||||
|
libgtop_need_server=yes
|
||||||
|
libgtop_postinstall='chgrp kmem $(bindir)/libgtop_server && chmod 2755 $(bindir)/libgtop_server'
|
||||||
|
;;
|
||||||
|
solaris*)
|
||||||
|
libgtop_sysdeps_dir=solaris
|
||||||
|
libgtop_use_machine_h=yes
|
||||||
|
libgtop_need_server=no
|
||||||
|
;;
|
||||||
sunos4*)
|
sunos4*)
|
||||||
libgtop_sysdeps_dir=sun4
|
libgtop_sysdeps_dir=sun4
|
||||||
libgtop_use_machine_h=yes
|
libgtop_use_machine_h=yes
|
||||||
libgtop_need_server=yes
|
libgtop_need_server=yes
|
||||||
;;
|
;;
|
||||||
osf*)
|
osf*)
|
||||||
|
@@ -2,6 +2,6 @@ Makefile
|
|||||||
Makefile.in
|
Makefile.in
|
||||||
POTFILES
|
POTFILES
|
||||||
cat-id-tbl.c
|
cat-id-tbl.c
|
||||||
*.gmo
|
*.gmo *.mo
|
||||||
libgtop.pot
|
libgtop.pot
|
||||||
Makefile.in.in
|
Makefile.in.in
|
||||||
|
2
po/de.po
2
po/de.po
@@ -5,7 +5,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: libgtop VERSION\n"
|
"Project-Id-Version: libgtop VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: Martin Baulig <martin@home-of-linux.org>\n"
|
"Last-Translator: Martin Baulig <martin@home-of-linux.org>\n"
|
||||||
"Language-Team: Martin Baulig <martin@home-of-linux.org>\n"
|
"Language-Team: Martin Baulig <martin@home-of-linux.org>\n"
|
||||||
|
2
po/es.po
2
po/es.po
@@ -1,7 +1,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: glibtop 1.0.0\n"
|
"Project-Id-Version: glibtop 1.0.0\n"
|
||||||
"POT-Creation-Date: 1999-02-23 13:48+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: 1998-12-13 04:38+0100\n"
|
"PO-Revision-Date: 1998-12-13 04:38+0100\n"
|
||||||
"Last-Translator: Pablo Saratxaga <srtxg@chanae.alphanet.ch>\n"
|
"Last-Translator: Pablo Saratxaga <srtxg@chanae.alphanet.ch>\n"
|
||||||
"Language-Team: Pablo Saratxaga <srtxg@chanae.alphanet.ch>\n"
|
"Language-Team: Pablo Saratxaga <srtxg@chanae.alphanet.ch>\n"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
2
po/fr.po
2
po/fr.po
@@ -5,7 +5,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: libgtop VERSION\n"
|
"Project-Id-Version: libgtop VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: Vincent Renardias <vincent@waw.com>\n"
|
"Last-Translator: Vincent Renardias <vincent@waw.com>\n"
|
||||||
"Language-Team: Vincent Renardias <vincent@waw.com>\n"
|
"Language-Team: Vincent Renardias <vincent@waw.com>\n"
|
||||||
|
2
po/ja.po
2
po/ja.po
@@ -4,7 +4,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: libgtop VERSION\n"
|
"Project-Id-Version: libgtop VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: 1998-12-11 06:53+09:00\n"
|
"PO-Revision-Date: 1998-12-11 06:53+09:00\n"
|
||||||
"Last-Translator: Eiichiro ITANI <emu@ceres.dti.ne.jp>\n"
|
"Last-Translator: Eiichiro ITANI <emu@ceres.dti.ne.jp>\n"
|
||||||
"Language-Team: <gnome@lists.hypercore.co.jp>\n"
|
"Language-Team: <gnome@lists.hypercore.co.jp>\n"
|
||||||
|
2
po/ko.po
2
po/ko.po
@@ -5,7 +5,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: libgtop VERSION\n"
|
"Project-Id-Version: libgtop VERSION\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: 1999-02-04 14:31:38+0900\n"
|
"PO-Revision-Date: 1999-02-04 14:31:38+0900\n"
|
||||||
"Last-Translator: Sung-Hyun Nam <namsh@lgic.co.kr>\n"
|
"Last-Translator: Sung-Hyun Nam <namsh@lgic.co.kr>\n"
|
||||||
"Language-Team: Korean <ko@li.org>\n"
|
"Language-Team: Korean <ko@li.org>\n"
|
||||||
|
2
po/no.po
2
po/no.po
@@ -5,7 +5,7 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: libgtop 0.99.3\n"
|
"Project-Id-Version: libgtop 0.99.3\n"
|
||||||
"POT-Creation-Date: 1999-02-27 22:24+0100\n"
|
"POT-Creation-Date: 1999-03-01 22:58+0100\n"
|
||||||
"PO-Revision-Date: 1999-01-27 23:22+0100\n"
|
"PO-Revision-Date: 1999-01-27 23:22+0100\n"
|
||||||
"Last-Translator: Kjartan Maraas <kmaraas@fib.hl.no>\n"
|
"Last-Translator: Kjartan Maraas <kmaraas@fib.hl.no>\n"
|
||||||
"Language-Team: Norwegian <no@li.org>\n"
|
"Language-Team: Norwegian <no@li.org>\n"
|
||||||
|
@@ -6,5 +6,5 @@ endif
|
|||||||
|
|
||||||
SUBDIRS = @sysdeps_dir@ common names $(guile_SUBDIRS)
|
SUBDIRS = @sysdeps_dir@ common names $(guile_SUBDIRS)
|
||||||
|
|
||||||
DIST_SUBDIRS = common guile linux kernel names osf1 \
|
DIST_SUBDIRS = common guile linux names osf1 \
|
||||||
stub stub_suid sun4 freebsd
|
stub stub_suid sun4 freebsd solaris
|
||||||
|
@@ -1,3 +1,22 @@
|
|||||||
|
1999-03-19 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
Added basic support for BSDI. It compiles without problems on
|
||||||
|
BSDI 2.1 and 3.1, but it is *untested* - I'm neither root on
|
||||||
|
the machine nor have I access to /dev/kmem, so I don't know
|
||||||
|
whether it will work.
|
||||||
|
|
||||||
|
You need to give configure the `--enable-hacker-mode' parameter
|
||||||
|
to use the code.
|
||||||
|
|
||||||
|
If someone can verify whether it actually works, please let me
|
||||||
|
know.
|
||||||
|
|
||||||
|
1999-03-18 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
* ppp.c: Don't use `sppp.pp_phase' if we don't HAVE_I4B_ACCT.
|
||||||
|
This is an ugly hack until someone tells me which versions have
|
||||||
|
this field and which not.
|
||||||
|
|
||||||
1999-02-25 Martin Baulig <martin@home-of-linux.org>
|
1999-02-25 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
* prockernel.c, proctime.c: Applied patch Stanislav Grozev for
|
* prockernel.c, proctime.c: Applied patch Stanislav Grozev for
|
||||||
|
@@ -28,12 +28,17 @@
|
|||||||
#include <glibtop_suid.h>
|
#include <glibtop_suid.h>
|
||||||
|
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
#ifndef __bsdi__
|
||||||
#include <sys/vmmeter.h>
|
#include <sys/vmmeter.h>
|
||||||
|
#endif
|
||||||
#include <vm/vm_param.h>
|
#include <vm/vm_param.h>
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_mem =
|
static const unsigned long _glibtop_sysdeps_mem =
|
||||||
(1 << GLIBTOP_MEM_TOTAL) + (1 << GLIBTOP_MEM_USED) +
|
(1 << GLIBTOP_MEM_TOTAL) + (1 << GLIBTOP_MEM_USED) +
|
||||||
(1 << GLIBTOP_MEM_FREE) + (1 << GLIBTOP_MEM_SHARED) +
|
(1 << GLIBTOP_MEM_FREE) +
|
||||||
|
#ifndef __bsdi__
|
||||||
|
(1 << GLIBTOP_MEM_SHARED) +
|
||||||
|
#endif
|
||||||
(1 << GLIBTOP_MEM_BUFFER) +
|
(1 << GLIBTOP_MEM_BUFFER) +
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
(1 << GLIBTOP_MEM_CACHED) +
|
(1 << GLIBTOP_MEM_CACHED) +
|
||||||
@@ -61,9 +66,11 @@ static struct nlist nlst [] = {
|
|||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef __bsdi__
|
||||||
/* MIB array for sysctl */
|
/* MIB array for sysctl */
|
||||||
/* static int mib_length=2; */
|
/* static int mib_length=2; */
|
||||||
static int mib [] = { CTL_VM, VM_METER };
|
static int mib [] = { CTL_VM, VM_METER };
|
||||||
|
#endif /* __bsdi__ */
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -95,8 +102,10 @@ glibtop_init_mem_p (glibtop *server)
|
|||||||
void
|
void
|
||||||
glibtop_get_mem_p (glibtop *server, glibtop_mem *buf)
|
glibtop_get_mem_p (glibtop *server, glibtop_mem *buf)
|
||||||
{
|
{
|
||||||
|
#ifndef __bsdi__
|
||||||
struct vmtotal vmt;
|
struct vmtotal vmt;
|
||||||
size_t length_vmt;
|
size_t length_vmt;
|
||||||
|
#endif
|
||||||
struct vmmeter vmm;
|
struct vmmeter vmm;
|
||||||
u_int v_used_count;
|
u_int v_used_count;
|
||||||
u_int v_total_count;
|
u_int v_total_count;
|
||||||
@@ -109,6 +118,7 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf)
|
|||||||
if (server->sysdeps.mem == 0)
|
if (server->sysdeps.mem == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifndef __bsdi__
|
||||||
/* [FIXME: On FreeBSD 2.2.6, sysctl () returns an incorrect
|
/* [FIXME: On FreeBSD 2.2.6, sysctl () returns an incorrect
|
||||||
* value for `vmt.vm'. We use some code from Unix top
|
* value for `vmt.vm'. We use some code from Unix top
|
||||||
* here.] */
|
* here.] */
|
||||||
@@ -119,6 +129,7 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf)
|
|||||||
glibtop_warn_io_r (server, "sysctl");
|
glibtop_warn_io_r (server, "sysctl");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Get the data from kvm_* */
|
/* Get the data from kvm_* */
|
||||||
if (kvm_read (server->machine.kd, nlst[0].n_value,
|
if (kvm_read (server->machine.kd, nlst[0].n_value,
|
||||||
@@ -154,7 +165,9 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
buf->locked = (u_int64_t) pagetok (vmm.v_wire_count) << LOG1024;
|
buf->locked = (u_int64_t) pagetok (vmm.v_wire_count) << LOG1024;
|
||||||
|
#ifndef __bsdi__
|
||||||
buf->shared = (u_int64_t) pagetok (vmt.t_rmshr) << LOG1024;
|
buf->shared = (u_int64_t) pagetok (vmt.t_rmshr) << LOG1024;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if __FreeBSD__
|
#if __FreeBSD__
|
||||||
buf->buffer = (u_int64_t) bufspace;
|
buf->buffer = (u_int64_t) bufspace;
|
||||||
|
@@ -27,9 +27,26 @@
|
|||||||
|
|
||||||
#include <glibtop_suid.h>
|
#include <glibtop_suid.h>
|
||||||
|
|
||||||
|
#if (defined __bsdi__) && (_BSDI_VERSION < 199700)
|
||||||
|
/* Older versions of BSDI don't seem to have this. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_msg_limits_p (glibtop *server)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_msg_limits_p (glibtop *server, glibtop_msg_limits *buf)
|
||||||
|
{
|
||||||
|
glibtop_init_p (server, (1 << GLIBTOP_SYSDEPS_MSG_LIMITS), 0);
|
||||||
|
|
||||||
|
memset (buf, 0, sizeof (glibtop_msg_limits));
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* #define KERNEL to get declaration of `struct msginfo'. */
|
/* #define KERNEL to get declaration of `struct msginfo'. */
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#if (defined __FreeBSD__) || (defined __bsdi__)
|
||||||
#define KERNEL 1
|
#define KERNEL 1
|
||||||
#else
|
#else
|
||||||
#define _KERNEL 1
|
#define _KERNEL 1
|
||||||
@@ -93,3 +110,6 @@ glibtop_get_msg_limits_p (glibtop *server, glibtop_msg_limits *buf)
|
|||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_msg_limits;
|
buf->flags = _glibtop_sysdeps_msg_limits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* either a newer BSDI or no BSDI at all. */
|
||||||
|
|
||||||
|
@@ -107,7 +107,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf,
|
|||||||
sizeof (ifnet)) != sizeof (ifnet))
|
sizeof (ifnet)) != sizeof (ifnet))
|
||||||
glibtop_error_io_r (server, "kvm_read (ifnetaddr)");
|
glibtop_error_io_r (server, "kvm_read (ifnetaddr)");
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#if (defined __FreeBSD__) || (defined __bsdi__)
|
||||||
if (kvm_read (server->machine.kd, (u_long) ifnet.if_name,
|
if (kvm_read (server->machine.kd, (u_long) ifnet.if_name,
|
||||||
tname, 16) != 16)
|
tname, 16) != 16)
|
||||||
glibtop_error_io_r (server, "kvm_read (if_name)");
|
glibtop_error_io_r (server, "kvm_read (if_name)");
|
||||||
@@ -118,7 +118,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf,
|
|||||||
|
|
||||||
#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000)
|
#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000)
|
||||||
ifaddraddr = (u_long) ifnet.if_addrhead.tqh_first;
|
ifaddraddr = (u_long) ifnet.if_addrhead.tqh_first;
|
||||||
#elif (defined __FreeBSD__)
|
#elif (defined __FreeBSD__) || (defined __bsdi__)
|
||||||
ifaddraddr = (u_long) ifnet.if_addrlist;
|
ifaddraddr = (u_long) ifnet.if_addrlist;
|
||||||
#else
|
#else
|
||||||
ifaddraddr = (u_long) ifnet.if_addrlist.tqh_first;
|
ifaddraddr = (u_long) ifnet.if_addrlist.tqh_first;
|
||||||
@@ -196,7 +196,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf,
|
|||||||
|
|
||||||
#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000)
|
#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000)
|
||||||
ifaddraddr = (u_long)ifaddr.ifa.ifa_link.tqe_next;
|
ifaddraddr = (u_long)ifaddr.ifa.ifa_link.tqe_next;
|
||||||
#elif (defined __FreeBSD__)
|
#elif (defined __FreeBSD__) || (defined __bsdi__)
|
||||||
ifaddraddr = (u_long)ifaddr.ifa.ifa_next;
|
ifaddraddr = (u_long)ifaddr.ifa.ifa_next;
|
||||||
#else
|
#else
|
||||||
ifaddraddr = (u_long)ifaddr.ifa.ifa_list.tqe_next;
|
ifaddraddr = (u_long)ifaddr.ifa.ifa_list.tqe_next;
|
||||||
@@ -205,7 +205,7 @@ glibtop_get_netload_p (glibtop *server, glibtop_netload *buf,
|
|||||||
|
|
||||||
#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000)
|
#if (defined __FreeBSD__) && (__FreeBSD_version >= 300000)
|
||||||
ifnetaddr = (u_long) ifnet.if_link.tqe_next;
|
ifnetaddr = (u_long) ifnet.if_link.tqe_next;
|
||||||
#elif (defined __FreeBSD__)
|
#elif (defined __FreeBSD__) || (defined __bsdi__)
|
||||||
ifnetaddr = (u_long) ifnet.if_next;
|
ifnetaddr = (u_long) ifnet.if_next;
|
||||||
#else
|
#else
|
||||||
ifnetaddr = (u_long) ifnet.if_list.tqe_next;
|
ifnetaddr = (u_long) ifnet.if_list.tqe_next;
|
||||||
|
@@ -110,10 +110,15 @@ glibtop_get_ppp_p (glibtop *server, glibtop_ppp *buf, unsigned short device)
|
|||||||
#ifdef HAVE_I4B_ACCT
|
#ifdef HAVE_I4B_ACCT
|
||||||
phase = data.sc_if_un.scu_sp.pp_phase;
|
phase = data.sc_if_un.scu_sp.pp_phase;
|
||||||
#else
|
#else
|
||||||
|
/* FIXME: Which FreeBSD version have this field and
|
||||||
|
* which not. */
|
||||||
|
#if 0
|
||||||
phase = data.pp_phase;
|
phase = data.pp_phase;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (phase) {
|
switch (phase) {
|
||||||
|
#ifdef HAVE_I4B_ACCT
|
||||||
case PHASE_DEAD:
|
case PHASE_DEAD:
|
||||||
case PHASE_TERMINATE:
|
case PHASE_TERMINATE:
|
||||||
buf->state = GLIBTOP_PPP_STATE_HANGUP;
|
buf->state = GLIBTOP_PPP_STATE_HANGUP;
|
||||||
@@ -122,6 +127,7 @@ glibtop_get_ppp_p (glibtop *server, glibtop_ppp *buf, unsigned short device)
|
|||||||
case PHASE_NETWORK:
|
case PHASE_NETWORK:
|
||||||
buf->state = GLIBTOP_PPP_STATE_ONLINE;
|
buf->state = GLIBTOP_PPP_STATE_ONLINE;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
buf->state = GLIBTOP_PPP_STATE_UNKNOWN;
|
buf->state = GLIBTOP_PPP_STATE_UNKNOWN;
|
||||||
break;
|
break;
|
||||||
|
@@ -31,10 +31,12 @@
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#include <sys/proc.h>
|
#include <sys/proc.h>
|
||||||
#ifndef __OpenBSD__
|
#if (!defined __OpenBSD__) && (!defined __bsdi__)
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef __bsdi__
|
||||||
#include <machine/pcb.h>
|
#include <machine/pcb.h>
|
||||||
|
#endif
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include <machine/tss.h>
|
#include <machine/tss.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -122,7 +124,7 @@ glibtop_get_proc_kernel_p (glibtop *server,
|
|||||||
/* NOTE: You need to mount the /proc filesystem to make
|
/* NOTE: You need to mount the /proc filesystem to make
|
||||||
* `kvm_uread' work. */
|
* `kvm_uread' work. */
|
||||||
|
|
||||||
sprintf (filename, "/proc/%d/mem", pid);
|
sprintf (filename, "/proc/%d/mem", (int) pid);
|
||||||
if (stat (filename, &statb)) return;
|
if (stat (filename, &statb)) return;
|
||||||
|
|
||||||
glibtop_suid_enter (server);
|
glibtop_suid_enter (server);
|
||||||
@@ -162,7 +164,11 @@ glibtop_get_proc_kernel_p (glibtop *server,
|
|||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
buf->kstk_esp = (u_int64_t) pcb.pcb_tss.tss_esp0;
|
buf->kstk_esp = (u_int64_t) pcb.pcb_tss.tss_esp0;
|
||||||
|
#ifdef __bsdi__
|
||||||
|
buf->kstk_eip = (u_int64_t) pcb.pcb_tss.tss_eip;
|
||||||
|
#else
|
||||||
buf->kstk_eip = (u_int64_t) pcb.pcb_tss.__tss_eip;
|
buf->kstk_eip = (u_int64_t) pcb.pcb_tss.__tss_eip;
|
||||||
|
#endif
|
||||||
|
|
||||||
buf->flags |= _glibtop_sysdeps_proc_kernel_pcb;
|
buf->flags |= _glibtop_sysdeps_proc_kernel_pcb;
|
||||||
#endif
|
#endif
|
||||||
|
@@ -42,7 +42,7 @@
|
|||||||
#include <ufs/ufs/inode.h>
|
#include <ufs/ufs/inode.h>
|
||||||
|
|
||||||
#include <sys/ucred.h>
|
#include <sys/ucred.h>
|
||||||
#ifndef __OpenBSD__
|
#if (!defined __OpenBSD__) && (!defined __bsdi__)
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
#endif
|
#endif
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
@@ -39,7 +39,7 @@
|
|||||||
#include <ufs/ufs/inode.h>
|
#include <ufs/ufs/inode.h>
|
||||||
|
|
||||||
#include <sys/ucred.h>
|
#include <sys/ucred.h>
|
||||||
#ifndef __OpenBSD__
|
#if (!defined __OpenBSD__) && (!defined __bsdi__)
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
#endif
|
#endif
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include <glibtop_suid.h>
|
#include <glibtop_suid.h>
|
||||||
|
|
||||||
#ifndef __OpenBSD__
|
#if (!defined __OpenBSD__) && (!defined __bsdi__)
|
||||||
#include <sys/user.h>
|
#include <sys/user.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -140,7 +140,7 @@ glibtop_get_proc_time_p (glibtop *server, glibtop_proc_time *buf,
|
|||||||
/* It does not work for the swapper task. */
|
/* It does not work for the swapper task. */
|
||||||
if (pid == 0) return;
|
if (pid == 0) return;
|
||||||
|
|
||||||
sprintf (filename, "/proc/%d/mem", pid);
|
sprintf (filename, "/proc/%d/mem", (int) pid);
|
||||||
if (stat (filename, &statb)) return;
|
if (stat (filename, &statb)) return;
|
||||||
|
|
||||||
/* Get the process information */
|
/* Get the process information */
|
||||||
|
@@ -27,9 +27,26 @@
|
|||||||
|
|
||||||
#include <glibtop_suid.h>
|
#include <glibtop_suid.h>
|
||||||
|
|
||||||
|
#if (defined __bsdi__) && (_BSDI_VERSION < 199700)
|
||||||
|
/* Older versions of BSDI don't seem to have this. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_sem_limits_p (glibtop *server)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_sem_limits_p (glibtop *server, glibtop_sem_limits *buf)
|
||||||
|
{
|
||||||
|
glibtop_init_p (server, (1 << GLIBTOP_SYSDEPS_SEM_LIMITS), 0);
|
||||||
|
|
||||||
|
memset (buf, 0, sizeof (glibtop_sem_limits));
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* #define KERNEL to get declaration of `struct seminfo'. */
|
/* #define KERNEL to get declaration of `struct seminfo'. */
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#if (defined __FreeBSD__) || (defined __bsdi__)
|
||||||
#define KERNEL 1
|
#define KERNEL 1
|
||||||
#else
|
#else
|
||||||
#define _KERNEL 1
|
#define _KERNEL 1
|
||||||
@@ -98,3 +115,6 @@ glibtop_get_sem_limits_p (glibtop *server, glibtop_sem_limits *buf)
|
|||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_sem_limits;
|
buf->flags = _glibtop_sysdeps_sem_limits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* either a newer BSDI or no BSDI at all. */
|
||||||
|
|
||||||
|
@@ -27,9 +27,26 @@
|
|||||||
|
|
||||||
#include <glibtop_suid.h>
|
#include <glibtop_suid.h>
|
||||||
|
|
||||||
|
#if (defined __bsdi__) && (_BSDI_VERSION < 199700)
|
||||||
|
/* Older versions of BSDI don't seem to have this. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_shm_limits_p (glibtop *server)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_shm_limits_p (glibtop *server, glibtop_shm_limits *buf)
|
||||||
|
{
|
||||||
|
glibtop_init_p (server, (1 << GLIBTOP_SYSDEPS_SHM_LIMITS), 0);
|
||||||
|
|
||||||
|
memset (buf, 0, sizeof (glibtop_shm_limits));
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* #define KERNEL to get declaration of `struct shminfo'. */
|
/* #define KERNEL to get declaration of `struct shminfo'. */
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#if (defined __FreeBSD__) || (defined __bsdi__)
|
||||||
#define KERNEL 1
|
#define KERNEL 1
|
||||||
#else
|
#else
|
||||||
#define _KERNEL 1
|
#define _KERNEL 1
|
||||||
@@ -93,3 +110,6 @@ glibtop_get_shm_limits_p (glibtop *server, glibtop_shm_limits *buf)
|
|||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_shm_limits;
|
buf->flags = _glibtop_sysdeps_shm_limits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* either a newer BSDI or no BSDI at all. */
|
||||||
|
|
||||||
|
@@ -1,28 +0,0 @@
|
|||||||
.deps
|
|
||||||
.libs
|
|
||||||
Makefile
|
|
||||||
Makefile.in
|
|
||||||
close.lo
|
|
||||||
cpu.lo
|
|
||||||
init.lo
|
|
||||||
ipc_limits.lo
|
|
||||||
libgtop_sysdeps.la
|
|
||||||
loadavg.lo
|
|
||||||
mem.lo
|
|
||||||
msg_limits.lo
|
|
||||||
open.lo
|
|
||||||
procdata.lo
|
|
||||||
prockernel.lo
|
|
||||||
proclist.lo
|
|
||||||
procmem.lo
|
|
||||||
procsegment.lo
|
|
||||||
procsignal.lo
|
|
||||||
procstate.lo
|
|
||||||
proctime.lo
|
|
||||||
procuid.lo
|
|
||||||
sem_limits.lo
|
|
||||||
shm_limits.lo
|
|
||||||
swap.lo
|
|
||||||
sysdeps.lo
|
|
||||||
sysinfo.lo
|
|
||||||
uptime.lo
|
|
@@ -1,23 +0,0 @@
|
|||||||
1998-10-26 Martin Baulig <martin@home-of-linux.org>
|
|
||||||
|
|
||||||
* netload.c: New file. Currently empty.
|
|
||||||
|
|
||||||
1998-10-26 Martin Baulig <martin@home-of-linux.org>
|
|
||||||
|
|
||||||
* procargs.c: New file. Currently empty.
|
|
||||||
|
|
||||||
1998-10-25 Martin Baulig <martin@home-of-linux.org>
|
|
||||||
|
|
||||||
* ppp.c: New file. Currently empty.
|
|
||||||
|
|
||||||
1998-06-14 Martin Baulig <martin@home-of-linux.org>
|
|
||||||
|
|
||||||
* kernel.s: New file - declaration of the table () function
|
|
||||||
via _syscall3 (); due to a bug in egcs, we cannot put this
|
|
||||||
into a C file.
|
|
||||||
|
|
||||||
1998-06-13 Martin Baulig <martin@home-of-linux.org>
|
|
||||||
|
|
||||||
The code in this directory fetches all information
|
|
||||||
directly from the kernel. It uses the new table ()
|
|
||||||
system call from the `kernel' directory.
|
|
@@ -4,21 +4,14 @@ INCLUDES = @INCLUDES@
|
|||||||
|
|
||||||
lib_LTLIBRARIES = libgtop_sysdeps.la
|
lib_LTLIBRARIES = libgtop_sysdeps.la
|
||||||
|
|
||||||
libgtop_sysdeps_la_SOURCES = open.c close.c kernel.s cpu.c mem.c swap.c \
|
libgtop_sysdeps_la_SOURCES = open.c close.c siglist.c cpu.c mem.c swap.c \
|
||||||
uptime.c loadavg.c shm_limits.c msg_limits.c \
|
uptime.c loadavg.c shm_limits.c msg_limits.c \
|
||||||
sem_limits.c proclist.c procstate.c procuid.c \
|
sem_limits.c proclist.c procstate.c procuid.c \
|
||||||
proctime.c procmem.c procsignal.c prockernel.c \
|
proctime.c procmem.c procsignal.c prockernel.c \
|
||||||
procsegment.c siglist.c procargs.c procmap.c \
|
procsegment.c procargs.c procmap.c netload.c \
|
||||||
netload.c ppp.c
|
ppp.c
|
||||||
|
|
||||||
libgtop_sysdeps_la_LDFLAGS = $(LT_VERSION_INFO)
|
libgtop_sysdeps_la_LDFLAGS = $(LT_VERSION_INFO)
|
||||||
|
|
||||||
include_HEADERS = glibtop_server.h
|
include_HEADERS = glibtop_server.h
|
||||||
|
|
||||||
noinst_HEADERS = kernel.h
|
|
||||||
|
|
||||||
kernel.o kernel.lo: $(srcdir)/kernel.s
|
|
||||||
rm -f kernel.o kernel.lo
|
|
||||||
$(AS) -o kernel.o $(srcdir)/kernel.s
|
|
||||||
cp kernel.o kernel.lo
|
|
||||||
|
|
||||||
|
@@ -21,16 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/cpu.h>
|
#include <glibtop/cpu.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_cpu = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_cpu =
|
|
||||||
(1 << GLIBTOP_CPU_TOTAL) + (1 << GLIBTOP_CPU_USER) +
|
|
||||||
(1 << GLIBTOP_CPU_NICE) + (1 << GLIBTOP_CPU_SYS) +
|
|
||||||
(1 << GLIBTOP_CPU_IDLE) + (1 << GLIBTOP_CPU_FREQUENCY);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -45,21 +39,5 @@ glibtop_init_cpu_s (glibtop *server)
|
|||||||
void
|
void
|
||||||
glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
|
glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_CPU, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_cpu));
|
memset (buf, 0, sizeof (glibtop_cpu));
|
||||||
|
|
||||||
if (table (TABLE_CPU, &tbl, NULL))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_CPU)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_cpu;
|
|
||||||
|
|
||||||
buf->total = tbl.cpu.total;
|
|
||||||
buf->user = tbl.cpu.user;
|
|
||||||
buf->nice = tbl.cpu.nice;
|
|
||||||
buf->sys = tbl.cpu.sys;
|
|
||||||
buf->idle = tbl.cpu.idle;
|
|
||||||
buf->frequency = tbl.cpu.frequency;
|
|
||||||
}
|
}
|
||||||
|
@@ -1,42 +0,0 @@
|
|||||||
.file "test.c"
|
|
||||||
.version "01.01"
|
|
||||||
/ GNU C version egcs-2.90.29 980515 (egcs-1.0.3 release) (i686-pc-linux-gnu) compiled by GNU C version egcs-2.90.29 980515 (egcs-1.0.3 release).
|
|
||||||
/ options passed: -O2 -Wall -W
|
|
||||||
/ options enabled: -fdefer-pop -fcse-follow-jumps -fcse-skip-blocks
|
|
||||||
/ -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
|
|
||||||
/ -fforce-mem -ffunction-cse -finline -fkeep-static-consts -fcaller-saves
|
|
||||||
/ -fpcc-struct-return -frerun-cse-after-loop -frerun-loop-opt
|
|
||||||
/ -fschedule-insns2 -fcommon -fverbose-asm -fgnu-linker -fregmove
|
|
||||||
/ -falias-check -fargument-alias -m80387 -mhard-float -mno-soft-float
|
|
||||||
/ -mieee-fp -mfp-ret-in-387 -mschedule-prologue -mcpu=pentiumpro
|
|
||||||
/ -march=pentium
|
|
||||||
|
|
||||||
gcc2_compiled.:
|
|
||||||
.text
|
|
||||||
.align 4
|
|
||||||
.globl table
|
|
||||||
.type table,@function
|
|
||||||
table:
|
|
||||||
pushl %ebp
|
|
||||||
movl %esp,%ebp
|
|
||||||
movl $190,%eax
|
|
||||||
pushl %ebx
|
|
||||||
movl 8(%ebp),%ebx
|
|
||||||
movl 12(%ebp),%ecx
|
|
||||||
movl 16(%ebp),%edx
|
|
||||||
#APP
|
|
||||||
int $0x80
|
|
||||||
#NO_APP
|
|
||||||
testl %eax,%eax
|
|
||||||
jge .L3
|
|
||||||
negl %eax
|
|
||||||
movl %eax,errno
|
|
||||||
movl $-1,%eax
|
|
||||||
.L3:
|
|
||||||
movl -4(%ebp),%ebx
|
|
||||||
movl %ebp,%esp
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
.Lfe1:
|
|
||||||
.size table,.Lfe1-table
|
|
||||||
.ident "GCC: (GNU) egcs-2.90.29 980515 (egcs-1.0.3 release)"
|
|
@@ -21,15 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/loadavg.h>
|
#include <glibtop/loadavg.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_loadavg = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_loadavg =
|
|
||||||
(1 << GLIBTOP_LOADAVG_LOADAVG) + (1 << GLIBTOP_LOADAVG_NR_RUNNING) +
|
|
||||||
(1 << GLIBTOP_LOADAVG_NR_TASKS) + (1 << GLIBTOP_LOADAVG_LAST_PID);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -39,27 +34,10 @@ glibtop_init_loadavg_s (glibtop *server)
|
|||||||
server->sysdeps.loadavg = _glibtop_sysdeps_loadavg;
|
server->sysdeps.loadavg = _glibtop_sysdeps_loadavg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Provides load load averange. */
|
/* Provides load averange. */
|
||||||
|
|
||||||
void
|
void
|
||||||
glibtop_get_loadavg_s (glibtop *server, glibtop_loadavg *buf)
|
glibtop_get_loadavg_s (glibtop *server, glibtop_loadavg *buf)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_LOADAVG, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_loadavg));
|
memset (buf, 0, sizeof (glibtop_loadavg));
|
||||||
|
|
||||||
if (table (TABLE_LOADAVG, &tbl, NULL))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_LOADAVG)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_loadavg;
|
|
||||||
|
|
||||||
buf->loadavg [0] = tbl.loadavg.loadavg [0];
|
|
||||||
buf->loadavg [1] = tbl.loadavg.loadavg [1];
|
|
||||||
buf->loadavg [2] = tbl.loadavg.loadavg [2];
|
|
||||||
|
|
||||||
buf->nr_running = tbl.loadavg.nr_running;
|
|
||||||
buf->nr_tasks = tbl.loadavg.nr_tasks;
|
|
||||||
buf->last_pid = tbl.loadavg.last_pid;
|
|
||||||
}
|
}
|
||||||
|
@@ -21,17 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/mem.h>
|
#include <glibtop/mem.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_mem = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_mem =
|
|
||||||
(1 << GLIBTOP_MEM_TOTAL) + (1 << GLIBTOP_MEM_USED) +
|
|
||||||
(1 << GLIBTOP_MEM_FREE) + (1 << GLIBTOP_MEM_SHARED) +
|
|
||||||
(1 << GLIBTOP_MEM_BUFFER) + (1 << GLIBTOP_MEM_CACHED) +
|
|
||||||
(1 << GLIBTOP_MEM_USER);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -46,23 +39,5 @@ glibtop_init_mem_s (glibtop *server)
|
|||||||
void
|
void
|
||||||
glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
|
glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_MEM, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_mem));
|
memset (buf, 0, sizeof (glibtop_mem));
|
||||||
|
|
||||||
if (table (TABLE_MEM, &tbl, NULL))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_MEM)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_mem;
|
|
||||||
|
|
||||||
buf->total = tbl.mem.total;
|
|
||||||
buf->used = tbl.mem.used;
|
|
||||||
buf->free = tbl.mem.free;
|
|
||||||
buf->shared = tbl.mem.shared;
|
|
||||||
buf->buffer = tbl.mem.buffer;
|
|
||||||
buf->cached = tbl.mem.cached;
|
|
||||||
|
|
||||||
buf->user = buf->total - buf->free - buf->shared - buf->buffer;
|
|
||||||
}
|
}
|
||||||
|
@@ -21,16 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
#include <glibtop/msg_limits.h>
|
#include <glibtop/msg_limits.h>
|
||||||
|
|
||||||
#include <sys/ipc.h>
|
static const unsigned long _glibtop_sysdeps_msg_limits = 0;
|
||||||
#include <sys/msg.h>
|
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_msg_limits =
|
|
||||||
(1 << GLIBTOP_IPC_MSGPOOL) + (1 << GLIBTOP_IPC_MSGMAP) +
|
|
||||||
(1 << GLIBTOP_IPC_MSGMAX) + (1 << GLIBTOP_IPC_MSGMNB) +
|
|
||||||
(1 << GLIBTOP_IPC_MSGMNI) + (1 << GLIBTOP_IPC_MSGSSZ) +
|
|
||||||
(1 << GLIBTOP_IPC_MSGTQL);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -45,21 +39,5 @@ glibtop_init_msg_limits_s (glibtop *server)
|
|||||||
void
|
void
|
||||||
glibtop_get_msg_limits_s (glibtop *server, glibtop_msg_limits *buf)
|
glibtop_get_msg_limits_s (glibtop *server, glibtop_msg_limits *buf)
|
||||||
{
|
{
|
||||||
struct msginfo msginfo;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_MSG_LIMITS, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_msg_limits));
|
memset (buf, 0, sizeof (glibtop_msg_limits));
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_msg_limits;
|
|
||||||
|
|
||||||
msgctl (0, IPC_INFO, (struct msqid_ds *) &msginfo);
|
|
||||||
|
|
||||||
buf->msgpool = msginfo.msgpool;
|
|
||||||
buf->msgmap = msginfo.msgmap;
|
|
||||||
buf->msgmax = msginfo.msgmax;
|
|
||||||
buf->msgmnb = msginfo.msgmnb;
|
|
||||||
buf->msgmni = msginfo.msgmni;
|
|
||||||
buf->msgssz = msginfo.msgssz;
|
|
||||||
buf->msgtql = msginfo.msgtql;
|
|
||||||
}
|
}
|
||||||
|
@@ -23,33 +23,6 @@
|
|||||||
|
|
||||||
#include <glibtop/open.h>
|
#include <glibtop/open.h>
|
||||||
|
|
||||||
/* =====================================================
|
|
||||||
* Linux kernel version information for procps utilities
|
|
||||||
* Copyright (c) 1996 Charles Blake <cblake@bbn.com>
|
|
||||||
*/
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
|
|
||||||
#define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z)
|
|
||||||
|
|
||||||
static int linux_version_code = 0;
|
|
||||||
|
|
||||||
static void set_linux_version(void) {
|
|
||||||
static struct utsname uts;
|
|
||||||
int x = 0, y = 0, z = 0; /* cleared in case sscanf() < 3 */
|
|
||||||
|
|
||||||
if (linux_version_code) return;
|
|
||||||
if (uname(&uts) == -1) /* failure most likely implies impending death */
|
|
||||||
exit(1);
|
|
||||||
if (sscanf(uts.release, "%d.%d.%d", &x, &y, &z) < 3)
|
|
||||||
fprintf(stderr, /* *very* unlikely to happen by accident */
|
|
||||||
"Non-standard uts for running kernel:\n"
|
|
||||||
"release %s=%d.%d.%d gives version code %d\n",
|
|
||||||
uts.release, x, y, z, LINUX_VERSION(x,y,z));
|
|
||||||
linux_version_code = LINUX_VERSION(x, y, z);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ======================================================= */
|
|
||||||
|
|
||||||
/* Opens pipe to gtop server. Returns 0 on success and -1 on error. */
|
/* Opens pipe to gtop server. Returns 0 on success and -1 on error. */
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -57,7 +30,4 @@ glibtop_open_s (glibtop *server, const char *program_name,
|
|||||||
const unsigned long features, const unsigned flags)
|
const unsigned long features, const unsigned flags)
|
||||||
{
|
{
|
||||||
server->name = program_name;
|
server->name = program_name;
|
||||||
|
|
||||||
set_linux_version ();
|
|
||||||
server->os_version_code = (unsigned long) linux_version_code;
|
|
||||||
}
|
}
|
||||||
|
@@ -38,7 +38,7 @@ glibtop_init_proc_args_s (glibtop *server)
|
|||||||
|
|
||||||
/* Provides detailed information about a process. */
|
/* Provides detailed information about a process. */
|
||||||
|
|
||||||
const char *
|
char *
|
||||||
glibtop_get_proc_args_s (glibtop *server, glibtop_proc_args *buf,
|
glibtop_get_proc_args_s (glibtop *server, glibtop_proc_args *buf,
|
||||||
pid_t pid, unsigned max_len)
|
pid_t pid, unsigned max_len)
|
||||||
{
|
{
|
||||||
|
@@ -1,180 +0,0 @@
|
|||||||
/* $Id$ */
|
|
||||||
|
|
||||||
/* Copyright (C) 1998-99 Martin Baulig
|
|
||||||
This file is part of LibGTop 1.0.
|
|
||||||
|
|
||||||
Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
|
|
||||||
|
|
||||||
LibGTop is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License,
|
|
||||||
or (at your option) any later version.
|
|
||||||
|
|
||||||
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with LibGTop; see the file COPYING. If not, write to the
|
|
||||||
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <glibtop/procdata.h>
|
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z)
|
|
||||||
|
|
||||||
#define BIT_SHIFT(x) (1 << (x % 32))
|
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_procdata_0 =
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_CMD) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_STATE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_UID) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_PID) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_PPID) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_PGRP) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_SESSION) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_TTY) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_TPGID) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_PRIORITY) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_NICE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_SIGNAL) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_BLOCKED) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_SIGIGNORE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_SIGCATCH) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_START_TIME) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_UTIME) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_STIME) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_CUTIME) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_CSTIME) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_SIZE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_RESIDENT) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_SHARE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_TRS) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_LRS) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_DRS) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_DT) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_VSIZE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_RSS) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_RSS_RLIM) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_TIMEOUT) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_IT_REAL_VALUE);
|
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_procdata_1 =
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_K_FLAGS) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_MIN_FLT) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_MAJ_FLT) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_CMIN_FLT) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_CMAJ_FLT) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_START_CODE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_END_CODE) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_START_STACK) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_KSTK_ESP) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_KSTK_EIP) +
|
|
||||||
BIT_SHIFT(GLIBTOP_PROCDATA_WCHAN);
|
|
||||||
|
|
||||||
/* Provides detailed information about a process. */
|
|
||||||
|
|
||||||
void
|
|
||||||
glibtop_get_procdata_s (glibtop *server, glibtop_procdata *buf, pid_t pid)
|
|
||||||
{
|
|
||||||
char input [BUFSIZ], *tmp;
|
|
||||||
struct stat statb;
|
|
||||||
int nread;
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, 0, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_procdata));
|
|
||||||
|
|
||||||
if (pid == 0) {
|
|
||||||
/* Client is only interested in the flags. */
|
|
||||||
buf->flags [0] = _glibtop_sysdeps_procdata_0;
|
|
||||||
buf->flags [1] = _glibtop_sysdeps_procdata_1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sprintf (input, "/proc/%d/stat", pid);
|
|
||||||
|
|
||||||
if (stat (input, &statb)) return;
|
|
||||||
|
|
||||||
buf->uid = statb.st_uid;
|
|
||||||
|
|
||||||
f = fopen (input, "r");
|
|
||||||
if (!f) return;
|
|
||||||
|
|
||||||
nread = fread (input, 1, BUFSIZ, f);
|
|
||||||
|
|
||||||
if (nread < 0) {
|
|
||||||
fclose (f);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
input [nread] = 0;
|
|
||||||
|
|
||||||
/* This is from guile-utils/gtop/proc/readproc.c */
|
|
||||||
|
|
||||||
/* split into "PID (cmd" and "<rest>" */
|
|
||||||
tmp = strrchr (input, ')');
|
|
||||||
*tmp = '\0'; /* replace trailing ')' with NUL */
|
|
||||||
/* parse these two strings separately, skipping the leading "(". */
|
|
||||||
memset (buf->cmd, 0, sizeof (buf->cmd));
|
|
||||||
sscanf (input, "%d (%39c", &buf->pid, buf->cmd);
|
|
||||||
sscanf(tmp + 2, /* skip space after ')' too */
|
|
||||||
"%c %d %d %d %d %d %lu %lu %lu %lu %lu "
|
|
||||||
"%ld %ld %ld %ld %d %d %lu %lu %ld %lu "
|
|
||||||
"%lu %lu %lu %lu %lu %lu %lu %d %d %d %d %lu",
|
|
||||||
&buf->state, &buf->ppid, &buf->pgrp, &buf->session,
|
|
||||||
&buf->tty, &buf->tpgid, &buf->k_flags, &buf->min_flt,
|
|
||||||
&buf->cmin_flt, &buf->maj_flt, &buf->cmaj_flt,
|
|
||||||
&buf->utime, &buf->stime, &buf->cutime, &buf->cstime,
|
|
||||||
&buf->priority, &buf->nice, &buf->timeout,
|
|
||||||
&buf->it_real_value, &buf->start_time, &buf->vsize,
|
|
||||||
&buf->rss, &buf->rss_rlim, &buf->start_code,
|
|
||||||
&buf->end_code, &buf->start_stack, &buf->kstk_esp,
|
|
||||||
&buf->kstk_eip, &buf->signal, &buf->blocked,
|
|
||||||
&buf->sigignore, &buf->sigcatch, &buf->wchan);
|
|
||||||
|
|
||||||
if (buf->tty == 0)
|
|
||||||
/* the old notty val, update elsewhere bef. moving to 0 */
|
|
||||||
buf->tty = -1;
|
|
||||||
|
|
||||||
if (server->os_version_code < LINUX_VERSION(1,3,39)) {
|
|
||||||
/* map old meanings to new */
|
|
||||||
buf->priority = 2*15 - buf->priority;
|
|
||||||
buf->nice = 15 - buf->nice;
|
|
||||||
}
|
|
||||||
if (server->os_version_code < LINUX_VERSION(1,1,30) && buf->tty != -1)
|
|
||||||
/* when tty wasn't full devno */
|
|
||||||
buf->tty = 4*0x100 + buf->tty;
|
|
||||||
|
|
||||||
fclose (f);
|
|
||||||
|
|
||||||
sprintf (input, "/proc/%d/statm", pid);
|
|
||||||
|
|
||||||
f = fopen (input, "r");
|
|
||||||
if (!f) return;
|
|
||||||
|
|
||||||
nread = fread (input, 1, BUFSIZ, f);
|
|
||||||
|
|
||||||
if (nread < 0) {
|
|
||||||
fclose (f);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
input [nread] = 0;
|
|
||||||
|
|
||||||
sscanf (input, "%ld %ld %ld %ld %ld %ld %ld",
|
|
||||||
&buf->size, &buf->resident, &buf->share,
|
|
||||||
&buf->trs, &buf->lrs, &buf->drs, &buf->dt);
|
|
||||||
|
|
||||||
fclose (f);
|
|
||||||
|
|
||||||
buf->flags [0] = _glibtop_sysdeps_procdata_0;
|
|
||||||
buf->flags [1] = _glibtop_sysdeps_procdata_1;
|
|
||||||
}
|
|
@@ -22,16 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/prockernel.h>
|
#include <glibtop/prockernel.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_proc_kernel = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_kernel =
|
|
||||||
(1 << GLIBTOP_PROC_KERNEL_K_FLAGS) + (1 << GLIBTOP_PROC_KERNEL_MIN_FLT) +
|
|
||||||
(1 << GLIBTOP_PROC_KERNEL_MAJ_FLT) + (1 << GLIBTOP_PROC_KERNEL_CMIN_FLT) +
|
|
||||||
(1 << GLIBTOP_PROC_KERNEL_CMAJ_FLT) + (1 << GLIBTOP_PROC_KERNEL_KSTK_ESP) +
|
|
||||||
(1 << GLIBTOP_PROC_KERNEL_KSTK_EIP) + (1 << GLIBTOP_PROC_KERNEL_NWCHAN);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -47,22 +40,5 @@ void
|
|||||||
glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf,
|
glibtop_get_proc_kernel_s (glibtop *server, glibtop_proc_kernel *buf,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_KERNEL, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_kernel));
|
memset (buf, 0, sizeof (glibtop_proc_kernel));
|
||||||
|
|
||||||
if (table (TABLE_PROC_KERNEL, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_KERNEL)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_kernel;
|
|
||||||
|
|
||||||
buf->min_flt = tbl.proc_kernel.min_flt;
|
|
||||||
buf->cmin_flt = tbl.proc_kernel.cmin_flt;
|
|
||||||
buf->maj_flt = tbl.proc_kernel.maj_flt;
|
|
||||||
buf->cmaj_flt = tbl.proc_kernel.cmaj_flt;
|
|
||||||
buf->kstk_esp = tbl.proc_kernel.kesp;
|
|
||||||
buf->kstk_eip = tbl.proc_kernel.keip;
|
|
||||||
buf->nwchan = tbl.proc_kernel.wchan;
|
|
||||||
}
|
}
|
||||||
|
@@ -22,14 +22,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/xmalloc.h>
|
|
||||||
#include <glibtop/proclist.h>
|
#include <glibtop/proclist.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
#define GLIBTOP_PROCLIST_FLAGS 3
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proclist =
|
static const unsigned long _glibtop_sysdeps_proclist = 0;
|
||||||
(1 << GLIBTOP_PROCLIST_TOTAL) + (1 << GLIBTOP_PROCLIST_NUMBER) +
|
|
||||||
(1 << GLIBTOP_PROCLIST_SIZE);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -39,48 +36,17 @@ glibtop_init_proclist_s (glibtop *server)
|
|||||||
server->sysdeps.proclist = _glibtop_sysdeps_proclist;
|
server->sysdeps.proclist = _glibtop_sysdeps_proclist;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BLOCK_COUNT 256
|
|
||||||
#define BLOCK_SIZE (BLOCK_COUNT * sizeof (unsigned))
|
|
||||||
|
|
||||||
/* Fetch list of currently running processes.
|
/* Fetch list of currently running processes.
|
||||||
*
|
*
|
||||||
* The interface of this function is a little bit different from the others:
|
* IMPORTANT NOTE:
|
||||||
* buf->flags is only set if the call succeeded, in this case pids_chain,
|
* On error, this function MUST return NULL and set buf->flags to zero !
|
||||||
* a list of the pids of all currently running processes is returned,
|
* On success, it returnes a pointer to a list of buf->number elements
|
||||||
* buf->number is the number of elements of this list and buf->size is
|
* each buf->size big. The total size is stored in buf->total. */
|
||||||
* the size of one single element (sizeof (unsigned)). The total size is
|
|
||||||
* stored in buf->total.
|
|
||||||
*
|
|
||||||
* The calling function has to free the memory to which a pointer is returned.
|
|
||||||
*
|
|
||||||
* On error, NULL is returned and buf->flags is zero. */
|
|
||||||
|
|
||||||
unsigned *
|
unsigned *
|
||||||
glibtop_get_proclist_s (glibtop *server, glibtop_proclist *buf,
|
glibtop_get_proclist_s (glibtop *server, glibtop_proclist *buf,
|
||||||
int64_t which, int64_t arg)
|
int64_t which, int64_t arg)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
unsigned *pids_chain;
|
|
||||||
struct proclist_args args;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROCLIST, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proclist));
|
memset (buf, 0, sizeof (glibtop_proclist));
|
||||||
|
return NULL;
|
||||||
args.which = which;
|
|
||||||
args.arg = arg;
|
|
||||||
|
|
||||||
if (table (TABLE_PROCLIST, &tbl, &args))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROCLIST)");
|
|
||||||
|
|
||||||
buf->size = sizeof (unsigned);
|
|
||||||
buf->number = tbl.proclist.nr_tasks;
|
|
||||||
|
|
||||||
buf->total = buf->number * sizeof (unsigned);
|
|
||||||
|
|
||||||
pids_chain = glibtop_malloc_r (server, buf->total);
|
|
||||||
|
|
||||||
memcpy (pids_chain, tbl.proclist.pids, buf->total);
|
|
||||||
|
|
||||||
return pids_chain;
|
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,7 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
#include <glibtop/error.h>
|
||||||
#include <glibtop/xmalloc.h>
|
#include <glibtop/xmalloc.h>
|
||||||
|
@@ -22,15 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/procmem.h>
|
#include <glibtop/procmem.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_proc_mem = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_mem =
|
|
||||||
(1 << GLIBTOP_PROC_MEM_SIZE) + (1 << GLIBTOP_PROC_MEM_VSIZE) +
|
|
||||||
(1 << GLIBTOP_PROC_MEM_RESIDENT) + (1 << GLIBTOP_PROC_MEM_SHARE) +
|
|
||||||
(1 << GLIBTOP_PROC_MEM_RSS) + (1 << GLIBTOP_PROC_MEM_RSS_RLIM);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -46,25 +40,5 @@ void
|
|||||||
glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf,
|
glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_MEM, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_mem));
|
memset (buf, 0, sizeof (glibtop_proc_mem));
|
||||||
|
|
||||||
if (table (TABLE_PROC_MEM, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_MEM)");
|
|
||||||
|
|
||||||
buf->rss = tbl.proc_mem.rss;
|
|
||||||
buf->rss_rlim = tbl.proc_mem.rlim;
|
|
||||||
|
|
||||||
if (table (TABLE_PROC_SEGMENT, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_SEGMENT)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_mem;
|
|
||||||
|
|
||||||
buf->vsize = tbl.proc_segment.vsize;
|
|
||||||
buf->size = tbl.proc_segment.size;
|
|
||||||
buf->resident = tbl.proc_segment.resident;
|
|
||||||
buf->share = tbl.proc_segment.shared;
|
|
||||||
}
|
}
|
||||||
|
@@ -21,21 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/procsegment.h>
|
#include <glibtop/procsegment.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_proc_segment = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_segment =
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_TEXT_RSS) +
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_SHLIB_RSS) +
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_DATA_RSS) +
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_STACK_RSS) +
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_DIRTY_SIZE) +
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_START_CODE) +
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_END_CODE) +
|
|
||||||
(1 << GLIBTOP_PROC_SEGMENT_START_STACK);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -51,27 +40,5 @@ void
|
|||||||
glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
|
glibtop_get_proc_segment_s (glibtop *server, glibtop_proc_segment *buf,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_SEGMENT, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_segment));
|
memset (buf, 0, sizeof (glibtop_proc_segment));
|
||||||
|
|
||||||
if (table (TABLE_PROC_MEM, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_MEM)");
|
|
||||||
|
|
||||||
buf->start_code = tbl.proc_mem.start_code;
|
|
||||||
buf->end_code = tbl.proc_mem.end_code;
|
|
||||||
buf->start_stack = tbl.proc_mem.start_stack;
|
|
||||||
|
|
||||||
if (table (TABLE_PROC_SEGMENT, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_SEGMENT)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_segment;
|
|
||||||
|
|
||||||
buf->text_rss = tbl.proc_segment.trs;
|
|
||||||
buf->shlib_rss = tbl.proc_segment.lrs;
|
|
||||||
buf->data_rss = tbl.proc_segment.drs;
|
|
||||||
buf->stack_rss = tbl.proc_segment.srs;
|
|
||||||
buf->dirty_size = tbl.proc_segment.dt;
|
|
||||||
}
|
}
|
||||||
|
@@ -22,14 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/procsignal.h>
|
#include <glibtop/procsignal.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_proc_signal = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_signal =
|
|
||||||
(1 << GLIBTOP_PROC_SIGNAL_SIGNAL) + (1 << GLIBTOP_PROC_SIGNAL_BLOCKED) +
|
|
||||||
(1 << GLIBTOP_PROC_SIGNAL_SIGIGNORE) + (1 << GLIBTOP_PROC_SIGNAL_SIGCATCH);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -45,19 +40,5 @@ void
|
|||||||
glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf,
|
glibtop_get_proc_signal_s (glibtop *server, glibtop_proc_signal *buf,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_SIGNAL, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_signal));
|
memset (buf, 0, sizeof (glibtop_proc_signal));
|
||||||
|
|
||||||
if (table (TABLE_PROC_SIGNAL, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_SIGNAL)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_signal;
|
|
||||||
|
|
||||||
buf->signal [0] = tbl.proc_signal.signal;
|
|
||||||
buf->blocked [0] = tbl.proc_signal.blocked;
|
|
||||||
buf->sigignore [0] = tbl.proc_signal.ignored;
|
|
||||||
buf->sigcatch [0] = tbl.proc_signal.caught;
|
|
||||||
}
|
}
|
||||||
|
@@ -22,14 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/procstate.h>
|
#include <glibtop/procstate.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_proc_state = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_state =
|
|
||||||
(1 << GLIBTOP_PROC_STATE_CMD) + (1 << GLIBTOP_PROC_STATE_STATE) +
|
|
||||||
(1 << GLIBTOP_PROC_STATE_UID) + (1 << GLIBTOP_PROC_STATE_GID);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -41,35 +36,9 @@ glibtop_init_proc_state_s (glibtop *server)
|
|||||||
|
|
||||||
/* Provides detailed information about a process. */
|
/* Provides detailed information about a process. */
|
||||||
|
|
||||||
#define NR_STATES 7
|
|
||||||
|
|
||||||
void
|
void
|
||||||
glibtop_get_proc_state_s (glibtop *server, glibtop_proc_state *buf,
|
glibtop_get_proc_state_s (glibtop *server, glibtop_proc_state *buf,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
static const char states [NR_STATES] =
|
|
||||||
{ 'R', 'S', 'D', 'Z', 'T', 'W', '.' };
|
|
||||||
unsigned state;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_STATE, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_state));
|
memset (buf, 0, sizeof (glibtop_proc_state));
|
||||||
|
|
||||||
if (table (TABLE_PROC_STATE, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_STATE)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_state;
|
|
||||||
|
|
||||||
memcpy (buf->cmd, tbl.proc_state.comm, sizeof (tbl.proc_state.comm));
|
|
||||||
|
|
||||||
buf->uid = tbl.proc_state.uid;
|
|
||||||
buf->gid = tbl.proc_state.state;
|
|
||||||
|
|
||||||
state = (unsigned) tbl.proc_state.state;
|
|
||||||
|
|
||||||
if (state >= NR_STATES)
|
|
||||||
state = NR_STATES;
|
|
||||||
|
|
||||||
buf->state = states [state];
|
|
||||||
}
|
}
|
||||||
|
@@ -22,17 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/proctime.h>
|
#include <glibtop/proctime.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_proc_time = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_time =
|
|
||||||
(1 << GLIBTOP_PROC_TIME_UTIME) + (1 << GLIBTOP_PROC_TIME_CUTIME) +
|
|
||||||
(1 << GLIBTOP_PROC_TIME_STIME) + (1 << GLIBTOP_PROC_TIME_CSTIME) +
|
|
||||||
(1 << GLIBTOP_PROC_TIME_RTIME) + (1 << GLIBTOP_PROC_TIME_FREQUENCY) +
|
|
||||||
(1 << GLIBTOP_PROC_TIME_TIMEOUT) + (1 << GLIBTOP_PROC_TIME_IT_REAL_VALUE) +
|
|
||||||
(1 << GLIBTOP_PROC_TIME_START_TIME);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -48,26 +40,5 @@ void
|
|||||||
glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf,
|
glibtop_get_proc_time_s (glibtop *server, glibtop_proc_time *buf,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_TIME, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_time));
|
memset (buf, 0, sizeof (glibtop_proc_time));
|
||||||
|
|
||||||
if (table (TABLE_PROC_TIME, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_TIME)");
|
|
||||||
|
|
||||||
buf->utime = tbl.proc_time.utime;
|
|
||||||
buf->stime = tbl.proc_time.stime;
|
|
||||||
|
|
||||||
buf->rtime = buf->utime + buf->stime;
|
|
||||||
|
|
||||||
buf->cutime = tbl.proc_time.cutime;
|
|
||||||
buf->cstime = tbl.proc_time.cstime;
|
|
||||||
|
|
||||||
buf->frequency = 100;
|
|
||||||
|
|
||||||
buf->timeout = tbl.proc_time.timeout;
|
|
||||||
buf->it_real_value = tbl.proc_time.it_real_value;
|
|
||||||
buf->start_time = tbl.proc_time.start_time;
|
|
||||||
}
|
}
|
||||||
|
@@ -22,18 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/procuid.h>
|
#include <glibtop/procuid.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_proc_uid = 0;
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_uid =
|
|
||||||
(1 << GLIBTOP_PROC_UID_UID) + (1 << GLIBTOP_PROC_UID_EUID) +
|
|
||||||
(1 << GLIBTOP_PROC_UID_GID) + (1 << GLIBTOP_PROC_UID_EGID) +
|
|
||||||
(1 << GLIBTOP_PROC_UID_PID) + (1 << GLIBTOP_PROC_UID_PPID) +
|
|
||||||
(1 << GLIBTOP_PROC_UID_PGRP) + (1 << GLIBTOP_PROC_UID_SESSION) +
|
|
||||||
(1 << GLIBTOP_PROC_UID_TTY) + (1 << GLIBTOP_PROC_UID_TPGID) +
|
|
||||||
(1 << GLIBTOP_PROC_UID_PRIORITY) + (1 << GLIBTOP_PROC_UID_NICE);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -43,63 +34,11 @@ glibtop_init_proc_uid_s (glibtop *server)
|
|||||||
server->sysdeps.proc_uid = _glibtop_sysdeps_proc_uid;
|
server->sysdeps.proc_uid = _glibtop_sysdeps_proc_uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define LINUX_VERSION(x,y,z) (0x10000*(x) + 0x100*(y) + z)
|
|
||||||
|
|
||||||
/* Provides detailed information about a process. */
|
/* Provides detailed information about a process. */
|
||||||
|
|
||||||
void
|
void
|
||||||
glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf,
|
glibtop_get_proc_uid_s (glibtop *server, glibtop_proc_uid *buf,
|
||||||
pid_t pid)
|
pid_t pid)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
long def_priority, priority, nice;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_PROC_UID, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_proc_uid));
|
memset (buf, 0, sizeof (glibtop_proc_uid));
|
||||||
|
|
||||||
if (table (TABLE_PROC_UID, &tbl, &pid))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_PROC_UID)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_uid;
|
|
||||||
|
|
||||||
buf->uid = tbl.proc_uid.uid;
|
|
||||||
buf->euid = tbl.proc_uid.euid;
|
|
||||||
buf->gid = tbl.proc_uid.gid;
|
|
||||||
buf->egid = tbl.proc_uid.egid;
|
|
||||||
|
|
||||||
buf->pid = tbl.proc_uid.pid;
|
|
||||||
buf->ppid = tbl.proc_uid.ppid;
|
|
||||||
buf->pgrp = tbl.proc_uid.pgrp;
|
|
||||||
buf->session = tbl.proc_uid.session;
|
|
||||||
buf->tty = tbl.proc_uid.tty;
|
|
||||||
buf->tpgid = tbl.proc_uid.tpgid;
|
|
||||||
|
|
||||||
/* scale priority and nice values from timeslices to -20..20 */
|
|
||||||
/* to make it look like a "normal" unix priority/nice value */
|
|
||||||
|
|
||||||
def_priority = tbl.proc_uid.def_priority;
|
|
||||||
|
|
||||||
priority = tbl.proc_uid.counter;
|
|
||||||
priority = 20 - (priority * 10 + def_priority / 2) / def_priority;
|
|
||||||
nice = tbl.proc_uid.priority;
|
|
||||||
nice = 20 - (nice * 20 + def_priority / 2) / def_priority;
|
|
||||||
|
|
||||||
buf->priority = (int) priority;
|
|
||||||
buf->nice = (int) nice;
|
|
||||||
|
|
||||||
if (buf->tty == 0)
|
|
||||||
/* the old notty val, update elsewhere bef. moving to 0 */
|
|
||||||
buf->tty = -1;
|
|
||||||
|
|
||||||
if (server->os_version_code < LINUX_VERSION(1,3,39)) {
|
|
||||||
/* map old meanings to new */
|
|
||||||
buf->priority = 2*15 - buf->priority;
|
|
||||||
buf->nice = 15 - buf->nice;
|
|
||||||
}
|
|
||||||
if (server->os_version_code < LINUX_VERSION(1,1,30) && buf->tty != -1)
|
|
||||||
/* when tty wasn't full devno */
|
|
||||||
buf->tty = 4*0x100 + buf->tty;
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proc_uid;
|
|
||||||
}
|
}
|
||||||
|
@@ -21,32 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
#include <glibtop/sem_limits.h>
|
#include <glibtop/sem_limits.h>
|
||||||
|
|
||||||
#include <sys/ipc.h>
|
static const unsigned long _glibtop_sysdeps_sem_limits = 0;
|
||||||
#include <sys/sem.h>
|
|
||||||
|
|
||||||
#ifdef _SEM_SEMUN_UNDEFINED
|
|
||||||
|
|
||||||
/* glibc 2.1 will no longer defines semun, instead it defines
|
|
||||||
* _SEM_SEMUN_UNDEFINED so users can define semun on their own.
|
|
||||||
* Thanks to Albert K T Hui <avatar@deva.net>. */
|
|
||||||
|
|
||||||
union semun
|
|
||||||
{
|
|
||||||
int val;
|
|
||||||
struct semid_ds *buf;
|
|
||||||
unsigned short int *array;
|
|
||||||
struct seminfo *__buf;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static unsigned long _glibtop_sysdeps_sem_limits =
|
|
||||||
(1 << GLIBTOP_IPC_SEMMAP) + (1 << GLIBTOP_IPC_SEMMNI) +
|
|
||||||
(1 << GLIBTOP_IPC_SEMMNS) + (1 << GLIBTOP_IPC_SEMMNU) +
|
|
||||||
(1 << GLIBTOP_IPC_SEMMSL) + (1 << GLIBTOP_IPC_SEMOPM) +
|
|
||||||
(1 << GLIBTOP_IPC_SEMUME) + (1 << GLIBTOP_IPC_SEMUSZ) +
|
|
||||||
(1 << GLIBTOP_IPC_SEMVMX) + (1 << GLIBTOP_IPC_SEMAEM);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -56,31 +34,10 @@ glibtop_init_sem_limits_s (glibtop *server)
|
|||||||
server->sysdeps.sem_limits = _glibtop_sysdeps_sem_limits;
|
server->sysdeps.sem_limits = _glibtop_sysdeps_sem_limits;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Provides information about sysv ipc limits. */
|
/* Provides information about sysv sem limits. */
|
||||||
|
|
||||||
void
|
void
|
||||||
glibtop_get_sem_limits_s (glibtop *server, glibtop_sem_limits *buf)
|
glibtop_get_sem_limits_s (glibtop *server, glibtop_sem_limits *buf)
|
||||||
{
|
{
|
||||||
struct seminfo seminfo;
|
|
||||||
union semun arg;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_SEM_LIMITS, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_sem_limits));
|
memset (buf, 0, sizeof (glibtop_sem_limits));
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_sem_limits;
|
|
||||||
|
|
||||||
arg.array = (ushort *) &seminfo;
|
|
||||||
semctl (0, 0, IPC_INFO, arg);
|
|
||||||
|
|
||||||
buf->semmap = seminfo.semmap;
|
|
||||||
buf->semmni = seminfo.semmni;
|
|
||||||
buf->semmns = seminfo.semmns;
|
|
||||||
buf->semmnu = seminfo.semmnu;
|
|
||||||
buf->semmsl = seminfo.semmsl;
|
|
||||||
buf->semopm = seminfo.semopm;
|
|
||||||
buf->semume = seminfo.semume;
|
|
||||||
buf->semusz = seminfo.semusz;
|
|
||||||
buf->semvmx = seminfo.semvmx;
|
|
||||||
buf->semaem = seminfo.semaem;
|
|
||||||
}
|
}
|
||||||
|
@@ -21,15 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
#include <glibtop/shm_limits.h>
|
#include <glibtop/shm_limits.h>
|
||||||
|
|
||||||
#include <sys/ipc.h>
|
static const unsigned long _glibtop_sysdeps_shm_limits = 0;
|
||||||
#include <sys/shm.h>
|
|
||||||
|
|
||||||
static unsigned long _glibtop_sysdeps_shm_limits =
|
|
||||||
(1 << GLIBTOP_IPC_SHMMAX) + (1 << GLIBTOP_IPC_SHMMIN) +
|
|
||||||
(1 << GLIBTOP_IPC_SHMMNI) + (1 << GLIBTOP_IPC_SHMSEG) +
|
|
||||||
(1 << GLIBTOP_IPC_SHMALL);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -44,19 +39,5 @@ glibtop_init_shm_limits_s (glibtop *server)
|
|||||||
void
|
void
|
||||||
glibtop_get_shm_limits_s (glibtop *server, glibtop_shm_limits *buf)
|
glibtop_get_shm_limits_s (glibtop *server, glibtop_shm_limits *buf)
|
||||||
{
|
{
|
||||||
struct shminfo shminfo;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_SHM_LIMITS, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_shm_limits));
|
memset (buf, 0, sizeof (glibtop_shm_limits));
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_shm_limits;
|
|
||||||
|
|
||||||
shmctl (0, IPC_INFO, (struct shmid_ds *) &shminfo);
|
|
||||||
|
|
||||||
buf->shmmax = shminfo.shmmax;
|
|
||||||
buf->shmmin = shminfo.shmmin;
|
|
||||||
buf->shmmni = shminfo.shmmni;
|
|
||||||
buf->shmseg = shminfo.shmseg;
|
|
||||||
buf->shmall = shminfo.shmall;
|
|
||||||
}
|
}
|
||||||
|
@@ -25,36 +25,4 @@
|
|||||||
#include <glibtop/signal.h>
|
#include <glibtop/signal.h>
|
||||||
|
|
||||||
const glibtop_signame glibtop_sys_siglist [] =
|
const glibtop_signame glibtop_sys_siglist [] =
|
||||||
{ { 1, "SIGHUP", NULL }, /* Hangup (POSIX). */
|
{ { 0, NULL, NULL } };
|
||||||
{ 2, "SIGINT", NULL }, /* Interrupt (ANSI). */
|
|
||||||
{ 3, "SIGQUIT", NULL }, /* Quit (POSIX). */
|
|
||||||
{ 4, "SIGILL", NULL }, /* Illegal instruction (ANSI). */
|
|
||||||
{ 5, "SIGTRAP", NULL }, /* Trace trap (POSIX). */
|
|
||||||
{ 6, "SIGABRT", NULL }, /* Abort (ANSI). */
|
|
||||||
{ 7, "SIGBUS", NULL }, /* BUS error (4.2 BSD). */
|
|
||||||
{ 8, "SIGFPE", NULL }, /* Floating-point exception (ANSI). */
|
|
||||||
{ 9, "SIGKILL", NULL }, /* Kill, unblockable (POSIX). */
|
|
||||||
{ 10, "SIGUSR1", NULL }, /* User-defined signal 1 (POSIX). */
|
|
||||||
{ 11, "SIGSEGV", NULL }, /* Segmentation violation (ANSI). */
|
|
||||||
{ 12, "SIGUSR2", NULL }, /* User-defined signal 2 (POSIX). */
|
|
||||||
{ 13, "SIGPIPE", NULL }, /* Broken pipe (POSIX). */
|
|
||||||
{ 14, "SIGALRM", NULL }, /* Alarm clock (POSIX). */
|
|
||||||
{ 15, "SIGTERM", NULL }, /* Termination (ANSI). */
|
|
||||||
{ 16, "SIGSTKFLT", NULL }, /* ??? */
|
|
||||||
{ 17, "SIGCHLD", NULL }, /* Child status has changed (POSIX). */
|
|
||||||
{ 18, "SIGCONT", NULL }, /* Continue (POSIX). */
|
|
||||||
{ 19, "SIGSTOP", NULL }, /* Stop, unblockable (POSIX). */
|
|
||||||
{ 20, "SIGTSTP", NULL }, /* Keyboard stop (POSIX). */
|
|
||||||
{ 21, "SIGTTIN", NULL }, /* Background read from tty (POSIX). */
|
|
||||||
{ 22, "SIGTTOU", NULL }, /* Background write to tty (POSIX). */
|
|
||||||
{ 23, "SIGURG", NULL }, /* Urgent condition on socket (4.2 BSD). */
|
|
||||||
{ 24, "SIGXCPU", NULL }, /* CPU limit exceeded (4.2 BSD). */
|
|
||||||
{ 25, "SIGXFSZ", NULL }, /* File size limit exceeded (4.2 BSD). */
|
|
||||||
{ 26, "SIGVTALRM", NULL }, /* Virtual alarm clock (4.2 BSD). */
|
|
||||||
{ 27, "SIGPROF", NULL }, /* Profiling alarm clock (4.2 BSD). */
|
|
||||||
{ 28, "SIGWINCH", NULL }, /* Window size change (4.3 BSD, Sun). */
|
|
||||||
{ 29, "SIGIO", NULL }, /* I/O now possible (4.2 BSD). */
|
|
||||||
{ 30, "SIGPWR", NULL }, /* Power failure restart (System V). */
|
|
||||||
{ 31, "SIGUNUSED", NULL },
|
|
||||||
{ 0, NULL, NULL },
|
|
||||||
};
|
|
||||||
|
@@ -21,16 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/swap.h>
|
#include <glibtop/swap.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_swap = 0;
|
||||||
|
|
||||||
static unsigned long _glibtop_sysdeps_swap =
|
|
||||||
(1 << GLIBTOP_SWAP_TOTAL) + (1 << GLIBTOP_SWAP_USED) +
|
|
||||||
(1 << GLIBTOP_SWAP_FREE) + (1 << GLIBTOP_SWAP_PAGEIN) +
|
|
||||||
(1 << GLIBTOP_SWAP_PAGEOUT);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -45,21 +39,5 @@ glibtop_init_swap_s (glibtop *server)
|
|||||||
void
|
void
|
||||||
glibtop_get_swap_s (glibtop *server, glibtop_swap *buf)
|
glibtop_get_swap_s (glibtop *server, glibtop_swap *buf)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_SWAP, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_swap));
|
memset (buf, 0, sizeof (glibtop_swap));
|
||||||
|
|
||||||
if (table (TABLE_SWAP, &tbl, NULL))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_SWAP)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_swap;
|
|
||||||
|
|
||||||
buf->total = tbl.swap.total;
|
|
||||||
buf->used = tbl.swap.used;
|
|
||||||
buf->free = tbl.swap.free;
|
|
||||||
|
|
||||||
buf->pagein = tbl.swap.pagein;
|
|
||||||
buf->pageout = tbl.swap.pageout;
|
|
||||||
}
|
}
|
||||||
|
@@ -21,14 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
|
||||||
#include <glibtop/uptime.h>
|
#include <glibtop/uptime.h>
|
||||||
|
|
||||||
#include "kernel.h"
|
static const unsigned long _glibtop_sysdeps_uptime = 0;
|
||||||
|
|
||||||
static unsigned long _glibtop_sysdeps_uptime =
|
|
||||||
(1 << GLIBTOP_UPTIME_UPTIME) + (1 << GLIBTOP_UPTIME_IDLETIME);
|
|
||||||
|
|
||||||
/* Init function. */
|
/* Init function. */
|
||||||
|
|
||||||
@@ -43,22 +39,5 @@ glibtop_init_uptime_s (glibtop *server)
|
|||||||
void
|
void
|
||||||
glibtop_get_uptime_s (glibtop *server, glibtop_uptime *buf)
|
glibtop_get_uptime_s (glibtop *server, glibtop_uptime *buf)
|
||||||
{
|
{
|
||||||
union table tbl;
|
|
||||||
|
|
||||||
glibtop_init_s (&server, GLIBTOP_SYSDEPS_UPTIME, 0);
|
|
||||||
|
|
||||||
memset (buf, 0, sizeof (glibtop_uptime));
|
memset (buf, 0, sizeof (glibtop_uptime));
|
||||||
|
|
||||||
if (table (TABLE_UPTIME, &tbl, NULL))
|
|
||||||
glibtop_error_io_r (server, "table(TABLE_UPTIME)");
|
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_uptime;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
fprintf (stderr, "Table (%u) = %lu, %lu\n",
|
|
||||||
TABLE_UPTIME, tbl.uptime.uptime, tbl.uptime.idle);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
buf->uptime = (double) tbl.uptime.uptime / HZ;
|
|
||||||
buf->idletime = (double) tbl.uptime.idle / HZ;
|
|
||||||
}
|
}
|
||||||
|
@@ -65,10 +65,12 @@ init_sysinfo (glibtop *server)
|
|||||||
p = strchr (buffer, ':');
|
p = strchr (buffer, ':');
|
||||||
if (!p) continue;
|
if (!p) continue;
|
||||||
|
|
||||||
|
/* Remove leading spaces from `p'. */
|
||||||
*p = '\0'; start = p; p++;
|
*p = '\0'; start = p; p++;
|
||||||
while (isspace (*p)) p++;
|
while (isspace (*p)) p++;
|
||||||
|
|
||||||
while ((start > buffer) && isspace (*start))
|
/* Remove trailing spaces from `buffer'. */
|
||||||
|
while ((start > buffer) && (*start) && isspace (*start))
|
||||||
*start-- = '\0';
|
*start-- = '\0';
|
||||||
|
|
||||||
key = g_strdup (buffer);
|
key = g_strdup (buffer);
|
||||||
|
6
sysdeps/solaris/.cvsignore
Normal file
6
sysdeps/solaris/.cvsignore
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
.deps
|
||||||
|
.libs
|
||||||
|
Makefile
|
||||||
|
Makefile.in
|
||||||
|
libgtop_sysdeps.la
|
||||||
|
*.lo
|
36
sysdeps/solaris/ChangeLog
Normal file
36
sysdeps/solaris/ChangeLog
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
1999-03-19 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
Added first kstat based implementation for Solaris 7.
|
||||||
|
|
||||||
|
* open.c (glibtop_open_s): Walk kstat list and save interesting
|
||||||
|
kstats in the `server->machine'.
|
||||||
|
|
||||||
|
* cpu.c: This can already provide `idle', `user' and `sys' with
|
||||||
|
full SMP support.
|
||||||
|
|
||||||
|
* swap.c: This can already provide `total', `used' and `free'.
|
||||||
|
|
||||||
|
1999-03-17 Martin Baulig <martin@home-of-linux.org>
|
||||||
|
|
||||||
|
Initial import of my Solaris 7 port.
|
||||||
|
|
||||||
|
* loadavg.c: We use getloadavg () to get the `loadavg' field.
|
||||||
|
|
||||||
|
* procdata.c: This file will handle all interaction with the
|
||||||
|
/proc filesystem.
|
||||||
|
(glibtop_get_proc_data_psinfo_s): Read `/proc/<pid>/psinfo' and
|
||||||
|
return the resulting `struct psinfo'.
|
||||||
|
(glibtop_get_proc_data_usage_s): Read `/proc/<pid>/usage' and
|
||||||
|
return the resulting `struct prusage'.
|
||||||
|
|
||||||
|
* proclist.c: We use readdir () on /proc to get the list of
|
||||||
|
all pids.
|
||||||
|
|
||||||
|
* procstate.c: Read `uid' and `gid' from the `struct psinfo'.
|
||||||
|
|
||||||
|
* proctime.c: Read `start_time', `rtime', `utime' and `stime'
|
||||||
|
from the `struct prusage'.
|
||||||
|
|
||||||
|
* procuid.c: Read `euid', `uid', `egid', `gid', `pid', `ppid',
|
||||||
|
`pgrp', `session' and `tty' from the `struct psinfo'.
|
||||||
|
|
18
sysdeps/solaris/Makefile.am
Normal file
18
sysdeps/solaris/Makefile.am
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@
|
||||||
|
|
||||||
|
INCLUDES = @INCLUDES@
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libgtop_sysdeps.la
|
||||||
|
|
||||||
|
libgtop_sysdeps_la_SOURCES = open.c close.c siglist.c cpu.c mem.c swap.c \
|
||||||
|
uptime.c loadavg.c shm_limits.c msg_limits.c \
|
||||||
|
sem_limits.c proclist.c procstate.c procuid.c \
|
||||||
|
proctime.c procmem.c procsignal.c prockernel.c \
|
||||||
|
procsegment.c procargs.c procmap.c netload.c \
|
||||||
|
ppp.c procdata.c
|
||||||
|
|
||||||
|
libgtop_sysdeps_la_LDFLAGS = $(LT_VERSION_INFO)
|
||||||
|
|
||||||
|
include_HEADERS = glibtop_server.h glibtop_machine.h
|
||||||
|
noinst_HEADERS = glibtop_private.h
|
||||||
|
|
@@ -21,20 +21,10 @@
|
|||||||
Boston, MA 02111-1307, USA.
|
Boston, MA 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __GLIBTOP_KERNEL_KERNEL_H__
|
#include <glibtop/close.h>
|
||||||
#define __GLIBTOP_KERNEL_KERNEL_H__
|
|
||||||
|
|
||||||
#include <linux/unistd.h>
|
/* Closes pipe to gtop server. */
|
||||||
#include <linux/table.h>
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
void
|
||||||
|
glibtop_close_s (glibtop *server)
|
||||||
#include <syscall.h>
|
{ }
|
||||||
|
|
||||||
BEGIN_LIBGTOP_DECLS
|
|
||||||
|
|
||||||
extern int table (int, union table *, const void *);
|
|
||||||
|
|
||||||
END_LIBGTOP_DECLS
|
|
||||||
|
|
||||||
#endif
|
|
83
sysdeps/solaris/cpu.c
Normal file
83
sysdeps/solaris/cpu.c
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
|
#include <glibtop/error.h>
|
||||||
|
#include <glibtop/cpu.h>
|
||||||
|
|
||||||
|
static const unsigned long _glibtop_sysdeps_cpu =
|
||||||
|
(1 << GLIBTOP_CPU_TOTAL) + (1 << GLIBTOP_CPU_USER) +
|
||||||
|
(1 << GLIBTOP_CPU_SYS) + (1 << GLIBTOP_CPU_IDLE) +
|
||||||
|
(1 << GLIBTOP_XCPU_TOTAL) + (1 << GLIBTOP_XCPU_USER) +
|
||||||
|
(1 << GLIBTOP_XCPU_SYS) + (1 << GLIBTOP_XCPU_IDLE);
|
||||||
|
|
||||||
|
/* Init function. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_cpu_s (glibtop *server)
|
||||||
|
{
|
||||||
|
server->sysdeps.cpu = _glibtop_sysdeps_cpu;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Provides information about cpu usage. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
|
||||||
|
{
|
||||||
|
kstat_ctl_t *kc = server->machine.kc;
|
||||||
|
cpu_stat_t cpu_stat;
|
||||||
|
int cpu, ncpu;
|
||||||
|
kid_t ret;
|
||||||
|
|
||||||
|
memset (buf, 0, sizeof (glibtop_cpu));
|
||||||
|
|
||||||
|
ncpu = server->ncpu;
|
||||||
|
if (ncpu > GLIBTOP_NCPU) ncpu = GLIBTOP_NCPU;
|
||||||
|
|
||||||
|
for (cpu = 0; cpu < ncpu; cpu++) {
|
||||||
|
kstat_t *ksp = server->machine.cpu_stat_kstat [cpu];
|
||||||
|
if (!ksp) continue;
|
||||||
|
|
||||||
|
ret = kstat_read (kc, ksp, &cpu_stat);
|
||||||
|
|
||||||
|
if (ret == -1) {
|
||||||
|
glibtop_warn_io_r (server, "kstat_read (cpu_stat%d)", cpu);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf->xcpu_idle [cpu] = cpu_stat.cpu_sysinfo.cpu [CPU_IDLE];
|
||||||
|
buf->xcpu_user [cpu] = cpu_stat.cpu_sysinfo.cpu [CPU_IDLE];
|
||||||
|
buf->xcpu_sys [cpu] = cpu_stat.cpu_sysinfo.cpu [CPU_IDLE];
|
||||||
|
|
||||||
|
buf->xcpu_total [cpu] = buf->xcpu_idle [cpu] + buf->xcpu_user [cpu] +
|
||||||
|
buf->xcpu_sys [cpu];
|
||||||
|
|
||||||
|
buf->idle += cpu_stat.cpu_sysinfo.cpu [CPU_IDLE];
|
||||||
|
buf->user += cpu_stat.cpu_sysinfo.cpu [CPU_USER];
|
||||||
|
buf->sys += cpu_stat.cpu_sysinfo.cpu [CPU_KERNEL];
|
||||||
|
}
|
||||||
|
|
||||||
|
buf->total = buf->idle + buf->user + buf->sys;
|
||||||
|
|
||||||
|
buf->flags = _glibtop_sysdeps_cpu;
|
||||||
|
}
|
54
sysdeps/solaris/glibtop_machine.h
Normal file
54
sysdeps/solaris/glibtop_machine.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, March 1999.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GLIBTOP_MACHINE_H__
|
||||||
|
#define __GLIBTOP_MACHINE_H__
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <procfs.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <kstat.h>
|
||||||
|
#include <sys/sysinfo.h>
|
||||||
|
|
||||||
|
BEGIN_LIBGTOP_DECLS
|
||||||
|
|
||||||
|
typedef struct _glibtop_machine glibtop_machine;
|
||||||
|
|
||||||
|
struct _glibtop_machine
|
||||||
|
{
|
||||||
|
uid_t uid, euid;
|
||||||
|
gid_t gid, egid;
|
||||||
|
|
||||||
|
kstat_ctl_t *kc;
|
||||||
|
|
||||||
|
kstat_t *vminfo_kstat;
|
||||||
|
hrtime_t vminfo_snaptime;
|
||||||
|
vminfo_t vminfo;
|
||||||
|
|
||||||
|
kstat_t *cpu_stat_kstat [64];
|
||||||
|
};
|
||||||
|
|
||||||
|
END_LIBGTOP_DECLS
|
||||||
|
|
||||||
|
#endif __GLIBTOP_MACHINE_H__
|
45
sysdeps/solaris/glibtop_private.h
Normal file
45
sysdeps/solaris/glibtop_private.h
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, March 1999.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GLIBTOP_PRIVATE_H__
|
||||||
|
#define __GLIBTOP_PRIVATE_H__
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
|
#include <glibtop/error.h>
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <procfs.h>
|
||||||
|
#include <kstat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
BEGIN_LIBGTOP_DECLS
|
||||||
|
|
||||||
|
/* Read /proc/<pid>/psinfo */
|
||||||
|
int glibtop_get_proc_data_psinfo_s (glibtop *server, struct psinfo *psinfo, pid_t pid);
|
||||||
|
|
||||||
|
/* Read /proc/<pid>/usage */
|
||||||
|
int glibtop_get_proc_data_usage_s (glibtop *server, struct prusage *prusage, pid_t pid);
|
||||||
|
|
||||||
|
END_LIBGTOP_DECLS
|
||||||
|
|
||||||
|
#endif __GLIBTOP_PRIVATE_H__
|
52
sysdeps/solaris/glibtop_server.h
Normal file
52
sysdeps/solaris/glibtop_server.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GLIBTOP_SERVER_H__
|
||||||
|
#define __GLIBTOP_SERVER_H__
|
||||||
|
|
||||||
|
BEGIN_LIBGTOP_DECLS
|
||||||
|
|
||||||
|
#define GLIBTOP_SUID_CPU 0
|
||||||
|
#define GLIBTOP_SUID_MEM 0
|
||||||
|
#define GLIBTOP_SUID_SWAP 0
|
||||||
|
#define GLIBTOP_SUID_UPTIME 0
|
||||||
|
#define GLIBTOP_SUID_LOADAVG 0
|
||||||
|
#define GLIBTOP_SUID_SHM_LIMITS 0
|
||||||
|
#define GLIBTOP_SUID_MSG_LIMITS 0
|
||||||
|
#define GLIBTOP_SUID_SEM_LIMITS 0
|
||||||
|
#define GLIBTOP_SUID_PROCLIST 0
|
||||||
|
#define GLIBTOP_SUID_PROC_STATE 0
|
||||||
|
#define GLIBTOP_SUID_PROC_UID 0
|
||||||
|
#define GLIBTOP_SUID_PROC_MEM 0
|
||||||
|
#define GLIBTOP_SUID_PROC_TIME 0
|
||||||
|
#define GLIBTOP_SUID_PROC_SIGNAL 0
|
||||||
|
#define GLIBTOP_SUID_PROC_KERNEL 0
|
||||||
|
#define GLIBTOP_SUID_PROC_SEGMENT 0
|
||||||
|
#define GLIBTOP_SUID_PROC_ARGS 0
|
||||||
|
#define GLIBTOP_SUID_PROC_MAP 0
|
||||||
|
#define GLIBTOP_SUID_NETLOAD 0
|
||||||
|
#define GLIBTOP_SUID_PPP 0
|
||||||
|
|
||||||
|
END_LIBGTOP_DECLS
|
||||||
|
|
||||||
|
#endif
|
51
sysdeps/solaris/loadavg.c
Normal file
51
sysdeps/solaris/loadavg.c
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, March 1999.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
|
#include <glibtop/loadavg.h>
|
||||||
|
|
||||||
|
#include <sys/loadavg.h>
|
||||||
|
|
||||||
|
static const unsigned long _glibtop_sysdeps_loadavg =
|
||||||
|
(1 << GLIBTOP_LOADAVG_LOADAVG);
|
||||||
|
|
||||||
|
/* Init function. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_loadavg_s (glibtop *server)
|
||||||
|
{
|
||||||
|
server->sysdeps.loadavg = _glibtop_sysdeps_loadavg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Provides load averange. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_loadavg_s (glibtop *server, glibtop_loadavg *buf)
|
||||||
|
{
|
||||||
|
memset (buf, 0, sizeof (glibtop_loadavg));
|
||||||
|
|
||||||
|
if (getloadavg (buf->loadavg, 3))
|
||||||
|
return;
|
||||||
|
|
||||||
|
buf->flags = _glibtop_sysdeps_loadavg;
|
||||||
|
}
|
43
sysdeps/solaris/mem.c
Normal file
43
sysdeps/solaris/mem.c
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
|
#include <glibtop/mem.h>
|
||||||
|
|
||||||
|
static const unsigned long _glibtop_sysdeps_mem = 0;
|
||||||
|
|
||||||
|
/* Init function. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_mem_s (glibtop *server)
|
||||||
|
{
|
||||||
|
server->sysdeps.mem = _glibtop_sysdeps_mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Provides information about memory usage. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_mem_s (glibtop *server, glibtop_mem *buf)
|
||||||
|
{
|
||||||
|
memset (buf, 0, sizeof (glibtop_mem));
|
||||||
|
}
|
43
sysdeps/solaris/msg_limits.c
Normal file
43
sysdeps/solaris/msg_limits.c
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
|
#include <glibtop/msg_limits.h>
|
||||||
|
|
||||||
|
static const unsigned long _glibtop_sysdeps_msg_limits = 0;
|
||||||
|
|
||||||
|
/* Init function. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_msg_limits_s (glibtop *server)
|
||||||
|
{
|
||||||
|
server->sysdeps.msg_limits = _glibtop_sysdeps_msg_limits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Provides information about sysv ipc limits. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_msg_limits_s (glibtop *server, glibtop_msg_limits *buf)
|
||||||
|
{
|
||||||
|
memset (buf, 0, sizeof (glibtop_msg_limits));
|
||||||
|
}
|
45
sysdeps/solaris/netload.c
Normal file
45
sysdeps/solaris/netload.c
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, October 1998.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glibtop.h>
|
||||||
|
#include <glibtop/error.h>
|
||||||
|
#include <glibtop/netload.h>
|
||||||
|
|
||||||
|
static const unsigned long _glibtop_sysdeps_netload = 0;
|
||||||
|
|
||||||
|
/* Init function. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_init_netload_s (glibtop *server)
|
||||||
|
{
|
||||||
|
server->sysdeps.netload = _glibtop_sysdeps_netload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Provides network statistics. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_get_netload_s (glibtop *server, glibtop_netload *buf,
|
||||||
|
const char *interface)
|
||||||
|
{
|
||||||
|
memset (buf, 0, sizeof (glibtop_netload));
|
||||||
|
}
|
65
sysdeps/solaris/open.c
Normal file
65
sysdeps/solaris/open.c
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
|
Contributed by Martin Baulig <martin@home-of-linux.org>, April 1998.
|
||||||
|
|
||||||
|
LibGTop is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
LibGTop is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with LibGTop; see the file COPYING. If not, write to the
|
||||||
|
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <glibtop/open.h>
|
||||||
|
|
||||||
|
/* Opens pipe to gtop server. Returns 0 on success and -1 on error. */
|
||||||
|
|
||||||
|
void
|
||||||
|
glibtop_open_s (glibtop *server, const char *program_name,
|
||||||
|
const unsigned long features, const unsigned flags)
|
||||||
|
{
|
||||||
|
kstat_t *ksp;
|
||||||
|
|
||||||
|
server->name = program_name;
|
||||||
|
|
||||||
|
server->machine.kc = kstat_open ();
|
||||||
|
|
||||||
|
for (ksp = server->machine.kc->kc_chain; ksp != NULL; ksp = ksp->ks_next) {
|
||||||
|
if (!strcmp (ksp->ks_class, "vm") && !strcmp (ksp->ks_name, "vminfo")) {
|
||||||
|
server->machine.vminfo_kstat = ksp;
|
||||||
|
kstat_read (server->machine.kc, ksp, &server->machine.vminfo);
|
||||||
|
server->machine.vminfo_snaptime = ksp->ks_snaptime;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp (ksp->ks_class, "misc") && !strncmp (ksp->ks_name, "cpu_stat", 8)) {
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
if ((sscanf (ksp->ks_name+8, "%d", &cpu) != 1) || (cpu > 63))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (cpu >= server->ncpu)
|
||||||
|
server->ncpu = cpu+1;
|
||||||
|
|
||||||
|
server->machine.cpu_stat_kstat [cpu] = ksp;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!server->machine.kc)
|
||||||
|
glibtop_error_io_r (server, "kstat_open ()");
|
||||||
|
|
||||||
|
fprintf (stderr, "Sleeping 2 seconds, please wait ...\n");
|
||||||
|
sleep (2);
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user