summaryrefslogtreecommitdiff
path: root/xxx/copy_page_physical.asm
diff options
context:
space:
mode:
Diffstat (limited to 'xxx/copy_page_physical.asm')
-rw-r--r--xxx/copy_page_physical.asm33
1 files changed, 33 insertions, 0 deletions
diff --git a/xxx/copy_page_physical.asm b/xxx/copy_page_physical.asm
new file mode 100644
index 0000000..8e26050
--- /dev/null
+++ b/xxx/copy_page_physical.asm
@@ -0,0 +1,33 @@
+[bits 32]
+
+global copy_page_physical_XXX
+copy_page_physical_XXX:
+ push ebx ; According to __cdecl, we must preserve the contents of EBX.
+ pushf ; push EFLAGS, so we can pop it and reenable interrupts
+ ; later, if they were enabled anyway.
+ cli ; Disable interrupts, so we aren't interrupted.
+ ; Load these in BEFORE we disable paging!
+ mov ebx, [esp+12] ; Source address
+ mov ecx, [esp+16] ; Destination address
+
+ mov edx, cr0 ; Get the control register...
+ and edx, 0x7fffffff ; and...
+ mov cr0, edx ; Disable paging.
+
+ mov edx, 1024 ; 1024*4bytes = 4096 bytes to copy
+
+.loop:
+ mov eax, [ebx] ; Get the word at the source address
+ mov [ecx], eax ; Store it at the dest address
+ add ebx, 4 ; Source address += sizeof(word)
+ add ecx, 4 ; Dest address += sizeof(word)
+ dec edx ; One less word to do
+ jnz .loop
+
+ mov edx, cr0 ; Get the control register again
+ or edx, 0x80000000 ; and...
+ mov cr0, edx ; Enable paging.
+
+ popf ; Pop EFLAGS back.
+ pop ebx ; Get the original value of EBX back.
+ ret