<html><head><base href="x-msg://170/"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><br></div><div>      asm("     ta      0x3   ! ST_FLUSH_WINDOWS");</div><div>      asm("     retl");</div><div>      asm("     mov     %sp,%o0");</div><div><br></div><div><font class="Apple-style-span" size="3"><span class="Apple-style-span" style="font-size: 12px;"><font class="Apple-style-span" color="#0000FF" face="'Gill Sans'"><span class="Apple-style-span" style="font-size: medium;">The sp returned is that for the *callee* SaveRegsInStack, which includes the space for saved registers.  Your version gives an address in the *caller* frame.</span></font></span></font></div><div><br></div><div><div>On 24 Nov 2009, at 20:55, Jay K wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div class="hmmessage" style="font-size: 10pt; font-family: Verdana; "><div> > No.  The sp back from SaveRegsInStack may capture more state than ADR(xx).</div> <br>How so?<br>Esp. the 32bit version, which doesn't change the register window?<br>I can see how maybe the 64bit one would make the current registers available since it allocates a new window.<br></div></span></blockquote><div><br></div>Correct:<br><div><br></div><div><div>      asm("     save        %sp,-128,%sp");</div><div>      asm("     flushw");</div><div>      asm("     ret");</div><div>      asm("     restore %sp,2047+128,%o0");</div></div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div class="hmmessage" style="font-size: 10pt; font-family: Verdana; "> Maybe we should just setjmp on all architectures and include the jmpbuf in the stack, by making a function call after it and taking the address of a local in the second function?<br></div></span></blockquote><div><br></div><div>That could work.</div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div class="hmmessage" style="font-size: 10pt; font-family: Verdana; ">And also longjmp on Sparc. Basically very much resemble ProcessLive, but just to set sp and not make the callbacks?<br>And endeavor to be sure to not waste time getting the signal mask.<br></div></span></blockquote><div><br></div><div>OK.</div><br><blockquote type="cite"><span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><div class="hmmessage" style="font-size: 10pt; font-family: Verdana; "> <br> - Jay<br><br> <br><hr id="stopSpelling">From:<span class="Apple-converted-space"> </span><a href="mailto:hosking@cs.purdue.edu">hosking@cs.purdue.edu</a><br>Date: Tue, 24 Nov 2009 17:17:51 -0500<br>To:<span class="Apple-converted-space"> </span><a href="mailto:jay.krell@cornell.edu">jay.krell@cornell.edu</a><br>CC:<span class="Apple-converted-space"> </span><a href="mailto:m3devel@elegosoft.com">m3devel@elegosoft.com</a><br>Subject: Re: [M3devel] sparc ta/setjmp/longjmp<br><br><div><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><div style="word-wrap: break-word; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal 12px/normal Helvetica; text-transform: none; color: rgb(0, 0, 0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><div><span class="ecxApple-style-span" style="font-size: medium; ">On 24 Nov 2009, at 06:05, 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 class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal medium/normal Helvetica; text-transform: none; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><div class="ecxhmmessage" style="font-size: 10pt; font-family: Verdana; ">Tony,<br> <br>Does this seem correct?<br> <br><span lang="EN">PROCEDURE SignalHandler (sig: int) =<br>VAR<br>...<br>old:<br> <br>me.sp := SaveRegsInStack();<br>IF me.sp = NIL THEN me.sp := ADR(xx) END;<br>new:<br> <br>SaveRegsInStack(); (* no return value *)<br>me.sp := ADR(xx); (* unconditional *)<br></span></div></span></blockquote><div><br></div><div>No.  The sp back from SaveRegsInStack may capture more state than ADR(xx).</div><br><blockquote><span class="ecxApple-style-span" style="word-spacing: 0px; font: normal normal normal medium/normal Helvetica; text-transform: none; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; "><div class="ecxhmmessage" style="font-size: 10pt; font-family: Verdana; "> <br> <br> <br><span lang="EN">void ThreadPThread__SaveRegsInStack(void)<br>{<br>#ifdef M3_REGISTER_WINDOWS<br>/* On "register window" architectures, setjmp/longjmp tends<br>to flush registers to the stack in a fairly portable not<br>too inefficient fashion, and saves us the need for<br>gnarly assembly. (ta 3 on Sparc, flushrs on IA64)<br>*/<br>jmp_buf jb;<br>if (setjmp(jb) == 0) longjmp(jb, 1);<br>#endif<br>}<br></span> <br> <br>You know -- was the stack pointer returned by SaveRegsInStack before really better/different than just ADR(xx)?<br> <br> <br>Consider:<br> <br>#   if defined(__arch64__) || defined(__sparcv9)<br>      asm("     save        %sp,-128,%sp");<br>      asm("     flushw");<br>      asm("     ret");<br>      asm("     restore %sp,2047+128,%o0");<br>#   else<br>asm("     ta      0x3   ! ST_FLUSH_WINDOWS");<br>      asm("     retl");<br>      asm("     mov     %sp,%o0");<br>#   endif<br> <br> <br>on 32bit, it just returns the unchanged %sp of its caller.<br>On 64bit, I suspect kind of the same thing, though I don't know what the 128 or 2047 are. 2047 is probably some "bias" builtin to the register and 128 I guess is required for flushw??<br> <br> <br> - Jay<br><br><br><br></div></span></blockquote></div><br></div></span><br class="Apple-interchange-newline"></blockquote></div><br></body></html>