summaryrefslogtreecommitdiffstats
path: root/src/VBox/VMM/VMMRC/MMRamRCA.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/VMM/VMMRC/MMRamRCA.asm')
-rw-r--r--src/VBox/VMM/VMMRC/MMRamRCA.asm157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/VBox/VMM/VMMRC/MMRamRCA.asm b/src/VBox/VMM/VMMRC/MMRamRCA.asm
new file mode 100644
index 00000000..c9e8446c
--- /dev/null
+++ b/src/VBox/VMM/VMMRC/MMRamRCA.asm
@@ -0,0 +1,157 @@
+; $Id: MMRamRCA.asm $
+;; @file
+; MMRamGCA - Guest Context Ram access Assembly Routines.
+;
+
+;
+; Copyright (C) 2006-2019 Oracle Corporation
+;
+; This file is part of VirtualBox Open Source Edition (OSE), as
+; available from http://www.virtualbox.org. This file is free software;
+; you can redistribute it and/or modify it under the terms of the GNU
+; General Public License (GPL) as published by the Free Software
+; Foundation, in version 2 as it comes in the "COPYING" file of the
+; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+;
+
+;*******************************************************************************
+;* Header Files *
+;*******************************************************************************
+%include "VBox/asmdefs.mac"
+%include "VBox/err.mac"
+%include "iprt/err.mac"
+%include "iprt/x86.mac"
+
+
+BEGINCODE
+
+
+;;
+; Read data in guest context, CDECL calling conv.
+; VMMRCDECL(int) MMGCRamRead(void *pDst, void *pSrc, size_t cb);
+; MMRamGC page fault handler must be installed prior this call for safe operation.
+;
+; @returns eax=0 if data read, other code - invalid access, #PF was generated.
+; @param [esp + 04h] Param 1 - Pointer where to store result data (pDst).
+; @param [esp + 08h] Param 2 - Pointer of data to read (pSrc).
+; @param [esp + 0ch] Param 3 - Size of data to read, only 1/2/4/8 is valid.
+; @uses eax, ecx, edx
+;
+; @remark Data is saved to destination (Param 1) even if read error occurred!
+;
+align 16
+BEGINPROC MMGCRamReadNoTrapHandler
+ mov eax, [esp + 0ch] ; eax = size of data to read
+ cmp eax, byte 8 ; yes, it's slow, validate input
+ ja ramread_InvalidSize
+ mov edx, [esp + 04h] ; edx = result address
+ mov ecx, [esp + 08h] ; ecx = data address
+ jmp [ramread_table + eax*4]
+
+ramread_byte:
+ xor eax, eax ; rc = VINF_SUCCESS by default
+ mov cl, [ecx] ; read data
+ mov [edx], cl ; save data
+ ret
+
+ramread_word:
+ xor eax, eax ; rc = VINF_SUCCESS by default
+ mov cx, [ecx] ; read data
+ mov [edx], cx ; save data
+ ret
+
+ramread_dword:
+ xor eax, eax ; rc = VINF_SUCCESS by default
+ mov ecx, [ecx] ; read data
+ mov [edx], ecx ; save data
+ ret
+
+ramread_qword:
+ mov eax, [ecx] ; read data
+ mov [edx], eax ; save data
+ mov eax, [ecx+4] ; read data
+ mov [edx+4], eax ; save data
+ xor eax, eax ; rc = VINF_SUCCESS by default
+ ret
+
+; Read error - we will be here after our page fault handler.
+GLOBALNAME MMGCRamRead_Error
+ mov eax, VERR_ACCESS_DENIED
+ ret
+
+; Invalid data size
+ramread_InvalidSize:
+ mov eax, VERR_INVALID_PARAMETER
+ ret
+
+; Jump table
+ramread_table:
+ DD ramread_InvalidSize
+ DD ramread_byte
+ DD ramread_word
+ DD ramread_InvalidSize
+ DD ramread_dword
+ DD ramread_InvalidSize
+ DD ramread_InvalidSize
+ DD ramread_InvalidSize
+ DD ramread_qword
+ENDPROC MMGCRamReadNoTrapHandler
+
+
+;;
+; Write data in guest context, CDECL calling conv.
+; VMMRCDECL(int) MMGCRamWrite(void *pDst, void *pSrc, size_t cb);
+;
+; @returns eax=0 if data written, other code - invalid access, #PF was generated.
+; @param [esp + 04h] Param 1 - Pointer where to write data (pDst).
+; @param [esp + 08h] Param 2 - Pointer of data to write (pSrc).
+; @param [esp + 0ch] Param 3 - Size of data to write, only 1/2/4 is valid.
+; @uses eax, ecx, edx
+;
+align 16
+BEGINPROC MMGCRamWriteNoTrapHandler
+ mov eax, [esp + 0ch] ; eax = size of data to write
+ cmp eax, byte 4 ; yes, it's slow, validate input
+ ja ramwrite_InvalidSize
+ mov edx, [esp + 04h] ; edx = write address
+ mov ecx, [esp + 08h] ; ecx = data address
+ jmp [ramwrite_table + eax*4]
+
+ramwrite_byte:
+ xor eax, eax ; rc = VINF_SUCCESS by default
+ mov cl, [ecx] ; read data
+ mov [edx], cl ; write data
+ ret
+
+ramwrite_word:
+ xor eax, eax ; rc = VINF_SUCCESS by default
+ mov cx, [ecx] ; read data
+ mov [edx], cx ; write data
+ ret
+
+ramwrite_dword:
+ xor eax, eax ; rc = VINF_SUCCESS by default
+ mov ecx, [ecx] ; read data
+ mov [edx], ecx ; write data
+ ret
+
+; Write error - we will be here after our page fault handler.
+GLOBALNAME MMGCRamWrite_Error
+ mov eax, VERR_ACCESS_DENIED
+ ret
+
+; Invalid data size
+ramwrite_InvalidSize:
+ mov eax, VERR_INVALID_PARAMETER
+ ret
+
+; Jump table
+ramwrite_table:
+ DD ramwrite_InvalidSize
+ DD ramwrite_byte
+ DD ramwrite_word
+ DD ramwrite_InvalidSize
+ DD ramwrite_dword
+ENDPROC MMGCRamWriteNoTrapHandler
+