diff --git a/src/arch/x86_64/ustring.asm b/src/arch/x86_64/ustring.asm index 8da21cbf..58282301 100644 --- a/src/arch/x86_64/ustring.asm +++ b/src/arch/x86_64/ustring.asm @@ -4,17 +4,49 @@ global arch_u_strlen global arch_u_strlen_cont arch_u_strlen: - xor rcx, rcx - .loop: - cmp byte [rdi],0 - je .done - inc rcx - inc rdi - jmp .loop - .done: - mov [rsi], rcx - xor rax, rax - ret + xor rcx, rcx + .loop: + cmp byte [rdi],0 + je .done + inc rcx + inc rdi + jmp .loop + .done: + mov [rsi], rcx + xor rax, rax + ret arch_u_strlen_cont: - mov rax, 1 - ret + mov rax, 1 + ret + +global arch_u_memcpy +global arch_u_memcpy_cont + +arch_u_memcpy: + mov rcx, rdx + rep movsb + xor rax, rax + ret + arch_u_memcpy_cont: + mov rax, 1 + ret + +global arch_u_strcpy +global arch_u_strcpy_cont + +arch_u_strcpy: + .loop: + mov al, [rsi] + mov [rdi], al + inc rsi + inc rdi + test al,al + jz .done + jmp .loop + .done: + xor rax,rax + ret + arch_u_strcpy_cont: + mov rax, 1 + ret + diff --git a/src/include/kernel/ustring.h b/src/include/kernel/ustring.h index 67098a1c..a427da62 100644 --- a/src/include/kernel/ustring.h +++ b/src/include/kernel/ustring.h @@ -3,7 +3,9 @@ #include -int u_strlen(const char* str, size_t* size); +int u_strlen(const char*, size_t*); +int u_memcpy(void*, const void*, size_t); +int u_strcpy(char*, const char*); #endif diff --git a/src/sys/ustring.c b/src/sys/ustring.c index 8505fa12..b28cf784 100644 --- a/src/sys/ustring.c +++ b/src/sys/ustring.c @@ -17,3 +17,32 @@ int u_strlen(const char* str, size_t* len){ } +extern void arch_u_memcpy_cont(); +extern int arch_u_memcpy(void* dest, const void* src, size_t len); + +int u_memcpy(void* dest, const void* src, size_t len){ + + arch_getcls()->thread->umemopfailaddr = arch_u_memcpy_cont; + + int ret = arch_u_memcpy(dest, src, len); + + arch_getcls()->thread->umemopfailaddr = NULL; + + return ret == 0 ? 0 : arch_getcls()->thread->umemoperror; + +} + +extern void arch_u_strcpy_cont(); +extern int arch_u_strcpy(void* dest, const void* src); + +int u_strcpy(void* dest, const void* src){ + + arch_getcls()->thread->umemopfailaddr = arch_u_strcpy_cont; + + int ret = arch_u_strcpy(dest, src); + + arch_getcls()->thread->umemopfailaddr = NULL; + + return ret == 0 ? 0 : arch_getcls()->thread->umemoperror; + +}