Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Oct 1995 14:43:02 -0400 (EDT)
From:      "Ron G. Minnich" <rminnich@Sarnoff.COM>
To:        Theo de Raadt <deraadt@theos.com>, hackers@freebsd.org
Subject:   anatomy of rfork, part 1: minherit
Message-ID:  <Pine.SUN.3.91.951025143802.28686A-100000@terra>

next in thread | raw e-mail | index | archive | help
i've had enough q's on this, and time is tight, so i thought i'd just put 
out a few messages on how to do rfork. The code is small, so bear with 
me. 

To do rfork as i needed it, you really need two parts to start with: a 
way to share data after fork and a way to share file tables after fork. 
AIX/370 implemented DCE threads with these two things. I thought i'd show 
minherit first. I don't know the plan9 environment erasing stuff, 
although that is pretty easy to add -- could be useful. 

minherit is shown below. Calls are much like mprotect: 
minherit(caddr, len, new inherit values)

Look in vm/vm_inherit.h

All you need to do is take the mprotect call code and redo it just a bit 
so it calls vm_map_inherit. Here we go: 

struct mprotect_args {
	caddr_t	addr;
	int	len;
	int	inherit;
};
int
minherit(p, uap, retval)
	struct proc *p;
	struct mprotect_args *uap;
	int *retval;
{
	vm_offset_t addr;
	vm_size_t size;
	register vm_inherit_t inherit;

#ifdef DEBUG
	printf("minherit(%d): addr %x len %x prot %d\n",
		       p->p_pid, uap->addr, uap->len, uap->inherit);
#endif

	addr = (vm_offset_t)uap->addr;
	if ((addr & PAGE_MASK) || uap->len < 0)
		return(EINVAL);
	size = (vm_size_t)uap->len;
	inherit = uap->inherit;

	switch (vm_map_inherit(&p->p_vmspace->vm_map, addr, addr+size, 
			inherit)) {
	case KERN_SUCCESS:
#ifdef DEBUG
	printf("works\n");
#endif
		return (0);
	case KERN_PROTECTION_FAILURE:
#ifdef DEBUG
	printf("fails\n");
#endif
		return (EACCES);
	}
#ifdef DEBUG
	printf("return einval\n");
#endif
	return (EINVAL);
}




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.SUN.3.91.951025143802.28686A-100000>