| ;------------------------------------------------------------------------------ | |
| ; | |
| ; Copyright (c) 2018, Intel Corporation. All rights reserved.<BR> | |
| ; SPDX-License-Identifier: BSD-2-Clause-Patent | |
| ; | |
| ; Abstract: | |
| ; | |
| ; This file provides macro definitions for stuffing the Return Stack Buffer (RSB) | |
| ; for NASM files. | |
| ; | |
| ;------------------------------------------------------------------------------ | |
| %define RSB_STUFF_ENTRIES 0x20 | |
| ; | |
| ; parameters: | |
| ; @param 1: register to use as counter (e.g. IA32:eax, X64:rax) | |
| ; @param 2: stack pointer to restore (IA32:esp, X64:rsp) | |
| ; @param 3: the size of a stack frame (IA32:4, X64:8) | |
| ; | |
| %macro StuffRsb 3 | |
| mov %1, RSB_STUFF_ENTRIES / 2 | |
| %%Unroll1: | |
| call %%Unroll2 | |
| %%SpecTrap1: | |
| pause | |
| lfence | |
| jmp %%SpecTrap1 | |
| %%Unroll2: | |
| call %%StuffLoop | |
| %%SpecTrap2: | |
| pause | |
| lfence | |
| jmp %%SpecTrap2 | |
| %%StuffLoop: | |
| dec %1 | |
| jnz %%Unroll1 | |
| add %2, RSB_STUFF_ENTRIES * %3 ; Restore the stack pointer | |
| %endmacro | |
| ; | |
| ; RSB stuffing macros for IA32 and X64 | |
| ; | |
| %macro StuffRsb32 0 | |
| StuffRsb eax, esp, 4 | |
| %endmacro | |
| %macro StuffRsb64 0 | |
| StuffRsb rax, rsp, 8 | |
| %endmacro |