[comp.sys.hp] existence of getrusage

gds@spam.istc.sri.com (Greg Skinner) (05/07/88)

I'm working on an application that requires me to know how many IPC
messages a Sun Unix RPC server has sent and received.  I was using the
getrusage(2) system call to do this.  So far I have not found any
references to the getrusage(2) system call in the HP-UX 6.0
documentation.  I would like to know if this call is supported in this
release, and if not, how I might go about getting this information
(perhaps via reading /hp-ux or kmem)?

--gregbo

gregc@miro.Berkeley.EDU.berkeley.edu (Greg Couch) (05/08/88)

Enclosed is a very unofficial, but extremely useful way of adding 4.2
system calls to hp-ux 5.x and 6.0.  You may need to put some of the
include files from /etc/conf/h in /usr/include/sys (e.g. resource.h),
or grab them from a BSD system.  I added getdtablesiz, getpagesize,
getpriority, setpriority, setregid, setreuid, getrusage, getrlimit,
and setrlimit.  If you only add the system calls I did, you should be
able to use the Makefile's as is.  Read sys/hpux-patchinfo to get an
idea of how the patching works and some caveats.

	- Greg Couch
	gregc@miro.Berkeley.EDU
	gregc@Berkeley.EDU

-----
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by gregc at ebi on Sat May  7 17:56:40 1988
#
# This archive contains:
#	libc	sys	
#

LANG=""; export LANG

echo mkdir - libc
mkdir libc

