linux/tools/testing/selftests/x86/thunks_32.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * thunks_32.S - assembly helpers for mixed-bitness code
   4 * Copyright (c) 2015 Denys Vlasenko
   5 *
   6 * These are little helpers that make it easier to switch bitness on
   7 * the fly.
   8 */
   9
  10        .text
  11        .code32
  12
  13        .global call64_from_32
  14        .type call32_from_64, @function
  15
  16        // 4(%esp): function to call
  17call64_from_32:
  18        // Fetch function address
  19        mov     4(%esp), %eax
  20
  21        // Save registers which are callee-clobbered by 64-bit ABI
  22        push    %ecx
  23        push    %edx
  24        push    %esi
  25        push    %edi
  26
  27        // Switch to long mode
  28        jmp     $0x33,$1f
  291:      .code64
  30
  31        // Call the function
  32        call    *%rax
  33
  34        // Switch to compatibility mode
  35        push    $0x23  /* USER32_CS */
  36        .code32; push $1f; .code64 /* hack: can't have X86_64_32S relocation in 32-bit ELF */
  37        lretq
  381:      .code32
  39
  40        pop     %edi
  41        pop     %esi
  42        pop     %edx
  43        pop     %ecx
  44
  45        ret
  46
  47.size call64_from_32, .-call64_from_32
  48
  49.section .note.GNU-stack,"",%progbits
  50