; ; 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