; 
; Written by the Chair for Operating Systems, RWTH Aachen University
; 
; NO Copyright (C) 2010-2011, Stefan Lankes
; consider these trivial functions to be public domain.
; 
; These functions are distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;

[BITS 32]
SECTION .text
global strcpy
strcpy:
   push ebp
   mov ebp, esp
   push edi
   push esi

   mov esi, [ebp+12]
   mov edi, [ebp+8]

L1:
   lodsb
   stosb
   test al, al
   jne L1
   
   mov eax, [ebp+8]
   pop esi
   pop edi
   pop ebp
   ret

global strncpy
strncpy:
   push ebp
   mov ebp, esp
   push edi
   push esi

   mov ecx, [ebp+16]
   mov esi, [ebp+12]
   mov edi, [ebp+8]

L2:
   dec ecx
   js L3
   lodsb
   stosb
   test al, al
   jne L1
   rep
   stosb

L3:
   mov eax, [ebp+8]
   pop esi
   pop edi
   pop ebp
   ret

; The following function is derived from JamesM's kernel development tutorials
; (http://www.jamesmolloy.co.uk/tutorial_html/)
global copy_page_physical
copy_page_physical:
    push esi              ; According to __cdecl, we must preserve the contents of ESI
    push edi              ; and EDI.
    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 edi, [esp+12+4]   ; Destination address
    mov esi, [esp+12+8]   ; Source address
  
    mov edx, cr0          ; Get the control register...
    and edx, 0x7fffffff   ; and...
    mov cr0, edx          ; Disable paging.
 
    cld 
    mov ecx, 0x400        ; 1024*4bytes = 4096 bytes = page size
    rep movsd             ; copy page

    mov edx, cr0          ; Get the control register again
    or  edx, 0x80000000   ; and...
    mov cr0, edx          ; Enable paging.

    popf                  ; Pop EFLAGS back.  
    pop edi               ; Get the original value of EDI
    pop esi               ; and ESI back.
    ret

SECTION .note.GNU-stack noalloc noexec nowrite progbits