VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMGC/EMGCA.asm@ 5999

Last change on this file since 5999 was 5999, checked in by vboxsync, 17 years ago

The Giant CDDL Dual-License Header Change.

File size: 5.4 KB
Line 
1; $Id: EMAllA.asm 20278 2007-04-09 11:56:29Z sandervl $
2;; @file
3; EM Assembly Routines.
4;
5
6;
7; Copyright (C) 2006-2007 innotek GmbH
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17
18;*******************************************************************************
19;* Header Files *
20;*******************************************************************************
21%include "VBox/asmdefs.mac"
22%include "VBox/err.mac"
23%include "VBox/x86.mac"
24
25BEGINCODE
26
27;;
28; Emulate lock CMPXCHG instruction, CDECL calling conv.
29; EMGCDECL(uint32_t) EMGCEmulateLockCmpXchg(RTGCPTR pu32Param1, uint32_t *pu32Param2, uint32_t u32Param3, size_t cbSize, uint32_t *pEflags);
30;
31; @returns eax=0 if data written, other code - invalid access, #PF was generated.
32; @param [esp + 04h] Param 1 - First parameter - pointer to first parameter
33; @param [esp + 08h] Param 2 - Second parameter - pointer to second parameter (eax)
34; @param [esp + 0ch] Param 3 - Third parameter - third parameter
35; @param [esp + 10h] Param 4 - Size of parameters, only 1/2/4 is valid.
36; @param [esp + 14h] Param 4 - Pointer to eflags (out)
37; @uses eax, ecx, edx
38;
39align 16
40BEGINPROC EMGCEmulateLockCmpXchg
41 push ebx
42 mov ecx, [esp + 04h + 4] ; ecx = first parameter
43 mov ebx, [esp + 08h + 4] ; ebx = 2nd parameter (eax)
44 mov edx, [esp + 0ch + 4] ; edx = third parameter
45 mov eax, [esp + 10h + 4] ; eax = size of parameters
46
47 cmp al, 4
48 je short .do_dword ; 4 bytes variant
49 cmp al, 2
50 je short .do_word ; 2 byte variant
51 cmp al, 1
52 je short .do_byte ; 1 bytes variant
53 int3
54
55.do_dword:
56 ; load 2nd parameter's value
57 mov eax, dword [ebx]
58
59 lock cmpxchg dword [ecx], edx ; do 4 bytes CMPXCHG
60 mov dword [ebx], eax
61 jmp short .done
62
63.do_word:
64 ; load 2nd parameter's value
65 mov eax, dword [ebx]
66
67 lock cmpxchg word [ecx], dx ; do 2 bytes CMPXCHG
68 mov word [ebx], ax
69 jmp short .done
70
71.do_byte:
72 ; load 2nd parameter's value
73 mov eax, dword [ebx]
74
75 lock cmpxchg byte [ecx], dl ; do 1 bytes CMPXCHG
76 mov byte [ebx], al
77
78.done:
79 ; collect flags and return.
80 pushf
81 pop eax
82
83 mov edx, [esp + 14h + 4] ; eflags pointer
84 mov dword [edx], eax
85
86 pop ebx
87 mov eax, VINF_SUCCESS
88 retn
89
90; Read error - we will be here after our page fault handler.
91GLOBALNAME EMGCEmulateLockCmpXchg_Error
92 pop ebx
93 mov eax, VERR_ACCESS_DENIED
94 ret
95
96ENDPROC EMGCEmulateLockCmpXchg
97
98;;
99; Emulate CMPXCHG instruction, CDECL calling conv.
100; EMGCDECL(uint32_t) EMGCEmulateCmpXchg(RTGCPTR pu32Param1, uint32_t *pu32Param2, uint32_t u32Param3, size_t cbSize, uint32_t *pEflags);
101;
102; @returns eax=0 if data written, other code - invalid access, #PF was generated.
103; @param [esp + 04h] Param 1 - First parameter - pointer to first parameter
104; @param [esp + 08h] Param 2 - Second parameter - pointer to second parameter (eax)
105; @param [esp + 0ch] Param 3 - Third parameter - third parameter
106; @param [esp + 10h] Param 4 - Size of parameters, only 1/2/4 is valid.
107; @param [esp + 14h] Param 4 - Pointer to eflags (out)
108; @uses eax, ecx, edx
109;
110align 16
111BEGINPROC EMGCEmulateCmpXchg
112 push ebx
113 mov ecx, [esp + 04h + 4] ; ecx = first parameter
114 mov ebx, [esp + 08h + 4] ; ebx = 2nd parameter (eax)
115 mov edx, [esp + 0ch + 4] ; edx = third parameter
116 mov eax, [esp + 10h + 4] ; eax = size of parameters
117
118 cmp al, 4
119 je short .do_dword ; 4 bytes variant
120 cmp al, 2
121 je short .do_word ; 2 byte variant
122 cmp al, 1
123 je short .do_byte ; 1 bytes variant
124 int3
125
126.do_dword:
127 ; load 2nd parameter's value
128 mov eax, dword [ebx]
129
130 cmpxchg dword [ecx], edx ; do 4 bytes CMPXCHG
131 mov dword [ebx], eax
132 jmp short .done
133
134.do_word:
135 ; load 2nd parameter's value
136 mov eax, dword [ebx]
137
138 cmpxchg word [ecx], dx ; do 2 bytes CMPXCHG
139 mov word [ebx], ax
140 jmp short .done
141
142.do_byte:
143 ; load 2nd parameter's value
144 mov eax, dword [ebx]
145
146 cmpxchg byte [ecx], dl ; do 1 bytes CMPXCHG
147 mov byte [ebx], al
148
149.done:
150 ; collect flags and return.
151 pushf
152 pop eax
153
154 mov edx, [esp + 14h + 4] ; eflags pointer
155 mov dword [edx], eax
156
157 pop ebx
158 mov eax, VINF_SUCCESS
159 retn
160
161; Read error - we will be here after our page fault handler.
162GLOBALNAME EMGCEmulateCmpXchg_Error
163 pop ebx
164 mov eax, VERR_ACCESS_DENIED
165 ret
166ENDPROC EMGCEmulateCmpXchg
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette