Re: problem with USER_LDT in current 9.99.81
On Wed, Apr 28, 2021 at 10:54:22AM +0100, Dave Tyson wrote: > I don't know whether altering the LDT size will have any implications for the > SVS stuff, currently > > #define MAX_USERLDT_SIZE PAGE_SIZE > > appears in the above include files. > > I changed the define to be: > > #define MAX_USERLDT_SIZE PAGE_SIZE*2 > > and a recompiled kernel now allows wine to work correctly. If we want have a fixed size limit, it should be 64KB. That's the maximum size a LDT can have and I see no reason why we want to allow less. It's rare enough that wasting a bit space here shouldn't matter. Joerg
Re: problem with USER_LDT in current 9.99.81
On Monday 26 Apr 2021 19:36:00 Dave Tyson wrote: > On Tuesday 27 Apr 2021 04:22:22 matthew green wrote: > > Dave Tyson writes: > > > I have wine 4.4 working under NetBSD 9.99.23 amd64 (> 1 year ago) and > > > recently tried against a recent current - 9.99.81. > > > > > > Wine now complains: > > > i386_set_ldt: Operation not permitted > > > Did you reconfigure the kernel with "options USER_LDT"? > > > > > > but GENERIC has the option enabled and strings on the kernel shows: > > > > > > _CFG_options \011USER_LDT\011# User-settable LDT, used by Wine > > > _KERNEL_OPT_USER_LDT > > > > > > I am guessing a change between 9.99.23 and 9.99.81 has broken the > > > functionality, but before I bisect does anyone have any ideas... > > > > try this? > > > > # sysctl -w machdep.user_ldt=0 > > > > .mrg. > > Thanks for the idea - however machdep.user_ldt was already 0 :-( > > I'll pull the older sources and try and find the change which caused the > problem > > Dave OK, I found the problem: - Module Name:src Committed By: maxv Date: Fri Apr 24 16:27:28 UTC 2020 Modified Files: src/sys/arch/amd64/amd64: netbsd32_machdep.c src/sys/arch/amd64/include: gdt.h src/sys/arch/i386/include: gdt.h src/sys/arch/x86/include: pmap.h src/sys/arch/x86/x86: pmap.c svs.c sys_machdep.c Log Message: Give the ldt a fixed size of one page (512 slots), and drop the variable- sized mechanism that was too complex. This fixes a race between USER_LDT and SVS: during context switches, the way SVS installs the new ldt relies on the ldt pointer AND the ldt size, but both cannot be accessed atomically at the same time. --- This change stops wine 4.4 working. Clearly wine needs more than one page of space and with the new limit it fails, but the error message is the same as it you hadn't defined USER_LDT (old way) or set machdep.user_ldt=1 (new way) which isn't very helpful. I don't know whether altering the LDT size will have any implications for the SVS stuff, currently #define MAX_USERLDT_SIZE PAGE_SIZE appears in the above include files. I changed the define to be: #define MAX_USERLDT_SIZE PAGE_SIZE*2 and a recompiled kernel now allows wine to work correctly. I don't know how many applications make use of the LDT, but wine is clearly an important one and maybe if this is an acceptable fix it should be pulled up. I can file a PR if necessary. Copied to Maxime - though not sure if he is still involved. Dave
re: problem with USER_LDT in current 9.99.81
> Thanks for the idea - however machdep.user_ldt was already 0 :-( > > I'll pull the older sources and try and find the change which caused the > problem oops! i meant to say "=1".
Re: problem with USER_LDT in current 9.99.81
On Tuesday 27 Apr 2021 04:22:22 matthew green wrote: > Dave Tyson writes: > > I have wine 4.4 working under NetBSD 9.99.23 amd64 (> 1 year ago) and > > recently tried against a recent current - 9.99.81. > > > > Wine now complains: > > i386_set_ldt: Operation not permitted > > Did you reconfigure the kernel with "options USER_LDT"? > > > > but GENERIC has the option enabled and strings on the kernel shows: > > > > _CFG_options \011USER_LDT\011# User-settable LDT, used by Wine > > _KERNEL_OPT_USER_LDT > > > > I am guessing a change between 9.99.23 and 9.99.81 has broken the > > functionality, but before I bisect does anyone have any ideas... > > try this? > > # sysctl -w machdep.user_ldt=0 > > > .mrg. Thanks for the idea - however machdep.user_ldt was already 0 :-( I'll pull the older sources and try and find the change which caused the problem Dave
re: problem with USER_LDT in current 9.99.81
Dave Tyson writes: > I have wine 4.4 working under NetBSD 9.99.23 amd64 (> 1 year ago) and > recently > tried against a recent current - 9.99.81. > > Wine now complains: > i386_set_ldt: Operation not permitted > Did you reconfigure the kernel with "options USER_LDT"? > > but GENERIC has the option enabled and strings on the kernel shows: > > _CFG_options \011USER_LDT\011# User-settable LDT, used by Wine > _KERNEL_OPT_USER_LDT > > I am guessing a change between 9.99.23 and 9.99.81 has broken the > functionality, but before I bisect does anyone have any ideas... try this? # sysctl -w machdep.user_ldt=0 .mrg.