diff --git a/kernel/common/unistd.h b/kernel/common/unistd.h index 5b62fb3b..2b3fe7c2 100644 --- a/kernel/common/unistd.h +++ b/kernel/common/unistd.h @@ -25,4 +25,12 @@ pid_t fork(void); * * @return pid_t */ -pid_t vfork(void); \ No newline at end of file +pid_t vfork(void); + +/** + * @brief 交换n字节 + * @param src 源地址 + * @param dest 目的地址 + * @param nbytes 交换字节数 + */ +void swab(void *restrict src, void *restrict dest, ssize_t nbytes); \ No newline at end of file diff --git a/kernel/lib/unistd.c b/kernel/lib/unistd.c index b534b283..f4a3228e 100644 --- a/kernel/lib/unistd.c +++ b/kernel/lib/unistd.c @@ -1,4 +1,5 @@ #include +#include /** * @brief fork当前进程 @@ -18,4 +19,21 @@ pid_t fork(void) pid_t vfork(void) { return (pid_t)enter_syscall_int(SYS_VFORK, 0, 0, 0, 0, 0, 0, 0, 0); +} + +void swab(void *restrict src, void *restrict dest, ssize_t nbytes) +{ + unsigned char buf[32]; + char *_src = src; + char *_dest = dest; + uint32_t transfer; + for (; nbytes > 0; nbytes -= transfer) + { + transfer = (nbytes > 32) ? 32 : nbytes; + memcpy(buf, _src, transfer); + memcpy(_src, _dest, transfer); + memcpy(_dest, buf, transfer); + _src += transfer; + _dest += transfer; + } } \ No newline at end of file diff --git a/user/libs/libc/string.h b/user/libs/libc/string.h index 3ad020f9..1d158f1f 100644 --- a/user/libs/libc/string.h +++ b/user/libs/libc/string.h @@ -48,4 +48,32 @@ char* strcpy(char* dst, const char* src); */ char *strcat(char *dest, const char *src); -#define memcpy(dst, src, n) __builtin_memcpy(dst, src, n) \ No newline at end of file +/** + * @brief 内存拷贝函数 + * + * @param dst 目标数组 + * @param src 源数组 + * @param Num 字节数 + * @return void* + */ +static void *memcpy(void *dst, const void *src, long Num) +{ + int d0 = 0, d1 = 0, d2 = 0; + __asm__ __volatile__("cld \n\t" + "rep \n\t" + "movsq \n\t" + "testb $4,%b4 \n\t" + "je 1f \n\t" + "movsl \n\t" + "1:\ttestb $2,%b4 \n\t" + "je 2f \n\t" + "movsw \n\t" + "2:\ttestb $1,%b4 \n\t" + "je 3f \n\t" + "movsb \n\t" + "3: \n\t" + : "=&c"(d0), "=&D"(d1), "=&S"(d2) + : "0"(Num / 8), "q"(Num), "1"(dst), "2"(src) + : "memory"); + return dst; +} \ No newline at end of file diff --git a/user/libs/libc/unistd.c b/user/libs/libc/unistd.c index e4919baa..de88bf6d 100644 --- a/user/libs/libc/unistd.c +++ b/user/libs/libc/unistd.c @@ -3,6 +3,7 @@ #include #include #include +#include /** * @brief 关闭文件接口 @@ -157,4 +158,27 @@ int execv(const char *path, char *const argv[]) int rmdir(const char *path) { return syscall_invoke(SYS_RMDIR, (uint64_t)path, 0, 0, 0, 0, 0, 0, 0); +} + +/** + * @brief 交换n字节 + * @param src 源地址 + * @param dest 目的地址 + * @param nbytes 交换字节数 + */ +void swab(void *restrict src, void *restrict dest, ssize_t nbytes) +{ + unsigned char buf[32]; + char *_src = src; + char *_dest = dest; + uint32_t transfer; + for (; nbytes > 0; nbytes -= transfer) + { + transfer = (nbytes > 32) ? 32 : nbytes; + memcpy(buf, _src, transfer); + memcpy(_src, _dest, transfer); + memcpy(_dest, buf, transfer); + _src += transfer; + _dest += transfer; + } } \ No newline at end of file diff --git a/user/libs/libc/unistd.h b/user/libs/libc/unistd.h index 3e4bc707..c207bcc5 100644 --- a/user/libs/libc/unistd.h +++ b/user/libs/libc/unistd.h @@ -83,25 +83,33 @@ int64_t chdir(char *dest_path); /** * @brief 执行新的程序 - * + * * @param path 文件路径 * @param argv 参数列表 - * @return int + * @return int */ -int execv(const char* path, char * const argv[]); +int execv(const char *path, char *const argv[]); /** * @brief 睡眠指定时间 - * + * * @param usec 微秒 - * @return int + * @return int */ extern int usleep(useconds_t usec); /** * @brief 删除文件夹 - * + * * @param path 绝对路径 * @return int 错误码 */ -int rmdir(const char* path); \ No newline at end of file +int rmdir(const char *path); + +/** + * @brief 交换n字节 + * @param src 源地址 + * @param dest 目的地址 + * @param nbytes 交换字节数 + */ +void swab(void *restrict src, void *restrict dest, ssize_t nbytes); \ No newline at end of file