diff options
Diffstat (limited to 'xxx/copy_page_physical.asm')
| -rw-r--r-- | xxx/copy_page_physical.asm | 33 |
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 |
