More tweaks on Linux and Solaris.

This commit is contained in:
rsc 2003-11-25 02:11:11 +00:00
parent f7012583e9
commit 64bcfff3a1
14 changed files with 118 additions and 75 deletions

View file

@ -10,7 +10,6 @@ static char *_psstate[] = {
"Ready",
"Rendezvous",
};
#endif
static char*
psstate(int s)
@ -19,6 +18,7 @@ psstate(int s)
return "unknown";
return _psstate[s];
}
#endif
void
_schedinit(void *arg)

View file

@ -1,9 +1,12 @@
#include "threadimpl.h"
static void
launchersparc(int o0, int o1, int o2, int o3, int o4,
launchersparc(uint o0, uint o1, uint o2, uint o3,
uint o4, uint o5, uint o6, uint o7,
void (*f)(void *arg), void *arg)
{
if(0) print("ls %x %x %x %x %x %x %x %x %x %x at %x\n",
o0, o1, o2, o3, o4, o5, o6, o7, f, arg, &o0);
(*f)(arg);
threadexits(nil);
}
@ -13,13 +16,26 @@ _threadinitstack(Thread *t, void (*f)(void*), void *arg)
{
ulong *tos, *stk;
/*
* This is a bit more complicated than it should be,
* because we need to set things up so that gotolabel
* (which executes a return) gets us into launchersparc.
* So all the registers are going to be renamed before
* we get there. The input registers here become the
* output registers there, which is useless.
* The input registers there are inaccessible, so we
* have to give launchersparc enough arguments that
* everything ends up in the stack.
*/
tos = (ulong*)&t->stk[t->stksize&~7];
stk = tos;
--stk;
*--stk = (ulong)arg;
*--stk = (ulong)f;
stk -= 25; /* would love to understand this */
t->sched.link = (ulong)launchersparc - 8;
t->sched.input[6] = 0;
t->sched.sp = (ulong)stk - 0x5c;
t->sched.sp = (ulong)stk;
if(0) print("tis %x %x at %x\n", f, arg, t->sched.sp);
}