22.1.0 での TLS callback 検証

C:\Proj\arm64x-upon-llvm>clang-cl --target=aarch64-pc-windows-msvc tls_callback.c -c -o tls_callback.arm64.o

C:\Proj\arm64x-upon-llvm>clang-cl --target=arm64ec-pc-windows-msvc tls_callback.c -c -o tls_callback.arm64ec.o

C:\Proj\arm64x-upon-llvm>
C:\Proj\arm64x-upon-llvm>lld-link /machine:arm64   /subsystem:windows /dll tls_callback.arm64.o                        /out:tls_callback.arm64.dll

C:\Proj\arm64x-upon-llvm>lld-link /machine:arm64ec /subsystem:windows /dll tls_callback.arm64ec.o                      /out:tls_callback.arm64ec.dll

C:\Proj\arm64x-upon-llvm>lld-link /machine:arm64x  /subsystem:windows /dll tls_callback.arm64.o tls_callback.arm64ec.o /out:tls_callback.arm64x.dll

C:\Proj\arm64x-upon-llvm>
C:\Proj\arm64x-upon-llvm>loader.arm64.exe tls_callback.arm64.dll
Attempting to load DLL: tls_callback.arm64.dll
TLS Callback fired (ARM64)
DLL loaded successfully: tls_callback.arm64.dll

C:\Proj\arm64x-upon-llvm>loader.arm64ec.exe tls_callback.arm64ec.dll
Attempting to load DLL: tls_callback.arm64ec.dll
TLS Callback fired (ARM64EC)
DLL loaded successfully: tls_callback.arm64ec.dll

C:\Proj\arm64x-upon-llvm>loader.arm64.exe tls_callback.arm64x.dll
Attempting to load DLL: tls_callback.arm64x.dll
TLS Callback fired (ARM64)
DLL loaded successfully: tls_callback.arm64x.dll

C:\Proj\arm64x-upon-llvm>loader.arm64ec.exe tls_callback.arm64x.dll
Attempting to load DLL: tls_callback.arm64x.dll
TLS Callback fired (ARM64EC)
DLL loaded successfully: tls_callback.arm64x.dll

検証結果は良好です。 確認の結果、問題は見つかりませんでした。

Arm64X での TLS callback 実装については MSFT link.exe と同様の実装方針を選択したようです。

TLS callback のポイント先にトランポリンを設置しています。 Arm64EC 利用時には (DVRT の適用によって) トランポリンのジャンプ先が変更されています。

