Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


working paged real mode
[palacios.git] / palacios / src / geekos / svm_lowlevel.asm
index badc8f1..7aa128f 100644 (file)
 %include "symbol.asm"
 
 
+EXPORT DisableInts
+
+EXPORT GetGDTR
+EXPORT GetIDTR
+EXPORT GetTR
+
+EXPORT exit_test
+
+EXTERN handle_svm_exit
+
+EXPORT launch_svm
+EXPORT safe_svm_launch
+
+
+;; These need to be kept similar with the svm return values in svm.h
+SVM_HANDLER_SUCCESS  equ 0x00
+SVM_HANDLER_ERROR equ  0x1
+SVM_HANDLER_HALT equ 0x2
+
 [BITS 32]
 
 
+; Save and restore registers needed by SVM
+%macro Save_SVM_Registers 1
+       mov     [%1], ebx
+       mov     [%1 + 8], ecx
+       mov     [%1 + 16], edx
+       mov     [%1 + 24], esi
+       mov     [%1 + 32], edi
+       mov     [%1 + 40], ebp
+%endmacro
+
+
+%macro Restore_SVM_Registers 1
+       mov     ebx, [%1]
+       mov     ecx, [%1 + 8]
+       mov     edx, [%1 + 16]
+       mov     esi, [%1 + 24]
+       mov     edi, [%1 + 32]
+       mov     ebp, [%1 + 40]
+%endmacro
+
+%macro vmrun 0
+       db      00fh, 001h, 0d8h
+%endmacro
+
+%macro vmsave 0
+       db      00fh, 001h, 0dbh
+%endmacro
+
+%macro vmload 0
+       db      00fh, 001h, 0dah
+%endmacro
+
+;VMRUN  equ db 0Fh, 01h, D8h
+;VMLOAD equ db 0x0F,0x01,0xDA
+;VMSAVE equ db 0x0F,0x01,0xDB
+;STGI   equ db 0x0F,0x01,0xDC
+;CLGI   equ db 0x0F,0x01,0xDD
+
+
+align 8
+DisableInts:
+       cli
+       ret
+
+
+align 8
+GetGDTR:
+       push    ebp
+       mov     ebp, esp
+       pusha   
+       mov     ebx, [ebp + 8]
+       sgdt    [ebx]
+       
+       popa
+       pop     ebp
+       ret
+
+
+align 8
+GetIDTR:
+       push    ebp
+       mov     ebp, esp
+       pusha   
+
+       mov     ebx, [ebp + 8]
+       sidt    [ebx]
+       
+       popa
+       pop     ebp
+       ret
+
 
 
+align 8
+GetTR:
+       push    ebp
+       mov     ebp, esp
+       pusha   
+       mov     ebx, [ebp + 8]
+       str     [ebx]
+       
+       popa
+       pop     ebp
+       ret
 
 
 
+; I think its safe to say that there are some pretty serious register issues...
+align 8
+launch_svm:
+       push    ebp
+       mov     ebp, esp
+       pusha
+       
+       mov     eax, [ebp + 8]
+       vmrun
+;      db      00fh, 001h, 0d8h
+       popa
+       pop     ebp
+       ret
+
+
+
+
+exit_test: 
+       mov     cr4, eax
+       ret
+
+
+;; Need to check this..
+;; save_svm_launch(rax, struct guest_gprs * regs)
+align 8
+safe_svm_launch:
+       push    ebp
+       mov     ebp, esp
+       pushf
+       pusha                   ;; Save Host state
+
+
+       push    dword [ebp + 12]  ;; pointer to the guest GPR save area
+       push    dword [ebp + 8]   ;; pointer to the VMCB pointer
+
+       mov     eax, [esp + 4]    ;; mov guest GPR pointer to eax
+
+       Restore_SVM_Registers eax ;; Restore Guest GPR state
+       pop     eax               ;; pop VMCB pointer into eax
+
+       vmload
+       vmrun
+       vmsave
+
+       pop     eax               ;; pop Guest GPR pointer into eax
+       Save_SVM_Registers eax    ;; save guest GPRs
+
+       popa                      ;; Restore Host state
+       popf
+       pop     ebp
+       ret
+
+
+
+;;align 8
+;;safe_svm_launch:
+;;     push    ebp
+;;     mov     ebp, esp
+;;     pushf
+;;     pusha
+;;
+;.vmm_loop:
+;      mov     eax, [ebp + 8]
+;      vmrun
+;      Save_SVM_Registers
+;
+;      call    handle_svm_exit
+;
+;      mov     [ebp + 12], eax
+;
+;      and     eax, eax
+;
+;      Restore_SVM_Registers
+;
+;      jz      .vmm_loop
+;
+;      popa
+;      popf
+;      pop     ebp
+;      ret
+
+
 %endif
+
+