fix: setup new gdt before bootstrapping MM
This commit is contained in:
		
							parent
							
								
									549c063b38
								
							
						
					
					
						commit
						e6b057fe78
					
				
					 13 changed files with 289 additions and 142 deletions
				
			
		| 
						 | 
					@ -16,7 +16,7 @@ KERNEL	= vmstupid.sys
 | 
				
			||||||
MM_SRCS = bootstrap.inc \
 | 
					MM_SRCS = bootstrap.inc \
 | 
				
			||||||
			mm.inc \
 | 
								mm.inc \
 | 
				
			||||||
			pmm.inc \
 | 
								pmm.inc \
 | 
				
			||||||
			vmm.inc
 | 
								vmem.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRCS	= kernel.asm \
 | 
					SRCS	= kernel.asm \
 | 
				
			||||||
			const.inc \
 | 
								const.inc \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,4 +23,5 @@ LF   = 0x0A
 | 
				
			||||||
CONFIG_COMPAT_I386 = 0
 | 
					CONFIG_COMPAT_I386 = 0
 | 
				
			||||||
CONFIG_TRACE_PMM = 1
 | 
					CONFIG_TRACE_PMM = 1
 | 
				
			||||||
CONFIG_TRACE_VMEM = 1
 | 
					CONFIG_TRACE_VMEM = 1
 | 
				
			||||||
 | 
					CONFIG_TRACE_SVM = 1
 | 
				
			||||||
CONFIG_TRACE_VMM = 1
 | 
					CONFIG_TRACE_VMM = 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,21 +44,6 @@ kmain:
 | 
				
			||||||
	mov eax, szMsgBuildDate
 | 
						mov eax, szMsgBuildDate
 | 
				
			||||||
	call klog
 | 
						call klog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	call mm_bootstrap
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	call pmm_init
 | 
					 | 
				
			||||||
	call vmm_bootstrap
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mov eax, 4
 | 
					 | 
				
			||||||
	call pmm_alloc
 | 
					 | 
				
			||||||
	xchg bx, bx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mov edx, 4
 | 
					 | 
				
			||||||
	call pmm_free
 | 
					 | 
				
			||||||
	xchg bx, bx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	call pic_init
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	; clear tss
 | 
						; clear tss
 | 
				
			||||||
	mov ecx, sizeof.TSS
 | 
						mov ecx, sizeof.TSS
 | 
				
			||||||
	xor ax, ax
 | 
						xor ax, ax
 | 
				
			||||||
| 
						 | 
					@ -73,6 +58,19 @@ kmain:
 | 
				
			||||||
	call gdt_flush
 | 
						call gdt_flush
 | 
				
			||||||
	call tss_flush
 | 
						call tss_flush
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call mm_bootstrap
 | 
				
			||||||
 | 
						call mm_init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov eax, 4
 | 
				
			||||||
 | 
						call pmm_alloc
 | 
				
			||||||
 | 
						xchg bx, bx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov edx, 4
 | 
				
			||||||
 | 
						call pmm_free
 | 
				
			||||||
 | 
						xchg bx, bx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call pic_init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	call idt_setup
 | 
						call idt_setup
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mov ax, 100 ; 100Hz
 | 
						mov ax, 100 ; 100Hz
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,28 @@ MM_KERNEL_PTE_BASE = 0xFFC00000
 | 
				
			||||||
	include 'bootstrap.inc'
 | 
						include 'bootstrap.inc'
 | 
				
			||||||
	include 'pmm.inc'
 | 
						include 'pmm.inc'
 | 
				
			||||||
	include 'vmem.inc'
 | 
						include 'vmem.inc'
 | 
				
			||||||
	include 'vmm.inc'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
