1 /** @file
2   AsmMonitor function
3 
4   Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php.
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 /**
16   Sets up a monitor buffer that is used by AsmMwait().
17 
18   Executes a MONITOR instruction with the register state specified by Eax, Ecx
19   and Edx. Returns Eax. This function is only available on IA-32 and x64.
20 
21   @param  RegisterEax The value to load into EAX or RAX before executing the MONITOR
22                       instruction.
23   @param  RegisterEcx The value to load into ECX or RCX before executing the MONITOR
24                       instruction.
25   @param  RegisterEdx The value to load into EDX or RDX before executing the MONITOR
26                       instruction.
27 
28   @return RegisterEax
29 
30 **/
31 UINTN
32 EFIAPI
AsmMonitor(IN UINTN RegisterEax,IN UINTN RegisterEcx,IN UINTN RegisterEdx)33 AsmMonitor (
34   IN      UINTN                     RegisterEax,
35   IN      UINTN                     RegisterEcx,
36   IN      UINTN                     RegisterEdx
37   )
38 {
39   _asm {
40     mov     eax, RegisterEax
41     mov     ecx, RegisterEcx
42     mov     edx, RegisterEdx
43     _emit   0x0f             // monitor
44     _emit   0x01
45     _emit   0xc8
46   }
47 }
48 
49