cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

thunks_32.S (882B)


      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