> On Jun 24, 2020, at 7:10 AM, Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote: > > On 24/06/20 14:52, Thomas Huth wrote: >> On 23/06/2020 10.41, Nadav Amit wrote: >>> Currently, the BSP's segment selectors are not initialized in 32-bit >>> (cstart.S). As a result the tests implicitly rely on the segment >>> selector values that are set by the BIOS. If this assumption is not >>> kept, the task-switch test fails. >>> >>> Fix it by initializing them. >>> >>> Signed-off-by: Nadav Amit <namit@xxxxxxxxxx> >>> --- >>> x86/cstart.S | 17 +++++++++++------ >>> 1 file changed, 11 insertions(+), 6 deletions(-) >> >> I'm sorry to be the bearer of bad news again, but this commit broke >> another set of tests in the Travis CI: >> >> https://travis-ci.com/github/huth/kvm-unit-tests/jobs/353103187#L796 >> >> smptest, smptest3, kvmclock_test, hyperv_synic and hyperv_stimer are >> failing now in the 32-bit kvm-unit-tests :-( > > And that's just bad testing (both Nadav's and mine). Writing to %gs > clobbers the PERCPU area. The fix is as simple as this: > > diff --git a/x86/cstart.S b/x86/cstart.S > index 5ad70b5..77dc34d 100644 > --- a/x86/cstart.S > +++ b/x86/cstart.S > @@ -106,6 +106,7 @@ MSR_GS_BASE = 0xc0000101 > .globl start > start: > mov $stacktop, %esp > + setup_segments > push %ebx > call setup_multiboot > call setup_libcflat > @@ -118,7 +119,6 @@ start: > > prepare_32: > lgdtl gdt32_descr > - setup_segments > > mov %cr4, %eax > bts $4, %eax // pse Unfortunately this change does not work for me (i.e., it breaks the task-switch test on my setup). Admittedly, my patch was wrong. I actually did not notice this scheme of having the GS descriptor and GS-base out of sync. It seems very fragile, specifically when you have a task-switch that reloads the GS and overwrites the original value. I will try to investigate it further later.