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

efi-rt-wrapper.S (1151B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2018 Linaro Ltd <ard.biesheuvel@linaro.org>
      4 */
      5
      6#include <linux/linkage.h>
      7
      8SYM_FUNC_START(__efi_rt_asm_wrapper)
      9	stp	x29, x30, [sp, #-32]!
     10	mov	x29, sp
     11
     12	/*
     13	 * Register x18 is designated as the 'platform' register by the AAPCS,
     14	 * which means firmware running at the same exception level as the OS
     15	 * (such as UEFI) should never touch it.
     16	 */
     17	stp	x1, x18, [sp, #16]
     18
     19	/*
     20	 * We are lucky enough that no EFI runtime services take more than
     21	 * 5 arguments, so all are passed in registers rather than via the
     22	 * stack.
     23	 */
     24	mov	x8, x0
     25	mov	x0, x2
     26	mov	x1, x3
     27	mov	x2, x4
     28	mov	x3, x5
     29	mov	x4, x6
     30	blr	x8
     31
     32	ldp	x1, x2, [sp, #16]
     33	cmp	x2, x18
     34	ldp	x29, x30, [sp], #32
     35	b.ne	0f
     36	ret
     370:
     38	/*
     39	 * With CONFIG_SHADOW_CALL_STACK, the kernel uses x18 to store a
     40	 * shadow stack pointer, which we need to restore before returning to
     41	 * potentially instrumented code. This is safe because the wrapper is
     42	 * called with preemption disabled and a separate shadow stack is used
     43	 * for interrupts.
     44	 */
     45	mov	x18, x2
     46	b	efi_handle_corrupted_x18	// tail call
     47SYM_FUNC_END(__efi_rt_asm_wrapper)