1#/*++ 2# 3#Copyright (c) 2006, Intel Corporation. All rights reserved.<BR> 4#This program and the accompanying materials 5#are licensed and made available under the terms and conditions of the BSD License 6#which accompanies this distribution. The full text of the license may be found at 7#http://opensource.org/licenses/bsd-license.php 8# 9#THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10#WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11# 12#Module Name: 13# 14# EfiSetMem.asm 15# 16#Abstract: 17# 18# This is the code that supports IA32-optimized SetMem service 19# 20#--*/ 21#include "EfiBind.h" 22#--------------------------------------------------------------------------- 23 .686: 24 #.MODEL flat,C 25 .mmx: 26 .code: 27 28#--------------------------------------------------------------------------- 29.globl ASM_PFX(EfiCommonLibSetMem) 30 31#VOID 32#EfiCommonLibSetMem ( 33# IN VOID *Buffer, 34# IN UINTN Count, 35# IN UINT8 Value 36# ) 37#/*++ 38# 39#Input: VOID *Buffer - Pointer to buffer to write 40# UINTN Count - Number of bytes to write 41# UINT8 Value - Value to write 42# 43#Output: None. 44# 45#Saves: 46# 47#Modifies: 48# 49#Description: This function is an optimized set-memory function. 50# 51#Notes: This function tries to set memory 8 bytes at a time. As a result, 52# it first picks up any misaligned bytes, then words, before getting 53# in the main loop that does the 8-byte clears. 54# 55#--*/ 56ASM_PFX(EfiCommonLibSetMem): 57 58 pushl %ebp 59 movl %esp, %ebp 60 subl $0x10, %esp # Reserve space for local variable UINT64 QWordValue @[ebp - 10H] & UINT64 MmxSave @[ebp - 18H] 61 pushl %ebx 62 pushl %edi 63 64 movl 0xC(%ebp), %edx # Count 65 testl %edx, %edx 66 je _SetMemDone 67 68 pushl %ebx 69 70 movl 8(%ebp), %eax # Buffer 71 movb 0x10(%ebp), %bl # Value 72 movl %eax, %edi 73 movb %bl, %bh 74 75 cmpl $256, %edx 76 jb _SetRemindingByte 77 78 andb $0x7, %al 79 testb %al, %al 80 je _SetBlock 81 82 movl %edi, %eax 83 shrl $3, %eax 84 incl %eax 85 shll $3, %eax 86 subl %edi, %eax 87 cmpl %edx, %eax 88 jnb _SetRemindingByte 89 90 subl %eax, %edx 91 movl %eax, %ecx 92 93 movb %bl, %al 94 rep 95 stosb 96 97_SetBlock: 98 movl %edx, %eax 99 shrl $6, %eax 100 testl %eax, %eax 101 je _SetRemindingByte 102 103 shll $6, %eax 104 subl %eax, %edx 105 shrl $6, %eax 106 107 movw %bx, -0x10(%ebp) # QWordValue[0] 108 movw %bx, -0x10+2(%ebp) # QWordValue[2] 109 movw %bx, -0x10+4(%ebp) # QWordValue[4] 110 movw %bx, -0x10+6(%ebp) # QWordValue[6] 111 112 113 movq %mm0, -8(%ebp) # Save mm0 to MmxSave 114 movq -0x10(%ebp), %mm0 # Load QWordValue to mm0 115 116_B: 117 movq %mm0, %ds:(%edi) 118 movq %mm0, %ds:8(%edi) 119 movq %mm0, %ds:16(%edi) 120 movq %mm0, %ds:24(%edi) 121 movq %mm0, %ds:32(%edi) 122 movq %mm0, %ds:40(%edi) 123 movq %mm0, %ds:48(%edi) 124 movq %mm0, %ds:56(%edi) 125 addl $64, %edi 126 decl %eax 127 jnz _B 128 129# Restore mm0 130 movq -8(%ebp), %mm0 # Restore MmxSave to mm0 131 emms # Exit MMX Instruction 132 133_SetRemindingByte: 134 movl %edx, %ecx 135 136 movl %ebx, %eax 137 shll $16, %eax 138 movw %bx, %ax 139 shrl $2, %ecx 140 rep 141 stosl 142 143 movl %edx, %ecx 144 andl $3, %ecx 145 rep 146 stosb 147 148 popl %ebx 149 150_SetMemDone: 151 152 popl %edi 153 popl %ebx 154 leave 155 ret 156 157#EfiCommonLibSetMem ENDP 158 159