From 7db0c756d68ee6b7be9d9fa071b14c101726dac1 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Tue, 25 May 1999 18:09:27 +0000 Subject: First attempt at making this work on NetBSD 1.4. --- sysdeps/freebsd/glibtop_suid.h | 2 ++ sysdeps/freebsd/mem.c | 58 +++++++++++++++++++++++++++++++++++++----- sysdeps/freebsd/procmap.c | 6 +++++ sysdeps/freebsd/procmem.c | 36 +++++++++++++++++++++++++- sysdeps/freebsd/swap.c | 34 +++++++++++++++++++++++++ 5 files changed, 129 insertions(+), 7 deletions(-) (limited to 'sysdeps/freebsd') diff --git a/sysdeps/freebsd/glibtop_suid.h b/sysdeps/freebsd/glibtop_suid.h index d8e609d1..ed99fca4 100644 --- a/sysdeps/freebsd/glibtop_suid.h +++ b/sysdeps/freebsd/glibtop_suid.h @@ -26,6 +26,8 @@ BEGIN_LIBGTOP_DECLS +#include + #define KI_PROC(ki) (&(ki))->kp_proc) #define KI_EPROC(ki) (&(ki))->kp_eproc) diff --git a/sysdeps/freebsd/mem.c b/sysdeps/freebsd/mem.c index 63a71c41..39b76e7a 100644 --- a/sysdeps/freebsd/mem.c +++ b/sysdeps/freebsd/mem.c @@ -31,6 +31,10 @@ #include #include +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) +#include +#endif + static const unsigned long _glibtop_sysdeps_mem = (1L << GLIBTOP_MEM_TOTAL) + (1L << GLIBTOP_MEM_USED) + (1L << GLIBTOP_MEM_FREE) + @@ -53,7 +57,10 @@ static int pageshift; /* log base 2 of the pagesize */ /* nlist structure for kernel access */ static struct nlist nlst [] = { - { "_cnt" }, +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + { "_bufpages" }, + { 0 } +#else #if defined(__bsdi__) { "_bufcachemem" }, #elif defined(__FreeBSD__) @@ -61,7 +68,9 @@ static struct nlist nlst [] = { #else { "_bufpages" }, #endif + { "_cnt" }, { 0 } +#endif }; /* MIB array for sysctl */ @@ -72,6 +81,10 @@ static int mib [] = { CTL_VM, VM_TOTAL }; static int mib [] = { CTL_VM, VM_METER }; #endif +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) +static int mib_uvmexp [] = { CTL_VM, VM_UVMEXP }; +#endif + /* Init function. */ void @@ -104,9 +117,15 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) { struct vmtotal vmt; size_t length_vmt; +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + struct uvmexp uvmexp; + size_t length_uvmexp; +#else struct vmmeter vmm; +#endif u_int v_used_count; u_int v_total_count; + u_int v_free_count; int bufspace; glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_MEM), 0); @@ -123,18 +142,26 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) /* Get the data from sysctl */ length_vmt = sizeof (vmt); if (sysctl (mib, 2, &vmt, &length_vmt, NULL, 0)) { - glibtop_warn_io_r (server, "sysctl"); + glibtop_warn_io_r (server, "sysctl (vmt)"); return; } - + +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + length_uvmexp = sizeof (uvmexp); + if (sysctl (mib_uvmexp, 2, &uvmexp, &length_uvmexp, NULL, 0)) { + glibtop_warn_io_r (server, "sysctl (uvmexp)"); + return; + } +#else /* Get the data from kvm_* */ - if (kvm_read (server->machine.kd, nlst[0].n_value, + if (kvm_read (server->machine.kd, nlst[1].n_value, &vmm, sizeof (vmm)) != sizeof (vmm)) { glibtop_warn_io_r (server, "kvm_read (cnt)"); return; } +#endif - if (kvm_read (server->machine.kd, nlst[1].n_value, + if (kvm_read (server->machine.kd, nlst[0].n_value, &bufspace, sizeof (bufspace)) != sizeof (bufspace)) { glibtop_warn_io_r (server, "kvm_read (bufspace)"); return; @@ -144,23 +171,42 @@ glibtop_get_mem_p (glibtop *server, glibtop_mem *buf) #if defined(__FreeBSD__) v_total_count = vmm.v_page_count; +#else +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + v_total_count = uvmexp.reserve_kernel + + uvmexp.free + uvmexp.wired + uvmexp.active + + uvmexp.inactive; + fprintf (stderr, "TEST: %d - %d\n", v_total_count, + uvmexp.npages); #else v_total_count = vmm.v_kernel_pages + vmm.v_free_count + vmm.v_wire_count + vmm.v_active_count + vmm.v_inactive_count; #endif +#endif +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + v_used_count = uvmexp.active + uvmexp.inactive; + v_free_count = uvmexp.free; +#else v_used_count = vmm.v_active_count + vmm.v_inactive_count; + v_free_count = vmm.v_free_count; +#endif buf->total = (u_int64_t) pagetok (v_total_count) << LOG1024; buf->used = (u_int64_t) pagetok (v_used_count) << LOG1024; - buf->free = (u_int64_t) pagetok (vmm.v_free_count) << LOG1024; + buf->free = (u_int64_t) pagetok (v_free_count) << LOG1024; #ifdef __FreeBSD__ buf->cached = (u_int64_t) pagetok (vmm.v_cache_count) << LOG1024; #endif +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + buf->locked = (u_int64_t) pagetok (uvmexp.wired) << LOG1024; +#else buf->locked = (u_int64_t) pagetok (vmm.v_wire_count) << LOG1024; +#endif + buf->shared = (u_int64_t) pagetok (vmt.t_rmshr) << LOG1024; #if __FreeBSD__ diff --git a/sysdeps/freebsd/procmap.c b/sysdeps/freebsd/procmap.c index 2c9cc251..1090d4b2 100644 --- a/sysdeps/freebsd/procmap.c +++ b/sysdeps/freebsd/procmap.c @@ -147,9 +147,12 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, if (entry.eflags & (MAP_ENTRY_IS_A_MAP|MAP_ENTRY_IS_SUB_MAP)) continue; #endif +#else +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) #else if (entry.is_a_map || entry.is_sub_map) continue; +#endif #endif maps [i].flags = _glibtop_sysdeps_map_entry; @@ -169,6 +172,8 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, i++; +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) +#else if (!entry.object.vm_object) continue; @@ -178,6 +183,7 @@ glibtop_get_proc_map_p (glibtop *server, glibtop_proc_map *buf, (unsigned long) entry.object.vm_object, &object, sizeof (object)) != sizeof (object)) glibtop_error_io_r (server, "kvm_read (object)"); +#endif #ifdef __FreeBSD__ /* If the object is of type vnode, add its size */ diff --git a/sysdeps/freebsd/procmem.c b/sysdeps/freebsd/procmem.c index 5217e671..9492ba6d 100644 --- a/sysdeps/freebsd/procmem.c +++ b/sysdeps/freebsd/procmem.c @@ -45,6 +45,14 @@ #include #include +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) +/* Fixme ... */ +#undef _KERNEL +#define _UVM_UVM_AMAP_I_H_ 1 +#define _UVM_UVM_MAP_I_H_ 1 +#include +#endif + static const unsigned long _glibtop_sysdeps_proc_mem = (1L << GLIBTOP_PROC_MEM_SIZE) + (1L << GLIBTOP_PROC_MEM_VSIZE) + @@ -94,7 +102,11 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, struct kinfo_proc *pinfo; struct vm_map_entry entry, *first; struct vmspace *vms, vmspace; +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + struct uvm_object object; +#else struct vm_object object; +#endif struct plimit plimit; int count; @@ -173,11 +185,29 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, if (entry.eflags & (MAP_ENTRY_IS_A_MAP|MAP_ENTRY_IS_SUB_MAP)) continue; #endif +#else +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + if (UVM_ET_ISSUBMAP (&entry)) + continue; #else if (entry.is_a_map || entry.is_sub_map) continue; #endif +#endif + +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + if (!entry.object.uvm_obj) + continue; + + /* We're only interested in `uvm_obj's */ + if (kvm_read (server->machine.kd, + (unsigned long) entry.object.uvm_obj, + &object, sizeof (object)) != sizeof (object)) { + glibtop_warn_io_r (server, "kvm_read (object)"); + return; + } +#else if (!entry.object.vm_object) continue; @@ -189,7 +219,7 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, glibtop_warn_io_r (server, "kvm_read (object)"); return; } - +#endif /* If the object is of type vnode, add its size */ #ifdef __FreeBSD__ @@ -197,8 +227,12 @@ glibtop_get_proc_mem_p (glibtop *server, glibtop_proc_mem *buf, continue; buf->share += object.un_pager.vnp.vnp_size; +#else +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + buf->share += pagetok (object.uo_npages) << LOG1024; #else buf->share += object.size; +#endif #endif } diff --git a/sysdeps/freebsd/swap.c b/sysdeps/freebsd/swap.c index d051a2d3..cc30cb2a 100644 --- a/sysdeps/freebsd/swap.c +++ b/sysdeps/freebsd/swap.c @@ -69,15 +69,24 @@ static struct nlist nlst [] = { #elif defined(__NetBSD__) +#if (__NetBSD_Version__ >= 104000000) +#include +#include +#else #include +#endif #endif +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) +static int mib_uvmexp [] = { CTL_VM, VM_UVMEXP }; +#else /* nlist structure for kernel access */ static struct nlist nlst2 [] = { { "_cnt" }, { 0 } }; +#endif /* Init function. */ @@ -100,10 +109,12 @@ glibtop_init_swap_p (glibtop *server) #endif #endif +#if !(defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)) if (kvm_nlist (server->machine.kd, nlst2) != 0) { glibtop_warn_io_r (server, "kvm_nlist (cnt)"); return; } +#endif server->sysdeps.swap = _glibtop_sysdeps_swap; } @@ -145,8 +156,13 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) int nswap, i; int avail = 0, inuse = 0; +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + struct uvmexp uvmexp; + size_t length_uvmexp; +#else /* To get `pagein' and `pageout'. */ struct vmmeter vmm; +#endif static int swappgsin = -1; static int swappgsout = -1; @@ -157,6 +173,13 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) if (server->sysdeps.swap == 0) return; +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + length_uvmexp = sizeof (uvmexp); + if (sysctl (mib_uvmexp, 2, &uvmexp, &length_uvmexp, NULL, 0)) { + glibtop_warn_io_r (server, "sysctl (uvmexp)"); + return; + } +#else /* This is used to get the `pagein' and `pageout' members. */ if (kvm_read (server->machine.kd, nlst2[0].n_value, @@ -164,6 +187,7 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) glibtop_warn_io_r (server, "kvm_read (cnt)"); return; } +#endif if (swappgsin < 0) { buf->pagein = 0; @@ -172,19 +196,29 @@ glibtop_get_swap_p (glibtop *server, glibtop_swap *buf) #ifdef __FreeBSD__ buf->pagein = vmm.v_swappgsin - swappgsin; buf->pageout = vmm.v_swappgsout - swappgsout; +#else +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + buf->pagein = uvmexp.swapins - swappgsin; + buf->pageout = uvmexp.swapouts - swappgsout; #else buf->pagein = vmm.v_swpin - swappgsin; buf->pageout = vmm.v_swpout - swappgsout; +#endif #endif } #ifdef __FreeBSD__ swappgsin = vmm.v_swappgsin; swappgsout = vmm.v_swappgsout; +#else +#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000) + swappgsin = uvmexp.swapins; + swappgsout = uvmexp.swapouts; #else swappgsin = vmm.v_swpin; swappgsout = vmm.v_swpout; #endif +#endif #if defined(__FreeBSD__) -- cgit v1.2.1