root/tools/testing/selftests/x86/thunks_32.S

/* [<][>][^][v][top][bottom][index][help] */
   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
  17 call64_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
  29 1:      .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
  38 1:      .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

/* [<][>][^][v][top][bottom][index][help] */