C:\Proj\arm64x-upon-llvm> C:\Proj\psqlodbc-for-win10-arm64\Toolings\InspectTLSCallback\bin\Debug\net8.0\InspectTLSCallback.exe inspect tls_callback.arm64x.dll
# Before apply Dvrt

              AA64 machine
                 2 CHPE Version

  0000000180039001 Start of raw data
  0000000180039003 End of raw data
  0000000180033524 Address of index
  000000018002DF28 Address of callbacks
                 0 Size of zero fill
          00000000 Characteristics

    TLS Callbacks

    Address
    ----------------
    00000001800211B8      ARM64
    0000000000000000

    VirtualAddress   | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    -----------------|------------------------------------------------
    00000001800211B8 | 10 FF FF 90 10 D2 02 91 00 02 1F D6 E6 9F BA AD
    00000001800211C8 | E8 27 01 AD EA 2F 02 AD EC 37 03 AD EE 3F 04 AD
    00000001800211D8 | FD 7B 0A A9 FD 83 02 91 20 01 3F D6 E8 03 00 AA
    00000001800211E8 | 69 00 00 90 20 19 47 F9 FD 7B 4A A9 EE 3F 44 AD

    AArch64 disassembly by AsmArm64
    ---
    00000001800211B8: 90FFFF10  adrp x16, #-131072
    00000001800211BC: 9102D210  add x16, x16, #180
    00000001800211C0: D61F0200  br x16
    00000001800211C4: ADBA9FE6  stp q6, q7, [sp, #-176]!
    00000001800211C8: AD0127E8  stp q8, q9, [sp, #32]
    00000001800211CC: AD022FEA  stp q10, q11, [sp, #64]
    00000001800211D0: AD0337EC  stp q12, q13, [sp, #96]
    00000001800211D4: AD043FEE  stp q14, q15, [sp, #128]
    00000001800211D8: A90A7BFD  stp x29, x30, [sp, #160]
    00000001800211DC: 910283FD  add x29, sp, #160
    00000001800211E0: D63F0120  blr x9
    00000001800211E4: AA0003E8  mov x8, x0
    00000001800211E8: 90000069  adrp x9, #49152
    00000001800211EC: F9471920  ldr x0, [x9, #3632]
    00000001800211F0: A94A7BFD  ldp x29, x30, [sp, #160]
    00000001800211F4: AD443FEE  ldp q14, q15, [sp, #128]

    Navigate to the destination at 00000001800010B4

      VirtualAddress   | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
      -----------------|------------------------------------------------
      00000001800010B4 | FF C3 00 D1 FE 13 00 F9 E2 0F 00 F9 E1 17 00 B9
      00000001800010C4 | E0 07 00 F9 E8 17 40 B9 08 05 00 71 C1 00 00 54
      00000001800010D4 | 01 00 00 14 40 01 00 F0 00 00 03 91 D5 FF FF 97
      00000001800010E4 | 01 00 00 14 FE 13 40 F9 FF C3 00 91 C0 03 5F D6

      AArch64 disassembly by AsmArm64
      ---
      00000001800010B4: D100C3FF  sub sp, sp, #48
      00000001800010B8: F90013FE  str x30, [sp, #32]
      00000001800010BC: F9000FE2  str x2, [sp, #24]
      00000001800010C0: B90017E1  str w1, [sp, #20]
      00000001800010C4: F90007E0  str x0, [sp, #8]
      00000001800010C8: B94017E8  ldr w8, [sp, #20]
      00000001800010CC: 71000508  subs w8, w8, #1
      00000001800010D0: 540000C1  b.ne #24
      00000001800010D4: 14000001  #0:
      00000001800010D8: F0000140  adrp x0, #176128
      00000001800010DC: 91030000  add x0, x0, #192
      00000001800010E0: 97FFFFD5  bl #-172
      00000001800010E4: 14000001  #0:
      00000001800010E8: F94013FE  ldr x30, [sp, #32]
      00000001800010EC: 9100C3FF  add sp, sp, #48
      00000001800010F0: D65F03C0  ret

# After apply Dvrt

              8664 machine
                 2 CHPE Version
                   This is an Arm64EC! (chpeVersion == 2 && header.Machine == 0x8664)

  0000000180039001 Start of raw data
  0000000180039003 End of raw data
  0000000180033524 Address of index
  000000018002DF28 Address of callbacks
                 0 Size of zero fill
          00000000 Characteristics

    TLS Callbacks

    Address
    ----------------
    00000001800211B8      RtlIsEcCode = true (ARM64EC)
    0000000000000000

    VirtualAddress   | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    -----------------|------------------------------------------------
    00000001800211B8 | 90 FF FF 90 10 02 03 91 00 02 1F D6 E6 9F BA AD
    00000001800211C8 | E8 27 01 AD EA 2F 02 AD EC 37 03 AD EE 3F 04 AD
    00000001800211D8 | FD 7B 0A A9 FD 83 02 91 20 01 3F D6 E8 03 00 AA
    00000001800211E8 | 69 00 00 90 20 19 47 F9 FD 7B 4A A9 EE 3F 44 AD

    AArch64 disassembly by AsmArm64
    ---
    00000001800211B8: 90FFFF90  adrp x16, #-65536
    00000001800211BC: 91030210  add x16, x16, #192
    00000001800211C0: D61F0200  br x16
    00000001800211C4: ADBA9FE6  stp q6, q7, [sp, #-176]!
    00000001800211C8: AD0127E8  stp q8, q9, [sp, #32]
    00000001800211CC: AD022FEA  stp q10, q11, [sp, #64]
    00000001800211D0: AD0337EC  stp q12, q13, [sp, #96]
    00000001800211D4: AD043FEE  stp q14, q15, [sp, #128]
    00000001800211D8: A90A7BFD  stp x29, x30, [sp, #160]
    00000001800211DC: 910283FD  add x29, sp, #160
    00000001800211E0: D63F0120  blr x9
    00000001800211E4: AA0003E8  mov x8, x0
    00000001800211E8: 90000069  adrp x9, #49152
    00000001800211EC: F9471920  ldr x0, [x9, #3632]
    00000001800211F0: A94A7BFD  ldp x29, x30, [sp, #160]
    00000001800211F4: AD443FEE  ldp q14, q15, [sp, #128]

    Navigate to the destination at 00000001800110C0

      VirtualAddress   | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
      -----------------|------------------------------------------------
      00000001800110C0 | FF C3 00 D1 FE 13 00 F9 E2 0F 00 F9 E1 17 00 B9
      00000001800110D0 | E0 07 00 F9 E8 17 40 B9 08 05 00 71 C1 00 00 54
      00000001800110E0 | 01 00 00 14 C0 00 00 F0 00 80 02 91 D4 FF FF 97
      00000001800110F0 | 01 00 00 14 FE 13 40 F9 FF C3 00 91 C0 03 5F D6

      AArch64 disassembly by AsmArm64
      ---
      00000001800110C0: D100C3FF  sub sp, sp, #48
      00000001800110C4: F90013FE  str x30, [sp, #32]
      00000001800110C8: F9000FE2  str x2, [sp, #24]
      00000001800110CC: B90017E1  str w1, [sp, #20]
      00000001800110D0: F90007E0  str x0, [sp, #8]
      00000001800110D4: B94017E8  ldr w8, [sp, #20]
      00000001800110D8: 71000508  subs w8, w8, #1
      00000001800110DC: 540000C1  b.ne #24
      00000001800110E0: 14000001  #0:
      00000001800110E4: F00000C0  adrp x0, #110592
      00000001800110E8: 91028000  add x0, x0, #160
      00000001800110EC: 97FFFFD4  bl #-176
      00000001800110F0: 14000001  #0:
      00000001800110F4: F94013FE  ldr x30, [sp, #32]
      00000001800110F8: 9100C3FF  add sp, sp, #48
      00000001800110FC: D65F03C0  ret
C:\Proj\arm64x-upon-llvm> C:\Proj\psqlodbc-for-win10-arm64\Toolings\InspectTLSCallback\bin\Debug\net8.0\InspectTLSCallback.exe chpe tls_callback.arm64x.dll
                 2 CHPE Version

          00037000 Offset of Arm64X arm64x redirection metadata table
                 1  Count of Arm64X arm64x redirection metadata table entries

  000000018002DDFE Hybrid code address range table
                 3 Hybrid code address range count

  Hybrid Code Address Range Table

              Address Range
        ----------------------
        arm64  0000000180001000 - 00000001800103B3 (00001000 - 000103B3)
      arm64ec  0000000180011000 - 00000001800218A3 (00011000 - 000218A3)
          x64  0000000180022000 - 000000018002300F (00022000 - 0002300F)

  Arm64X Redirection Metadata Table

        FFS Start           ARM64EC Address
        ------------------------------------
        0000000180023000 -> 0000000180011F68