<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
--></style>
</head>
<body class='hmmessage'>
The registers are spilled..to the stack right?..by virtue of longjmp issuing ta 3.<BR>
Which, while I haven't thought it through, I bet must be done.<BR>
You can see various refererences to flushrs in IA64 setjmp/longjmp as well.<BR>
(In college Professer Teitelbaum tricked me on a test with "implement setjmp/longjmp for sparc." I implemented them years ago for the simple 65816 but I failed to consider register windows..)<BR>
 <BR>
 <BR>
> <A href="http://www.sics.se/~psm/sparcstack.html">http://www.sics.se/~psm/sparcstack.html</A><BR>
 <BR>
 <BR>
"Writing a library for multithreaded execution is an example that requires explicit flushing, as is <TT>longjmp()</TT>."<BR>
 <BR>
 > <A href="http://blogs.sun.com/d/entry/flush_register_windows">http://blogs.sun.com/d/entry/flush_register_windows</A><BR>
 <BR>
"Note that setjmp and longjmp which are sometimes used as part of code to implement context switching already have the appropriate flushes in them. "<BR>
 <BR>
 <BR>
So I contend:<BR>
 <BR>
void SaveRegsInStack(void)<BR>
{<BR>
#if defined(__sparc) || defined(__ia64__)<BR>
  jmpbuf j;<BR>
  if (!setjmp(j)) longjmp(j, 1);<BR>
#endif<BR>
}<BR>
 <BR>
It might not be ideal, but given that ta 3 is expensive anyway, and in one of the users there is already a setjmp call, I think it is pretty reasonable.<BR>
 <BR>
 <BR>
Once things are working better, unless you disagree, I'll make this change in ThreadPThreadC.c and RTStackC.c.<BR>
ThreadPThreadC.c already has a setjmp.<BR>
The ProcessMe/ProcessLive interaction will change slightly.<BR>
ProcessMe will pass stackbase to ProcessLive.<BR>
stack_grows_down will be in C to be accessible to ProcessLive.<BR>
I had this all written but have to back up and restore general health..<BR>
 <BR>
 <BR>
I've seen code that does ta 83 instead of ta 3 on Linux.<BR>
But I've also seen that that isn't right.<BR>
This way we can sweep all these issues away fairly well, for all sparc32, sparc64, and ia64 targets.<BR>
 <BR>
 - Jay<BR><BR> <BR>
