diff --git a/arch/aarch64/bits/alltypes.h.in b/arch/aarch64/bits/alltypes.h.in index c547ca0b72a3fc2a1a77a30997e66a2d597b73ee..739e1029cd548b077eb6db6e147b24e1c6e4e10f 100644 --- a/arch/aarch64/bits/alltypes.h.in +++ b/arch/aarch64/bits/alltypes.h.in @@ -2,7 +2,7 @@ #define _Int64 long #define _Reg long -#if __AARCH64EB__ +#ifdef __AARCH64EB__ #define __BYTE_ORDER 4321 #else #define __BYTE_ORDER 1234 diff --git a/arch/aarch64/bits/syscall.h.in b/arch/aarch64/bits/syscall.h.in index 5f420e61769070050e69429214c68ff758abb344..fca761765870b10a75cc8297fa104ec256dd0944 100644 --- a/arch/aarch64/bits/syscall.h.in +++ b/arch/aarch64/bits/syscall.h.in @@ -277,6 +277,7 @@ #define __NR_io_pgetevents 292 #define __NR_rseq 293 #define __NR_kexec_file_load 294 +#define __NR_pause 295 #define __NR_pidfd_send_signal 424 #define __NR_io_uring_setup 425 #define __NR_io_uring_enter 426 diff --git a/arch/aarch64/syscall_arch.h b/arch/aarch64/syscall_arch.h index 9fc491e54add650a2dad7c0dcb8823ad94d0695a..c4749189cfcc91003bb4001d7fd7a9fb8bad050a 100644 --- a/arch/aarch64/syscall_arch.h +++ b/arch/aarch64/syscall_arch.h @@ -121,3 +121,14 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo #endif #define IPC_64 0 + +#define VDSO_GET_DATA_SYM "vdso_get_data" +#define VDSO_GET_DATA_VER "HongMeng_1.8.0" + +#define VDSO_GETTIME_OF_DAY_SYM "__kernel_gettimeofday" +#define VDSO_GETTIME_OF_DAY_VER "LINUX_2.6.39" + +#define VDSO_SAFE_COPY "safe_copy" +#define VDSO_SAFE_COPY_ALIGN "safe_copy_align" +#define VDSO_SAFE_COPY_NOPF "safe_copy_nopf" +#define VDSO_SAFE_COPY_VERSION "HongMeng_1.8.0" diff --git a/arch/arm/bits/fcntl.h b/arch/arm/bits/fcntl.h index 4cb1753b76733e7b74b080d39e016f5af6fdc865..76c5b19180dd449eab98841ec2e49c4a15cfe138 100644 --- a/arch/arm/bits/fcntl.h +++ b/arch/arm/bits/fcntl.h @@ -30,9 +30,15 @@ #define F_SETSIG 10 #define F_GETSIG 11 +#ifdef __HM_KERNEL__ +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 +#else #define F_GETLK 12 #define F_SETLK 13 #define F_SETLKW 14 +#endif #define F_SETOWN_EX 15 #define F_GETOWN_EX 16 diff --git a/arch/arm/bits/syscall.h.in b/arch/arm/bits/syscall.h.in index 048fdea79707a6b590e4ecb563943d5cdd38db82..374e0013259f138cfb2705334b162d6321964fba 100644 --- a/arch/arm/bits/syscall.h.in +++ b/arch/arm/bits/syscall.h.in @@ -407,3 +407,13 @@ #define __ARM_NR_set_tls 0x0f0005 #define __ARM_NR_get_tls 0x0f0006 +#define __NR_timer_settime SYS_timer_settime32 +#define __NR_timer_gettime SYS_timer_gettime32 +#define __NR_timerfd_settime SYS_timerfd_settime32 +#define __NR_timerfd_gettime SYS_timerfd_gettime32 +#define __NR_clock_settime SYS_clock_settime32 +#define __NR_clock_gettime SYS_clock_gettime32 +#define __NR_clock_getres SYS_clock_getres_time32 +#define __NR_clock_nanosleep SYS_clock_nanosleep_time32 +#define __NR_gettimeofday SYS_gettimeofday_time32 +#define __NR_settimeofday SYS_settimeofday_time32 diff --git a/arch/arm/syscall_arch.h b/arch/arm/syscall_arch.h index fd1fa8250f89341e46633b7210342875b0ed3fe3..77f66991a618b8b9d1cad3acd3df1e35163f0f8f 100644 --- a/arch/arm/syscall_arch.h +++ b/arch/arm/syscall_arch.h @@ -115,3 +115,11 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo #define SYSCALL_IPC_BROKEN_MODE #define VDSO_CGT_WORKAROUND 1 + +#define VDSO_GET_DATA_SYM "vdso_get_data" +#define VDSO_GET_DATA_VER "HongMeng_1.8.0" + +#define VDSO_SAFE_COPY "safe_copy" +#define VDSO_SAFE_COPY_ALIGN "safe_copy_align" +#define VDSO_SAFE_COPY_NOPF "safe_copy_nopf" +#define VDSO_SAFE_COPY_VERSION "HongMeng_1.8.0" diff --git a/hm/Makefile b/hm/Makefile new file mode 100755 index 0000000000000000000000000000000000000000..259d5f8f98e07db771c8d6ce3a4e802730f13565 --- /dev/null +++ b/hm/Makefile @@ -0,0 +1,297 @@ +# +# Makefile for musl (requires GNU make) +# +# This is how simple every makefile should be... +# No, I take that back - actually most should be less than half this size. +# +# Use config.mak to override any of the following variables. +# Do not make changes here. +# + +srcdir = . +exec_prefix = /usr/local +bindir = $(exec_prefix)/bin + +prefix = /usr/local/musl +includedir = $(prefix)/include +libdir = $(prefix)/lib +syslibdir = /lib + +MALLOC_DIR = mallocng +HMSRC_DIRS = hm/src/* +SRC_DIRS = $(addprefix $(srcdir)/,src/* src/malloc/$(MALLOC_DIR) crt ldso $(COMPAT_SRC_DIRS) $(HMSRC_DIRS)) +BASE_GLOBS = $(addsuffix /*.c,$(SRC_DIRS)) +ARCH_GLOBS = $(addsuffix /$(ARCH)/*.[csS],$(SRC_DIRS)) +BASE_SRCS = $(sort $(wildcard $(BASE_GLOBS))) +ARCH_SRCS = $(sort $(wildcard $(ARCH_GLOBS))) +BASE_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(BASE_SRCS))) +ARCH_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(ARCH_SRCS))) +REPLACED_OBJS = $(sort $(subst /$(ARCH)/,/,$(ARCH_OBJS))) +ALL_OBJS = $(addprefix obj/, $(filter-out $(REPLACED_OBJS), $(sort $(BASE_OBJS) $(ARCH_OBJS)))) + +LIBC_OBJS = $(filter obj/src/%,$(ALL_OBJS)) $(filter obj/compat/%,$(ALL_OBJS)) $(filter obj/hm/src/%,$(ALL_OBJS)) +LDSO_OBJS = $(filter obj/ldso/%,$(ALL_OBJS:%.o=%.lo)) +CRT_OBJS = $(filter obj/crt/%,$(ALL_OBJS)) + +AOBJS = $(LIBC_OBJS) +LOBJS = $(LIBC_OBJS:.o=.lo) +GENH = obj/include/bits/alltypes.h obj/include/bits/syscall.h obj/include/hmsyscall.h +GENH_INT = obj/src/internal/version.h +IMPH = $(addprefix $(srcdir)/, src/internal/stdio_impl.h src/internal/pthread_impl.h src/internal/locale_impl.h src/internal/libc.h) + +LDFLAGS = +LDFLAGS_AUTO = +LIBCC = -lgcc +CPPFLAGS = +CFLAGS = +CFLAGS_AUTO = -Os -pipe +CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc + +CFLAGS_ALL = $(CFLAGS_C99FSE) +CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I$(srcdir)/arch/$(ARCH) -I$(srcdir)/arch/generic -Iobj/src/internal -I$(srcdir)/src/include -I$(srcdir)/src/internal -Iobj/include -I$(srcdir)/include -I$(srcdir)/hm/include +CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS_AUTO) $(CFLAGS) + +LDFLAGS_ALL = $(LDFLAGS_AUTO) $(LDFLAGS) + +AR = $(CROSS_COMPILE)ar +RANLIB = $(CROSS_COMPILE)ranlib +INSTALL = $(srcdir)/tools/install.sh + +PRIVATE_HEADERS += $(srcdir)/src/internal/futex.h +PRIVATE_HEADERS += $(srcdir)/src/internal/libc.h +PRIVATE_HEADERS += $(srcdir)/src/internal/pthread_impl.h +PRIVATE_HEADERS += $(srcdir)/src/internal/syscall.h +PRIVATE_HEADERS += $(srcdir)/src/include/features.h +PRIVATE_HEADERS += $(srcdir)/arch/$(ARCH)/syscall_arch.h +PRIVATE_HEADERS += $(srcdir)/arch/$(ARCH)/pthread_arch.h + +ARCH_INCLUDES = $(wildcard $(srcdir)/arch/$(ARCH)/bits/*.h) +GENERIC_INCLUDES = $(wildcard $(srcdir)/arch/generic/bits/*.h) +INCLUDES = $(wildcard $(srcdir)/include/*.h $(srcdir)/include/*/*.h) +HM_INCLUDES = $(wildcard $(srcdir)/hm/include/*.h) +ALL_INCLUDE = $(sort $(HM_INCLUDES:$(srcdir)/hm/%=%) $(INCLUDES:$(srcdir)/%=%) $(GENH:obj/%=%) $(ARCH_INCLUDES:$(srcdir)/arch/$(ARCH)/%=include/%) $(GENERIC_INCLUDES:$(srcdir)/arch/generic/%=include/%)) +ALL_INCLUDE += $(PRIVATE_HEADERS:$(srcdir)/src/internal/%=$(DESTDIR)$(includedir)/private/%) +ALL_INCLUDE += $(PRIVATE_HEADERS:$(srcdir)/src/include/%=$(DESTDIR)$(includedir)/private/%) +ALL_INCLUDE += $(PRIVATE_HEADERS:$(srcdir)/arch/$(ARCH)/%=$(DESTDIR)$(includedir)/private/%) +ALL_INCLUDES = $(filter-out $(PRIVATE_HEADERS) , $(ALL_INCLUDE)) + +EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl +EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a) +CRT_LIBS = $(addprefix lib/,$(notdir $(CRT_OBJS))) +STATIC_LIBS = lib/libc.a +SHARED_LIBS = lib/libc.so +SHARED_LIBS-unstripped = lib/libc.unstripped.so +TARGET-sys = lib/libc-sys.a +TARGET-sys-shared = lib/libc-sys.so +TARGET-sys-shared-unstripped = lib/libc-sys.unstripped.so +TOOL_LIBS = lib/musl-gcc.specs +ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS) $(TARGET-sys) $(TARGET-sys-shared) $(SHARED_LIBS-unstripped) $(TARGET-sys-shared-unstripped) +ALL_TOOLS = obj/musl-gcc + +WRAPCC_GCC = gcc +WRAPCC_CLANG = clang + +LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1 + +-include config.mak +-include $(srcdir)/arch/$(ARCH)/arch.mak + +ifeq ($(ARCH),) + +all: + @echo "Please set ARCH in config.mak before running make." + @exit 1 + +else + +all: $(ALL_LIBS) $(ALL_TOOLS) + +OBJ_DIRS = $(sort $(patsubst %/,%,$(dir $(ALL_LIBS) $(ALL_TOOLS) $(ALL_OBJS) $(GENH) $(GENH_INT))) obj/include) + +$(ALL_LIBS) $(ALL_TOOLS) $(ALL_OBJS) $(ALL_OBJS:%.o=%.lo) $(GENH) $(GENH_INT): | $(OBJ_DIRS) + +$(OBJ_DIRS): + mkdir -p $@ + +obj/include/bits/alltypes.h: $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in $(srcdir)/tools/mkalltypes.sed + sed -f $(srcdir)/tools/mkalltypes.sed $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in > $@ + +obj/include/bits/syscall.h: $(srcdir)/arch/$(ARCH)/bits/syscall.h.in + cp $< $@ + sed -n -e s/__NR_/SYS_/p < $< >> $@ + +obj/include/hmsyscall.h: $(srcdir)/hm/arch/$(ARCH)/hmsyscall.h.in + cp $< $@ + +obj/src/internal/version.h: $(wildcard $(srcdir)/VERSION $(srcdir)/.git) + printf '#define VERSION "%s"\n' "$$(cd $(srcdir); sh tools/version.sh)" > $@ + +obj/src/internal/version.o obj/src/internal/version.lo: obj/src/internal/version.h + +obj/crt/rcrt1.o obj/ldso/dlstart.lo obj/ldso/dynlink.lo: $(srcdir)/src/internal/dynlink.h $(srcdir)/arch/$(ARCH)/reloc.h + +obj/crt/crt1.o obj/crt/scrt1.o obj/crt/rcrt1.o obj/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h + +obj/crt/rcrt1.o: $(srcdir)/ldso/dlstart.c + +obj/crt/Scrt1.o obj/crt/rcrt1.o: CFLAGS_ALL += -fPIC + +OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(srcdir)/src/%)) +$(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.o) $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.lo): CFLAGS += -O3 + +MEMOPS_OBJS = $(filter %/memcpy.o %/memmove.o %/memcmp.o %/memset.o, $(LIBC_OBJS)) +$(MEMOPS_OBJS) $(MEMOPS_OBJS:%.o=%.lo): CFLAGS_ALL += $(CFLAGS_MEMOPS) + +NOSSP_OBJS = $(CRT_OBJS) $(LDSO_OBJS) $(filter \ + %/__libc_start_main.o %/__init_tls.o %/__stack_chk_fail.o \ + %/__set_thread_area.o %/memset.o %/memcpy.o \ + , $(LIBC_OBJS)) +$(NOSSP_OBJS) $(NOSSP_OBJS:%.o=%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP) + +$(CRT_OBJS): CFLAGS_ALL += -DCRT + +$(LOBJS) $(LDSO_OBJS): CFLAGS_ALL += -fPIC + +CC_CMD = $(CC) $(CFLAGS_ALL) -c -o $@ $< + +# Choose invocation of assembler to be used +ifeq ($(ADD_CFI),yes) + AS_CMD = LC_ALL=C awk -f $(srcdir)/tools/add-cfi.common.awk -f $(srcdir)/tools/add-cfi.$(ARCH).awk $< | $(CC) $(CFLAGS_ALL) -x assembler -c -o $@ - +else + AS_CMD = $(CC_CMD) +endif + +obj/%.o: $(srcdir)/%.s + $(AS_CMD) + +obj/%.o: $(srcdir)/%.S + $(CC_CMD) + +obj/%.o: $(srcdir)/%.c $(GENH) $(IMPH) + $(CC_CMD) + +obj/%.lo: $(srcdir)/%.s + $(AS_CMD) + +obj/%.lo: $(srcdir)/%.S + $(CC_CMD) + +obj/%.lo: $(srcdir)/%.c $(GENH) $(IMPH) + $(CC_CMD) + +lib/libc.so: $(LOBJS) $(LDSO_OBJS) + $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \ + -Wl,-e,_dlstart -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC) + +lib/libc.a: $(AOBJS) + rm -f $@ + $(AR) rc $@ $(AOBJS) + $(RANLIB) $@ + +$(TARGET-sys): $(AOBJS) + rm -f $@ + $(AR) rc $@ $(AOBJS) + $(RANLIB) $@ + +$(TARGET-sys-shared): $(LOBJS) $(LDSO_OBJS) + $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \ + -Wl,-e,_dlstart -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC) + +$(SHARED_LIBS-unstripped): $(LOBJS) $(LDSO_OBJS) + $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \ + -Wl,-e,_dlstart -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC) + +$(TARGET-sys-shared-unstripped): $(LOBJS) $(LDSO_OBJS) + $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \ + -Wl,-e,_dlstart -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC) + +$(EMPTY_LIBS): + rm -f $@ + $(AR) rc $@ + +lib/%.o: obj/crt/$(ARCH)/%.o + cp $< $@ + +lib/%.o: obj/crt/%.o + cp $< $@ + +lib/musl-gcc.specs: $(srcdir)/tools/musl-gcc.specs.sh config.mak + sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@ + +obj/musl-gcc: config.mak + printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@ + chmod +x $@ + +obj/%-clang: $(srcdir)/tools/%-clang.in config.mak + sed -e 's!@CC@!$(WRAPCC_CLANG)!g' -e 's!@PREFIX@!$(prefix)!g' -e 's!@INCDIR@!$(includedir)!g' -e 's!@LIBDIR@!$(libdir)!g' -e 's!@LDSO@!$(LDSO_PATHNAME)!g' $< > $@ + chmod +x $@ + +$(DESTDIR)$(bindir)/%: obj/% + $(INSTALL) -D $< $@ + +$(DESTDIR)$(libdir)/%.so: lib/%.so + $(INSTALL) -D -m 755 $< $@ + +$(DESTDIR)$(libdir)/%: lib/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/generic/bits/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/bits/%: obj/include/bits/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/%: $(srcdir)/include/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/%: $(srcdir)/hm/include/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/hmsyscall.h: obj/include/hmsyscall.h + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so + $(INSTALL) -D -l $(libdir)/libc.so $@ || true + +$(DESTDIR)$(includedir)/private/%: $(srcdir)/src/internal/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/private/%: $(srcdir)/src/include/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/private/%: $(srcdir)/arch/$(ARCH)/% + $(INSTALL) -D -m 644 $< $@ + +install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),) + +install-headers: $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%) + @touch $(DESTDIR)$(includedir)/private/tmp $(DESTDIR)$(includedir)/private/musl_log.h + @echo "#define MUSL_LOGE(...)" > $(DESTDIR)$(includedir)/private/musl_log.h + @$(INSTALL) -D -m 644 $(DESTDIR)$(includedir)/private/tmp $(DESTDIR)$(includedir)/private/atomic.h + @$(INSTALL) -D -m 644 $(DESTDIR)$(includedir)/private/musl_log.h $(DESTDIR)$(includedir)/private/musl_log.h + @rm $(DESTDIR)$(includedir)/private/tmp + +install-tools: $(ALL_TOOLS:obj/%=$(DESTDIR)$(bindir)/%) + +install: install-libs install-headers install-tools + +kasan_install: install-headers + +musl-git-%.tar.gz: .git + git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ $(patsubst musl-git-%.tar.gz,%,$@) + +musl-%.tar.gz: .git + git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ v$(patsubst musl-%.tar.gz,%,$@) + +endif + +clean: + rm -rf obj lib + +distclean: clean + rm -f config.mak + +.PHONY: all clean install install-libs install-headers install-tools diff --git a/hm/arch/aarch64/hmsyscall.h.in b/hm/arch/aarch64/hmsyscall.h.in new file mode 100644 index 0000000000000000000000000000000000000000..ac064a73daabdf458e695fe7aa076a0a334828ce --- /dev/null +++ b/hm/arch/aarch64/hmsyscall.h.in @@ -0,0 +1,43 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2018. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Sat Nov 24 12:51:01 2018 + */ + +#ifndef HM_INCLUDE_HMSYSCALL_H +#define HM_INCLUDE_HMSYSCALL_H + +/* + * New added syscall number should be added here. + * + * Begins from 400 + * + */ + +#define SYS_cpu_getnum 400 +#define SYS_mq_close 401 +#define SYS_set_thread_area 402 +#define SYS_debug_thread_sp 404 +#define SYS_getifaddrs 405 +#define SYS_ext_wait 406 +#define SYS_ext_ctrl 407 +#define SYS_proc_check_regs 408 +#define SYS_debug_load_symbol 409 +#define SYS_debug_unload_symbol 410 +#define SYS_process_spawn 412 +#define SYS_sched_get_avail_prio_max 414 + +#define __NR_cpu_getnum 400 +#define __NR_mq_close 401 +#define __NR_set_thread_area 402 +#define __NR_debug_thread_sp 404 +#define __NR_getifaddrs 405 +#define __NR_ext_wait 406 +#define __NR_ext_ctrl 407 +#define __NR_proc_check_regs 408 +#define __NR_debug_load_symbol 409 +#define __NR_debug_unload_symbol 410 +#define __NR_process_spawn 412 +#define __NR_sched_get_avail_prio_max 414 + +#endif diff --git a/hm/arch/arm/hmsyscall.h.in b/hm/arch/arm/hmsyscall.h.in new file mode 100644 index 0000000000000000000000000000000000000000..84a909873673dc57249e84d82a4654e92fa69ec5 --- /dev/null +++ b/hm/arch/arm/hmsyscall.h.in @@ -0,0 +1,42 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2023. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Thursday May 211, 2023 09:09:30 CST + */ + +#ifndef HM_INCLUDE_HMSYSCALL_H +#define HM_INCLUDE_HMSYSCALL_H + +/* + * New added syscall number should be added here. Begins from 447. + * + * Do not add new syscall numbers which already have been used in arm's original syscall number header file. + */ + +#define SYS_cpu_getnum 447 +#define SYS_mq_close 448 +#define SYS_set_thread_area 449 +#define SYS_debug_thread_sp 451 +#define SYS_getifaddrs 452 +#define SYS_ext_wait 453 +#define SYS_ext_ctrl 454 +#define SYS_proc_check_regs 455 +#define SYS_debug_load_symbol 456 +#define SYS_debug_unload_symbol 457 +#define SYS_process_spawn 459 +#define SYS_sched_get_avail_prio_max 461 + +#define __NR_cpu_getnum 447 +#define __NR_mq_close 448 +#define __NR_set_thread_area 449 +#define __NR_debug_thread_sp 451 +#define __NR_getifaddrs 452 +#define __NR_ext_wait 453 +#define __NR_ext_ctrl 454 +#define __NR_proc_check_regs 455 +#define __NR_debug_load_symbol 456 +#define __NR_debug_unload_symbol 457 +#define __NR_process_spawn 459 +#define __NR_sched_get_avail_prio_max 461 + +#endif diff --git a/hm/include/execinfo.h b/hm/include/execinfo.h new file mode 100644 index 0000000000000000000000000000000000000000..b092f0ade9ed98cd60d36d9143c86538861faff5 --- /dev/null +++ b/hm/include/execinfo.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2019. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Mon May 13 12:02:17 2019 + */ +#ifndef _EXECINFO_H +#define _EXECINFO_H + +#ifdef __cplusplus +extern "C" { +#endif + +extern int backtrace(void **buffer, int size); +extern char **backtrace_symbols(void *const *array, int size); +extern void backtrace_symbols_fd(void *const *array, int size, int fd); + +#ifdef __cplusplus +} +#endif + +#endif /* execinfo.h */ diff --git a/hm/include/hmdsosym.h b/hm/include/hmdsosym.h new file mode 100644 index 0000000000000000000000000000000000000000..21219a967a5b5fd4676fb165ec5c006026a78f67 --- /dev/null +++ b/hm/include/hmdsosym.h @@ -0,0 +1,71 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2019. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Wed Oct 23 14:53:17 2019 + */ + +#ifndef HM_INCLUDE_HMDSOSYM_H +#define HM_INCLUDE_HMDSOSYM_H + +#include + +struct dso_sym_entry { + uint32_t flag; /* Is entry valid or not, 0:invalid, 1:valid */ + uint32_t elf_type; /* Object file type */ + uint64_t fname; /* Object file name */ + uint64_t base; /* Address of dynamic shared object loaded */ + uint64_t tls_offset; /* Offset from TP of dso's TLS */ + uint64_t symtab_addr; /* Address of symbol section loaded */ + uint64_t strtab_addr; /* Address of strings section loaded */ + uint32_t fname_len; /* Length of file name, include last null character */ + uint32_t base_len; /* Length of dso */ + uint32_t symtab_len; /* Length of symbol section loaded */ + uint32_t strtab_len; /* Length of strings section loaded */ +}; + +#define MEM_SIZE_FOR_DSO_INFO (4096) +#define DSO_INFO_MAGIC "HMDSO" +#define DSO_INFO_MAGIC_LEN (16) +#define MAIN_ELF_NAME_LEN (64) +#define HMLDSO_ELF_NAME_LEN (24) + +/* dso_sym_info and dso_sym_entry memory structure, must align to 4k. + * The data members in dso_sym_info and dso_sym_entry should be of fixed length. + * + * base page cur_page next_page + * ------------------ <-- ------> ------------------ <-- ------> ------------------ + * | ---------------- | | | | ---------------- | | | | ---------------- | + * || dso_sym_info || --|--- || dso_sym_info || --|--- || dso_sym_info || + * ||----------------|| NULL | | ||----------------|| | | ||----------------|| NULL + * || ... || ^ | | || ... || | | || ... || ^ + * || prev_page ||___| | ---|| prev_page || | ----|| prev_page || | + * || next_page ||------ || next_page ||------ || next_page ||___| + * || main_elf_entry || || main_elf_entry || || main_elf_entry || + * ||hmldso_elf_entry|| ||hmldso_elf_entry|| ||hmldso_elf_entry|| + * | ---------------- | | ---------------- | | ---------------- | + * | ---------------- | | ---------------- | | ---------------- | + * || dso_sym_entry || || dso_sym_entry || || dso_sym_entry || + * | ---------------- | | ---------------- | | ---------------- | + * | ---------------- | | ---------------- | | ---------------- | + * || dso_sym_entry || || dso_sym_entry || || dso_sym_entry || + * | ---------------- | | ---------------- | | ---------------- | + * | ... | | ... | | ... | + * ------------------ ------------------ ------------------ + * + */ +struct dso_sym_info { + char magic[DSO_INFO_MAGIC_LEN]; /* magic info, default is "HMDSO" */ + uint32_t nr_sym_entry; /* number of available entries */ + uint32_t nr_valid_entry; /* current number of valid entries */ + uint64_t prev_page; /* point to the previous page of the current page */ + uint64_t next_page; /* point to the next page of the current page */ + char main_elf_name[MAIN_ELF_NAME_LEN]; /* save the name of main elf */ + char hmldso_name[HMLDSO_ELF_NAME_LEN]; /* save the name of hmldso elf */ + struct dso_sym_entry main_elf_entry; /* save the main elf information */ + struct dso_sym_entry hmldso_elf_entry; /* save the hmldso elf information */ +}; + +int fill_dso_syminfo(struct dso_sym_entry *sym_entry); +void drop_dso_syminfo(const void *base); + +#endif diff --git a/hm/include/hmsched.h b/hm/include/hmsched.h new file mode 100644 index 0000000000000000000000000000000000000000..1757613f203fa3a9070ccd6df097ff4a9caf3e38 --- /dev/null +++ b/hm/include/hmsched.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Tue May 19 10:03:24 2020 + */ +#ifndef HM_INCLUDE_HMSCHED_H +#define HM_INCLUDE_HMSCHED_H + +#include +#include + +#define SCHED_FLAG_UTIL_CLAMP_MIN 0x20 +#define SCHED_FLAG_UTIL_CLAMP_MAX 0x40 + +#define SCHED_FLAG_UTIL_CLAMP (SCHED_FLAG_UTIL_CLAMP_MIN | \ + SCHED_FLAG_UTIL_CLAMP_MAX) + +struct sched_attr { + uint32_t size; + + uint32_t sched_policy; + uint64_t sched_flags; + + /* SCHED_OTHER */ + int32_t sched_nice; + + /* SCHED_FIFO, SCHED_RR */ + uint32_t sched_priority; + + /* SCHED_DEADLINE */ + uint64_t sched_runtime; + uint64_t sched_deadline; + uint64_t sched_period; + + /* UCLAMP */ + uint32_t sched_util_min; + uint32_t sched_util_max; +}; + +int sched_get_available_priority_max(void); +int sched_setattr(pid_t pid, const struct sched_attr *attr, + unsigned int flags); +int sched_getattr(pid_t pid, const struct sched_attr *attr, + unsigned int size, unsigned int flags); +int getcpu(unsigned int *cpu, unsigned int *node); +#endif diff --git a/hm/include/kasanhook.h b/hm/include/kasanhook.h new file mode 100644 index 0000000000000000000000000000000000000000..1f24c5230c5facadd6fa062a95b6d33357528cb5 --- /dev/null +++ b/hm/include/kasanhook.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: Kasan hook function header + * Author: Huawei OS Kernel Lab + * Create: Sat Feb 26 15:11:46 2022 + */ +#ifndef KASAN_HOOK_H +#define KASAN_HOOK_H + +#include + +#define DEFINE_ASAN_LOADSTORE_PTR(size) \ + void (*__asan_load##size)(unsigned long bgn); \ + void (*__asan_load##size##_noabort)(unsigned long bgn); \ + void (*__asan_store##size)(unsigned long bgn); \ + void (*__asan_store##size##_noabort)(unsigned long bgn); + +struct kasan_global; + +struct asan_callback { + DEFINE_ASAN_LOADSTORE_PTR(1) + DEFINE_ASAN_LOADSTORE_PTR(2) + DEFINE_ASAN_LOADSTORE_PTR(4) + DEFINE_ASAN_LOADSTORE_PTR(8) + DEFINE_ASAN_LOADSTORE_PTR(16) + void (*__asan_loadN)(unsigned long bgn, size_t size); + void (*__asan_loadN_noabort)(unsigned long bgn, size_t size); + void (*__asan_storeN)(unsigned long bgn, size_t size); + void (*__asan_storeN_noabort)(unsigned long bgn, size_t size); + void (*__asan_register_globals)(struct kasan_global *glbls, size_t size); + void (*__asan_unregister_globals)(struct kasan_global *glbls, size_t size); + void (*__asan_handle_no_return)(void); +}; + + +int set_asan_callback(const struct asan_callback *new_ac); + +#endif diff --git a/hm/src/internal/sysinfo.c b/hm/src/internal/sysinfo.c new file mode 100644 index 0000000000000000000000000000000000000000..4a1850253fb74c40a7c3d46327fe7eac9b2b31af --- /dev/null +++ b/hm/src/internal/sysinfo.c @@ -0,0 +1,20 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2019. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Thu Apr 18 11:06:42 2019 + */ + +#include "libc.h" + +/** + * We need to use __libc to setup tls for raw thread. This function is used by ulibs + * to get struct __libc. + * + * If we use __libc variable directly in ulibs, it will use a local variable from ulibs + * not from libc.so. So we provide a function to get __libc pointer. + */ +struct __libc* __get_libc(void); +struct __libc* __get_libc(void) +{ + return &__libc; +} diff --git a/hm/src/kasan/kasan.c b/hm/src/kasan/kasan.c new file mode 100644 index 0000000000000000000000000000000000000000..ebd7a07ebfe7e3ede0bcf2213dc7c2e3de0c8954 --- /dev/null +++ b/hm/src/kasan/kasan.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + * Description: Kasan hook function + * Author: Huawei OS Kernel Lab + * Create: Sat Feb 26 15:10:47 2022 + */ +#include +#include "kasanhook.h" + +static void dummy0(void) +{ +} + +static void dummy1(unsigned long bgn) +{ + (void)bgn; +} + +static void dummy2(unsigned long bgn, size_t size) +{ + (void)bgn; + (void)size; +} + +static void dummy3(struct kasan_global *glbls, size_t size) +{ + (void)glbls; + (void)size; +} + +#define ASAN_LOADSTORE_ASSIGN(size) \ + .__asan_load##size = dummy1, \ + .__asan_load##size##_noabort = dummy1, \ + .__asan_store##size = dummy1, \ + .__asan_store##size##_noabort = dummy1, + +static struct asan_callback g_asan_callback = { + ASAN_LOADSTORE_ASSIGN(1) + ASAN_LOADSTORE_ASSIGN(2) + ASAN_LOADSTORE_ASSIGN(4) + ASAN_LOADSTORE_ASSIGN(8) + ASAN_LOADSTORE_ASSIGN(16) + .__asan_loadN = dummy2, + .__asan_loadN_noabort = dummy2, + .__asan_storeN = dummy2, + .__asan_storeN_noabort = dummy2, + .__asan_register_globals = dummy3, + .__asan_unregister_globals = dummy3, + .__asan_handle_no_return = dummy0 +}; + + +#define DEFINE_ASAN_LOADSTORE(size) \ + void __asan_load##size(unsigned long bgn) \ + { \ + g_asan_callback.__asan_load##size(bgn); \ + } \ + void __asan_load##size##_noabort(unsigned long bgn) \ + { \ + g_asan_callback.__asan_load##size##_noabort(bgn); \ + } \ + void __asan_store##size(unsigned long bgn) \ + { \ + g_asan_callback.__asan_store##size(bgn); \ + } \ + void __asan_store##size##_noabort(unsigned long bgn) \ + { \ + g_asan_callback.__asan_store##size##_noabort(bgn); \ + } + +DEFINE_ASAN_LOADSTORE(1) +DEFINE_ASAN_LOADSTORE(2) +DEFINE_ASAN_LOADSTORE(4) +DEFINE_ASAN_LOADSTORE(8) +DEFINE_ASAN_LOADSTORE(16) + +void __asan_loadN(unsigned long bgn, size_t size) +{ + g_asan_callback.__asan_loadN(bgn, size); +} + +void __asan_loadN_noabort(unsigned long bgn, size_t size) +{ + g_asan_callback.__asan_loadN_noabort(bgn, size); +} + +void __asan_storeN(unsigned long bgn, size_t size) +{ + g_asan_callback.__asan_storeN(bgn, size); +} + +void __asan_storeN_noabort(unsigned long bgn, size_t size)\ +{ + g_asan_callback.__asan_storeN_noabort(bgn, size); +} + +void __asan_register_globals(struct kasan_global *glbls, size_t size) +{ + g_asan_callback.__asan_register_globals(glbls, size); +} + +void __asan_unregister_globals(struct kasan_global *glbls, size_t size) + +{ + g_asan_callback.__asan_unregister_globals(glbls, size); +} + +void __asan_handle_no_return(void) +{ + g_asan_callback.__asan_handle_no_return(); +} + +int set_asan_callback(const struct asan_callback *new_ac) +{ + if (new_ac == NULL) { + return -1; + } + /* Avoid using memcpy (gcc optimization) */ + unsigned int i = 0; + for (; i < sizeof(struct asan_callback); i++) { + *((char *)&g_asan_callback + i) = *((char *)new_ac + i); + } + return 0; +} diff --git a/hm/src/sched/getcpu.c b/hm/src/sched/getcpu.c new file mode 100644 index 0000000000000000000000000000000000000000..a64fc484d9bdeaf63227b6d23f62857fb51a9ea8 --- /dev/null +++ b/hm/src/sched/getcpu.c @@ -0,0 +1,12 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Fri Aug 06 15:21:48 2021 + */ +#include +#include "syscall.h" + +int getcpu(unsigned int *cpu, unsigned int *node) +{ + return (int)syscall((long)SYS_getcpu, cpu, node); +} diff --git a/hm/src/sched/sched_get_available_priority_max.c b/hm/src/sched/sched_get_available_priority_max.c new file mode 100644 index 0000000000000000000000000000000000000000..98fd32aa76a49f5e451ace0d38dab194290e6de4 --- /dev/null +++ b/hm/src/sched/sched_get_available_priority_max.c @@ -0,0 +1,13 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Tue May 19 09:58:57 2020 + */ +#include +#include +#include + +int sched_get_available_priority_max(void) +{ + return (int)syscall((long)SYS_sched_get_avail_prio_max); +} diff --git a/hm/src/sched/sched_getattr.c b/hm/src/sched/sched_getattr.c new file mode 100644 index 0000000000000000000000000000000000000000..3dbc3c68539ab68f4a25c59deb4251ae4ad2c377 --- /dev/null +++ b/hm/src/sched/sched_getattr.c @@ -0,0 +1,14 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Fri Aug 06 15:21:48 2021 + */ +#include +#include +#include + +int sched_getattr(pid_t pid, const struct sched_attr *attr, + unsigned int size, unsigned int flags) +{ + return (int)syscall((long)SYS_sched_getattr, pid, attr, size, flags); +} diff --git a/hm/src/sched/sched_setattr.c b/hm/src/sched/sched_setattr.c new file mode 100644 index 0000000000000000000000000000000000000000..ef3d5f342534b824819f1cc4185b5280f8ddf89a --- /dev/null +++ b/hm/src/sched/sched_setattr.c @@ -0,0 +1,14 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2020. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Fri Aug 06 15:21:48 2021 + */ +#include +#include +#include + +int sched_setattr(pid_t pid, const struct sched_attr *attr, + unsigned int flags) +{ + return (int)syscall((long)SYS_sched_setattr, pid, attr, flags); +} diff --git a/hm/src/string/safe_copy.c b/hm/src/string/safe_copy.c new file mode 100644 index 0000000000000000000000000000000000000000..0bba5df7e2729e7bc69421ccc0320fdc35f1a586 --- /dev/null +++ b/hm/src/string/safe_copy.c @@ -0,0 +1,142 @@ +/* + * Copyright (C) Huawei Technologies Co., Ltd. 2018. All rights reserved. + * Author: Huawei OS Kernel Lab + * Create: Tue Jan 08 14:53:17 2019 + */ +#define _GNU_SOURCE + +#include +#include +#include +#include +#include + +#include +#include "syscall.h" +#include "atomic.h" + +int safe_copy(void *dst, const void *src, size_t len) +{ + int r = 0; + static int (*func)(void *, const void *, size_t) = + (int (*)(void *, const void *, size_t))NULL; + if (func == NULL) { + __get_vdso_info(); + void *p = __get_vdso_addr(VDSO_SAFE_COPY_VERSION, VDSO_SAFE_COPY); + if (p == NULL) { + errno = ENOSYS; + r = -ENOSYS; + } else { + (void)a_cas_p(&func, NULL, p); + } + } + + if (r == 0) { + r = func(dst, src, len); + if (r != 0) { + errno = EFAULT; + } + } + return r; +} + +int safe_copy_align(void *dst, const void *src, size_t len) +{ + int r = 0; + static int (*func_align)(void *, const void *, size_t) = + (int (*)(void *, const void *, size_t))NULL; + if (func_align == NULL) { + __get_vdso_info(); + void *p = __get_vdso_addr(VDSO_SAFE_COPY_VERSION, VDSO_SAFE_COPY_ALIGN); + if (p == NULL) { + errno = ENOSYS; + r = -ENOSYS; + } else { + (void)a_cas_p(&func_align, NULL, p); + } + } + + if (r == 0) { + r = func_align(dst, src, len); + if (r != 0) { + errno = EFAULT; + } + } + return r; +} + +int safe_copy_nopf(void *dst, const void *src, size_t len) +{ + int r = 0; + static int (*func_nopf)(void *, const void *, size_t) = + (int (*)(void *, const void *, size_t))NULL; + if (func_nopf == NULL) { + __get_vdso_info(); + void *p = __get_vdso_addr(VDSO_SAFE_COPY_VERSION, VDSO_SAFE_COPY_NOPF); + if (p == NULL) { + errno = ENOSYS; + r = -ENOSYS; + } else { + (void)a_cas_p(&func_nopf, NULL, p); + } + } + + if (r == 0) { + r = func_nopf(dst, src, len); + if (r != 0) { + errno = EFAULT; + } + } + return r; +} + +static int __check_mem(void *addr, size_t size, char rw) +{ + int err; + uintptr_t page_start, page_mask, next_page_start; + size_t remain, page_size, page_mem; + char byte_mem; + remain = size; + page_size = (size_t)getpagesize(); + page_mask = (~((uintptr_t)page_size - 1u)); + page_start = (uintptr_t)addr; + next_page_start = (page_start + page_size) & page_mask; + while (true) { + page_mem = next_page_start - page_start; + err = safe_copy(&byte_mem, (const void *)page_start, sizeof(char)); + if (err != 0) { + err = -1; + break; + } + if (rw == 'w') { + err = safe_copy((void *)page_start, &byte_mem, sizeof(char)); + if (err != 0) { + err = -1; + break; + } + } + page_start = next_page_start; + next_page_start += page_size; + if (remain > page_mem) { + remain -= page_mem; + } else { + break; + } + } + + return err; +} + +int safe_check_mem(void *addr, size_t size, char rw) +{ + int rc = 0; + if (rw != 'r' && rw != 'w') { + errno = EINVAL; + rc = -1; + } + + if (rc == 0) { + rc = __check_mem(addr, size, rw); + } + return rc; +} diff --git a/hm/src/time/vdso_get_udata.c b/hm/src/time/vdso_get_udata.c new file mode 100644 index 0000000000000000000000000000000000000000..0d9164c42767c6e7dfedca4553af8f7a279164cd --- /dev/null +++ b/hm/src/time/vdso_get_udata.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: Implement vdso_get_udata + * Author: Huawei OS Kernel Lab + * Create: Mon Aug 2 15:49:23 2021 + */ +#include +#include +#include + +#include "atomic.h" +#include "syscall.h" + +void *vdso_get_udata(void) +{ +#ifdef VDSO_GET_DATA_SYM + void *r = NULL; + static void *(*func)(void) = (void *(*)(void))NULL; + + if (func == NULL) { + __get_vdso_info(); + void *p = __get_vdso_addr(VDSO_GET_DATA_VER, VDSO_GET_DATA_SYM); + if (p == NULL) { + errno = ENOSYS; + return NULL; + } + (void)a_cas_p(&func, NULL, p); + } + + r = func(); + if (r == NULL) { + errno = EINVAL; + } + + return r; +#else + errno = ENOSYS; + return NULL; +#endif +} diff --git a/include/elf.h b/include/elf.h index 04896ed3b5956be5c5b948e44bd4de1b7550a638..86ee41eb9494cd3d817450a50fedbe9e1bb2d2e5 100644 --- a/include/elf.h +++ b/include/elf.h @@ -1010,7 +1010,9 @@ typedef struct { } a_un; } Elf64_auxv_t; - +#define AT_FLAGS_PRESERVE_ARGV0_BIT 0 +#define AT_FLAGS_COMPAT32_BIT 30 +#define AT_FLAGS_ILP32_BIT 31 #define AT_NULL 0 #define AT_IGNORE 1 diff --git a/include/fcntl.h b/include/fcntl.h index 1b8826f7da754648315c21683b83c0097f4df555..6f12e046700cf8137c19060c5382c5bfb433d863 100644 --- a/include/fcntl.h +++ b/include/fcntl.h @@ -199,9 +199,15 @@ ssize_t tee(int, int, size_t, unsigned); #endif #if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE) +#ifdef __HM_KERNEL__ +#define F_GETLK64 12 +#define F_SETLK64 13 +#define F_SETLKW64 14 +#else #define F_GETLK64 F_GETLK #define F_SETLK64 F_SETLK #define F_SETLKW64 F_SETLKW +#endif #define flock64 flock #define open64 open #define openat64 openat diff --git a/include/sched.h b/include/sched.h index 94b83b29763f55b07b1e587247ccb031f2c5ee8b..895bff8e8de7d838ea7726a7e19498a521523049 100644 --- a/include/sched.h +++ b/include/sched.h @@ -30,7 +30,7 @@ struct sched_param { struct sched_param { int sched_priority; int __reserved1; -#if _REDIR_TIME64 +#ifdef _REDIR_TIME64 long __reserved2[4]; #else struct { @@ -151,7 +151,7 @@ __CPU_op_func_S(XOR, ^) #endif -#if _REDIR_TIME64 +#ifdef _REDIR_TIME64 __REDIR(sched_rr_get_interval, __sched_rr_get_interval_time64); #endif diff --git a/include/stddef.h b/include/stddef.h index f25b86396e80a015490a6aec521cb38ab36ab118..312594eac794dc0e0219c3552d1932f259d92d60 100644 --- a/include/stddef.h +++ b/include/stddef.h @@ -1,7 +1,7 @@ #ifndef _STDDEF_H #define _STDDEF_H -#if __cplusplus >= 201103L +#if defined(__cplusplus) &&__cplusplus >= 201103L #define NULL nullptr #elif defined(__cplusplus) #define NULL 0L @@ -12,9 +12,15 @@ #define __NEED_ptrdiff_t #define __NEED_size_t #define __NEED_wchar_t +#ifdef __cplusplus #if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L #define __NEED_max_align_t #endif +#else +#if __STDC_VERSION__ >= 201112L +#define __NEED_max_align_t +#endif +#endif #include diff --git a/include/stdio.h b/include/stdio.h index 5019d31e7a5ae254f8a8214f17b0fcf69944ff93..ef9f07cc1c5b0fff7c8de1efb3740d727eff9fe5 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -26,7 +26,7 @@ extern "C" { #include -#if __cplusplus >= 201103L +#if defined(__cplusplus) && __cplusplus >= 201103L #define NULL nullptr #elif defined(__cplusplus) #define NULL 0L @@ -239,7 +239,7 @@ enum fdsan_owner_type { FDSAN_OWNER_TYPE_ZIP_ARCHIVE = 4, }; -void* fdsan_get_fd_table(); +void* fdsan_get_fd_table(void); uint64_t fdsan_create_owner_tag(enum fdsan_owner_type type, uint64_t tag); void fdsan_exchange_owner_tag(int fd, uint64_t expected_tag, uint64_t new_tag); int fdsan_close_with_tag(int fd, uint64_t tag); @@ -261,7 +261,7 @@ enum fdsan_error_level { FDSAN_ERROR_LEVEL_FATAL, }; -enum fdsan_error_level fdsan_get_error_level(); +enum fdsan_error_level fdsan_get_error_level(void); enum fdsan_error_level fdsan_set_error_level(enum fdsan_error_level new_level); enum fdsan_error_level fdsan_set_error_level_from_param(enum fdsan_error_level default_level); diff --git a/include/stdlib.h b/include/stdlib.h index 7f9b4878dbe388e0b89b82364b7ddcda97273d9e..7382abf0e415fcee0bc9329b00f63e7bae43dbbe 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -7,7 +7,7 @@ extern "C" { #include -#if __cplusplus >= 201103L +#if defined(__cplusplus) && __cplusplus >= 201103L #define NULL nullptr #elif defined(__cplusplus) #define NULL 0L diff --git a/include/string.h b/include/string.h index 3746ce396a7b1636b30bb26e91f13038d575d19c..3421bd9238da11d2edd1f4fdc437a0abb4c5962f 100644 --- a/include/string.h +++ b/include/string.h @@ -7,7 +7,7 @@ extern "C" { #include -#if __cplusplus >= 201103L +#if defined(__cplusplus) && __cplusplus >= 201103L #define NULL nullptr #elif defined(__cplusplus) #define NULL 0L @@ -54,6 +54,11 @@ char *strtok (char *__restrict, const char *__restrict); size_t strlen (const char *); char *strerror (int); +int safe_copy(void *, const void *, size_t); +int safe_copy_align(void *, const void *, size_t); +int safe_copy_nopf(void *, const void *, size_t); + +int safe_check_mem(void *, size_t, char); #if defined(_BSD_SOURCE) || defined(_GNU_SOURCE) #include diff --git a/include/sys/mount.h b/include/sys/mount.h index 09bd6e9dfeffa8867432ed1080996f456e1e3981..b72963f7cb126a88597e7194635815f14c9414ff 100644 --- a/include/sys/mount.h +++ b/include/sys/mount.h @@ -19,6 +19,7 @@ extern "C" { #define BLKSECTSET _IO(0x12,102) #define BLKSECTGET _IO(0x12,103) #define BLKSSZGET _IO(0x12,104) +#define BLKDISCARD _IO(0x12,119) #define BLKBSZGET _IOR(0x12,112,size_t) #define BLKBSZSET _IOW(0x12,113,size_t) #define BLKGETSIZE64 _IOR(0x12,114,size_t) diff --git a/include/sys/prctl.h b/include/sys/prctl.h index 04ce0d4f3848d17666503cae860bbba790a16238..45584231dedf12348eeb0a320151f8bc963448ef 100644 --- a/include/sys/prctl.h +++ b/include/sys/prctl.h @@ -39,6 +39,8 @@ extern "C" { #define PR_TIMING_TIMESTAMP 1 #define PR_SET_NAME 15 #define PR_GET_NAME 16 +#define PR_SET_TNAME 17 +#define PR_GET_TNAME 18 #define PR_GET_ENDIAN 19 #define PR_SET_ENDIAN 20 #define PR_ENDIAN_BIG 0 diff --git a/include/time.h b/include/time.h index f274edb0d34bb3233b3986c5b0ae262270591642..94d85c8198c6ba9dd3b6b208ed8de888e1db688d 100644 --- a/include/time.h +++ b/include/time.h @@ -7,7 +7,7 @@ extern "C" { #include -#if __cplusplus >= 201103L +#if defined(__cplusplus) && __cplusplus >= 201103L #define NULL nullptr #elif defined(__cplusplus) #define NULL 0L @@ -134,7 +134,7 @@ int stime(const time_t *); time_t timegm(struct tm *); #endif -#if _REDIR_TIME64 +#if defined(_REDIR_TIME64) __REDIR(time, __time64); __REDIR(difftime, __difftime64); __REDIR(mktime, __mktime64); diff --git a/include/time/vdso.h b/include/time/vdso.h new file mode 100644 index 0000000000000000000000000000000000000000..f21284fe70049cd4e8869985789e18e305db6aea --- /dev/null +++ b/include/time/vdso.h @@ -0,0 +1,13 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved. + * Description: Header file of vdso_get_udata.c + * Author: Huawei OS Kernel Lab + * Create: Mon Aug 2 16:37:54 2021 + */ + +#ifndef _TIME_VDSOGETDATA_H +#define _TIME_VDSOGETDATA_H + +void *vdso_get_udata(void); + +#endif diff --git a/include/unistd.h b/include/unistd.h index 888e9580535c056800f941204177d6688dd91f3b..889a841de3117231c5e54472c0b8a940f75fe5d5 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -26,7 +26,7 @@ extern "C" { #define NULL ((void*)0) #endif #else -#if __cplusplus >= 201103L +#if defined(__cplusplus) &&__cplusplus >= 201103L #define NULL nullptr #elif defined(__cplusplus) #define NULL 0L diff --git a/ldso/linux/dynlink.c b/ldso/linux/dynlink.c index ec2a6be3a797ac845f59b1ba7116b80e61376c90..e5c2253985f25193c26d22d60a9ad20f2c8f72be 100644 --- a/ldso/linux/dynlink.c +++ b/ldso/linux/dynlink.c @@ -28,6 +28,10 @@ #include #include +#ifdef __HM_KERNEL__ +#include +#endif + #include "cfi.h" #include "dlfcn_ext.h" #include "dynlink_rand.h" @@ -356,6 +360,200 @@ static void init_default_namespace(struct dso *app) return; } +#if __HM_KERNEL__ +struct dso_sym_info *dso_syminfo = NULL; +#define AT_DSOINFO (AT_L3_CACHEGEOMETRY + 1) +#define AT_LIBCMAPLEN (AT_L3_CACHEGEOMETRY + 3) + +static bool find_entry(struct dso_sym_info *tmp_dso_info, struct dso_sym_entry **entry, uint64_t base) +{ + uint32_t i; + struct dso_sym_entry *entries = NULL; + + entries = &tmp_dso_info->main_elf_entry; + for (i = 0; i < tmp_dso_info->nr_sym_entry; i++) { + if (entries[i].flag == 0) { + if ((*entry) == NULL) { + (*entry) = &entries[i]; + } + } else { + if (entries[i].base == base) { + (*entry) = &entries[i]; + return true; + } + } + } + + return false; +} + +static void do_init_dso_sym_info(void *addr, struct dso_sym_info **cur_sym_info, + struct dso_sym_info *prev_sym_info) +{ + uint32_t i; + struct dso_sym_entry *entries = NULL; + + (*cur_sym_info) = (struct dso_sym_info *)addr; + (*cur_sym_info)->nr_valid_entry = 0; + (*cur_sym_info)->nr_sym_entry = (MEM_SIZE_FOR_DSO_INFO - + ((uint32_t)(uintptr_t)&((*cur_sym_info)->main_elf_entry) - + (uint32_t)(uintptr_t)(*cur_sym_info))) / + (sizeof(struct dso_sym_entry)); + entries = &(*cur_sym_info)->main_elf_entry; + for (i = 0; i < (*cur_sym_info)->nr_sym_entry; i++) { + entries[i].flag = 0; + } + strcpy(&((*cur_sym_info)->magic[0]), DSO_INFO_MAGIC); + (*cur_sym_info)->prev_page = (uint64_t)(uintptr_t)prev_sym_info; + (*cur_sym_info)->next_page = 0; + if (prev_sym_info != NULL) { + prev_sym_info->next_page = (uint64_t)(uintptr_t)(*cur_sym_info); + } +} + +static int add_new_page(struct dso_sym_entry **entry, + struct dso_sym_info **cur_sym_info, + struct dso_sym_info *last_valid_info) +{ + void *addr = NULL; + + addr = mmap(NULL, MEM_SIZE_FOR_DSO_INFO, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANON, + 0, 0); + if (addr == MAP_FAILED) { + dprintf(2, "ERROR: Failed to map the MMAP address\n"); + return -EINVAL; + } + do_init_dso_sym_info(addr, cur_sym_info, last_valid_info); + (*entry) = &(*cur_sym_info)->main_elf_entry; + + return 0; +} + +static int __add_dso_syminfo_nolock(struct dso_sym_entry *sym_entry) +{ + int rc = 0; + bool found = false; + struct dso_sym_info *cur_sym_info = NULL; + struct dso_sym_info *last_valid_info = NULL; + struct dso_sym_info *tmp_dso_info = NULL; + struct dso_sym_entry *entry = NULL; + + if (dso_syminfo == NULL) { + dprintf(2, "ERROR: invalid syminfo mem\n"); + return -EINVAL; + } + cur_sym_info = dso_syminfo; + while (cur_sym_info != NULL) { + last_valid_info = cur_sym_info; + found = find_entry(cur_sym_info, &entry, sym_entry->base); + if (found) { + return -EEXIST; + } + if (entry != NULL && tmp_dso_info == NULL) { + tmp_dso_info = cur_sym_info; + } + cur_sym_info = (void *)(uintptr_t)(cur_sym_info->next_page); + } + + if (entry != NULL) { + cur_sym_info = tmp_dso_info; + } else { + rc = add_new_page(&entry, &cur_sym_info, last_valid_info); + if (rc != 0) { + return rc; + } + } + memcpy(entry, sym_entry, sizeof(struct dso_sym_entry)); + entry->flag = 1; + cur_sym_info->nr_valid_entry++; + + return rc; +} + +static void set_dso_syminfo(size_t *auxv) +{ + char *addr = NULL; + + if (dso_syminfo != NULL) { + dprintf(2, "ERROR: dso_sym_info has been initted\n"); + return; + } + for (; auxv[0]; auxv += 2) { + if (auxv[0] == AT_DSOINFO) { + addr = (char *)auxv[1]; + } else if (auxv[0] == AT_LIBCMAPLEN) { + ldso.map_len = (size_t)auxv[1]; + } + } + if (addr == NULL) { + return; + } + dso_syminfo = (struct dso_sym_info *)addr; +} + +int fill_dso_syminfo(struct dso_sym_entry *sym_entry) +{ + int ret = -EINVAL; + + if (sym_entry != NULL) { + pthread_rwlock_wrlock(&lock); + ret = __add_dso_syminfo_nolock(sym_entry); + pthread_rwlock_unlock(&lock); + } + + return ret; +} + +static void __drop_dso_syminfo(const void *base, struct dso *dso) +{ + bool found; + struct dso_sym_entry *entry = NULL; + struct dso_sym_info *cur_sym_info = NULL; + struct dso_sym_info *prev_sym_info = NULL; + struct dso_sym_info *next_sym_info = NULL; + unsigned int page_offset; + + if (base == NULL || dso_syminfo == NULL) { + return; + } + cur_sym_info = dso_syminfo; + while (cur_sym_info != NULL) { + found = find_entry(cur_sym_info, &entry, (uint64_t)(uintptr_t)base); + if (found) { + break; + } + cur_sym_info = (void *)(uintptr_t)(cur_sym_info->next_page); + } + if (cur_sym_info == NULL) { + return; + } + + entry->flag = 0; + cur_sym_info->nr_valid_entry--; + if (cur_sym_info->nr_valid_entry == 0 && cur_sym_info != dso_syminfo) { + prev_sym_info = (void *)(uintptr_t)(cur_sym_info->prev_page); + next_sym_info = (void *)(uintptr_t)(cur_sym_info->next_page); + munmap(cur_sym_info, MEM_SIZE_FOR_DSO_INFO); + prev_sym_info->next_page = (uint64_t)(uintptr_t)next_sym_info; + if (next_sym_info != NULL) { + next_sym_info->prev_page = (uint64_t)(uintptr_t)prev_sym_info; + } + } +} + +void drop_dso_syminfo(const void *base) +{ + if (base == NULL) { + return; + } + pthread_rwlock_wrlock(&lock); + __drop_dso_syminfo(base, NULL); + pthread_rwlock_unlock(&lock); +} +#endif + UT_STATIC void set_ns_attrs(ns_t *ns, ns_configor *conf) { if (!ns || !conf) { @@ -1824,6 +2022,13 @@ UT_STATIC void *map_library(int fd, struct dso *dso, struct reserved_address_par } /* if reserved_params does not exist, we should use real_map as prefered result to do the mmap operation */ } else { +#ifdef __HM_KERNEL__ + map = DL_NOMMU_SUPPORT + ? mmap((void *)addr_min, map_len, PROT_READ|PROT_WRITE|PROT_EXEC, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) + : mmap((void *)addr_min, map_len, PROT_NONE, + MAP_PRIVATE, fd, off_start); +#else /* use tmp_map_len to mmap enough space for the dso with anonymous mapping */ unsigned char *temp_map = mmap((void *)NULL, tmp_map_len, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (temp_map == MAP_FAILED) { @@ -1863,6 +2068,7 @@ UT_STATIC void *map_library(int fd, struct dso *dso, struct reserved_address_par LD_LOGE("munmap unused part 2 failed, errno:%{public}d", errno); } } +#endif } dso->map = map; dso->map_len = map_len; @@ -1901,6 +2107,11 @@ UT_STATIC void *map_library(int fd, struct dso *dso, struct reserved_address_par prot |= ext_prot; } #endif + +#ifdef __HM_KERNEL__ + size_t this_file_max = ph->p_vaddr+ph->p_filesz+PAGE_SIZE-1 & -PAGE_SIZE; + if (mmap_fixed(base+this_min, this_file_max-this_min, prot, MAP_PRIVATE | MAP_FIXED, fd, off_start) == MAP_FAILED) goto error; +#else /* Reuse the existing mapping for the lowest-address LOAD */ if (mmap_fixed( base + this_min, @@ -1911,6 +2122,7 @@ UT_STATIC void *map_library(int fd, struct dso *dso, struct reserved_address_par LD_LOGE("Error mapping library: mmap fix failed errno=%{public}d", errno); goto error; } +#endif if ((ph->p_flags & PF_X) && (ph->p_align == KPMD_SIZE) && hugepage_enabled) madvise(base + this_min, this_max - this_min, MADV_HUGEPAGE); if (ph->p_memsz > ph->p_filesz && (ph->p_flags&PF_W)) { @@ -3236,6 +3448,12 @@ void __dls3(size_t *sp, size_t *auxv, size_t *aux) env_preload = getenv("LD_PRELOAD"); } +#ifdef __HM_KERNEL__ + /* Find start address of memory which is used to + * record dso symbol info. */ + set_dso_syminfo(auxv); +#endif + /* Activate error handler function */ error = error_impl; diff --git a/src/internal/libc.h b/src/internal/libc.h index 571782a1cac22ff1fa7863417ec2a47cbae559b3..a04cb81e5aadf7be891ed79258f500f3d96516bd 100644 --- a/src/internal/libc.h +++ b/src/internal/libc.h @@ -6,6 +6,7 @@ #include #include #include +#include "features.h" struct __locale_map; diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index 86d7514e7a030fafe7175e19e10a3653b94bb774..925c914b9e473221ab17c5dbb4f95e87f59455fd 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -205,7 +205,7 @@ extern hidden volatile int __eintr_valid_flag; hidden int __clone(int (*)(void *), void *, int, void *, ...); hidden int __set_thread_area(void *); hidden int __libc_sigaction(int, const struct sigaction *, struct sigaction *); -hidden void __unmapself(void *, size_t); +void __unmapself(void *, size_t); hidden int __timedwait(volatile int *, int, clockid_t, const struct timespec *, int); hidden int __timedwait_cp(volatile int *, int, clockid_t, const struct timespec *, int);