1;; 2;; Copyright (c) 2019-2020, Intel Corporation 3;; 4;; Redistribution and use in source and binary forms, with or without 5;; modification, are permitted provided that the following conditions are met: 6;; 7;; * Redistributions of source code must retain the above copyright notice, 8;; this list of conditions and the following disclaimer. 9;; * Redistributions in binary form must reproduce the above copyright 10;; notice, this list of conditions and the following disclaimer in the 11;; documentation and/or other materials provided with the distribution. 12;; * Neither the name of Intel Corporation nor the names of its contributors 13;; may be used to endorse or promote products derived from this software 14;; without specific prior written permission. 15;; 16;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22;; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23;; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24;; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26;; 27 28%include "include/os.asm" 29%include "include/clear_regs.asm" 30 31section .text 32; 33; This function clears all scratch GP registers 34; 35; void clear_scratch_gps(void) 36MKGLOBAL(clear_scratch_gps,function,internal) 37clear_scratch_gps: 38 39 clear_scratch_gps_asm 40 41 ret 42 43; 44; This function clears all scratch XMM registers 45; 46; void clear_scratch_xmms_sse(void) 47MKGLOBAL(clear_scratch_xmms_sse,function,internal) 48clear_scratch_xmms_sse: 49 50 clear_scratch_xmms_sse_asm 51 52 ret 53 54; 55; This function clears all scratch XMM registers 56; 57; It should be called before restoring the XMM registers 58; for Windows (XMM6-XMM15) 59; 60; void clear_scratch_xmms_avx(void) 61MKGLOBAL(clear_scratch_xmms_avx,function,internal) 62clear_scratch_xmms_avx: 63 64 clear_scratch_xmms_avx_asm 65 66 ret 67 68; 69; This function clears all scratch YMM registers 70; 71; It should be called before restoring the XMM registers 72; for Windows (XMM6-XMM15) 73; 74; void clear_scratch_ymms(void) 75MKGLOBAL(clear_scratch_ymms,function,internal) 76clear_scratch_ymms: 77 78 clear_scratch_ymms_asm 79 80 ret 81 82; 83; This function clears all scratch ZMM registers 84; 85; It should be called before restoring the XMM registers 86; for Windows (XMM6-XMM15). YMM registers are used 87; on purpose, since XOR'ing YMM registers is faster 88; than XOR'ing ZMM registers, and the operation clears 89; also the upper 256 bits 90; 91; void clear_scratch_zmms(void) 92MKGLOBAL(clear_scratch_zmms,function,internal) 93clear_scratch_zmms: 94 95 clear_scratch_zmms_asm 96 97 ret 98 99; 100; This function clears all memory passed 101; 102; void force_memset_zero(void *mem, const size_t size) 103MKGLOBAL(force_memset_zero,function,internal) 104force_memset_zero: 105 106%ifdef LINUX 107 mov rcx, rsi 108%else 109 push rdi 110 mov rdi, rcx 111 mov rcx, rdx 112%endif 113 xor eax, eax 114 cld 115 rep stosb 116 117%ifndef LINUX 118 pop rdi 119%endif 120 ret 121 122MKGLOBAL(imb_clear_mem,function,) 123imb_clear_mem: 124 125%ifdef LINUX 126 cmp rdi, 0 127%else 128 cmp rcx, 0 129%endif 130 jz clr_mem_return 131 132 pushfq ;; save flags 133%ifdef LINUX 134 mov rcx, rsi 135%else 136 push rdi 137 mov rdi, rcx 138 mov rcx, rdx 139%endif 140 xor eax, eax 141 cld 142 rep stosb 143 144%ifndef LINUX 145 pop rdi 146%endif 147 sfence ;; ensure stores complete 148 popfq ;; restore flags 149 150clr_mem_return: 151 ret 152 153%ifdef LINUX 154section .note.GNU-stack noalloc noexec nowrite progbits 155%endif 156