[TUHS] link() syscall implementation

Oliver Lehmann lehmann at ans-netz.de
Sat Nov 14 22:34:15 AEST 2015


Hi,

I'm struggling on reimplementing the C code for the link()
syscall.

Usually on SYSIII and V7 you have something like:


link()
{
	register struct inode *ip, *xp;
	register struct a {
		char	*target;
		char	*linkname;
	} *uap;

[...]
	u.u_dirp = (caddr_t)uap->linkname;
[...]
}

The problem now on my system is, u_dirp in the user struct
is saddr_t (*long) and not caddr_t (*char) and I wonder how
I have to assign uap->linkname.
The original ASM code looks like:

_link::
{
	dec	fp,#~L2
	ldm	_stkseg+4(fp),r8,#6
	ldl	rr8,_u+36
[...]
	ldl	rr2,rr8(#4)
	ldl	rr4,rr2
	and	r4,#32512
	ldl	_u+78,rr4
[...]

I had the same problem already 7 years ago but didn't came up
with a solution back then.

http://home.salatschuessel.net/quest/problems.php

What came to my mind in the meantime is the following and maybe
someone can check if this is right:

1. _u+78 (u.u_dirp) contains a pointer - so what is assigned
    here in ASM is a memory address.
2. The memory notation for accessing segmented data on Z8001
    seems to be 0xSS00XXXX where SS is the segment number up
    to 127 and XXXX is the relative address in that segment.
3. This means ANDing 0xSS00 with 0x7F00 means to strip out
    all invalid data from the segment-position of the address,
    to make sure it  can only be between 0 and 127 (0x0000 and
    0x7F00).

I wonder how the assignment of uap->linkname to u.u_dirp has
to be done correctly?!



More information about the TUHS mailing list