[parisc-linux] Generic light-weight syscall.

Matthew Wilcox willy@debian.org
Fri, 25 Jul 2003 12:37:00 +0100

On Fri, Jul 25, 2003 at 02:37:40AM -0400, Carlos O'Donell wrote:
> Any thoughts about how one should implement some type of lightweight
> syscall for our glibc to use?

I have lots of thoughts ;-)

> We already have the makings of a simple system for SET_THREAD_SELF (e.g.
> seting cr27, the thread register, from userpsace), and I want to extend
> this to:
> exchange_and_add (volatile uint32_t *mem, int val)
> atomic_add (volatile uint32_t *mem, int val)
> compare_and_swap (volatile long int *p, long int oldval, long int newval)

Sure.  Sounds like a great idea.

> o---> libc 
>  --> exchange_and_add 
>   ==> Params into kernel
>    ==> disable interrupts on the current processor
>     ==> take a semaphore to keep other cpu's out
>     ==> do work 
>     ==> release semaphore
>    ==> reenable i-bit
>   --> back into userspace and done.
> This _must_ be very very fast, and appear atomic to userspace.

I'd say a spinlock rather than a semaphore.  And likely a special-cased
one too.

> Perhaps adding other pages instead of 0xE0 for set_thread_self might be
> the simplest way to do this? The area after the linux gateway page
> perhaps? Which seems to be the start of the next 4k page? Would this be
> possible? e.g. branch to 0x1000 (not 0x100 which is the current syscall
> branch).

I'd say we should keep doing stuff on our existing gateway page until we
exhaust it.  We've got plenty of space -- 248 instruction slots left before
0xE0, and a lot of space left after the syscall handler.

On a related subject, fast gettimeofday is always a popular idea.  I'm not
sure of all the ramifications of, for example, mapping a user-read-only,
system-writable data page after the gateway page (can't put the data
on the existing gateway page; a page that can do privilege promotion
isn't readable/writable).  If we have only one CPU update the data on
that page, time shouldn't go backwards ... right?

"It's not Hollywood.  War is real, war is primarily not about defeat or
victory, it is about death.  I've seen thousands and thousands of dead bodies.
Do you think I want to have an academic debate on this subject?" -- Robert Fisk