<HR id=stopSpelling>
From: hosking@cs.purdue.edu<BR>Date: Sat, 21 Nov 2009 22:19:12 -0500<BR>To: jay.krell@cornell.edu<BR>CC: m3devel@elegosoft.com<BR>Subject: Re: [M3devel] SaveRegsInStack<BR><BR><BASE>
<DIV><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxApple-style-span>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span>Are we sure that &jb is a sufficient sp?  What about other registers saved by the "ta 3"?  They don't necessarily end up in jb.</SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span><BR></SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxApple-style-span>On 21 Nov 2009, at 20:11, Jay K wrote:</SPAN></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></SPAN></DIV>
<DIV><BR class=ecxApple-interchange-newline>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; WORD-SPACING: 0px" class=ecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxhmmessage>Tony,<BR>Looking at the disassembly of /usr/lib/libc.so and /usr/lib/sparcv9/libc.so, both longjmps contain ta  3.<BR>So how about:<BR>void *RTStack__SaveRegsInStack(void)<BR>{<BR>  jmp_buf jb;<BR>  if (setjmp(jb))<BR>  {<BR>    longjmp(jb, 1); /* contains ta 3 */<BR>    abort(); /* unreachable */<BR>  }<BR>  else<BR>  {<BR>    return &jb;<BR>  }<BR>}<BR> <BR>Too wasteful?<BR> <BR> - Jay<BR><BR><BR> <BR>
<HR id=ecxstopSpelling>
From:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>To:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>Date: Sun, 22 Nov 2009 00:12:44 +0000<BR>CC:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: Re: [M3devel] SaveRegsInStack<BR><BR>SOLsun doesn't like the current source:<BR> <BR>C compiler failed compiling: ../src/runtime/SOLsun/RTStackC.c<BR>new source -> compiling ThreadPThreadC.c<BR>"../src/thread/PTHREAD/ThreadPThreadC.c", line 310: asm statement illegal outside function<BR>"../src/thread/PTHREAD/ThreadPThreadC.c", line 316: asm statement illegal outside function<BR>"../src/thread/PTHREAD/ThreadPThreadC.c", line 317: asm statement illegal outside function<BR>"../src/thread/PTHREAD/ThreadPThreadC.c", line 325: asm statement illegal outside function<BR>"../src/thread/PTHREAD/ThreadPThreadC.c", line 326: asm statement illegal outside function<BR>"../src/thread/PTHREAD/ThreadPThreadC.c", line 327: asm statement illegal outside function<BR>"../src/thread/PTHREAD/ThreadPThreadC.c", line 349: cannot recover from previous<BR><BR> - Jay<BR> <BR>
<HR id=ecxecxstopSpelling>
From:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>To:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>CC:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: RE: [M3devel] SaveRegsInStack<BR>Date: Sat, 21 Nov 2009 23:45:42 +0000<BR><BR>(or RTMachineC.c)<BR> <BR> - Jay<BR> <BR>
<HR id=ecxecxecxstopSpelling>
From:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>To:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>Date: Sat, 21 Nov 2009 23:40:03 +0000<BR>CC:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: Re: [M3devel] SaveRegsInStack<BR><BR>
<DIV> > No, those don't have the desired effect on SPARC.</DIV> <BR>ok. I was somewhat guessing.<BR> <BR> > Why wouldn't SPARC* all have stack walkers?<BR> <BR>Because I'm lazy and doubt anyone cares much about SPARC{32,64}_{LINUX,FREEBSD,NETBSD}, SPARC64_SOLARIS.<BR>? But I can maybe try it at some point.<BR> <BR>I also expect the way to go is use libunwind for nearly all targets, even probably SPARC*.<BR> <BR> > It would be good to have it in one place for *all* SPARC targets.  Where to put it<BR> <BR>How about a new src/runtime/common/RTStackC.c, compiled on all platforms but with #ifdefs (the same #ifdefs as are currently used, but revisiting them at some point, the NETBSD and such seem suspicious).<BR>I think I'll do that shortly.<BR> <BR>There is also TARGET_ARCH defined in the config files.<BR>We could do<BR>if exist(TARGET_ARCH/m3makefile)<BR>  include_dir(TARGET_ARCH)<BR>end<BR> <BR>(similarly there is TARGET_OS).<BR> <BR> - Jay<BR> <BR>
<HR id=ecxecxecxecxstopSpelling>
From:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</A><BR>Date: Sat, 21 Nov 2009 17:02:23 -0500<BR>To:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</A><BR>CC:<SPAN class=ecxApple-converted-space> </SPAN><A href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</A><BR>Subject: Re: [M3devel] SaveRegsInStack<BR><BR>
<DIV><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span>
<DIV style="WORD-WRAP: break-word"><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 12px Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span>
<DIV><SPAN style="FONT-SIZE: medium" class=ecxecxecxecxecxApple-style-span>On 21 Nov 2009, at 15:38, Jay K wrote:</SPAN></DIV></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></DIV></SPAN></SPAN></DIV>
<DIV><BR class=ecxecxecxecxecxApple-interchange-newline>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxecxecxecxecxhmmessage>Tony, it bugs me that we have three copies of this code.<BR>Would it be reasonable and not very inefficient<BR>and maybe somewhat portable to replace it with<BR>setjmp or getcontext or alloca(1)?<BR></DIV></SPAN></BLOCKQUOTE>
<DIV><BR></DIV>
<DIV>No, those don't have the desired effect on SPARC.</DIV><BR>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxecxecxecxecxhmmessage> Or can we go back to having RTStack call RTMachine?<BR>(Imagine if SPARC* all had stack walkers, though I<BR>doubt that will happen, other than via libunwind.)<BR></DIV></SPAN></BLOCKQUOTE>
<DIV><BR></DIV>
<DIV>Why wouldn't SPARC* all have stack walkers?  Their stack frames are trivial to unwind.</DIV>
<DIV>I agree that it is annoying to have multiple copies of this code.  It would be good to have it in one place for *all* SPARC targets.  Where to put it?</DIV><BR>
<BLOCKQUOTE><SPAN style="TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Helvetica; WHITE-SPACE: normal; LETTER-SPACING: normal; WORD-SPACING: 0px" class=ecxecxecxecxecxApple-style-span>
<DIV style="FONT-FAMILY: Verdana; FONT-SIZE: 10pt" class=ecxecxecxecxecxhmmessage> <BR><BR> - Jay<BR><BR></DIV></SPAN></BLOCKQUOTE></DIV><BR></DIV></SPAN><BR class=ecxApple-interchange-newline></BLOCKQUOTE></DIV><BR>                                      </body>
</html>