SP_OFFSET, jthreads, pthreads

Godmar Back gback at cs.utah.edu
Wed Aug 5 09:22:27 PDT 1998

> > Basically, you'll have to determine SP_OFFSET for the alpha;
> SP is the stack pointer?
> What does that offset signify?
> How much bytes a standard subroutine call puts on the stack?

 SP_OFFSET gives the offset in the jmpbuf buffer at which the stack
pointer is stored.

> > you'll have to find out whether its frame pointer needs to be
> > manipulated too, and if so, define FP_OFFSET.  You can either look in
> > <setjmp.h>, or I can send you a test program that finds out what it
> > is.
> Please do so!

I'll append sp_offset.c.

> > The macro FRAMEOKAY() is only used by the version that uses jit AND
> > unix-internal.  For unix-jthreads, I felt that putting this macro in jit.h
> > would violate encapsulation, so I replaced it with jthread_on_current_stack.
> > It is only used from within the threading system, namely in TnextFrame.
> Is there some FAQ or HOWTO about this?

It was discussed on this mailing list before, check the archives.

> What are jthreads and why would anyone want to use them in lieu of
> pthreads?

jthreads is the current Kaffe threading system, it is a simple preemptive
user-level threads package based on Kaffe's original non-preemptive
internal threads package (now called "internal").

A public pthreads port is not available.  There are some problems with
pthreads, too.  See Dan Lambright's mail about their pthreads port in the

> > The other macros in jit.h, as far as I can see, are still needed and you must 
> > implement them properly for the alpha.
> Mhh.
> If you give me a small program that uses them, I will try my best.

 regression/NullPointerTest.java is about as small as it gets.
Try regression/TestNative.java also.

	- Godmar


#include <setjmp.h>
#include <assert.h>
#include <stdio.h>
#include <signal.h>
#include <sys/wait.h>

#define STACK_SIZE      65536
#define STACK_COPY      128
#define GET_SP(E)       (((void**)(E))[SP_OFFSET])
#define SET_SP(E, V)    ((void**)(E))[SP_OFFSET] = (V)

int fork();

char new_stack[STACK_SIZE];
jmp_buf buf, buf2;

void alarm()
    longjmp(buf2, 1);

static void
    char x;
    if (&x > new_stack && &new_stack[sizeof new_stack] > &x)
        printf("#define\tSP_OFFSET\t%d\n", SP_OFFSET);

main(int ac, char *av[])
    int  stat;
    pid_t child;
    void *oldsp, *newsp;

    for (; SP_OFFSET < sizeof (buf) / sizeof (int); SP_OFFSET++) {

        if ((child = fork()) == 0) {    /* child */

            if (setjmp(buf)) 

            oldsp = GET_SP(buf);
            newsp = &new_stack[(sizeof new_stack)/2];
            SET_SP(buf, newsp);
            memcpy(newsp, oldsp, STACK_COPY);
            longjmp(buf, 1);

        } else {        /* parent */

            if (!setjmp(buf2)) {
                signal(SIGALRM, alarm);
                assert(child == wait(&stat));
            /* else timed out, continue */
    return 0;

More information about the kaffe mailing list