mm_init:
 | 
					mm_init:
 | 
				
			||||||
 | 
						call pmm_init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call vmem_bootstrap
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov eax, stVmemKernel
 | 
				
			||||||
 | 
						push dword 4
 | 
				
			||||||
 | 
						push dword 5
 | 
				
			||||||
 | 
						push dword 0
 | 
				
			||||||
 | 
						push dword 0
 | 
				
			||||||
 | 
						push dword 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov edx, PMM_VIRT_TEMP
 | 
				
			||||||
 | 
						mov ecx, kend
 | 
				
			||||||
 | 
						sub edx, ecx
 | 
				
			||||||
 | 
						push edx
 | 
				
			||||||
 | 
						mov edx, szVmemKernelName
 | 
				
			||||||
 | 
						call vmem_create
 | 
				
			||||||
 | 
						add esp, 24
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					szVmemKernelName db "kmem", 0
 | 
				
			||||||
 | 
					stVmemKernel Vmem
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								kernel/mm/svm.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								kernel/mm/svm.inc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
						;; File: svm.inc
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
						;; Simple Virtual Memory Manager mostly inspired by <UVM at https://www.usenix.org/legacy/event/usenix99/full_papers/cranor/cranor.pdf>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include 'svm/amap.inc'
 | 
				
			||||||
 | 
					include 'svm/pager.inc'
 | 
				
			||||||
 | 
					include 'svm/object.inc'
 | 
				
			||||||
 | 
					include 'svm/space.inc'
 | 
				
			||||||
 | 
					include 'svm/kernel.inc'
 | 
				
			||||||
							
								
								
									
										6
									
								
								kernel/mm/svm/amap.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								kernel/mm/svm/amap.inc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
						;; File: amap.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struc SvmAmap {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.pages ListHead
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										4
									
								
								kernel/mm/svm/kernel.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								kernel/mm/svm/kernel.inc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
						;; File: kernel.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stKernelMap SvmSpace
 | 
				
			||||||
							
								
								
									
										10
									
								
								kernel/mm/svm/object.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								kernel/mm/svm/object.inc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
						;; File: object.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struc SvmObject {
 | 
				
			||||||
 | 
						.refcount dd ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.amap dd ?
 | 
				
			||||||
 | 
						.object dd ?
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						.ops dd ?
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										5
									
								
								kernel/mm/svm/page.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								kernel/mm/svm/page.inc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
						;; File: page.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struc SvmPage {
 | 
				
			||||||
 | 
						.physaddr dd ?
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										11
									
								
								kernel/mm/svm/pager.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								kernel/mm/svm/pager.inc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
						;; File: pager.inc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struc SvmPagerOps {
 | 
				
			||||||
 | 
						.init dd ?
 | 
				
			||||||
 | 
						.reference dd ?
 | 
				
			||||||
 | 
						.detach dd ?
 | 
				
			||||||
 | 
						.fault dd ?
 | 
				
			||||||
 | 
						.get dd ?
 | 
				
			||||||
 | 
						.put dd ?
 | 
				
			||||||
 | 
						.markdirty dd ?
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										59
									
								
								kernel/mm/svm/space.inc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								kernel/mm/svm/space.inc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,59 @@
 | 
				
			||||||
 | 
						;; File: space
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SVM_PROT_READ  = PTE_P
 | 
				
			||||||
 | 
					SVM_PROT_WRITE = PTE_W
 | 
				
			||||||
 | 
					SVM_PROT_ALL   = (SVM_PROT_READ or SVM_PROT_WRITE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struc SvmSpaceEntry {
 | 
				
			||||||
 | 
						.start dd ?
 | 
				
			||||||
 | 
						.end dd ?
 | 
				
			||||||
 | 
						.object dd ?
 | 
				
			||||||
 | 
						.protections dd ?
 | 
				
			||||||
 | 
						.page_dir dd ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						.link ListEntry
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struc SvmSpace {
 | 
				
			||||||
 | 
						.vmem Vmem
 | 
				
			||||||
 | 
						.entries ListHead
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						; TODO: SvmStats
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						;; Function: svm_map
 | 
				
			||||||
 | 
					svm_map:
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						;; Function: svm_unmap
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
						;; In:
 | 
				
			||||||
 | 
						;;   EAX - Pointer to <SvmSpace> object.
 | 
				
			||||||
 | 
						;;   EDX - Address
 | 
				
			||||||
 | 
					svm_unmap:
 | 
				
			||||||
 | 
						or eax, eax
 | 
				
			||||||
 | 
						jnz @f 
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					@@:
 | 
				
			||||||
 | 
						push ebp
 | 
				
			||||||
 | 
						mov ebp, esp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						push esi
 | 
				
			||||||
 | 
						push edi
 | 
				
			||||||
 | 
						; lock
 | 
				
			||||||
 | 
						; remove element
 | 
				
			||||||
 | 
						; unlock
 | 
				
			||||||
 | 
						; drop object ref
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pop edi
 | 
				
			||||||
 | 
						pop esi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						leave
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_TRACE_SVM
 | 
				
			||||||
 | 
					szSvmTraceMap db "Trace(SVM): map ", 0
 | 
				
			||||||
 | 
					szSvmTraceUnmap db "Trace(SVM): unmap %x", 0
 | 
				
			||||||
 | 
					end if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,7 @@ struc Vmem {
 | 
				
			||||||
	.alloc dd ?
 | 
						.alloc dd ?
 | 
				
			||||||
	.free dd ?
 | 
						.free dd ?
 | 
				
			||||||
	.source dd ?
 | 
						.source dd ?
 | 
				
			||||||
	.vmflag dd ?
 | 
						.flags dd ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	.freelist dd FREELISTS_N dup(0)
 | 
						.freelist dd FREELISTS_N dup(0)
 | 
				
			||||||
	.hashtable dd HASHTABLE_N dup(0)
 | 
						.hashtable dd HASHTABLE_N dup(0)
 | 
				
			||||||
| 
						 | 
					@ -112,35 +112,49 @@ __hash_table_addr:
 | 
				
			||||||
	leave
 | 
						leave
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	;; Function: _vmm_segfree
 | 
						;; Function: _vmem_segfree
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
	;; In:
 | 
						;; In:
 | 
				
			||||||
	;;    EAX - Segment address
 | 
						;;    EAX - Segment address
 | 
				
			||||||
_vmm_segfree:
 | 
						;;
 | 
				
			||||||
	;mov ecx, eax
 | 
					_vmem_segfree:
 | 
				
			||||||
	;add ecx, VmSegment.seglist.next
 | 
						; XXX: lock 
 | 
				
			||||||
 | 
						add eax, VmSegment.seglist
 | 
				
			||||||
 | 
						mov edx, pVmemFreeSegHead
 | 
				
			||||||
 | 
						xchg eax, edx
 | 
				
			||||||
 | 
						call list_insert_head
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inc [iVmemFreeSegCount]
 | 
				
			||||||
 | 
						; XXX: unlock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	;mov edx, [pVmmFreeSegHead]
 | 
					 | 
				
			||||||
	;or edx, edx
 | 
					 | 
				
			||||||
	;jz @f
 | 
					 | 
				
			||||||
	;mov [eax + VmSegment.seglist.next], edx
 | 
					 | 
				
			||||||
	;mov [edx + VmSegment.seglist.prev], ecx
 | 
					 | 
				
			||||||
;@@:
 | 
					 | 
				
			||||||
;	mov [pVmmFreeSegHead], eax
 | 
					 | 
				
			||||||
;	mov [eax + VmSegment.seglist.prev], ecx
 | 
					 | 
				
			||||||
;
 | 
					 | 
				
			||||||
;	inc [iVmmFreeSegCount]
 | 
					 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
;
 | 
					
 | 
				
			||||||
;	;; Function: _vmm_segalloc
 | 
						;; Function: _vmem_segalloc
 | 
				
			||||||
;_vmm_segalloc:
 | 
						;;
 | 
				
			||||||
;	mov eax, [pVmmFreeSegHead]
 | 
						;; Out:
 | 
				
			||||||
;	or eax, eax
 | 
						;;    EAX - Pointer to <VmSegment> object on success, 0 on error
 | 
				
			||||||
;	jz @f
 | 
					_vmem_segalloc:
 | 
				
			||||||
;
 | 
						push ebp
 | 
				
			||||||
;	dec [iVmmFreeSegCount]
 | 
						mov ebp, esp
 | 
				
			||||||
;@@:
 | 
						; XXX: lock
 | 
				
			||||||
;	ret
 | 
						mov eax, [pVmemFreeSegHead]
 | 
				
			||||||
 | 
						or eax, eax
 | 
				
			||||||
 | 
						jz .end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						push ebx
 | 
				
			||||||
 | 
						mov ebx, eax
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						call list_remove
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sub ebx, VmSegment.seglist
 | 
				
			||||||
 | 
						dec [iVmemFreeSegCount]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pop ebx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.end:
 | 
				
			||||||
 | 
						; XXX: unlock
 | 
				
			||||||
 | 
						leave
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; MARK: public functions
 | 
					;;; MARK: public functions
 | 
				
			||||||
| 
						 | 
					@ -162,28 +176,72 @@ _vmm_segfree:
 | 
				
			||||||
vmem_create:
 | 
					vmem_create:
 | 
				
			||||||
	push ebp
 | 
						push ebp
 | 
				
			||||||
	mov ebp, esp
 | 
						mov ebp, esp
 | 
				
			||||||
 | 
						sub esp, 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mov [eax + Vmem.base], ecx
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if CONFIG_TRACE_VMEM
 | 
					 | 
				
			||||||
	push esi
 | 
						push esi
 | 
				
			||||||
	push edi
 | 
						push edi
 | 
				
			||||||
	push ebx
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mov esi, eax
 | 
						mov [ebp - 8], eax
 | 
				
			||||||
	mov edi, edx
 | 
						mov [ebp - 4], ecx
 | 
				
			||||||
	mov ebx, ecx
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mov eax, esi
 | 
					 | 
				
			||||||
	mov edx, edi
 | 
					 | 
				
			||||||
	mov ecx, ebx
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pop ebx
 | 
						; zero Vmem object
 | 
				
			||||||
 | 
						cld
 | 
				
			||||||
 | 
						mov edi, eax
 | 
				
			||||||
 | 
						xor eax, eax
 | 
				
			||||||
 | 
						mov ecx, sizeof.Vmem shr 2
 | 
				
			||||||
 | 
						cld
 | 
				
			||||||
 | 
						rep stosd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						; copy name 
 | 
				
			||||||
 | 
						mov esi, edx
 | 
				
			||||||
 | 
						mov edx, [ebp - 8]
 | 
				
			||||||
 | 
						xor cl, cl
 | 
				
			||||||
 | 
					@@:
 | 
				
			||||||
 | 
						lodsb
 | 
				
			||||||
 | 
						or al, al
 | 
				
			||||||
 | 
						jz @f
 | 
				
			||||||
 | 
						mov [edx], al
 | 
				
			||||||
 | 
						inc edx
 | 
				
			||||||
 | 
						inc cl
 | 
				
			||||||
 | 
						cmp cl, 15
 | 
				
			||||||
 | 
						jl @b
 | 
				
			||||||
 | 
					@@:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov edi, [ebp - 8]
 | 
				
			||||||
 | 
						mov ecx, [ebp - 4]
 | 
				
			||||||
 | 
						mov [edi + Vmem.base], ecx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						; copy other from stack to struct
 | 
				
			||||||
 | 
						mov ecx, 28 shr 2
 | 
				
			||||||
 | 
						mov esi, ebp
 | 
				
			||||||
 | 
						add esi, 8
 | 
				
			||||||
 | 
						mov edi, [ebp - 8]
 | 
				
			||||||
 | 
						add edi, Vmem.size
 | 
				
			||||||
 | 
						rep movsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov eax, [ebp - 8]
 | 
				
			||||||
 | 
						mov edx, [ebp - 4]
 | 
				
			||||||
 | 
						or edx, edx
 | 
				
			||||||
 | 
						jnz @f
 | 
				
			||||||
 | 
						mov ecx, [eax + Vmem.size]
 | 
				
			||||||
 | 
						or ecx, ecx
 | 
				
			||||||
 | 
						jz @f
 | 
				
			||||||
 | 
						push dword [eax + Vmem.flags]
 | 
				
			||||||
 | 
						call vmem_add
 | 
				
			||||||
 | 
						add esp, 4
 | 
				
			||||||
 | 
					@@:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_TRACE_VMEM
 | 
				
			||||||
 | 
						mov esi, [ebp - 8]
 | 
				
			||||||
 | 
						mov edx, [esi + Vmem.base]
 | 
				
			||||||
 | 
						mov ecx, [esi + Vmem.size]
 | 
				
			||||||
 | 
						add ecx, edx
 | 
				
			||||||
 | 
						TRACE szTraceVmemCreate, esi, edx, ecx
 | 
				
			||||||
 | 
					end if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pop edi
 | 
						pop edi
 | 
				
			||||||
	pop esi
 | 
						pop esi
 | 
				
			||||||
end if
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	leave
 | 
						leave
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
| 
						 | 
					@ -263,6 +321,52 @@ vmem_xfree:
 | 
				
			||||||
	;; Out:
 | 
						;; Out:
 | 
				
			||||||
	;;    EAX - Return Address on success, 0 on failure.
 | 
						;;    EAX - Return Address on success, 0 on failure.
 | 
				
			||||||
vmem_add:
 | 
					vmem_add:
 | 
				
			||||||
 | 
						push ebp
 | 
				
			||||||
 | 
						mov ebp, esp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						push esi
 | 
				
			||||||
 | 
						push edi
 | 
				
			||||||
 | 
						push ebx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mov esi, eax
 | 
				
			||||||
 | 
						mov edi, ebx
 | 
				
			||||||
 | 
						mov ebx, ecx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pop ebx
 | 
				
			||||||
 | 
						pop edi
 | 
				
			||||||
 | 
						pop esi
 | 
				
			||||||
 | 
						leave
 | 
				
			||||||
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						;; Function: vmem_bootstrap
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
						;; Initialize static segments
 | 
				
			||||||
 | 
						;; 
 | 
				
			||||||
 | 
					vmem_bootstrap:
 | 
				
			||||||
 | 
						push ebp
 | 
				
			||||||
 | 
						mov ebp, esp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_TRACE_VMEM
 | 
				
			||||||
 | 
						TRACE szTraceVmemBootstrap
 | 
				
			||||||
 | 
					end if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						push ebx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xor ebx, ebx
 | 
				
			||||||
 | 
					@@:
 | 
				
			||||||
 | 
						mov eax, aVmemStaticSegs
 | 
				
			||||||
 | 
						add eax, ebx
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						call _vmem_segfree
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						add ebx, sizeof.VmSegment
 | 
				
			||||||
 | 
						cmp ebx, STATIC_SEG_COUNT*sizeof.VmSegment
 | 
				
			||||||
 | 
						jl @b
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pop ebx
 | 
				
			||||||
 | 
						leave
 | 
				
			||||||
	ret
 | 
						ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; MARK: variables
 | 
					;;; MARK: variables
 | 
				
			||||||
| 
						 | 
					@ -272,6 +376,7 @@ pVmemFreeSegHead  dd 0
 | 
				
			||||||
iVmemFreeSegCount dd 0
 | 
					iVmemFreeSegCount dd 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if CONFIG_TRACE_VMM
 | 
					if CONFIG_TRACE_VMM
 | 
				
			||||||
 | 
					szTraceVmemBootstrap db "Trace(VMEM): Bootstrap vmem", 0
 | 
				
			||||||
szTraceVmemCreate    db "Trace(VMEM): Create %s [%x, %x)", 0
 | 
					szTraceVmemCreate    db "Trace(VMEM): Create %s [%x, %x)", 0
 | 
				
			||||||
szTraceVmemAdd       db "Trace(VMEM): %s: Add span [%x, %x)", 0
 | 
					szTraceVmemAdd       db "Trace(VMEM): %s: Add span [%x, %x)", 0
 | 
				
			||||||
szTraceVmemDestroy   db "Trace(VMEM): Destroy %s", 0
 | 
					szTraceVmemDestroy   db "Trace(VMEM): Destroy %s", 0
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,82 +0,0 @@
 | 
				
			||||||
	;; File: vm.inc
 | 
					 | 
				
			||||||
	;; Based on <tinyvmem at https://github.com/rdmsr/tinyvmem> and on <Bonwick's paper at https://www.usenix.org/legacy/event/usenix01/full_papers/bonwick/bonwick.pdf>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	;; Function: vmm_init
 | 
					 | 
				
			||||||
	;; 
 | 
					 | 
				
			||||||
	;; Initializes a Vmem arena
 | 
					 | 
				
			||||||
	;;
 | 
					 | 
				
			||||||
	;; In:
 | 
					 | 
				
			||||||
	;;     EAX     - Pointer to a Vmem dest
 | 
					 | 
				
			||||||
	;;     EDX     - Base address
 | 
					 | 
				
			||||||
	;;     ECX     - Size
 | 
					 | 
				
			||||||
	;;     ESP[4]  - Quantum
 | 
					 | 
				
			||||||
	;;     ESP[8]  - Pointer to alloc function
 | 
					 | 
				
			||||||
	;;     ESP[12] - Pointer to free function
 | 
					 | 
				
			||||||
	;;     ESP[16] - Poiter to Vmem source
 | 
					 | 
				
			||||||
	;;     ESP[20] - qcache max
 | 
					 | 
				
			||||||
	;;     ESP[24] - Flags
 | 
					 | 
				
			||||||
vmm_init:
 | 
					 | 
				
			||||||
	push ebp
 | 
					 | 
				
			||||||
	mov ebp, esp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	push esi
 | 
					 | 
				
			||||||
	push edi 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mov [eax + Vmem.base], edx
 | 
					 | 
				
			||||||
	mov [eax + Vmem.size], ecx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	; copy other param from the stack
 | 
					 | 
				
			||||||
	mov ecx, 28
 | 
					 | 
				
			||||||
	mov edx, esp
 | 
					 | 
				
			||||||
	add edx, 4
 | 
					 | 
				
			||||||
	mov esi, edx
 | 
					 | 
				
			||||||
	mov edx, eax
 | 
					 | 
				
			||||||
	add edx, Vmem.quantum
 | 
					 | 
				
			||||||
	mov edi, edx
 | 
					 | 
				
			||||||
	rep movsd
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mov ecx, [eax + Vmem.size]
 | 
					 | 
				
			||||||
	or ecx, ecx
 | 
					 | 
				
			||||||
	jz @f
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mov edx, [eax + Vmem.source]
 | 
					 | 
				
			||||||
	or edx, edx
 | 
					 | 
				
			||||||
	jnz @f
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mov edx, [eax + Vmem.base]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
;	call vmm_add
 | 
					 | 
				
			||||||
	add esp, 4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@:
 | 
					 | 
				
			||||||
	pop edi
 | 
					 | 
				
			||||||
	pop esi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	leave
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	;; Function: vmm_bootstrap
 | 
					 | 
				
			||||||
	;;
 | 
					 | 
				
			||||||
vmm_bootstrap:
 | 
					 | 
				
			||||||
	push ebp 
 | 
					 | 
				
			||||||
	mov ebp, esp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	push ebx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	xor ebx, ebx
 | 
					 | 
				
			||||||
@@:
 | 
					 | 
				
			||||||
	mov eax, aVmemStaticSegs
 | 
					 | 
				
			||||||
	add eax, ebx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	call _vmm_segfree
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	add ebx, sizeof.VmSegment
 | 
					 | 
				
			||||||
	cmp ebx, STATIC_SEG_COUNT*sizeof.VmSegment
 | 
					 | 
				
			||||||
	jl @b
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pop ebx
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	leave
 | 
					 | 
				
			||||||
	ret
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue