[jit] Implement support for tls offsets >= 64 on win32.
authorZoltan Varga <vargaz@gmail.com>
Sun, 13 Jul 2014 20:33:22 +0000 (22:33 +0200)
committerZoltan Varga <vargaz@gmail.com>
Sun, 13 Jul 2014 20:33:22 +0000 (22:33 +0200)
mono/mini/cpu-x86.md
mono/mini/mini-x86.c

index 24c354351e61d5d546b04db2fdc4499abbbc6874..ca87f2fba43975024ef370c2b354e99cd5665240 100644 (file)
@@ -301,7 +301,7 @@ bigmul: len:2 dest:l src1:a src2:i
 bigmul_un: len:2 dest:l src1:a src2:i
 sext_i1: dest:i src1:y len:3
 sext_i2: dest:i src1:y len:3
-tls_get: dest:i len:20
+tls_get: dest:i len:32
 tls_get_reg: dest:i src1:i len:20
 tls_set: src1:i len:20
 tls_set_reg: src1:i src2:i len:20
index da0374fce3a1220042891c083f0fce02accd984f..30be6de9503ed28329a4cb43285a9dd41bc57055 100644 (file)
@@ -2461,12 +2461,24 @@ mono_x86_emit_tls_get (guint8* code, int dreg, int tls_offset)
         * See the Under the Hood article in the May 1996 issue of Microsoft Systems 
         * Journal and/or a disassembly of the TlsGet () function.
         */
-       g_assert (tls_offset < 64);
        x86_prefix (code, X86_FS_PREFIX);
        x86_mov_reg_mem (code, dreg, 0x18, 4);
        /* Dunno what this does but TlsGetValue () contains it */
        x86_alu_membase_imm (code, X86_AND, dreg, 0x34, 0);
-       x86_mov_reg_membase (code, dreg, dreg, 3600 + (tls_offset * 4), 4);
+       if (tls_offset < 64) {
+               x86_mov_reg_membase (code, dreg, dreg, 3600 + (tls_offset * 4), 4);
+       } else {
+               guint8 *buf [16];
+
+               g_assert (tls_offset < 0x440);
+               /* Load TEB->TlsExpansionSlots */
+               x86_mov_reg_membase (code, dreg, dreg, 0xf94, 4);
+               x86_test_reg_reg (code, dreg, dreg);
+               buf [0] = code;
+               x86_branch (code, X86_CC_EQ, code, TRUE);
+               x86_mov_reg_membase (code, dreg, dreg, (tls_offset * 4) - 0x100, 4);
+               x86_patch (buf [0], code);
+       }
 #else
        if (optimize_for_xen) {
                x86_prefix (code, X86_GS_PREFIX);