Ralf gently pointed out that there was the possibility of needing to
fault the page for *p, which couldn't occur with ints off. So here's an
updated version...
#ifndef CONFIG_CPU_HAS_LLSC
/* this version is inherently single processor! */
/* borrowed from Linux-2.4.0-test12 */
/* mlock/munlock added - jadb@redhat.com */
case MIPS_ATOMIC_SET: {
unsigned int tmp;
unsigned int flags;
p = (int *) arg1;
errno = verify_area(VERIFY_WRITE, p, sizeof(*p));
if (errno)
return errno;
errno = 0;
/* need to prevent page faults with ints off */
if (sys_mlock(p,sizeof(*p)) != 0)
{
return -EAGAIN;
}
/* actually _do_ the exchange */
save_and_cli(flags);
errno |= __get_user(tmp, p);
errno |= __put_user(arg2, p);
restore_flags(flags);
/* i don't think sys_munlock can fail here, and */
/* I wouldn't know what to do if it did, so no */
/* reason to pay attention to the return value */
sys_munlock(p,sizeof(*p));
return tmp;
}
#endif
comments anyone?
Joe
Maciej W. Rozycki wrote:
On Thu, 25 Jan 2001, Joe deBlaquiere wrote:
So I've got the following code which seems to work... (I can't use the
ll/sc ops on the Vr41xx since they are not implemeted!)
#ifdef CONFIG_CPU_VR41XX
You are perfectly correct, with the exception you really want to make it:
#ifndef CONFIG_CPU_HAS_LLSC
as that's the correct option -- just undef it in arch/mips/config.in for
your CPU like it's done for others already.
Shame on me I haven't sent the patch for MIPS_ATMIC_SET for non-ll/sc
processors yet. I have it but it needs a few minor cleanups.
Ralf, BTW, what do you think if we send a segfault on a memory access
violation instead of returning an error? That would make the behaviour of
MIPS_ATMIC_SET consistent for any memory contents. Does anything actually
rely on the function to return an error in such a situation?
Maciej
--
Joe deBlaquiere
Red Hat, Inc.
307 Wynn Drive
Huntsville AL, 35805
voice : (256)-704-9200
fax : (256)-837-3839
|