1. For %fs/fsbase the patch follows the macOS logic with LDT descriptor registration and Linux with switching. One notable difference is that on 32->64 transition we set %fs to GSEL(GUFS32_SEL, SEL_UPL) before restoring fsbase, otherwise FreeBSD will just revert it by reloading the selector [at the first opportunity](https://github.com/freebsd/freebsd-src/blob/5673462af5330df207…. GSEL(GUFS32_SEL, SEL_UPL) is the default %fs value on FreeBSD and is special-cased to save/restore actual fsbase value to/from PCB.
2. I was told we could get rid of fsbase glitches in signal handlers by blocking signals with [sigfastblock(2)](https://man.freebsd.org/cgi/man.cgi?query=sigfastblock) between %fs reset to the default value and fsbase reset to pthread_teb. This is currently a part of internal API for libthr, which could be exposed as pthread_signal_block_np for Wine. I'm on the fence whether it's worth it.
3. I fully admit I have no idea what registers are worth preserving around fallback syscalls to sysarch(AMD64_SET_FSBASE) and whether it's appropriate to push those to stack. ("Kernel" stack should be fine, I assume?) They definitely clobber r8-r11.
4. For %ss see https://lkml.org/lkml/2015/4/24/216. We don't have a similar workaround in the kernel, so it goes into Wine.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/8073
eric pouech (@epo) commented about include/consoleapi.h:
> ULONG nLength;
> ULONG nInitialChars;
> ULONG dwCtrlWakeupMask;
> - ULONG dwConsoleKeyState;
this change (and the other ones using the correct field name) should be in a separate patch (inside the same merge request)
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7843#note_103751
eric pouech (@epo) commented about programs/cmd/wcmdmain.c:
> +
> +static void build_search_string(WCHAR *inputBuffer, int len, SEARCH_CONTEXT *sc)
> +{
> + int cc = 0, nn = 0;
> + WCHAR *param = NULL, *last_param, *stripped_copy = NULL;
> + WCHAR last_stripped_copy[MAX_PATH] = L"\0";
> + BOOL need_wildcard = TRUE;
> +
> + sc->searchstr[0] = L'\0';
> +
> + /* If inputBuffer ends in a space then the user hit tab beyond the last
> + * parameter, so use that as the search pos (i.e. a wildcard search).
> + * Otherwise, parse the buffer to find the last parameter in the buffer,
> + * where tab was pressed.
> + */
> + if (inputBuffer[len-1] == L' ') {
len can be zero here (if \<tab\> is pressed at beg of line)
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7843#note_103749