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