target/i386: tcg: fix switching from 16-bit to 32-bit tasks or vice versa
authorPaolo Bonzini <pbonzini@redhat.com>
Tue, 1 Jun 2021 13:36:00 +0000 (15:36 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 4 Jun 2021 11:47:08 +0000 (13:47 +0200)
The format of the task state segment is governed by bit 3 in the
descriptor type field.  On a task switch, the format for saving
is given by the current value of TR's type field, while the
format for loading is given by the new descriptor.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
target/i386/tcg/seg_helper.c

index 2112c5fc51a1bffc1c4e60899ce851bfc69e4841..3ed20ca31d75b5f867fb243232bc95797ebbd971 100644 (file)
@@ -319,7 +319,7 @@ static void switch_tss_ra(CPUX86State *env, int tss_selector,
     }
 
     /* save the current state in the old TSS */
-    if (type & 8) {
+    if (old_type & 8) {
         /* 32 bit */
         cpu_stl_kernel_ra(env, env->tr.base + 0x20, next_eip, retaddr);
         cpu_stl_kernel_ra(env, env->tr.base + 0x24, old_eflags, retaddr);