[M3devel] proposal for getting wow64 context/stack reliably?

Tony Hosking hosking at cs.purdue.edu
Fri Jan 24 19:24:35 CET 2014


As a way forward I propose that we indeed treat EXTERNAL calls as needing to capture a GC context.  At least that should be the default.
Some calls could be annotated as not needing to capture the GC context with a different EXTERNAL pragma.  Knowing that such a call can safely ignore saving the context would require inspection of the external function, or understanding of its behavior.

Antony Hosking | Associate Professor | Computer Science | Purdue University
305 N. University Street | West Lafayette | IN 47907 | USA
Mobile +1 765 427 5484





On Jan 23, 2014, at 6:09 PM, Jay K <jay.krell at cornell.edu> wrote:

> Yes. Agreed.
> They should be ok with respect to SuspendThread + GetThreadContext. The small C++ test program in scratch.
> I don't know about the "other" problem that affects even pthreads and I agree we should focus on that first, on pthreads, native I386_NT, and possibly AMD64_NT, but for now, at least briefly, ignore I386_NT on 64bit Windows.
>  
>  
>  - Jay
> 
>  
> From: rcolebur at SCIRES.COM
> To: m3devel at elegosoft.com
> Date: Thu, 23 Jan 2014 22:23:43 +0000
> Subject: Re: [M3devel] proposal for getting wow64 context/stack reliably?
> 
> Jay:
>  
> When you say native 32/64-bit “should be ok”, you really mean ok with respect to the SYSWOW64 problem you’ve identified. 
>  
> Both of these native implementations still have threading misbehaviors as identified by the thread test program.  Correct?
>  
> --Randy
>  
> From: jayk123 at hotmail.com [mailto:jayk123 at hotmail.com] On Behalf Of Jay K
> Sent: Thursday, January 23, 2014 2:57 PM
> To: Tony; Coleburn, Randy
> Cc: m3devel
> Subject: EXT:RE: [M3devel] EXT: proposal for getting wow64 context/stack reliably?
>  
> There are no linker tricks. There are no syscalls, they aren't a special case just about anywhere, there are just functions, all treated the same.
> Correct it is only 32bit-on-64bit. Native 32bit should be ok. Native 64bit should be ok.
> 
>  - Jay
> From: hosking at cs.purdue.edu
> Date: Thu, 23 Jan 2014 11:51:02 -0500
> To: rcolebur at SCIRES.COM
> CC: m3devel at elegosoft.com; jay.krell at cornell.edu
> Subject: Re: [M3devel] EXT: proposal for getting wow64 context/stack reliably?
> 
> Yes, agreed.
> We need to address the native thread problem on all platforms (both pthread and windows).
>  
> However, this particular problem is pernicious if we need to save M3 stack state at all external calls.
>  
> Are there any linker tricks for Windows one can use to wrap only system calls?
>  
> I note that cooperative suspend will also need to do this at system calls so we can treat threads running code running outside of Modula-3 as essentially stopped,  This approach is used for all modern Java implementations that I am aware of.
>  
> It really begins to sound like we must bite the bullet and move to cooperative threading so that we can guarantee GC safepoints where we can safely get the thread state.
>  
> Antony Hosking | Associate Professor | Computer Science | Purdue University
> 305 N. University Street | West Lafayette | IN 47907 | USA
> Mobile +1 765 427 5484
>  
> 
> 
> 
> 
>  
> On Jan 23, 2014, at 6:59 AM, Coleburn, Randy <rcolebur at SCIRES.COM> wrote:
>  
> Jay,
>  
> If I'm following you correctly, you are saying that this bug happens when running on 64bit Windows, but not on 32bit, since it applies only to SysWOW64. 
>  
> Since the thread test program also misbehaves on 32bit Windows, there must yet be some other bug in the underlying implementation affecting both 32 & 64 bit platforms. 
>  
> Thus, the SysWOW64 issue is a 2nd, additional problem for 64bit. 
>  
> Has anyone made any progress in solving the 1st, underlying problem affecting both 32/64 bit Windows?
>  
> --Randy
> 
> Sent from my iPhone
> 
> On Jan 23, 2014, at 2:58 AM, "Jay K" <jay.krell at cornell.edu> wrote:
>   There is a behavior/bug in wow64.  
>   Bing for "wow64 GetThreadContext" "wow64 stack pointer", etc.
> 
> 
> 
>   SuspendThread / GetThreadContext work like this:  
> 
> 
>   32bit processes consist almost entirely of 32bit code.  
>   There is a small amount of 64bit code.  
> 
> 
>   If you suspend while running 32bit code, GetThreadContext works.  
>   if you suspend while running 64bit code, GetThreadContext usually but not always works.  
> 
> 
>   64bit code is run en route to syscalls.  
>   For example you call:  
>     1 kernel32!Sleep   
>     2 it calls 32bit NtDelayExecution   
>     3 that calls wow64NtDelayExecutation  (via a cross segment "far" jmp or call) 
>     4 which calls native NtDelayExecuation   
> 
>  
>   In between 2 and 3, within 64bit code, the 32bit context is saved.  
>     You can step through it very easily in a debugger. Really. 
>   Where GetThreadContext knows where to get it.  
>   The problem is that saving context is not atomic.  
>   You can suspend while saving context.  
> 
> 
>   What to do? 
> 
> 
>   scratch/wow64stack contains a program that detects the bug.
>   I believe it is the basis of a workaround for the bug.   
> 
> 
>   Proposal is that in the compiler, for I386_NT/NT386/I386_MINGWIN/I386_CYGWIN/I386_INTERIX platforms, 
>   not only functions that use exception handling, but also functions that call "extern" functions  
>   call GetActivation / SetActivation and therein save/set/restore the stack pointer. And garbage collection
>   use that, if it isn't zero. 
>   Normally it will be zero.  
>   Syscalls do nest -- I can call SendMessage and in my window proc call CreateFile.  
>   That is why it isn't a set/set-zero pattern (like in the test program).   
> 
> 
>   Downside: We would like to get rid of GetActivation / SetActivation, i.e. and reuse efficient C++ exception handling. 
> 
> 
>   Rejected counter proposal: 
>    Don't suspend/gc when running a syscall.  
>    No -- you can Sleep() a while. You can/should-be-able-to suspend and GC during that.  
> 
> 
>  Possible augmentation: if running native, short circuit most of this 
> 
> 
>   Rejected counter proposal: Have I386_NT_NATIVE that doesn't do this stuff. Relegate 
>    compatibility to I386_NT_COMPATIBLE. I don't like having more platforms/targets. 
> 
> 
>    AMD64_NT wouldn't have this stuff. Nor would other hypothetical platforms like ARM32_NT, 
>    until/unless there is another 32bit platform runable on some similar 64bit platforms. 
> 
> 
>   Performance impact: hypothetically large but probably not noticable. 
> 
> 
>   Furthe refinements: It isn't extern/native code per se, it is syscalls.
>   We could further augment pragmas to discern them. 
> 
> 
>   We could leave it to writing "syscall wrappers" and informally (no enforcement) ban direct calls 
>   to any functions that make syscalls. This is likely too hard to maintain and too unfriendly. 
>   It pretty viable in m3core, but then also libm3 and Trestle and Qt wrappers, etc... 
> 
> 
> 
>   Agreed? I'll make the compiler change? 
> 
> 
> Oh, also, not just stack pointer, but other registers, at least non-volatiles?
> 
> 
> Eventually cooperative suspend will cause this to fall away as a problem..
> 
> 
>  - Jay

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20140124/df5802c0/attachment-0002.html>


More information about the M3devel mailing list