public inbox for cygwin-cvs@sourceware.org help / color / mirror / Atom feed
From: Jon TURNEY <jturney@sourceware.org> To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: testsuite: Add x86_64 code to "dynamically load cygwin" test Date: Mon, 29 Aug 2022 16:54:56 +0000 (GMT) [thread overview] Message-ID: <20220829165456.7E4AB3857345@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=b4561c236357c32290321fade62b5c81a5a9fe3c commit b4561c236357c32290321fade62b5c81a5a9fe3c Author: Jon Turney <jon.turney@dronecode.org.uk> Date: Thu Nov 26 16:50:43 2020 +0000 Cygwin: testsuite: Add x86_64 code to "dynamically load cygwin" test This still needs some more voudou to actually work. Also update how-cygtls-works.txt a bit Diff: --- winsup/cygwin/DevDocs/how-cygtls-works.txt | 25 ++++++------------------- winsup/testsuite/winsup.api/cygload.cc | 22 +++++++++++++++++++--- winsup/testsuite/winsup.api/cygload.exp | 8 +++++++- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/winsup/cygwin/DevDocs/how-cygtls-works.txt b/winsup/cygwin/DevDocs/how-cygtls-works.txt index e4f694118..633c4da96 100644 --- a/winsup/cygwin/DevDocs/how-cygtls-works.txt +++ b/winsup/cygwin/DevDocs/how-cygtls-works.txt @@ -4,8 +4,8 @@ All cygwin threads have separate context in an object of class _cygtls. The storage for this object is kept on the stack in the bottom __CYGTLS_PADSIZE__ bytes. Each thread references the storage via the Thread Environment Block (aka Thread Information Block), which Windows maintains for each user thread -in the system, with the address in the FS segment register. The memory -is laid out as in the NT_TIB structure from <w32api/winnt.h>: +in the system, with the address in a segment register (FS on x86, GS on x86_64). +The memory is laid out as in the NT_TIB structure from <w32api/winnt.h>: typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; @@ -20,16 +20,10 @@ typedef struct _NT_TIB { struct _NT_TIB *Self; } NT_TIB,*PNT_TIB; -Cygwin sees it like this: - -extern exception_list *_except_list asm ("%fs:0"); // exceptions.cc -extern char *_tlsbase __asm__ ("%fs:4"); // cygtls.h -extern char *_tlstop __asm__ ("%fs:8"); // cygtls.h - -And accesses cygtls like this: - -#define _my_tls (((_cygtls *) _tlsbase)[-1]) // cygtls.h +Cygwin accesses cygtls like this (see cygtls.h): +#define _my_tls (*((_cygtls *) ((PBYTE) NtCurrentTeb()->Tib.StackBase \ + - __CYGTLS_PADSIZE__))) Initialization always goes through _cygtls::init_thread(). It works in the following ways: @@ -65,11 +59,4 @@ __CYGTLS_PADSIZE__ bytes down from there are overwritten. Debugging -You can examine the segment registers in gdb via "info w32 selector $fs" -(which is using GetThreadSelectorEntry()) to get results like this: - - Selector $fs - 0x03b: base=0x7ffdd000 limit=0x00000fff 32-bit Data (Read/Write, Exp-up) - Priviledge level = 3. Byte granular. - -"x/3x 0x7ffdd000" will give you _except_list, _tlsbase, and _tlstop. +You can examine the TIB in gdb via "info w32 tib" diff --git a/winsup/testsuite/winsup.api/cygload.cc b/winsup/testsuite/winsup.api/cygload.cc index faad5ce0e..f5ca8db9a 100644 --- a/winsup/testsuite/winsup.api/cygload.cc +++ b/winsup/testsuite/winsup.api/cygload.cc @@ -43,7 +43,10 @@ using std::string; cygwin::padding *cygwin::padding::_main = NULL; DWORD cygwin::padding::_mainTID = 0; -// A few cygwin constants. +// Cygwin signal constants +#undef SIGINT +#undef SIGTERM + static const int SIGHUP = 1; static const int SIGINT = 2; static const int SIGTERM = 15; // Cygwin won't deliver this one to us; @@ -68,17 +71,30 @@ cygwin::padding::padding () _end = _padding + sizeof (_padding); char *stackbase; -#ifdef __GNUC__ +#ifdef __GNUC__ /* GCC */ +# ifdef __x86_64__ + __asm__ ( + "mov %%gs:8, %0" + :"=r"(stackbase) + ); +# elif __X86__ __asm__ ( "movl %%fs:4, %0" :"=r"(stackbase) ); -#else +# else +# error Unknown architecture +# endif +#else /* !GCC assumed to be MSVC */ +# ifdef __X86__ __asm { mov eax, fs:[4]; mov stackbase, eax; } +#else +# error Unknown architecture +# endif #endif _stackbase = stackbase; diff --git a/winsup/testsuite/winsup.api/cygload.exp b/winsup/testsuite/winsup.api/cygload.exp index e7b439512..8ba8249bb 100644 --- a/winsup/testsuite/winsup.api/cygload.exp +++ b/winsup/testsuite/winsup.api/cygload.exp @@ -14,7 +14,13 @@ proc ws_spawn {cmd args} { verbose send "catchCode = $rv\n" } -ws_spawn "$MINGW_CXX $srcdir/$subdir/cygload.cc -o mingw-cygload.exe -lstdc++ -Wl,-e,_cygloadCRTStartup@0" +if { [string match "i686" $target_alias] } { + set entrypoint "_cygloadCRTStartup@0" +} else { + set entrypoint "cygloadCRTStartup" +} + +ws_spawn "$MINGW_CXX $srcdir/$subdir/cygload.cc -o mingw-cygload.exe -static -Wl,-e,$entrypoint" if { $rv != {0 {}} } { verbose -log "$rv"
reply other threads:[~2022-08-29 16:54 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220829165456.7E4AB3857345@sourceware.org \ --to=jturney@sourceware.org \ --cc=cygwin-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).