VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMGC/MMRamGCA.asm@ 15009

Last change on this file since 15009 was 12989, checked in by vboxsync, 16 years ago

VMM + VBox/cdefs.h: consolidated all the XYZ*DECLS of the VMM into VMM*DECL. Removed dead DECL and IN_XYZ* macros.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.4 KB
Line 
1; $Id: MMRamGCA.asm 12989 2008-10-06 02:15:39Z vboxsync $
2;; @file
3; MMRamGCA - Guest Context Ram access Assembly Routines.
4;
5
6;
7; Copyright (C) 2006-2007 Sun Microsystems, Inc.
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; Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18; Clara, CA 95054 USA or visit http://www.sun.com if you need
19; additional information or have any questions.
20;
21
22;*******************************************************************************
23;* Header Files *
24;*******************************************************************************
25%include "VBox/asmdefs.mac"
26%include "VBox/err.mac"
27%include "iprt/err.mac"
28%include "VBox/x86.mac"
29
30
31BEGINCODE
32
33
34;;
35; Read data in guest context, CDECL calling conv.
36; VMMRCDECL(int) MMGCRamRead(void *pDst, void *pSrc, size_t cb);
37; MMRamGC page fault handler must be installed prior this call for safe operation.
38;
39; @returns eax=0 if data read, other code - invalid access, #PF was generated.
40; @param [esp + 04h] Param 1 - Pointer where to store result data (pDst).
41; @param [esp + 08h] Param 2 - Pointer of data to read (pSrc).
42; @param [esp + 0ch] Param 3 - Size of data to read, only 1/2/4/8 is valid.
43; @uses eax, ecx, edx
44;
45; @remark Data is saved to destination (Param 1) even if read error occurred!
46;
47align 16
48BEGINPROC MMGCRamReadNoTrapHandler
49 mov eax, [esp + 0ch] ; eax = size of data to read
50 cmp eax, byte 8 ; yes, it's slow, validate input
51 ja ramread_InvalidSize
52 mov edx, [esp + 04h] ; edx = result address
53 mov ecx, [esp + 08h] ; ecx = data address
54 jmp [ramread_table + eax*4]
55
56ramread_byte:
57 xor eax, eax ; rc = VINF_SUCCESS by default
58 mov cl, [ecx] ; read data
59 mov [edx], cl ; save data
60 ret
61
62ramread_word:
63 xor eax, eax ; rc = VINF_SUCCESS by default
64 mov cx, [ecx] ; read data
65 mov [edx], cx ; save data
66 ret
67
68ramread_dword:
69 xor eax, eax ; rc = VINF_SUCCESS by default
70 mov ecx, [ecx] ; read data
71 mov [edx], ecx ; save data
72 ret
73
74ramread_qword:
75 mov eax, [ecx] ; read data
76 mov [edx], eax ; save data
77 mov eax, [ecx+4] ; read data
78 mov [edx+4], eax ; save data
79 xor eax, eax ; rc = VINF_SUCCESS by default
80 ret
81
82; Read error - we will be here after our page fault handler.
83GLOBALNAME MMGCRamRead_Error
84 mov eax, VERR_ACCESS_DENIED
85 ret
86
87; Invalid data size
88ramread_InvalidSize:
89 mov eax, VERR_INVALID_PARAMETER
90 ret
91
92; Jump table
93ramread_table:
94 DD ramread_InvalidSize
95 DD ramread_byte
96 DD ramread_word
97 DD ramread_InvalidSize
98 DD ramread_dword
99 DD ramread_InvalidSize
100 DD ramread_InvalidSize
101 DD ramread_InvalidSize
102 DD ramread_qword
103ENDPROC MMGCRamReadNoTrapHandler
104
105
106;;
107; Write data in guest context, CDECL calling conv.
108; VMMRCDECL(int) MMGCRamWrite(void *pDst, void *pSrc, size_t cb);
109;
110; @returns eax=0 if data written, other code - invalid access, #PF was generated.
111; @param [esp + 04h] Param 1 - Pointer where to write data (pDst).
112; @param [esp + 08h] Param 2 - Pointer of data to write (pSrc).
113; @param [esp + 0ch] Param 3 - Size of data to write, only 1/2/4 is valid.
114; @uses eax, ecx, edx
115;
116align 16
117BEGINPROC MMGCRamWriteNoTrapHandler
118 mov eax, [esp + 0ch] ; eax = size of data to write
119 cmp eax, byte 4 ; yes, it's slow, validate input
120 ja ramwrite_InvalidSize
121 mov edx, [esp + 04h] ; edx = write address
122 mov ecx, [esp + 08h] ; ecx = data address
123 jmp [ramwrite_table + eax*4]
124
125ramwrite_byte:
126 xor eax, eax ; rc = VINF_SUCCESS by default
127 mov cl, [ecx] ; read data
128 mov [edx], cl ; write data
129 ret
130
131ramwrite_word:
132 xor eax, eax ; rc = VINF_SUCCESS by default
133 mov cx, [ecx] ; read data
134 mov [edx], cx ; write data
135 ret
136
137ramwrite_dword:
138 xor eax, eax ; rc = VINF_SUCCESS by default
139 mov ecx, [ecx] ; read data
140 mov [edx], ecx ; write data
141 ret
142
143; Write error - we will be here after our page fault handler.
144GLOBALNAME MMGCRamWrite_Error
145 mov eax, VERR_ACCESS_DENIED
146 ret
147
148; Invalid data size
149ramwrite_InvalidSize:
150 mov eax, VERR_INVALID_PARAMETER
151 ret
152
153; Jump table
154ramwrite_table:
155 DD ramwrite_InvalidSize
156 DD ramwrite_byte
157 DD ramwrite_word
158 DD ramwrite_InvalidSize
159 DD ramwrite_dword
160ENDPROC MMGCRamWriteNoTrapHandler
161
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