Signed-off-by: Yeqi Fu <fufuyqqq...@gmail.com> --- common-user/native/libnative.c | 65 ++++++++++++++++++++++++++++++++++ include/native/libnative.h | 11 ++++++ include/native/native-func.h | 11 ++++++ 3 files changed, 87 insertions(+) create mode 100644 common-user/native/libnative.c create mode 100644 include/native/libnative.h create mode 100644 include/native/native-func.h
diff --git a/common-user/native/libnative.c b/common-user/native/libnative.c new file mode 100644 index 0000000000..d40e43c6fe --- /dev/null +++ b/common-user/native/libnative.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "native/libnative.h" +#include "native/native-func.h" + +#define STR_MACRO(str) #str +#define STR(num) STR_MACRO(num) + +#if defined(TARGET_I386) || defined(TARGET_X86_64) + +/* unused opcode */ +#define __PREFIX_INSTR \ + ".byte 0x0f,0xff;" + +#define NATIVE_CALL_EXPR(func) \ + __PREFIX_INSTR \ + ".word " STR(func) ";" : :: +#endif + +#if defined(TARGET_ARM) || defined(TARGET_AARCH64) + +/* unused syscall number */ +#define __PREFIX_INSTR \ + "svc 0xff;" + +#define NATIVE_CALL_EXPR(func) \ + __PREFIX_INSTR \ + ".word " STR(func) ";" : :: + +#endif + +#if defined(TARGET_MIPS) || defined(TARGET_MIPS64) + +/* unused bytes in syscall instructions */ +#define NATIVE_CALL_EXPR(func) \ + ".long " STR((0x1 << 24) + (func << 8) + 0xC) ";" : :: + +#endif + +void *memcpy(void *dest, const void *src, size_t n) +{ + __asm__ volatile(NATIVE_CALL_EXPR(NATIVE_MEMCPY)); +} + +int memcmp(const void *s1, const void *s2, size_t n) +{ + __asm__ volatile(NATIVE_CALL_EXPR(NATIVE_MEMCMP)); +} +void *memset(void *s, int c, size_t n) +{ + __asm__ volatile(NATIVE_CALL_EXPR(NATIVE_MEMSET)); +} +char *strcpy(char *dest, const char *src) +{ + __asm__ volatile(NATIVE_CALL_EXPR(NATIVE_STRCPY)); +} +int strcmp(const char *s1, const char *s2) +{ + __asm__ volatile(NATIVE_CALL_EXPR(NATIVE_STRCMP)); +} +char *strcat(char *dest, const char *src) +{ + __asm__ volatile(NATIVE_CALL_EXPR(NATIVE_STRCAT)); +} diff --git a/include/native/libnative.h b/include/native/libnative.h new file mode 100644 index 0000000000..d3c24f89f4 --- /dev/null +++ b/include/native/libnative.h @@ -0,0 +1,11 @@ +#ifndef __LIBNATIVE_H__ +#define __LIBNATIVE_H__ + +void *memcpy(void *dest, const void *src, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); +void *memset(void *s, int c, size_t n); +char *strcpy(char *dest, const char *src); +int strcmp(const char *s1, const char *s2); +char *strcat(char *dest, const char *src); + +#endif /* __LIBNATIVE_H__ */ diff --git a/include/native/native-func.h b/include/native/native-func.h new file mode 100644 index 0000000000..d48a8e547a --- /dev/null +++ b/include/native/native-func.h @@ -0,0 +1,11 @@ +#ifndef __NATIVE_FUNC_H__ +#define __NATIVE_FUNC_H__ + +#define NATIVE_MEMCPY 0x1001 +#define NATIVE_MEMCMP 0x1002 +#define NATIVE_MEMSET 0x1003 +#define NATIVE_STRCPY 0x1004 +#define NATIVE_STRCMP 0x1005 +#define NATIVE_STRCAT 0x1006 + +#endif -- 2.34.1