echo x - libc/setreuid.s
cat >libc/setreuid.s <<'@EOF'
define(`SYSCALL_NAME', setreuid)dnl
define(`SYSCALL_NUMBER', 0x7e)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/setreuid.s

echo x - libc/getpagesize.s
cat >libc/getpagesize.s <<'@EOF'
define(`SYSCALL_NAME', getpagesize)dnl
define(`SYSCALL_NUMBER', 0x40)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/getpagesize.s

echo x - libc/Makefile
cat >libc/Makefile <<'@EOF'
#
#	Create system call stubs for libc and libc_p
#

SHELL	= /bin/sh

LIBC	= /lib/libc.a
LIBC_P	= /lib/libc_p.a

OBJS	= getdtablesiz.o getpagesize.o getpriority.o setpriority.o \
	setregid.o setreuid.o getrusage.o getrlimit.o setrlimit.o

.s.o:
	m4 -DPROFILE $*.s | ${AS} -o profiled/$*.o
	m4 $*.s | ${AS} -o $*.o

all:	${OBJS}

install: all
	ar ru ${LIBC} ${OBJS}
	cd profiled; ar ru ${LIBC_P} ${OBJS}

clean:
	rm -f ${OBJS}
	cd profiled; rm -f ${OBJS}

#

${OBJS}:	SYS.m4
@EOF

chmod 444 libc/Makefile

echo x - libc/getdtablesiz.s
cat >libc/getdtablesiz.s <<'@EOF'
define(`SYSCALL_NAME', getdtablesize)dnl
define(`SYSCALL_NUMBER', 0x59)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/getdtablesiz.s

echo x - libc/getpriority.s
cat >libc/getpriority.s <<'@EOF'
define(`SYSCALL_NAME', getpriority)dnl
define(`SYSCALL_NUMBER', 0x64)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/getpriority.s

echo x - libc/setpriority.s
cat >libc/setpriority.s <<'@EOF'
define(`SYSCALL_NAME', setpriority)dnl
define(`SYSCALL_NUMBER', 0x60)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/setpriority.s

echo x - libc/SYS.m4
cat >libc/SYS.m4 <<'@EOF'
define(concat,$1$2$3$4$5$6$7$8$9)dnl
	allow_p1sub

	global	concat(_, SYSCALL_NAME)
	global	__cerror
concat(_, SYSCALL_NAME):
ifdef(`PROFILE',
`	global	mcount
	mov.l	&Lcount, %a0
	jsr	mcount
')dnl
ifelse(eval(SYSCALL_NUMBER/128), 0,
`	movq	&SYSCALL_NUMBER, %d0
',`	mov.l	&SYSCALL_NUMBER, %d0
')dnl
	trap	&0x0
	bcc.b	L11
	jmp	__cerror
L11:
	rts
ifdef(`PROFILE',
	data
	lalign	4
Lcount:
	space	4
)dnl
@EOF

chmod 444 libc/SYS.m4

echo x - libc/getrusage.s
cat >libc/getrusage.s <<'@EOF'
define(`SYSCALL_NAME', getrusage)dnl
define(`SYSCALL_NUMBER', 0x75)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/getrusage.s

echo x - libc/setregid.s
cat >libc/setregid.s <<'@EOF'
define(`SYSCALL_NAME', setregid)dnl
define(`SYSCALL_NUMBER', 0x7f)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/setregid.s

echo x - libc/getrlimit.s
cat >libc/getrlimit.s <<'@EOF'
define(`SYSCALL_NAME', getrlimit)dnl
define(`SYSCALL_NUMBER', 0x90)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/getrlimit.s

echo x - libc/setrlimit.s
cat >libc/setrlimit.s <<'@EOF'
define(`SYSCALL_NAME', setrlimit)dnl
define(`SYSCALL_NUMBER', 0x91)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/setrlimit.s

echo x - libc/PROTO.s
cat >libc/PROTO.s <<'@EOF'
define(`SYSCALL_NAME', NAME)dnl
define(`SYSCALL_NUMBER', NUMBER)dnl
include(`SYS.m4')dnl
@EOF

chmod 444 libc/PROTO.s

echo mkdir - libc/profiled
mkdir libc/profiled

chmod 755 libc/profiled

chmod 755 libc

echo mkdir - sys
mkdir sys

echo x - sys/syscall.instal
cat >sys/syscall.instal <<'@EOF'
/^#/	{ next }
{
	printf "sysent+(%s*8)?W %s\n", $2, $3
	printf "sysent+(%s*8)+4?W %s\n", $2, $1
}
END	{ print "$q" }
@EOF

chmod 444 sys/syscall.instal

echo x - sys/Makefile
cat >sys/Makefile <<'@EOF'
#
#	Install new system calls in kernel 
#
SHELL=/bin/sh

syscall:
	awk -f syscall.check < syscall.stubs | adb /hp-ux /dev/kmem
	@echo ""
	@echo "every line should have been:"
	@echo "	sysent+offset: 0x0 _nosys	'# system-call-name'"
	@echo "if not,"
	@echo "	edit the syscall.stubs file to use different system call #'s"
	@echo "if so,"
	@echo "	make syscall-install"

syscall-install:
	awk -f syscall.install < syscall.stubs | adb -w /hp-ux /dev/kmem
	@echo /etc/reboot the system to see change

version:
	@ver=`uname -v` ; \
	if [ $$ver = A ] ; then echo single-user system ; \
	elif [ $$ver = B ] ; then echo 16-user system ; \
	elif [ $$ver = C ] ; then echo 32-user system ; \
	elif [ $$ver = D ] ; then echo 64-user system ; \
	elif [ $$ver = U ] ; then echo unlimited-number-of-users system ; fi ;

version-install:
#	use 4100 for a single-user system, 4200 for 16-user,
#	4300 for 32-user, 4400 for 64-user, and 5500 for unlimited.
#	the 0x1b offset is from the version field offset in <sys/utsname.h>
	echo "utsname+0x1b?w 0x4200" | adb -w /hp-ux /dev/kmem
	@echo /etc/reboot the system to see change

nobody-install:
#	set the nfs nobody value which controls what uid a remote root
#	has on our exported filesystems.  Here we only export to trusted
#	hosts.
	echo "nobody?W 0" | adb -w /hp-ux /dev/kmem
	@echo /etc/reboot the system to see change
@EOF

chmod 644 sys/Makefile

echo x - sys/syscall.check
cat >sys/syscall.check <<'@EOF'
/^#/	{ next }
{
	printf "sysent+(%s*8)/Xp\"'%s %s'\"\n", $2, $3, $1
}
END	{ print "$q" }
@EOF

chmod 444 sys/syscall.check

echo x - sys/hpux-patchinfo
sed 's/^@//' >sys/hpux-patchinfo <<'@EOF'
@From chris@ic.Berkeley.EDU Wed Jan 20 23:53:16 1988
Received: from ic.Berkeley.EDU by degas.Berkeley.EDU (5.58/1.26)
	id AA26174; Wed, 20 Jan 88 23:53:12 PST
Received: by ic.Berkeley.EDU (5.57/1.26)
	id AA07726; Wed, 20 Jan 88 23:55:48 PST
Date: Wed, 20 Jan 88 23:55:48 PST
@From: chris@ic.Berkeley.EDU (Chris Guthrie)
Message-Id: <8801210755.AA07726@ic.Berkeley.EDU>
To: gregc@degas.Berkeley.EDU
Subject: Re:  hpux and rdist
Status: RO

Here's an old note I did on it.


A systematic way to recover the Berkeley System calls from HP-UX

HP-UX is based on a 4.2 bsd kernel.  Unfortunately, HP decided
overlay this kernel with a system five compatible interface.  Often,
this meant chopping out useful 4.2 system calls.  Fortunately,
someone with a bit of UNIX experience (and access to Berkeley source)
can put back some of these system calls in the following manner:

1)  Choose a needed system call.  For example, we will use getpriority()
    which has two arguments.
2)  You will need to adb the kernel:  adb -w /hp-ux /dev/kmem
3)  Collect the following information:

    Arguments:					2
    Handler location in kernel:			0x58a8
    (this can be had be typing getpriority=X in adb)
    syscall number				0x64 (100 base 10)
    (This comes out of sysent.c in the 4.2 source)
    sysent table location in kernel:		0x320
    (this is equal to the syscall number * 0x8)

4)  Check the sysent to make sure it hasn't been used for something else:
    in adb:
	    sysent+320?Xp
    should give:
	    sysent+0x320:  0x0			_nosys

5)  Now, use adb to fill these numbers in.
    First the argument count:
	    sysent+320?W 0x2
	    sysent+320/W 0x2
    Then the handler location:
	    sysent+324?W 0x58a8
	    sysent+324/W 0x58a8
    Your kernel is now modified.

6)  Now, for a user entry to this syscall, modify the following assembly
    entry in getpriority.s, and compile it with your program:

		global	__cerror;
err:		jmp	__cerror;

		global	_getpriority;
_getpriority:	movq	&0x64,%d0;
		trap	&0x0;
		bcc.b	_getpriority+0xC;
		jmp	__cerror;
		rts;


Note that the 0x64 represents the syscall number.  It must be changed
for other syscalls as should the label "getpriority."

With most syscalls, this should work.

Caveats:
   If you cannot find a handler for the syscall, you can't patch it in.
   For instance (sadly) rename doesn't exist.
   I have only installed getpriority, setpriority, and setreuid on my
   machines.  I add them as I need them.  Since I don't have HP-UX
   source (yet), I can never be sure that they work until I try them.
   Even then, there might be unseen problems.  Finally, this hacking
   no doubt qualifies as non-standard software as far as the software
   response center is concerned.

@EOF

chmod 444 sys/hpux-patchinfo

echo x - sys/syscall.stubs
cat >sys/syscall.stubs <<'@EOF'
# call number must be in hex for adb
# name		call #	# args
getdtablesize	0x59	0
getpagesize	0x40	0
getpriority	0x64	2
setpriority	0x60	3
setregid	0x7f	2
setreuid	0x7e	2
getrusage	0x75	2
getrlimit	0x90	2
setrlimit	0x91	2
@EOF

chmod 444 sys/syscall.stubs

chmod 755 sys

exit 0

rml@hpfcdc.HP.COM (Bob Lenk) (05/12/88)

>   For instance (sadly) rename doesn't exist.

Rename(2) exists and is supported as of 6.0 (and 2.0 on the series 800).

No comments on the rest of the posting.

Back to the original question about getrusage(2), there is no supported
way to get the requested functionality.

		Bob Lenk
		{ihnp4, hplabs}!hpfcla!rml
		rml%hpfcla@hplabs.hp.com