aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.clang-format15
-rw-r--r--Android.mk3
-rw-r--r--CleanSpec.mk5
-rw-r--r--README.md48
-rw-r--r--benchmarks/Android.mk43
-rw-r--r--benchmarks/Benchmark.cpp159
-rw-r--r--benchmarks/benchmark/Benchmark.h169
-rw-r--r--benchmarks/main.cpp61
-rw-r--r--benchmarks/math_benchmark.cpp203
-rw-r--r--benchmarks/property_benchmark.cpp86
-rw-r--r--benchmarks/pthread_benchmark.cpp168
-rw-r--r--benchmarks/semaphore_benchmark.cpp164
-rw-r--r--benchmarks/stdio_benchmark.cpp60
-rw-r--r--benchmarks/string_benchmark.cpp62
-rw-r--r--benchmarks/time_benchmark.cpp53
-rw-r--r--benchmarks/unistd_benchmark.cpp44
-rw-r--r--benchmarks/utils.cpp81
-rw-r--r--libc/Android.bp2075
-rw-r--r--libc/Android.mk407
-rw-r--r--libc/NOTICE369
-rw-r--r--libc/SYSCALLS.TXT25
-rw-r--r--libc/arch-arm/arm.mk40
-rw-r--r--libc/arch-arm/bionic/__aeabi.c106
-rw-r--r--libc/arch-arm/bionic/__restore.S12
-rw-r--r--libc/arch-arm/bionic/exidx_dynamic.c10
-rw-r--r--libc/arch-arm/bionic/popcount_tab.c42
-rw-r--r--libc/arch-arm/bionic/setjmp.S188
-rw-r--r--libc/arch-arm/bionic/vfork.S46
-rw-r--r--libc/arch-arm/cortex-a15/bionic/__strcat_chk.S192
-rw-r--r--libc/arch-arm/cortex-a15/bionic/__strcat_chk_common.S212
-rw-r--r--libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S156
-rw-r--r--libc/arch-arm/cortex-a15/bionic/__strcpy_chk_common.S173
-rw-r--r--libc/arch-arm/cortex-a15/bionic/memcpy.S79
-rw-r--r--libc/arch-arm/cortex-a15/bionic/memcpy_base.S42
-rw-r--r--libc/arch-arm/cortex-a15/bionic/memcpy_common.S103
-rw-r--r--libc/arch-arm/cortex-a15/bionic/strcat.S311
-rw-r--r--libc/arch-arm/cortex-a15/bionic/string_copy.S21
-rw-r--r--libc/arch-arm/cortex-a15/bionic/strlen.S60
-rw-r--r--libc/arch-arm/cortex-a15/cortex-a15.mk17
-rw-r--r--libc/arch-arm/cortex-a53.a57/cortex-a53.a57.mk32
-rw-r--r--libc/arch-arm/cortex-a53/bionic/__strcat_chk.S (renamed from libc/bionic/malloc_debug_backtrace.h)13
-rw-r--r--libc/arch-arm/cortex-a53/bionic/__strcpy_chk.S (renamed from libc/private/bionic_time.h)17
-rw-r--r--libc/arch-arm/cortex-a53/bionic/memcpy.S (renamed from libc/include/sys/shm.h)10
-rw-r--r--libc/arch-arm/cortex-a53/bionic/memcpy_base.S143
-rw-r--r--libc/arch-arm/cortex-a53/cortex-a53.mk32
-rw-r--r--libc/arch-arm/cortex-a7/bionic/memset.S180
-rw-r--r--libc/arch-arm/cortex-a7/cortex-a7.mk30
-rw-r--r--libc/arch-arm/cortex-a9/bionic/memcpy_base.S5
-rw-r--r--libc/arch-arm/cortex-a9/bionic/memset.S33
-rw-r--r--libc/arch-arm/cortex-a9/bionic/strcat.S261
-rw-r--r--libc/arch-arm/cortex-a9/bionic/string_copy.S21
-rw-r--r--libc/arch-arm/cortex-a9/cortex-a9.mk18
-rw-r--r--libc/arch-arm/denver/denver.mk15
-rw-r--r--libc/arch-arm/generic/bionic/memcmp.S3
-rw-r--r--libc/arch-arm/generic/bionic/memcpy.S6
-rw-r--r--libc/arch-arm/generic/bionic/memset.S6
-rw-r--r--libc/arch-arm/generic/generic.mk14
-rw-r--r--libc/arch-arm/krait/bionic/__strcat_chk.S19
-rw-r--r--libc/arch-arm/krait/bionic/__strcpy_chk.S15
-rw-r--r--libc/arch-arm/krait/bionic/memcpy.S17
-rw-r--r--libc/arch-arm/krait/bionic/memcpy_base.S314
-rw-r--r--libc/arch-arm/krait/bionic/memset.S20
-rw-r--r--libc/arch-arm/krait/krait.mk18
-rw-r--r--libc/arch-arm/syscalls/___clock_nanosleep.S2
-rw-r--r--libc/arch-arm/syscalls/___close.S2
-rw-r--r--libc/arch-arm/syscalls/___faccessat.S2
-rw-r--r--libc/arch-arm/syscalls/___fchmod.S2
-rw-r--r--libc/arch-arm/syscalls/___fchmodat.S2
-rw-r--r--libc/arch-arm/syscalls/___fgetxattr.S2
-rw-r--r--libc/arch-arm/syscalls/___flistxattr.S (renamed from libc/arch-arm/syscalls/flistxattr.S)7
-rw-r--r--libc/arch-arm/syscalls/___mremap.S23
-rw-r--r--libc/arch-arm/syscalls/___rt_sigqueueinfo.S2
-rw-r--r--libc/arch-arm/syscalls/__accept4.S2
-rw-r--r--libc/arch-arm/syscalls/__brk.S2
-rw-r--r--libc/arch-arm/syscalls/__connect.S2
-rw-r--r--libc/arch-arm/syscalls/__exit.S2
-rw-r--r--libc/arch-arm/syscalls/__fcntl64.S2
-rw-r--r--libc/arch-arm/syscalls/__fstatfs64.S2
-rw-r--r--libc/arch-arm/syscalls/__getcpu.S2
-rw-r--r--libc/arch-arm/syscalls/__getcwd.S2
-rw-r--r--libc/arch-arm/syscalls/__getdents64.S2
-rw-r--r--libc/arch-arm/syscalls/__getpid.S2
-rw-r--r--libc/arch-arm/syscalls/__getpriority.S2
-rw-r--r--libc/arch-arm/syscalls/__ioctl.S2
-rw-r--r--libc/arch-arm/syscalls/__openat.S2
-rw-r--r--libc/arch-arm/syscalls/__preadv64.S22
-rw-r--r--libc/arch-arm/syscalls/__ptrace.S2
-rw-r--r--libc/arch-arm/syscalls/__pwritev64.S22
-rw-r--r--libc/arch-arm/syscalls/__reboot.S2
-rw-r--r--libc/arch-arm/syscalls/__rt_sigaction.S2
-rw-r--r--libc/arch-arm/syscalls/__rt_sigpending.S2
-rw-r--r--libc/arch-arm/syscalls/__rt_sigprocmask.S2
-rw-r--r--libc/arch-arm/syscalls/__rt_sigsuspend.S2
-rw-r--r--libc/arch-arm/syscalls/__rt_sigtimedwait.S2
-rw-r--r--libc/arch-arm/syscalls/__sched_getaffinity.S2
-rw-r--r--libc/arch-arm/syscalls/__set_tid_address.S2
-rw-r--r--libc/arch-arm/syscalls/__set_tls.S2
-rw-r--r--libc/arch-arm/syscalls/__sigaction.S2
-rw-r--r--libc/arch-arm/syscalls/__signalfd4.S2
-rw-r--r--libc/arch-arm/syscalls/__socket.S2
-rw-r--r--libc/arch-arm/syscalls/__statfs64.S2
-rw-r--r--libc/arch-arm/syscalls/__timer_create.S2
-rw-r--r--libc/arch-arm/syscalls/__timer_delete.S2
-rw-r--r--libc/arch-arm/syscalls/__timer_getoverrun.S2
-rw-r--r--libc/arch-arm/syscalls/__timer_gettime.S2
-rw-r--r--libc/arch-arm/syscalls/__timer_settime.S2
-rw-r--r--libc/arch-arm/syscalls/_exit.S2
-rw-r--r--libc/arch-arm/syscalls/acct.S2
-rw-r--r--libc/arch-arm/syscalls/adjtimex.S (renamed from libc/arch-arm/syscalls/mremap.S)8
-rw-r--r--libc/arch-arm/syscalls/bind.S2
-rw-r--r--libc/arch-arm/syscalls/cacheflush.S2
-rw-r--r--libc/arch-arm/syscalls/capget.S2
-rw-r--r--libc/arch-arm/syscalls/capset.S2
-rw-r--r--libc/arch-arm/syscalls/chdir.S2
-rw-r--r--libc/arch-arm/syscalls/chroot.S2
-rw-r--r--libc/arch-arm/syscalls/clock_adjtime.S (renamed from libc/arch-arm/syscalls/vfork.S)8
-rw-r--r--libc/arch-arm/syscalls/clock_getres.S2
-rw-r--r--libc/arch-arm/syscalls/clock_gettime.S2
-rw-r--r--libc/arch-arm/syscalls/clock_settime.S2
-rw-r--r--libc/arch-arm/syscalls/delete_module.S2
-rw-r--r--libc/arch-arm/syscalls/dup.S2
-rw-r--r--libc/arch-arm/syscalls/dup3.S2
-rw-r--r--libc/arch-arm/syscalls/epoll_create1.S2
-rw-r--r--libc/arch-arm/syscalls/epoll_ctl.S2
-rw-r--r--libc/arch-arm/syscalls/eventfd.S2
-rw-r--r--libc/arch-arm/syscalls/execve.S2
-rw-r--r--libc/arch-arm/syscalls/fchdir.S2
-rw-r--r--libc/arch-arm/syscalls/fchown.S2
-rw-r--r--libc/arch-arm/syscalls/fdatasync.S2
-rw-r--r--libc/arch-arm/syscalls/flock.S2
-rw-r--r--libc/arch-arm/syscalls/fremovexattr.S2
-rw-r--r--libc/arch-arm/syscalls/fstat64.S2
-rw-r--r--libc/arch-arm/syscalls/fstatat64.S2
-rw-r--r--libc/arch-arm/syscalls/fsync.S2
-rw-r--r--libc/arch-arm/syscalls/ftruncate64.S2
-rw-r--r--libc/arch-arm/syscalls/getegid.S2
-rw-r--r--libc/arch-arm/syscalls/geteuid.S2
-rw-r--r--libc/arch-arm/syscalls/getgid.S2
-rw-r--r--libc/arch-arm/syscalls/getgroups.S2
-rw-r--r--libc/arch-arm/syscalls/getitimer.S2
-rw-r--r--libc/arch-arm/syscalls/getpeername.S2
-rw-r--r--libc/arch-arm/syscalls/getpgid.S2
-rw-r--r--libc/arch-arm/syscalls/getppid.S2
-rw-r--r--libc/arch-arm/syscalls/getresgid.S2
-rw-r--r--libc/arch-arm/syscalls/getresuid.S2
-rw-r--r--libc/arch-arm/syscalls/getrlimit.S2
-rw-r--r--libc/arch-arm/syscalls/getrusage.S2
-rw-r--r--libc/arch-arm/syscalls/getsid.S2
-rw-r--r--libc/arch-arm/syscalls/getsockname.S2
-rw-r--r--libc/arch-arm/syscalls/gettimeofday.S2
-rw-r--r--libc/arch-arm/syscalls/getuid.S2
-rw-r--r--libc/arch-arm/syscalls/getxattr.S2
-rw-r--r--libc/arch-arm/syscalls/init_module.S2
-rw-r--r--libc/arch-arm/syscalls/inotify_add_watch.S2
-rw-r--r--libc/arch-arm/syscalls/inotify_init1.S2
-rw-r--r--libc/arch-arm/syscalls/inotify_rm_watch.S2
-rw-r--r--libc/arch-arm/syscalls/kill.S2
-rw-r--r--libc/arch-arm/syscalls/klogctl.S2
-rw-r--r--libc/arch-arm/syscalls/lgetxattr.S2
-rw-r--r--libc/arch-arm/syscalls/listen.S2
-rw-r--r--libc/arch-arm/syscalls/listxattr.S2
-rw-r--r--libc/arch-arm/syscalls/llistxattr.S2
-rw-r--r--libc/arch-arm/syscalls/lremovexattr.S2
-rw-r--r--libc/arch-arm/syscalls/lseek.S2
-rw-r--r--libc/arch-arm/syscalls/madvise.S2
-rw-r--r--libc/arch-arm/syscalls/mincore.S2
-rw-r--r--libc/arch-arm/syscalls/mkdirat.S2
-rw-r--r--libc/arch-arm/syscalls/mknodat.S2
-rw-r--r--libc/arch-arm/syscalls/mlock.S2
-rw-r--r--libc/arch-arm/syscalls/mlockall.S2
-rw-r--r--libc/arch-arm/syscalls/mprotect.S2
-rw-r--r--libc/arch-arm/syscalls/msync.S2
-rw-r--r--libc/arch-arm/syscalls/munlock.S2
-rw-r--r--libc/arch-arm/syscalls/munlockall.S2
-rw-r--r--libc/arch-arm/syscalls/munmap.S2
-rw-r--r--libc/arch-arm/syscalls/nanosleep.S2
-rw-r--r--libc/arch-arm/syscalls/personality.S2
-rw-r--r--libc/arch-arm/syscalls/pipe2.S2
-rw-r--r--libc/arch-arm/syscalls/prlimit64.S2
-rw-r--r--libc/arch-arm/syscalls/read.S2
-rw-r--r--libc/arch-arm/syscalls/readlinkat.S2
-rw-r--r--libc/arch-arm/syscalls/readv.S2
-rw-r--r--libc/arch-arm/syscalls/recvmsg.S2
-rw-r--r--libc/arch-arm/syscalls/removexattr.S2
-rw-r--r--libc/arch-arm/syscalls/renameat.S2
-rw-r--r--libc/arch-arm/syscalls/sched_get_priority_max.S2
-rw-r--r--libc/arch-arm/syscalls/sched_get_priority_min.S2
-rw-r--r--libc/arch-arm/syscalls/sched_getparam.S2
-rw-r--r--libc/arch-arm/syscalls/sched_getscheduler.S2
-rw-r--r--libc/arch-arm/syscalls/sched_rr_get_interval.S2
-rw-r--r--libc/arch-arm/syscalls/sched_setaffinity.S2
-rw-r--r--libc/arch-arm/syscalls/sched_setparam.S2
-rw-r--r--libc/arch-arm/syscalls/sched_setscheduler.S2
-rw-r--r--libc/arch-arm/syscalls/sched_yield.S2
-rw-r--r--libc/arch-arm/syscalls/sendfile.S2
-rw-r--r--libc/arch-arm/syscalls/sendfile64.S2
-rw-r--r--libc/arch-arm/syscalls/sendmmsg.S2
-rw-r--r--libc/arch-arm/syscalls/sendmsg.S2
-rw-r--r--libc/arch-arm/syscalls/setfsgid.S2
-rw-r--r--libc/arch-arm/syscalls/setfsuid.S2
-rw-r--r--libc/arch-arm/syscalls/setgid.S2
-rw-r--r--libc/arch-arm/syscalls/setgroups.S2
-rw-r--r--libc/arch-arm/syscalls/sethostname.S2
-rw-r--r--libc/arch-arm/syscalls/setitimer.S2
-rw-r--r--libc/arch-arm/syscalls/setns.S2
-rw-r--r--libc/arch-arm/syscalls/setpgid.S2
-rw-r--r--libc/arch-arm/syscalls/setpriority.S2
-rw-r--r--libc/arch-arm/syscalls/setregid.S2
-rw-r--r--libc/arch-arm/syscalls/setresgid.S2
-rw-r--r--libc/arch-arm/syscalls/setresuid.S2
-rw-r--r--libc/arch-arm/syscalls/setreuid.S2
-rw-r--r--libc/arch-arm/syscalls/setrlimit.S2
-rw-r--r--libc/arch-arm/syscalls/setsid.S2
-rw-r--r--libc/arch-arm/syscalls/settimeofday.S2
-rw-r--r--libc/arch-arm/syscalls/setuid.S2
-rw-r--r--libc/arch-arm/syscalls/shutdown.S2
-rw-r--r--libc/arch-arm/syscalls/sigaltstack.S2
-rw-r--r--libc/arch-arm/syscalls/socketpair.S2
-rw-r--r--libc/arch-arm/syscalls/swapoff.S2
-rw-r--r--libc/arch-arm/syscalls/swapon.S2
-rw-r--r--libc/arch-arm/syscalls/symlinkat.S2
-rw-r--r--libc/arch-arm/syscalls/sync.S2
-rw-r--r--libc/arch-arm/syscalls/sysinfo.S2
-rw-r--r--libc/arch-arm/syscalls/tee.S2
-rw-r--r--libc/arch-arm/syscalls/tgkill.S2
-rw-r--r--libc/arch-arm/syscalls/timerfd_create.S2
-rw-r--r--libc/arch-arm/syscalls/timerfd_gettime.S2
-rw-r--r--libc/arch-arm/syscalls/timerfd_settime.S2
-rw-r--r--libc/arch-arm/syscalls/times.S2
-rw-r--r--libc/arch-arm/syscalls/truncate.S2
-rw-r--r--libc/arch-arm/syscalls/truncate64.S2
-rw-r--r--libc/arch-arm/syscalls/umask.S2
-rw-r--r--libc/arch-arm/syscalls/umount2.S2
-rw-r--r--libc/arch-arm/syscalls/uname.S2
-rw-r--r--libc/arch-arm/syscalls/unlinkat.S2
-rw-r--r--libc/arch-arm/syscalls/unshare.S2
-rw-r--r--libc/arch-arm/syscalls/utimensat.S2
-rw-r--r--libc/arch-arm/syscalls/vmsplice.S2
-rw-r--r--libc/arch-arm/syscalls/wait4.S2
-rw-r--r--libc/arch-arm/syscalls/write.S2
-rw-r--r--libc/arch-arm/syscalls/writev.S2
-rw-r--r--libc/arch-arm64/arm64.mk51
-rw-r--r--libc/arch-arm64/bionic/setjmp.S141
-rw-r--r--libc/arch-arm64/bionic/vfork.S5
-rw-r--r--libc/arch-arm64/cortex-a53/cortex-a53.mk1
-rw-r--r--libc/arch-arm64/denver64/denver64.mk15
-rw-r--r--libc/arch-arm64/generic/bionic/memmove.S16
-rw-r--r--libc/arch-arm64/generic/generic.mk14
-rw-r--r--libc/arch-arm64/syscalls/___flistxattr.S (renamed from libc/arch-arm64/syscalls/flistxattr.S)5
-rw-r--r--libc/arch-arm64/syscalls/___mremap.S (renamed from libc/arch-arm64/syscalls/mremap.S)5
-rw-r--r--libc/arch-arm64/syscalls/adjtimex.S14
-rw-r--r--libc/arch-arm64/syscalls/clock_adjtime.S14
-rw-r--r--libc/arch-arm64/syscalls/preadv.S16
-rw-r--r--libc/arch-arm64/syscalls/pwritev.S16
-rw-r--r--libc/arch-mips/bionic/setjmp.S137
-rw-r--r--libc/arch-mips/bionic/vfork.S8
-rw-r--r--libc/arch-mips/mips.mk35
-rw-r--r--libc/arch-mips/syscalls/___flistxattr.S (renamed from libc/arch-mips/syscalls/flistxattr.S)5
-rw-r--r--libc/arch-mips/syscalls/___mremap.S (renamed from libc/arch-mips/syscalls/mremap.S)5
-rw-r--r--libc/arch-mips/syscalls/__preadv64.S19
-rw-r--r--libc/arch-mips/syscalls/__pwritev64.S19
-rw-r--r--libc/arch-mips/syscalls/adjtimex.S19
-rw-r--r--libc/arch-mips/syscalls/clock_adjtime.S19
-rw-r--r--libc/arch-mips64/bionic/vfork.S6
-rw-r--r--libc/arch-mips64/mips64.mk35
-rw-r--r--libc/arch-mips64/syscalls/___flistxattr.S (renamed from libc/arch-mips64/syscalls/flistxattr.S)5
-rw-r--r--libc/arch-mips64/syscalls/___mremap.S (renamed from libc/arch-mips64/syscalls/mremap.S)5
-rw-r--r--libc/arch-mips64/syscalls/adjtimex.S25
-rw-r--r--libc/arch-mips64/syscalls/clock_adjtime.S25
-rw-r--r--libc/arch-mips64/syscalls/preadv.S27
-rw-r--r--libc/arch-mips64/syscalls/pwritev.S27
-rw-r--r--libc/arch-x86/atom/atom.mk35
-rw-r--r--libc/arch-x86/atom/string/sse2-strrchr-atom.S60
-rw-r--r--libc/arch-x86/atom/string/sse2-wcsrchr-atom.S8
-rw-r--r--libc/arch-x86/atom/string/ssse3-strcmp-atom.S7
-rw-r--r--libc/arch-x86/atom/string/ssse3-strcpy-atom.S2
-rw-r--r--libc/arch-x86/bionic/setjmp.S113
-rw-r--r--libc/arch-x86/bionic/syscall.S23
-rw-r--r--libc/arch-x86/bionic/vfork.S6
-rw-r--r--libc/arch-x86/generic/generic.mk52
-rw-r--r--libc/arch-x86/silvermont/silvermont.mk32
-rw-r--r--libc/arch-x86/silvermont/string/sse2-memmove-slm.S3
-rw-r--r--libc/arch-x86/syscalls/___clock_nanosleep.S18
-rw-r--r--libc/arch-x86/syscalls/___close.S12
-rw-r--r--libc/arch-x86/syscalls/___faccessat.S16
-rw-r--r--libc/arch-x86/syscalls/___fchmod.S14
-rw-r--r--libc/arch-x86/syscalls/___fchmodat.S16
-rw-r--r--libc/arch-x86/syscalls/___fgetxattr.S18
-rw-r--r--libc/arch-x86/syscalls/___flistxattr.S (renamed from libc/arch-x86/syscalls/mremap.S)20
-rw-r--r--libc/arch-x86/syscalls/___fsetxattr.S20
-rw-r--r--libc/arch-x86/syscalls/___mremap.S50
-rw-r--r--libc/arch-x86/syscalls/___rt_sigqueueinfo.S16
-rw-r--r--libc/arch-x86/syscalls/__accept4.S12
-rw-r--r--libc/arch-x86/syscalls/__brk.S12
-rw-r--r--libc/arch-x86/syscalls/__clock_gettime.S (renamed from libc/arch-x86/syscalls/clock_gettime.S)18
-rw-r--r--libc/arch-x86/syscalls/__connect.S12
-rw-r--r--libc/arch-x86/syscalls/__epoll_pwait.S22
-rw-r--r--libc/arch-x86/syscalls/__exit.S12
-rw-r--r--libc/arch-x86/syscalls/__fadvise64.S22
-rw-r--r--libc/arch-x86/syscalls/__fcntl64.S16
-rw-r--r--libc/arch-x86/syscalls/__fstatfs64.S16
-rw-r--r--libc/arch-x86/syscalls/__getcpu.S16
-rw-r--r--libc/arch-x86/syscalls/__getcwd.S14
-rw-r--r--libc/arch-x86/syscalls/__getdents64.S16
-rw-r--r--libc/arch-x86/syscalls/__getpid.S10
-rw-r--r--libc/arch-x86/syscalls/__getpriority.S14
-rw-r--r--libc/arch-x86/syscalls/__gettimeofday.S34
-rw-r--r--libc/arch-x86/syscalls/__ioctl.S16
-rw-r--r--libc/arch-x86/syscalls/__llseek.S20
-rw-r--r--libc/arch-x86/syscalls/__mmap2.S22
-rw-r--r--libc/arch-x86/syscalls/__openat.S18
-rw-r--r--libc/arch-x86/syscalls/__ppoll.S20
-rw-r--r--libc/arch-x86/syscalls/__preadv64.S49
-rw-r--r--libc/arch-x86/syscalls/__pselect6.S22
-rw-r--r--libc/arch-x86/syscalls/__ptrace.S18
-rw-r--r--libc/arch-x86/syscalls/__pwritev64.S49
-rw-r--r--libc/arch-x86/syscalls/__reboot.S18
-rw-r--r--libc/arch-x86/syscalls/__rt_sigaction.S18
-rw-r--r--libc/arch-x86/syscalls/__rt_sigpending.S14
-rw-r--r--libc/arch-x86/syscalls/__rt_sigprocmask.S18
-rw-r--r--libc/arch-x86/syscalls/__rt_sigsuspend.S14
-rw-r--r--libc/arch-x86/syscalls/__rt_sigtimedwait.S18
-rw-r--r--libc/arch-x86/syscalls/__sched_getaffinity.S16
-rw-r--r--libc/arch-x86/syscalls/__set_thread_area.S12
-rw-r--r--libc/arch-x86/syscalls/__set_tid_address.S12
-rw-r--r--libc/arch-x86/syscalls/__sigaction.S16
-rw-r--r--libc/arch-x86/syscalls/__signalfd4.S18
-rw-r--r--libc/arch-x86/syscalls/__socket.S12
-rw-r--r--libc/arch-x86/syscalls/__statfs64.S16
-rw-r--r--libc/arch-x86/syscalls/__timer_create.S16
-rw-r--r--libc/arch-x86/syscalls/__timer_delete.S12
-rw-r--r--libc/arch-x86/syscalls/__timer_getoverrun.S12
-rw-r--r--libc/arch-x86/syscalls/__timer_gettime.S14
-rw-r--r--libc/arch-x86/syscalls/__timer_settime.S18
-rw-r--r--libc/arch-x86/syscalls/__waitid.S20
-rw-r--r--libc/arch-x86/syscalls/_exit.S12
-rw-r--r--libc/arch-x86/syscalls/acct.S12
-rw-r--r--libc/arch-x86/syscalls/adjtimex.S (renamed from libc/arch-x86/syscalls/gettimeofday.S)19
-rw-r--r--libc/arch-x86/syscalls/bind.S12
-rw-r--r--libc/arch-x86/syscalls/capget.S14
-rw-r--r--libc/arch-x86/syscalls/capset.S14
-rw-r--r--libc/arch-x86/syscalls/chdir.S12
-rw-r--r--libc/arch-x86/syscalls/chroot.S12
-rw-r--r--libc/arch-x86/syscalls/clock_adjtime.S (renamed from libc/arch-x86/syscalls/flistxattr.S)19
-rw-r--r--libc/arch-x86/syscalls/clock_getres.S14
-rw-r--r--libc/arch-x86/syscalls/clock_settime.S14
-rw-r--r--libc/arch-x86/syscalls/delete_module.S14
-rw-r--r--libc/arch-x86/syscalls/dup.S12
-rw-r--r--libc/arch-x86/syscalls/dup3.S16
-rw-r--r--libc/arch-x86/syscalls/epoll_create1.S12
-rw-r--r--libc/arch-x86/syscalls/epoll_ctl.S18
-rw-r--r--libc/arch-x86/syscalls/eventfd.S14
-rw-r--r--libc/arch-x86/syscalls/execve.S16
-rw-r--r--libc/arch-x86/syscalls/fallocate64.S22
-rw-r--r--libc/arch-x86/syscalls/fchdir.S12
-rw-r--r--libc/arch-x86/syscalls/fchown.S16
-rw-r--r--libc/arch-x86/syscalls/fchownat.S20
-rw-r--r--libc/arch-x86/syscalls/fdatasync.S12
-rw-r--r--libc/arch-x86/syscalls/flock.S14
-rw-r--r--libc/arch-x86/syscalls/fremovexattr.S14
-rw-r--r--libc/arch-x86/syscalls/fstat64.S14
-rw-r--r--libc/arch-x86/syscalls/fstatat64.S18
-rw-r--r--libc/arch-x86/syscalls/fsync.S12
-rw-r--r--libc/arch-x86/syscalls/ftruncate64.S16
-rw-r--r--libc/arch-x86/syscalls/getegid.S10
-rw-r--r--libc/arch-x86/syscalls/geteuid.S10
-rw-r--r--libc/arch-x86/syscalls/getgid.S10
-rw-r--r--libc/arch-x86/syscalls/getgroups.S14
-rw-r--r--libc/arch-x86/syscalls/getitimer.S14
-rw-r--r--libc/arch-x86/syscalls/getpeername.S12
-rw-r--r--libc/arch-x86/syscalls/getpgid.S12
-rw-r--r--libc/arch-x86/syscalls/getppid.S10
-rw-r--r--libc/arch-x86/syscalls/getresgid.S16
-rw-r--r--libc/arch-x86/syscalls/getresuid.S16
-rw-r--r--libc/arch-x86/syscalls/getrlimit.S14
-rw-r--r--libc/arch-x86/syscalls/getrusage.S14
-rw-r--r--libc/arch-x86/syscalls/getsid.S12
-rw-r--r--libc/arch-x86/syscalls/getsockname.S12
-rw-r--r--libc/arch-x86/syscalls/getsockopt.S12
-rw-r--r--libc/arch-x86/syscalls/getuid.S10
-rw-r--r--libc/arch-x86/syscalls/getxattr.S18
-rw-r--r--libc/arch-x86/syscalls/init_module.S16
-rw-r--r--libc/arch-x86/syscalls/inotify_add_watch.S16
-rw-r--r--libc/arch-x86/syscalls/inotify_init1.S12
-rw-r--r--libc/arch-x86/syscalls/inotify_rm_watch.S14
-rw-r--r--libc/arch-x86/syscalls/kill.S14
-rw-r--r--libc/arch-x86/syscalls/klogctl.S16
-rw-r--r--libc/arch-x86/syscalls/lgetxattr.S18
-rw-r--r--libc/arch-x86/syscalls/linkat.S20
-rw-r--r--libc/arch-x86/syscalls/listen.S12
-rw-r--r--libc/arch-x86/syscalls/listxattr.S16
-rw-r--r--libc/arch-x86/syscalls/llistxattr.S16
-rw-r--r--libc/arch-x86/syscalls/lremovexattr.S14
-rw-r--r--libc/arch-x86/syscalls/lseek.S16
-rw-r--r--libc/arch-x86/syscalls/lsetxattr.S20
-rw-r--r--libc/arch-x86/syscalls/madvise.S16
-rw-r--r--libc/arch-x86/syscalls/mincore.S16
-rw-r--r--libc/arch-x86/syscalls/mkdirat.S16
-rw-r--r--libc/arch-x86/syscalls/mknodat.S18
-rw-r--r--libc/arch-x86/syscalls/mlock.S14
-rw-r--r--libc/arch-x86/syscalls/mlockall.S12
-rw-r--r--libc/arch-x86/syscalls/mount.S20
-rw-r--r--libc/arch-x86/syscalls/mprotect.S16
-rw-r--r--libc/arch-x86/syscalls/msync.S16
-rw-r--r--libc/arch-x86/syscalls/munlock.S14
-rw-r--r--libc/arch-x86/syscalls/munlockall.S10
-rw-r--r--libc/arch-x86/syscalls/munmap.S14
-rw-r--r--libc/arch-x86/syscalls/nanosleep.S14
-rw-r--r--libc/arch-x86/syscalls/personality.S12
-rw-r--r--libc/arch-x86/syscalls/pipe2.S14
-rw-r--r--libc/arch-x86/syscalls/prctl.S20
-rw-r--r--libc/arch-x86/syscalls/pread64.S20
-rw-r--r--libc/arch-x86/syscalls/prlimit64.S18
-rw-r--r--libc/arch-x86/syscalls/process_vm_readv.S22
-rw-r--r--libc/arch-x86/syscalls/process_vm_writev.S22
-rw-r--r--libc/arch-x86/syscalls/pwrite64.S20
-rw-r--r--libc/arch-x86/syscalls/read.S16
-rw-r--r--libc/arch-x86/syscalls/readahead.S18
-rw-r--r--libc/arch-x86/syscalls/readlinkat.S18
-rw-r--r--libc/arch-x86/syscalls/readv.S16
-rw-r--r--libc/arch-x86/syscalls/recvfrom.S12
-rw-r--r--libc/arch-x86/syscalls/recvmmsg.S12
-rw-r--r--libc/arch-x86/syscalls/recvmsg.S12
-rw-r--r--libc/arch-x86/syscalls/removexattr.S14
-rw-r--r--libc/arch-x86/syscalls/renameat.S18
-rw-r--r--libc/arch-x86/syscalls/sched_get_priority_max.S12
-rw-r--r--libc/arch-x86/syscalls/sched_get_priority_min.S12
-rw-r--r--libc/arch-x86/syscalls/sched_getparam.S14
-rw-r--r--libc/arch-x86/syscalls/sched_getscheduler.S12
-rw-r--r--libc/arch-x86/syscalls/sched_rr_get_interval.S14
-rw-r--r--libc/arch-x86/syscalls/sched_setaffinity.S16
-rw-r--r--libc/arch-x86/syscalls/sched_setparam.S14
-rw-r--r--libc/arch-x86/syscalls/sched_setscheduler.S16
-rw-r--r--libc/arch-x86/syscalls/sched_yield.S12
-rw-r--r--libc/arch-x86/syscalls/sendfile.S18
-rw-r--r--libc/arch-x86/syscalls/sendfile64.S18
-rw-r--r--libc/arch-x86/syscalls/sendmmsg.S12
-rw-r--r--libc/arch-x86/syscalls/sendmsg.S12
-rw-r--r--libc/arch-x86/syscalls/sendto.S12
-rw-r--r--libc/arch-x86/syscalls/setfsgid.S12
-rw-r--r--libc/arch-x86/syscalls/setfsuid.S12
-rw-r--r--libc/arch-x86/syscalls/setgid.S12
-rw-r--r--libc/arch-x86/syscalls/setgroups.S14
-rw-r--r--libc/arch-x86/syscalls/sethostname.S14
-rw-r--r--libc/arch-x86/syscalls/setitimer.S16
-rw-r--r--libc/arch-x86/syscalls/setns.S14
-rw-r--r--libc/arch-x86/syscalls/setpgid.S14
-rw-r--r--libc/arch-x86/syscalls/setpriority.S16
-rw-r--r--libc/arch-x86/syscalls/setregid.S14
-rw-r--r--libc/arch-x86/syscalls/setresgid.S16
-rw-r--r--libc/arch-x86/syscalls/setresuid.S16
-rw-r--r--libc/arch-x86/syscalls/setreuid.S14
-rw-r--r--libc/arch-x86/syscalls/setrlimit.S14
-rw-r--r--libc/arch-x86/syscalls/setsid.S10
-rw-r--r--libc/arch-x86/syscalls/setsockopt.S12
-rw-r--r--libc/arch-x86/syscalls/settimeofday.S14
-rw-r--r--libc/arch-x86/syscalls/setuid.S12
-rw-r--r--libc/arch-x86/syscalls/setxattr.S20
-rw-r--r--libc/arch-x86/syscalls/shutdown.S12
-rw-r--r--libc/arch-x86/syscalls/sigaltstack.S14
-rw-r--r--libc/arch-x86/syscalls/socketpair.S12
-rw-r--r--libc/arch-x86/syscalls/splice.S22
-rw-r--r--libc/arch-x86/syscalls/swapoff.S12
-rw-r--r--libc/arch-x86/syscalls/swapon.S14
-rw-r--r--libc/arch-x86/syscalls/symlinkat.S16
-rw-r--r--libc/arch-x86/syscalls/sync.S12
-rw-r--r--libc/arch-x86/syscalls/sysinfo.S12
-rw-r--r--libc/arch-x86/syscalls/tee.S18
-rw-r--r--libc/arch-x86/syscalls/tgkill.S16
-rw-r--r--libc/arch-x86/syscalls/timerfd_create.S14
-rw-r--r--libc/arch-x86/syscalls/timerfd_gettime.S14
-rw-r--r--libc/arch-x86/syscalls/timerfd_settime.S18
-rw-r--r--libc/arch-x86/syscalls/times.S12
-rw-r--r--libc/arch-x86/syscalls/truncate.S14
-rw-r--r--libc/arch-x86/syscalls/truncate64.S16
-rw-r--r--libc/arch-x86/syscalls/umask.S12
-rw-r--r--libc/arch-x86/syscalls/umount2.S14
-rw-r--r--libc/arch-x86/syscalls/uname.S12
-rw-r--r--libc/arch-x86/syscalls/unlinkat.S16
-rw-r--r--libc/arch-x86/syscalls/unshare.S12
-rw-r--r--libc/arch-x86/syscalls/utimensat.S18
-rw-r--r--libc/arch-x86/syscalls/vmsplice.S18
-rw-r--r--libc/arch-x86/syscalls/wait4.S18
-rw-r--r--libc/arch-x86/syscalls/write.S16
-rw-r--r--libc/arch-x86/syscalls/writev.S16
-rw-r--r--libc/arch-x86/x86.mk107
-rw-r--r--libc/arch-x86_64/bionic/setjmp.S90
-rw-r--r--libc/arch-x86_64/bionic/vfork.S6
-rw-r--r--libc/arch-x86_64/string/sse2-memmove-slm.S3
-rw-r--r--libc/arch-x86_64/syscalls/___flistxattr.S (renamed from libc/arch-x86_64/syscalls/flistxattr.S)5
-rw-r--r--libc/arch-x86_64/syscalls/___mremap.S (renamed from libc/arch-x86_64/syscalls/mremap.S)5
-rw-r--r--libc/arch-x86_64/syscalls/adjtimex.S15
-rw-r--r--libc/arch-x86_64/syscalls/clock_adjtime.S15
-rw-r--r--libc/arch-x86_64/syscalls/preadv.S18
-rw-r--r--libc/arch-x86_64/syscalls/pwritev.S18
-rw-r--r--libc/arch-x86_64/x86_64.mk36
-rw-r--r--libc/bionic/__cxa_guard.cpp2
-rw-r--r--libc/bionic/__cxa_thread_atexit_impl.cpp20
-rw-r--r--libc/bionic/__fread_chk.cpp47
-rw-r--r--libc/bionic/__fwrite_chk.cpp47
-rw-r--r--libc/bionic/__getcwd_chk.cpp40
-rw-r--r--libc/bionic/__libc_init_main_thread.cpp92
-rw-r--r--libc/bionic/__pwrite64_chk.cpp44
-rw-r--r--libc/bionic/__pwrite_chk.cpp (renamed from libc/bionic/debug_mapinfo.h)32
-rw-r--r--libc/bionic/__set_errno.cpp15
-rw-r--r--libc/bionic/__write_chk.cpp43
-rw-r--r--libc/bionic/arpa_inet.cpp72
-rw-r--r--libc/bionic/bionic_netlink.cpp93
-rw-r--r--libc/bionic/bionic_netlink.h59
-rw-r--r--libc/bionic/bionic_systrace.cpp30
-rw-r--r--libc/bionic/bionic_time_conversions.cpp20
-rw-r--r--libc/bionic/debug_mapinfo.cpp172
-rw-r--r--libc/bionic/debug_stacktrace.cpp161
-rw-r--r--libc/bionic/dlmalloc.c79
-rw-r--r--libc/bionic/dlmalloc.h58
-rw-r--r--libc/bionic/flistxattr.cpp (renamed from libc/bionic/if_indextoname.c)57
-rw-r--r--libc/bionic/flockfile.cpp18
-rw-r--r--libc/bionic/getcwd.cpp1
-rw-r--r--libc/bionic/ifaddrs.cpp260
-rw-r--r--libc/bionic/ioctl.cpp (renamed from libc/bionic/ioctl.c)21
-rw-r--r--libc/bionic/jemalloc.h4
-rw-r--r--libc/bionic/legacy_32_bit_support.cpp39
-rw-r--r--libc/bionic/libc_init_common.cpp159
-rw-r--r--libc/bionic/libc_init_common.h3
-rw-r--r--libc/bionic/libc_init_dynamic.cpp18
-rw-r--r--libc/bionic/libc_init_static.cpp38
-rw-r--r--libc/bionic/libc_logging.cpp101
-rw-r--r--libc/bionic/libgen.cpp18
-rw-r--r--libc/bionic/lockf.cpp73
-rw-r--r--libc/bionic/malloc_common.cpp464
-rw-r--r--libc/bionic/malloc_debug_check.cpp676
-rw-r--r--libc/bionic/malloc_debug_common.cpp527
-rw-r--r--libc/bionic/malloc_debug_common.h122
-rw-r--r--libc/bionic/malloc_debug_leak.cpp525
-rw-r--r--libc/bionic/malloc_debug_qemu.cpp1069
-rw-r--r--libc/bionic/mmap.cpp17
-rw-r--r--libc/bionic/mremap.cpp57
-rw-r--r--libc/bionic/ndk_cruft.cpp125
-rw-r--r--libc/bionic/net_if.cpp163
-rw-r--r--libc/bionic/netinet_in.cpp (renamed from libc/bionic/bindresvport.c)66
-rw-r--r--libc/bionic/pthread_atfork.cpp2
-rw-r--r--libc/bionic/pthread_attr.cpp53
-rw-r--r--libc/bionic/pthread_barrier.cpp183
-rw-r--r--libc/bionic/pthread_cond.cpp48
-rw-r--r--libc/bionic/pthread_create.cpp29
-rw-r--r--libc/bionic/pthread_internal.cpp6
-rw-r--r--libc/bionic/pthread_internal.h17
-rw-r--r--libc/bionic/pthread_mutex.cpp89
-rw-r--r--libc/bionic/pthread_once.cpp2
-rw-r--r--libc/bionic/pthread_rwlock.cpp60
-rw-r--r--libc/bionic/pthread_spinlock.cpp81
-rw-r--r--libc/bionic/pty.cpp11
-rw-r--r--libc/bionic/scandir.cpp41
-rw-r--r--libc/bionic/semaphore.cpp32
-rw-r--r--libc/bionic/setjmp_cookie.cpp69
-rw-r--r--libc/bionic/signal.cpp7
-rw-r--r--libc/bionic/strchrnul.cpp22
-rw-r--r--libc/bionic/stubs.cpp130
-rw-r--r--libc/bionic/sysconf.cpp25
-rw-r--r--libc/bionic/sysinfo.cpp33
-rw-r--r--libc/bionic/system_properties.cpp691
-rw-r--r--libc/bionic/tmpfile.cpp1
-rw-r--r--libc/bionic/vdso.cpp89
-rw-r--r--libc/crt.mk12
-rw-r--r--libc/dns/include/resolv_netid.h5
-rw-r--r--libc/dns/include/resolv_params.h46
-rw-r--r--libc/dns/include/resolv_private.h31
-rw-r--r--libc/dns/include/resolv_stats.h84
-rw-r--r--libc/dns/resolv/res_cache.c291
-rw-r--r--libc/dns/resolv/res_send.c143
-rw-r--r--libc/dns/resolv/res_state.c2
-rw-r--r--libc/dns/resolv/res_stats.c184
-rw-r--r--libc/include/android/dlext.h32
-rw-r--r--libc/include/bits/lockf.h50
-rw-r--r--libc/include/bits/posix_limits.h (renamed from libc/include/machine/posix_limits.h)6
-rw-r--r--libc/include/bits/pthread_types.h (renamed from libc/include/machine/pthread_types.h)6
-rw-r--r--libc/include/bits/timespec.h (renamed from libc/include/machine/timespec.h)6
-rw-r--r--libc/include/bits/wchar_limits.h (renamed from libc/include/machine/wchar_limits.h)6
-rw-r--r--libc/include/byteswap.h9
-rw-r--r--libc/include/dirent.h7
-rw-r--r--libc/include/dlfcn.h11
-rw-r--r--libc/include/fcntl.h4
-rw-r--r--libc/include/ifaddrs.h59
-rw-r--r--libc/include/libgen.h17
-rw-r--r--libc/include/limits.h13
-rw-r--r--libc/include/malloc.h5
-rw-r--r--libc/include/net/if.h14
-rw-r--r--libc/include/netinet/in.h6
-rw-r--r--libc/include/netinet/in6.h94
-rw-r--r--libc/include/netinet/udp.h36
-rw-r--r--libc/include/pthread.h41
-rw-r--r--libc/include/pwd.h3
-rw-r--r--libc/include/regex.h5
-rw-r--r--libc/include/sched.h2
-rw-r--r--libc/include/signal.h16
-rw-r--r--libc/include/stdint.h2
-rw-r--r--libc/include/stdio.h260
-rw-r--r--libc/include/stdlib.h20
-rw-r--r--libc/include/string.h12
-rw-r--r--libc/include/sys/_system_properties.h1
-rw-r--r--libc/include/sys/cdefs.h193
-rw-r--r--libc/include/sys/endian.h4
-rw-r--r--libc/include/sys/fcntl.h1
-rw-r--r--libc/include/sys/glibc-syscalls.h35
-rw-r--r--libc/include/sys/mman.h2
-rw-r--r--libc/include/sys/procfs.h4
-rw-r--r--libc/include/sys/resource.h3
-rw-r--r--libc/include/sys/socket.h20
-rw-r--r--libc/include/sys/stat.h4
-rw-r--r--libc/include/sys/syslog.h1
-rw-r--r--libc/include/sys/sysmacros.h28
-rw-r--r--libc/include/sys/time.h13
-rw-r--r--libc/include/sys/timex.h9
-rw-r--r--libc/include/sys/types.h21
-rw-r--r--libc/include/sys/ucontext.h6
-rw-r--r--libc/include/sys/uio.h12
-rw-r--r--libc/include/sys/unistd.h1
-rw-r--r--libc/include/sys/user.h18
-rw-r--r--libc/include/sys/vt.h27
-rw-r--r--libc/include/sys/wait.h1
-rw-r--r--libc/include/syscall.h1
-rw-r--r--libc/include/sysexits.h119
-rw-r--r--libc/include/uchar.h5
-rw-r--r--libc/include/unistd.h347
-rw-r--r--libc/include/utmp.h16
-rw-r--r--libc/include/wait.h1
-rw-r--r--libc/include/wchar.h2
-rw-r--r--libc/kernel/common/scsi/scsi.h261
-rw-r--r--libc/kernel/common/scsi/scsi_ioctl.h34
-rw-r--r--libc/kernel/common/scsi/sg.h179
-rwxr-xr-xlibc/kernel/tools/clean_header.py96
-rw-r--r--libc/kernel/tools/defaults.py8
-rwxr-xr-xlibc/kernel/tools/generate_uapi_headers.sh34
-rwxr-xr-xlibc/kernel/tools/update_all.py98
-rw-r--r--libc/kernel/tools/utils.py22
-rw-r--r--libc/kernel/uapi/asm-arm/asm/kvm.h16
-rw-r--r--libc/kernel/uapi/asm-arm/asm/unistd.h5
-rw-r--r--libc/kernel/uapi/asm-arm64/asm/hwcap.h2
-rw-r--r--libc/kernel/uapi/asm-arm64/asm/kvm.h63
-rw-r--r--libc/kernel/uapi/asm-arm64/asm/ptrace.h17
-rw-r--r--libc/kernel/uapi/asm-arm64/asm/signal.h4
-rw-r--r--libc/kernel/uapi/asm-arm64/asm/ucontext.h33
-rw-r--r--libc/kernel/uapi/asm-generic/mman-common.h13
-rw-r--r--libc/kernel/uapi/asm-generic/mman.h2
-rw-r--r--libc/kernel/uapi/asm-generic/siginfo.h59
-rw-r--r--libc/kernel/uapi/asm-generic/signal.h15
-rw-r--r--libc/kernel/uapi/asm-generic/socket.h5
-rw-r--r--libc/kernel/uapi/asm-generic/unistd.h7
-rw-r--r--libc/kernel/uapi/asm-mips/asm/break.h4
-rw-r--r--libc/kernel/uapi/asm-mips/asm/hwcap.h24
-rw-r--r--libc/kernel/uapi/asm-mips/asm/inst.h455
-rw-r--r--libc/kernel/uapi/asm-mips/asm/kvm.h127
-rw-r--r--libc/kernel/uapi/asm-mips/asm/mman.h11
-rw-r--r--libc/kernel/uapi/asm-mips/asm/sigcontext.h5
-rw-r--r--libc/kernel/uapi/asm-mips/asm/siginfo.h44
-rw-r--r--libc/kernel/uapi/asm-mips/asm/socket.h4
-rw-r--r--libc/kernel/uapi/asm-mips/asm/swab.h2
-rw-r--r--libc/kernel/uapi/asm-mips/asm/unistd.h27
-rw-r--r--libc/kernel/uapi/asm-x86/asm/bitsperlong.h2
-rw-r--r--libc/kernel/uapi/asm-x86/asm/bootparam.h65
-rw-r--r--libc/kernel/uapi/asm-x86/asm/e820.h13
-rw-r--r--libc/kernel/uapi/asm-x86/asm/hyperv.h59
-rw-r--r--libc/kernel/uapi/asm-x86/asm/kvm.h95
-rw-r--r--libc/kernel/uapi/asm-x86/asm/mce.h13
-rw-r--r--libc/kernel/uapi/asm-x86/asm/msr.h5
-rw-r--r--libc/kernel/uapi/asm-x86/asm/mtrr.h2
-rw-r--r--libc/kernel/uapi/asm-x86/asm/processor-flags.h45
-rw-r--r--libc/kernel/uapi/asm-x86/asm/ptrace-abi.h11
-rw-r--r--libc/kernel/uapi/asm-x86/asm/sigcontext.h250
-rw-r--r--libc/kernel/uapi/asm-x86/asm/sigcontext32.h77
-rw-r--r--libc/kernel/uapi/asm-x86/asm/svm.h2
-rw-r--r--libc/kernel/uapi/asm-x86/asm/unistd_32.h24
-rw-r--r--libc/kernel/uapi/asm-x86/asm/unistd_64.h5
-rw-r--r--libc/kernel/uapi/asm-x86/asm/unistd_x32.h21
-rw-r--r--libc/kernel/uapi/asm-x86/asm/vmx.h21
-rw-r--r--libc/kernel/uapi/drm/amdgpu_drm.h499
-rw-r--r--libc/kernel/uapi/drm/drm.h89
-rw-r--r--libc/kernel/uapi/drm/drm_fourcc.h49
-rw-r--r--libc/kernel/uapi/drm/drm_mode.h178
-rw-r--r--libc/kernel/uapi/drm/i810_drm.h98
-rw-r--r--libc/kernel/uapi/drm/i915_drm.h167
-rw-r--r--libc/kernel/uapi/drm/msm_drm.h74
-rw-r--r--libc/kernel/uapi/drm/nouveau_drm.h55
-rw-r--r--libc/kernel/uapi/drm/r128_drm.h105
-rw-r--r--libc/kernel/uapi/drm/radeon_drm.h19
-rw-r--r--libc/kernel/uapi/drm/savage_drm.h67
-rw-r--r--libc/kernel/uapi/drm/sis_drm.h4
-rw-r--r--libc/kernel/uapi/drm/tegra_drm.h69
-rw-r--r--libc/kernel/uapi/drm/via_drm.h4
-rw-r--r--libc/kernel/uapi/drm/virtgpu_drm.h136
-rw-r--r--libc/kernel/uapi/drm/vmwgfx_drm.h117
-rw-r--r--libc/kernel/uapi/linux/am437x-vpfe.h95
-rw-r--r--libc/kernel/uapi/linux/android/binder.h191
-rw-r--r--libc/kernel/uapi/linux/atm_zatm.h5
-rw-r--r--libc/kernel/uapi/linux/audit.h70
-rw-r--r--libc/kernel/uapi/linux/blkpg.h4
-rw-r--r--libc/kernel/uapi/linux/bpf.h96
-rw-r--r--libc/kernel/uapi/linux/btrfs.h167
-rw-r--r--libc/kernel/uapi/linux/can.h22
-rw-r--r--libc/kernel/uapi/linux/can/bcm.h7
-rw-r--r--libc/kernel/uapi/linux/can/error.h21
-rw-r--r--libc/kernel/uapi/linux/can/gw.h23
-rw-r--r--libc/kernel/uapi/linux/can/raw.h3
-rw-r--r--libc/kernel/uapi/linux/cryptouser.h111
-rw-r--r--libc/kernel/uapi/linux/dcbnl.h117
-rw-r--r--libc/kernel/uapi/linux/dlm_device.h2
-rw-r--r--libc/kernel/uapi/linux/dm-ioctl.h7
-rw-r--r--libc/kernel/uapi/linux/dvb/dmx.h51
-rw-r--r--libc/kernel/uapi/linux/dvb/frontend.h206
-rw-r--r--libc/kernel/uapi/linux/elf-em.h14
-rw-r--r--libc/kernel/uapi/linux/elf.h8
-rw-r--r--libc/kernel/uapi/linux/ethtool.h227
-rw-r--r--libc/kernel/uapi/linux/falloc.h3
-rw-r--r--libc/kernel/uapi/linux/fib_rules.h2
-rw-r--r--libc/kernel/uapi/linux/filter.h8
-rw-r--r--libc/kernel/uapi/linux/fou.h11
-rw-r--r--libc/kernel/uapi/linux/fs.h43
-rw-r--r--libc/kernel/uapi/linux/fuse.h1
-rw-r--r--libc/kernel/uapi/linux/gsmmux.h56
-rw-r--r--libc/kernel/uapi/linux/hsi/cs-protocol.h89
-rw-r--r--libc/kernel/uapi/linux/hyperv.h86
-rw-r--r--libc/kernel/uapi/linux/i2c-dev.h3
-rw-r--r--libc/kernel/uapi/linux/i2c.h20
-rw-r--r--libc/kernel/uapi/linux/if_addr.h8
-rw-r--r--libc/kernel/uapi/linux/if_alg.h4
-rw-r--r--libc/kernel/uapi/linux/if_arcnet.h10
-rw-r--r--libc/kernel/uapi/linux/if_bridge.h17
-rw-r--r--libc/kernel/uapi/linux/if_ether.h42
-rw-r--r--libc/kernel/uapi/linux/if_link.h273
-rw-r--r--libc/kernel/uapi/linux/if_packet.h81
-rw-r--r--libc/kernel/uapi/linux/if_tun.h40
-rw-r--r--libc/kernel/uapi/linux/if_tunnel.h28
-rw-r--r--libc/kernel/uapi/linux/iio/events.h39
-rw-r--r--libc/kernel/uapi/linux/iio/types.h121
-rw-r--r--libc/kernel/uapi/linux/ila.h29
-rw-r--r--libc/kernel/uapi/linux/in.h97
-rw-r--r--libc/kernel/uapi/linux/inet_diag.h21
-rw-r--r--libc/kernel/uapi/linux/input-event-codes.h865
-rw-r--r--libc/kernel/uapi/linux/input.h892
-rw-r--r--libc/kernel/uapi/linux/ip.h3
-rw-r--r--libc/kernel/uapi/linux/ip_vs.h34
-rw-r--r--libc/kernel/uapi/linux/ipv6.h64
-rw-r--r--libc/kernel/uapi/linux/ipv6_route.h11
-rw-r--r--libc/kernel/uapi/linux/kcmp.h34
-rw-r--r--libc/kernel/uapi/linux/kernel-page-flags.h3
-rw-r--r--libc/kernel/uapi/linux/kfd_ioctl.h245
-rw-r--r--libc/kernel/uapi/linux/kvm.h348
-rw-r--r--libc/kernel/uapi/linux/l2tp.h3
-rw-r--r--libc/kernel/uapi/linux/libc-compat.h40
-rw-r--r--libc/kernel/uapi/linux/lightnvm.h113
-rw-r--r--libc/kernel/uapi/linux/loop.h29
-rw-r--r--libc/kernel/uapi/linux/lwtunnel.h61
-rw-r--r--libc/kernel/uapi/linux/magic.h11
-rw-r--r--libc/kernel/uapi/linux/media-bus-format.h131
-rw-r--r--libc/kernel/uapi/linux/media.h54
-rw-r--r--libc/kernel/uapi/linux/mei.h4
-rw-r--r--libc/kernel/uapi/linux/membarrier.h26
-rw-r--r--libc/kernel/uapi/linux/mic_common.h39
-rw-r--r--libc/kernel/uapi/linux/mmc/ioctl.h8
-rw-r--r--libc/kernel/uapi/linux/mpls.h13
-rw-r--r--libc/kernel/uapi/linux/mpls_iptunnel.h29
-rw-r--r--libc/kernel/uapi/linux/msg.h9
-rw-r--r--libc/kernel/uapi/linux/nbd.h9
-rw-r--r--libc/kernel/uapi/linux/ndctl.h168
-rw-r--r--libc/kernel/uapi/linux/neighbour.h33
-rw-r--r--libc/kernel/uapi/linux/net_namespace.h33
-rw-r--r--libc/kernel/uapi/linux/net_tstamp.h20
-rw-r--r--libc/kernel/uapi/linux/netconf.h5
-rw-r--r--libc/kernel/uapi/linux/netfilter.h27
-rw-r--r--libc/kernel/uapi/linux/netfilter/ipset/ip_set.h9
-rw-r--r--libc/kernel/uapi/linux/netfilter/nf_conntrack_sctp.h5
-rw-r--r--libc/kernel/uapi/linux/netfilter/nf_conntrack_tcp.h5
-rw-r--r--libc/kernel/uapi/linux/netfilter/nf_tables.h200
-rw-r--r--libc/kernel/uapi/linux/netfilter/nfnetlink_conntrack.h91
-rw-r--r--libc/kernel/uapi/linux/netfilter/nfnetlink_cttimeout.h11
-rw-r--r--libc/kernel/uapi/linux/netfilter/nfnetlink_log.h22
-rw-r--r--libc/kernel/uapi/linux/netfilter/nfnetlink_queue.h27
-rw-r--r--libc/kernel/uapi/linux/netfilter/xt_CT.h16
-rw-r--r--libc/kernel/uapi/linux/netfilter/xt_set.h11
-rw-r--r--libc/kernel/uapi/linux/netfilter/xt_socket.h12
-rw-r--r--libc/kernel/uapi/linux/netfilter_bridge/ebtables.h61
-rw-r--r--libc/kernel/uapi/linux/netfilter_ipv6/ip6t_REJECT.h8
-rw-r--r--libc/kernel/uapi/linux/netlink.h21
-rw-r--r--libc/kernel/uapi/linux/nfc.h63
-rw-r--r--libc/kernel/uapi/linux/nfs.h55
-rw-r--r--libc/kernel/uapi/linux/nfs4.h36
-rw-r--r--libc/kernel/uapi/linux/nfsacl.h2
-rw-r--r--libc/kernel/uapi/linux/nfsd/debug.h12
-rw-r--r--libc/kernel/uapi/linux/nfsd/export.h5
-rw-r--r--libc/kernel/uapi/linux/nl80211.h596
-rw-r--r--libc/kernel/uapi/linux/nvme_ioctl.h74
-rw-r--r--libc/kernel/uapi/linux/openvswitch.h153
-rw-r--r--libc/kernel/uapi/linux/pci_regs.h343
-rw-r--r--libc/kernel/uapi/linux/perf_event.h152
-rw-r--r--libc/kernel/uapi/linux/pkt_cls.h212
-rw-r--r--libc/kernel/uapi/linux/pkt_sched.h225
-rw-r--r--libc/kernel/uapi/linux/pr.h68
-rw-r--r--libc/kernel/uapi/linux/prctl.h14
-rw-r--r--libc/kernel/uapi/linux/psci.h24
-rw-r--r--libc/kernel/uapi/linux/ptrace.h13
-rw-r--r--libc/kernel/uapi/linux/quota.h40
-rw-r--r--libc/kernel/uapi/linux/raid/md_p.h87
-rw-r--r--libc/kernel/uapi/linux/raid/md_u.h27
-rw-r--r--libc/kernel/uapi/linux/rds.h88
-rw-r--r--libc/kernel/uapi/linux/rtnetlink.h178
-rw-r--r--libc/kernel/uapi/linux/scif_ioctl.h111
-rw-r--r--libc/kernel/uapi/linux/screen_info.h14
-rw-r--r--libc/kernel/uapi/linux/securebits.h7
-rw-r--r--libc/kernel/uapi/linux/sem.h6
-rw-r--r--libc/kernel/uapi/linux/serial.h5
-rw-r--r--libc/kernel/uapi/linux/serial_core.h46
-rw-r--r--libc/kernel/uapi/linux/serial_reg.h24
-rw-r--r--libc/kernel/uapi/linux/snmp.h90
-rw-r--r--libc/kernel/uapi/linux/sock_diag.h13
-rw-r--r--libc/kernel/uapi/linux/stm.h38
-rw-r--r--libc/kernel/uapi/linux/sysctl.h323
-rw-r--r--libc/kernel/uapi/linux/target_core_user.h32
-rw-r--r--libc/kernel/uapi/linux/tc_act/tc_bpf.h41
-rw-r--r--libc/kernel/uapi/linux/tc_act/tc_connmark.h39
-rw-r--r--libc/kernel/uapi/linux/tc_act/tc_vlan.h43
-rw-r--r--libc/kernel/uapi/linux/tcp.h44
-rw-r--r--libc/kernel/uapi/linux/thermal.h49
-rw-r--r--libc/kernel/uapi/linux/tipc_netlink.h235
-rw-r--r--libc/kernel/uapi/linux/toshiba.h10
-rw-r--r--libc/kernel/uapi/linux/tty.h1
-rw-r--r--libc/kernel/uapi/linux/tty_flags.h28
-rw-r--r--libc/kernel/uapi/linux/udp.h2
-rw-r--r--libc/kernel/uapi/linux/uinput.h4
-rw-r--r--libc/kernel/uapi/linux/usb/cdc.h4
-rw-r--r--libc/kernel/uapi/linux/usb/ch9.h127
-rw-r--r--libc/kernel/uapi/linux/usb/functionfs.h37
-rw-r--r--libc/kernel/uapi/linux/usbdevice_fs.h25
-rw-r--r--libc/kernel/uapi/linux/userfaultfd.h106
-rw-r--r--libc/kernel/uapi/linux/userio.h34
-rw-r--r--libc/kernel/uapi/linux/v4l2-common.h13
-rw-r--r--libc/kernel/uapi/linux/v4l2-controls.h350
-rw-r--r--libc/kernel/uapi/linux/v4l2-dv-timings.h50
-rw-r--r--libc/kernel/uapi/linux/v4l2-mediabus.h207
-rw-r--r--libc/kernel/uapi/linux/v4l2-subdev.h37
-rw-r--r--libc/kernel/uapi/linux/version.h2
-rw-r--r--libc/kernel/uapi/linux/vfio.h99
-rw-r--r--libc/kernel/uapi/linux/vhost.h5
-rw-r--r--libc/kernel/uapi/linux/videodev2.h517
-rw-r--r--libc/kernel/uapi/linux/virtio_balloon.h18
-rw-r--r--libc/kernel/uapi/linux/virtio_blk.h47
-rw-r--r--libc/kernel/uapi/linux/virtio_config.h9
-rw-r--r--libc/kernel/uapi/linux/virtio_console.h19
-rw-r--r--libc/kernel/uapi/linux/virtio_gpu.h278
-rw-r--r--libc/kernel/uapi/linux/virtio_ids.h2
-rw-r--r--libc/kernel/uapi/linux/virtio_input.h71
-rw-r--r--libc/kernel/uapi/linux/virtio_net.h64
-rw-r--r--libc/kernel/uapi/linux/virtio_pci.h106
-rw-r--r--libc/kernel/uapi/linux/virtio_ring.h39
-rw-r--r--libc/kernel/uapi/linux/virtio_scsi.h159
-rw-r--r--libc/kernel/uapi/linux/virtio_types.h26
-rw-r--r--libc/kernel/uapi/linux/vsp1.h2
-rw-r--r--libc/kernel/uapi/linux/vt.h1
-rw-r--r--libc/kernel/uapi/linux/xfrm.h215
-rw-r--r--libc/kernel/uapi/linux/xilinx-v4l2-controls.h48
-rw-r--r--libc/kernel/uapi/misc/cxl.h44
-rw-r--r--libc/kernel/uapi/mtd/mtd-user.h5
-rw-r--r--libc/kernel/uapi/rdma/hfi/hfi1_user.h239
-rw-r--r--libc/kernel/uapi/rdma/ib_user_verbs.h342
-rw-r--r--libc/kernel/uapi/rdma/rdma_netlink.h98
-rw-r--r--libc/kernel/uapi/scsi/cxlflash_ioctl.h168
-rw-r--r--libc/kernel/uapi/sound/asequencer.h193
-rw-r--r--libc/kernel/uapi/sound/asoc.h289
-rw-r--r--libc/kernel/uapi/sound/asound.h302
-rw-r--r--libc/kernel/uapi/sound/compress_offload.h2
-rw-r--r--libc/kernel/uapi/sound/emu10k1.h155
-rw-r--r--libc/kernel/uapi/sound/firewire.h30
-rw-r--r--libc/kernel/uapi/sound/hdspm.h93
-rw-r--r--libc/kernel/uapi/sound/tlv.h33
-rw-r--r--libc/kernel/uapi/sound/usb_stream.h74
-rw-r--r--libc/kernel/uapi/xen/gntalloc.h29
-rw-r--r--libc/kernel/uapi/xen/gntdev.h42
-rw-r--r--libc/libc.arm.brillo.map (renamed from libc/libc.map)278
-rw-r--r--libc/libc.arm.map1497
-rw-r--r--libc/libc.arm64.map1212
-rw-r--r--libc/libc.map.txt1523
-rw-r--r--libc/libc.mips.brillo.map1299
-rw-r--r--libc/libc.mips.map1338
-rw-r--r--libc/libc.mips64.map1212
-rw-r--r--libc/libc.x86.brillo.map1298
-rw-r--r--libc/libc.x86.map1337
-rw-r--r--libc/libc.x86_64.map1212
-rw-r--r--libc/malloc_debug/Android.mk109
-rw-r--r--libc/malloc_debug/BacktraceData.cpp79
-rw-r--r--libc/malloc_debug/BacktraceData.h59
-rw-r--r--libc/malloc_debug/Config.cpp391
-rw-r--r--libc/malloc_debug/Config.h81
-rw-r--r--libc/malloc_debug/DebugData.cpp102
-rw-r--r--libc/malloc_debug/DebugData.h106
-rw-r--r--libc/malloc_debug/FreeTrackData.cpp141
-rw-r--r--libc/malloc_debug/FreeTrackData.h71
-rw-r--r--libc/malloc_debug/GuardData.cpp101
-rw-r--r--libc/malloc_debug/GuardData.h95
-rw-r--r--libc/malloc_debug/MapData.cpp168
-rw-r--r--libc/malloc_debug/MapData.h78
-rw-r--r--libc/malloc_debug/README.md330
-rw-r--r--libc/malloc_debug/README_api.md64
-rw-r--r--libc/malloc_debug/TrackData.cpp146
-rw-r--r--libc/malloc_debug/TrackData.h75
-rw-r--r--libc/malloc_debug/backtrace.cpp175
-rw-r--r--libc/malloc_debug/backtrace.h (renamed from libc/bionic/debug_stacktrace.h)17
-rw-r--r--libc/malloc_debug/debug_disable.cpp66
-rw-r--r--libc/malloc_debug/debug_disable.h (renamed from libc/bionic/malloc_debug_disable.h)16
-rw-r--r--libc/malloc_debug/debug_log.h (renamed from libc/bionic/if_nametoindex.c)44
-rw-r--r--libc/malloc_debug/exported32.map24
-rw-r--r--libc/malloc_debug/exported64.map22
-rw-r--r--libc/malloc_debug/malloc_debug.cpp699
-rw-r--r--libc/malloc_debug/malloc_debug.h73
-rw-r--r--libc/malloc_debug/tests/backtrace_fake.cpp59
-rw-r--r--libc/malloc_debug/tests/backtrace_fake.h27
-rw-r--r--libc/malloc_debug/tests/libc_fake.cpp19
-rw-r--r--libc/malloc_debug/tests/log_fake.cpp110
-rw-r--r--libc/malloc_debug/tests/log_fake.h (renamed from benchmarks/utils.h)14
-rw-r--r--libc/malloc_debug/tests/malloc_debug_config_tests.cpp628
-rw-r--r--libc/malloc_debug/tests/malloc_debug_unit_tests.cpp1514
-rw-r--r--libc/malloc_debug/tests/property_fake.cpp55
-rw-r--r--libc/private/KernelArgumentBlock.h17
-rw-r--r--libc/private/ScopedPthreadMutexLocker.h2
-rw-r--r--libc/private/ScopedReaddir.h7
-rw-r--r--libc/private/WriteProtected.h86
-rw-r--r--libc/private/bionic_asm.h17
-rw-r--r--libc/private/bionic_futex.h19
-rw-r--r--libc/private/bionic_globals.h57
-rw-r--r--libc/private/bionic_lock.h15
-rw-r--r--libc/private/bionic_macros.h4
-rw-r--r--libc/private/bionic_malloc_dispatch.h74
-rw-r--r--libc/private/bionic_page.h33
-rw-r--r--libc/private/bionic_sdk_version.h24
-rw-r--r--libc/private/bionic_time_conversions.h21
-rw-r--r--libc/private/bionic_tls.h15
-rw-r--r--libc/private/bionic_vdso.h55
-rw-r--r--libc/private/get_cpu_count_from_string.h53
-rw-r--r--libc/private/libc_logging.h2
-rw-r--r--libc/stdio/fileext.h80
-rw-r--r--libc/stdio/findfp.c191
-rw-r--r--libc/stdio/glue.h2
-rw-r--r--libc/stdio/local.h183
-rw-r--r--libc/stdio/refill.c (renamed from libc/upstream-openbsd/lib/libc/stdio/refill.c)7
-rw-r--r--libc/stdio/stdio.c90
-rw-r--r--libc/stdio/stdio.cpp600
-rw-r--r--libc/stdio/stdio_ext.cpp15
-rw-r--r--libc/stdlib/atexit.c49
-rwxr-xr-xlibc/tools/check-symbols-glibc.py10
-rwxr-xr-xlibc/tools/check-symbols.py26
-rwxr-xr-xlibc/tools/gensyscalls.py22
-rwxr-xr-xlibc/tools/genversion-scripts.py63
-rw-r--r--libc/tools/zoneinfo/ZoneCompactor.java192
-rwxr-xr-xlibc/tools/zoneinfo/update-tzdata.py262
-rw-r--r--libc/tzcode/asctime.c10
-rw-r--r--libc/tzcode/difftime.c56
-rw-r--r--libc/tzcode/localtime.c3333
-rw-r--r--libc/tzcode/private.h340
-rw-r--r--libc/tzcode/strftime.c177
-rw-r--r--libc/tzcode/tzfile.h12
-rw-r--r--libc/upstream-dlmalloc/README.txt10
-rw-r--r--libc/upstream-dlmalloc/malloc.c6318
-rw-r--r--libc/upstream-dlmalloc/malloc.h620
-rw-r--r--libc/upstream-freebsd/lib/libc/stdlib/imaxabs.c36
-rw-r--r--libc/upstream-freebsd/lib/libc/stdlib/imaxdiv.c45
-rw-r--r--libc/upstream-freebsd/lib/libc/stdlib/llabs.c36
-rw-r--r--libc/upstream-netbsd/android/include/netbsd-compat.h13
-rw-r--r--libc/upstream-openbsd/android/include/arc4random.h8
-rw-r--r--libc/upstream-openbsd/android/include/openbsd-compat.h9
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/err.c12
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/errx.c12
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/fnmatch.c9
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/time.c7
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/verr.c8
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/verrx.c8
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/vwarn.c8
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/vwarnx.c8
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/warn.c12
-rw-r--r--libc/upstream-openbsd/lib/libc/gen/warnx.c12
-rw-r--r--libc/upstream-openbsd/lib/libc/net/inet_addr.c175
-rw-r--r--libc/upstream-openbsd/lib/libc/net/inet_network.c84
-rw-r--r--libc/upstream-openbsd/lib/libc/net/res_random.c12
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/asprintf.c12
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/fclose.c63
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/fdopen.c91
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/fgetwc.c5
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/fgetws.c7
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/fopen.c86
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/fputwc.c6
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/freopen.c171
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/fseek.c251
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/ftell.c96
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/funopen.c68
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/getdelim.c6
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/open_memstream.c11
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/open_wmemstream.c10
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/tempnam.c13
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/vasprintf.c11
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/vfprintf.c57
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/vfwprintf.c22
-rw-r--r--libc/upstream-openbsd/lib/libc/stdio/vswprintf.c5
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/abs.c (renamed from libc/upstream-freebsd/lib/libc/stdlib/abs.c)14
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/imaxabs.c (renamed from libc/upstream-openbsd/lib/libc/stdio/fgetpos.c)21
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/imaxdiv.c (renamed from libc/upstream-openbsd/lib/libc/stdio/fileno.c)35
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/labs.c (renamed from libc/upstream-freebsd/lib/libc/stdlib/labs.c)14
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/llabs.c (renamed from libc/upstream-openbsd/lib/libc/stdio/fsetpos.c)21
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/reallocarray.c5
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/setenv.c11
-rw-r--r--libc/upstream-openbsd/lib/libc/stdlib/system.c22
-rw-r--r--libc/upstream-openbsd/lib/libc/string/strlcat.c49
-rw-r--r--libc/upstream-openbsd/lib/libc/string/strlcpy.c38
-rw-r--r--libc/upstream-openbsd/lib/libc/string/strtok.c11
-rw-r--r--libc/upstream-openbsd/lib/libc/string/wcslcpy.c39
-rw-r--r--libc/upstream-openbsd/lib/libc/time/wcsftime.c25
-rw-r--r--libdl/Android.bp60
-rw-r--r--libdl/Android.mk21
-rw-r--r--libdl/libdl.arm.map31
-rw-r--r--libdl/libdl.arm64.map30
-rw-r--r--libdl/libdl.c33
-rw-r--r--libdl/libdl.map.txt (renamed from libdl/libdl.map)16
-rw-r--r--libdl/libdl.mips.map30
-rw-r--r--libdl/libdl.mips64.map30
-rw-r--r--libdl/libdl.x86.map30
-rw-r--r--libdl/libdl.x86_64.map30
-rw-r--r--libm/Android.bp520
-rw-r--r--libm/Android.mk248
-rw-r--r--libm/NOTICE47
-rw-r--r--libm/arm/e_sqrtf.S39
-rw-r--r--libm/arm/floor.S (renamed from libm/arm/s_floor.S)0
-rw-r--r--libm/arm/sqrt.S (renamed from libm/arm/e_sqrt.S)7
-rw-r--r--libm/arm64/fenv.c19
-rw-r--r--libm/fabs.cpp46
-rw-r--r--libm/fake_long_double.c3
-rw-r--r--libm/include/math.h151
-rw-r--r--libm/libm.arm.map378
-rw-r--r--libm/libm.arm64.map274
-rw-r--r--libm/libm.map.txt (renamed from libm/libm.map)7
-rw-r--r--libm/libm.mips.map281
-rw-r--r--libm/libm.mips64.map274
-rw-r--r--libm/libm.x86.map274
-rw-r--r--libm/libm.x86_64.map274
-rw-r--r--libm/upstream-freebsd/lib/msun/ld128/k_expl.h4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/catrig.c66
-rw-r--r--libm/upstream-freebsd/lib/msun/src/catrigf.c66
-rw-r--r--libm/upstream-freebsd/lib/msun/src/e_j0.c32
-rw-r--r--libm/upstream-freebsd/lib/msun/src/e_j0f.c47
-rw-r--r--libm/upstream-freebsd/lib/msun/src/e_j1.c30
-rw-r--r--libm/upstream-freebsd/lib/msun/src/e_j1f.c45
-rw-r--r--libm/upstream-freebsd/lib/msun/src/e_jn.c12
-rw-r--r--libm/upstream-freebsd/lib/msun/src/e_jnf.c13
-rw-r--r--libm/upstream-freebsd/lib/msun/src/k_exp.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/k_expf.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/math_private.h20
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_ccosh.c61
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_ccoshf.c45
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_cexp.c14
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_cexpf.c14
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_conj.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_conjf.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_conjl.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_cproj.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_cprojf.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_cprojl.c4
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_csinh.c75
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_csinhf.c47
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_csqrt.c16
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_csqrtf.c16
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_csqrtl.c16
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_ctanh.c45
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_ctanhf.c19
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_exp2.c6
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_fabs.c31
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_fabsf.c33
-rw-r--r--libm/upstream-freebsd/lib/msun/src/s_scalbln.c42
-rw-r--r--libm/x86/lrint.S36
-rw-r--r--libm/x86/lrintf.S33
-rw-r--r--libm/x86/rint.S39
-rw-r--r--libm/x86/rintf.S36
-rw-r--r--libm/x86_64/lrint.S35
-rw-r--r--libm/x86_64/lrintf.S35
-rw-r--r--libm/x86_64/rint.S31
-rw-r--r--libm/x86_64/rintf.S31
-rw-r--r--linker/Android.mk33
-rw-r--r--linker/NOTICE28
-rw-r--r--linker/debugger.cpp53
-rw-r--r--linker/dlfcn.cpp153
-rw-r--r--linker/linked_list.h55
-rw-r--r--linker/linker.cpp2039
-rw-r--r--linker/linker.h129
-rw-r--r--linker/linker_allocator.cpp21
-rw-r--r--linker/linker_allocator.h5
-rw-r--r--linker/linker_block_allocator.cpp13
-rw-r--r--linker/linker_debug.h8
-rw-r--r--linker/linker_dlwarning.cpp47
-rw-r--r--linker/linker_dlwarning.h28
-rw-r--r--linker/linker_gdb_support.cpp94
-rw-r--r--linker/linker_gdb_support.h34
-rw-r--r--linker/linker_libc_support.c2
-rw-r--r--linker/linker_mapped_file_fragment.cpp63
-rw-r--r--linker/linker_mapped_file_fragment.h41
-rw-r--r--linker/linker_mips.cpp149
-rw-r--r--linker/linker_phdr.cpp251
-rw-r--r--linker/linker_phdr.h50
-rw-r--r--linker/linker_utils.cpp136
-rw-r--r--linker/linker_utils.h32
-rw-r--r--linker/tests/Android.mk7
-rw-r--r--linker/tests/linked_list_test.cpp17
-rw-r--r--linker/tests/linker_block_allocator_test.cpp12
-rw-r--r--linker/tests/linker_globals.cpp (renamed from libc/upstream-freebsd/android/include/spinlock.h)7
-rw-r--r--linker/tests/linker_memory_allocator_test.cpp14
-rw-r--r--linker/tests/linker_utils_test.cpp104
-rw-r--r--tests/Android.build.mk18
-rw-r--r--tests/Android.mk123
-rw-r--r--tests/__cxa_thread_atexit_test.cpp16
-rw-r--r--tests/arpa_inet_test.cpp81
-rw-r--r--tests/atexit_test.cpp10
-rw-r--r--tests/buffer_tests.cpp24
-rw-r--r--tests/bug_26110743_test.cpp113
-rw-r--r--tests/dirent_test.cpp66
-rw-r--r--tests/dlext_private.h93
-rw-r--r--tests/dlext_test.cpp761
-rw-r--r--tests/dlfcn_test.cpp182
-rwxr-xr-xtests/file-check-cxx8
-rw-r--r--tests/fortify_compilation_test.cpp65
-rw-r--r--tests/fortify_test.cpp54
-rw-r--r--tests/fortify_test_main.cpp17
-rw-r--r--tests/getauxval_test.cpp42
-rw-r--r--tests/gtest_main.cpp270
-rw-r--r--tests/ifaddrs_test.cpp269
-rw-r--r--tests/libgen_basename_test.cpp90
-rw-r--r--tests/libgen_test.cpp24
-rw-r--r--tests/libs/Android.build.dlext_testzip.mk59
-rw-r--r--tests/libs/Android.build.dt_runpath.mk94
-rw-r--r--tests/libs/Android.build.linker_namespaces.mk84
-rw-r--r--tests/libs/Android.build.target.testlib.mk20
-rw-r--r--tests/libs/Android.mk59
-rw-r--r--tests/libs/bionic_tests_zipalign.cpp158
-rw-r--r--tests/libs/dlopen_b.cpp16
-rw-r--r--tests/libs/namespaces_dlopened.cpp19
-rw-r--r--tests/libs/namespaces_private.cpp18
-rw-r--r--tests/libs/namespaces_public.cpp18
-rw-r--r--tests/libs/namespaces_root.cpp51
-rw-r--r--tests/malloc_test.cpp128
-rw-r--r--tests/math_data/llrint_intel_data.h1242
-rw-r--r--tests/math_data/llrintf_intel_data.h1242
-rw-r--r--tests/math_data/lrint_intel_data.h982
-rw-r--r--tests/math_data/lrintf_intel_data.h1002
-rw-r--r--tests/math_data_test.h34
-rw-r--r--tests/math_test.cpp20
-rw-r--r--tests/net_if_test.cpp73
-rw-r--r--tests/netinet_in_test.cpp36
-rw-r--r--tests/netinet_udp_test.cpp46
-rw-r--r--tests/pthread_dlfcn_test.cpp9
-rwxr-xr-xtests/pthread_test.cpp587
-rw-r--r--tests/pty_test.cpp7
-rw-r--r--tests/regex_test.cpp21
-rw-r--r--tests/semaphore_test.cpp86
-rw-r--r--tests/setjmp_test.cpp49
-rw-r--r--tests/signal_test.cpp51
-rw-r--r--tests/stack_protector_test.cpp109
-rw-r--r--tests/stack_protector_test_helper.cpp31
-rw-r--r--tests/stdio_ext_test.cpp22
-rw-r--r--tests/stdio_nofortify_test.cpp12
-rw-r--r--tests/stdio_test.cpp389
-rw-r--r--tests/stdlib_test.cpp19
-rw-r--r--tests/string_nofortify_test.cpp12
-rw-r--r--tests/string_test.cpp199
-rw-r--r--tests/strings_nofortify_test.cpp12
-rw-r--r--tests/strings_test.cpp16
-rw-r--r--tests/stubs_test.cpp104
-rw-r--r--tests/sys_mman_test.cpp17
-rw-r--r--tests/sys_personality_test.cpp4
-rw-r--r--tests/sys_prctl_test.cpp39
-rw-r--r--tests/sys_resource_test.cpp25
-rw-r--r--tests/sys_select_test.cpp27
-rw-r--r--tests/sys_sysmacros_test.cpp31
-rw-r--r--tests/sys_time_test.cpp4
-rw-r--r--tests/sys_timex_test.cpp47
-rw-r--r--tests/sys_uio_test.cpp54
-rw-r--r--tests/sys_xattr_test.cpp29
-rw-r--r--tests/system_properties_test.cpp7
-rw-r--r--tests/thread_local_test.cpp260
-rw-r--r--tests/time_test.cpp64
-rw-r--r--tests/unistd_nofortify_test.cpp12
-rw-r--r--tests/unistd_test.cpp257
-rw-r--r--tests/utils.h55
-rw-r--r--tests/utmp_test.cpp6
-rw-r--r--tools/bionicbb/presubmit.py6
-rw-r--r--tools/relocation_packer/Android.mk12
-rw-r--r--tools/relocation_packer/src/elf_file.cc101
-rw-r--r--tools/relocation_packer/src/elf_file_unittest.cc24
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_arm32.sobin93210 -> 92788 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_arm32_packed.sobin89114 -> 88692 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_arm64.sobin134131 -> 134144 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_arm64_packed.sobin113651 -> 113664 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_ia32.sobin0 -> 76736 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_ia32_packed.sobin0 -> 72640 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_mips32.sobin0 -> 134545 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_mips32_packed.sobin0 -> 130449 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_x64.sobin0 -> 108688 bytes
-rwxr-xr-xtools/relocation_packer/test_data/elf_file_unittest_relocs_x64_packed.sobin0 -> 88208 bytes
1199 files changed, 64702 insertions, 28028 deletions
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 000000000..9b7478c07
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,15 @@
+BasedOnStyle: Google
+AllowShortBlocksOnASingleLine: false
+AllowShortFunctionsOnASingleLine: false
+
+ColumnLimit: 100
+CommentPragmas: NOLINT:.*
+DerivePointerAlignment: false
+IndentWidth: 2
+ContinuationIndentWidth: 2
+PointerAlignment: Left
+TabWidth: 2
+UseTab: Never
+PenaltyExcessCharacter: 32
+
+Cpp11BracedListStyle: false
diff --git a/Android.mk b/Android.mk
index 7c3975104..9f0f0c376 100644
--- a/Android.mk
+++ b/Android.mk
@@ -16,4 +16,5 @@
LOCAL_PATH := $(call my-dir)
-include $(call all-subdir-makefiles)
+include $(call all-makefiles-under,$(LOCAL_PATH)) \
+ $(call all-makefiles-under,$(LOCAL_PATH)/libc)
diff --git a/CleanSpec.mk b/CleanSpec.mk
index 841ad16c0..9421e2601 100644
--- a/CleanSpec.mk
+++ b/CleanSpec.mk
@@ -48,6 +48,11 @@
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libc_*)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libc_*)
+# Required due to the replacement of a symlink with a shared library
+# (commit b952f42bef69e5c in frameworks/native).
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/system/lib/libGLES*)
+$(call add-clean-step, rm -f $(PRODUCT_OUT)/system/lib64/libGLES*)
+
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************
diff --git a/README.md b/README.md
index 79bb72a97..c6b927824 100644
--- a/README.md
+++ b/README.md
@@ -96,7 +96,6 @@ libc/
dns/
# Contains the DNS resolver (originates from NetBSD code).
- upstream-dlmalloc/
upstream-freebsd/
upstream-netbsd/
upstream-openbsd/
@@ -119,6 +118,10 @@ libc/
# current upstream source in one of the upstream directories or by
# switching the file to C++ and cleaning it up.
+ malloc_debug/
+ # The code that implements the functionality to enable debugging of
+ # native allocation problems.
+
stdio/
# These are legacy files of dubious provenance. We're working to clean
# this mess up, and this directory should disappear.
@@ -169,9 +172,10 @@ As mentioned above, this is currently a two-step process:
Updating tzdata
---------------
-This is fully automated:
+This is fully automated (and these days handled by the libcore team, because
+they own icu, and that needs to be updated in sync with bionic):
- 1. Run update-tzdata.py.
+ 1. Run update-tzdata.py in external/icu/tools/.
Verifying changes
@@ -194,14 +198,15 @@ The tests are all built from the tests/ directory.
### Device tests
$ mma
+ $ adb remount
$ adb sync
$ adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests32
$ adb shell \
/data/nativetest/bionic-unit-tests-static/bionic-unit-tests-static32
# Only for 64-bit targets
- $ adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests64
+ $ adb shell /data/nativetest64/bionic-unit-tests/bionic-unit-tests64
$ adb shell \
- /data/nativetest/bionic-unit-tests-static/bionic-unit-tests-static64
+ /data/nativetest64/bionic-unit-tests-static/bionic-unit-tests-static64
### Host tests
@@ -256,18 +261,33 @@ First, build and run the host tests as usual (see above).
The coverage report is now available at `covreport/index.html`.
-LP32 ABI bugs
--------------
+Attaching GDB to the tests
+--------------------------
+
+Bionic's test runner will run each test in its own process by default to prevent
+tests failures from impacting other tests. This also has the added benefit of
+running them in parallel, so they are much faster.
+
+However, this also makes it difficult to run the tests under GDB. To prevent
+each test from being forked, run the tests with the flag `--no-isolate`.
+
+
+32-bit ABI bugs
+---------------
This probably belongs in the NDK documentation rather than here, but these
-are the known ABI bugs in LP32:
+are the known ABI bugs in the 32-bit ABI:
- * `time_t` is 32-bit. <http://b/5819737>
+ * `time_t` is 32-bit. <http://b/5819737>. In the 64-bit ABI, time_t is
+ 64-bit.
- * `off_t` is 32-bit. There is `off64_t`, but no `_FILE_OFFSET_BITS` support.
- Many of the `off64_t` functions are missing in older releases, and
- stdio uses 32-bit offsets, so there's no way to fully implement
- `_FILE_OFFSET_BITS`.
+ * `off_t` is 32-bit. There is `off64_t`, and in newer releases there is
+ almost-complete support for `_FILE_OFFSET_BITS`. Unfortunately our stdio
+ implementation uses 32-bit offsets and -- worse -- function pointers to
+ functions that use 32-bit offsets, so there's no good way to implement
+ the last few pieces <http://b/24807045>. In the 64-bit ABI, off_t is
+ off64_t.
* `sigset_t` is too small on ARM and x86 (but correct on MIPS), so support
- for real-time signals is broken. <http://b/5828899>
+ for real-time signals is broken. <http://b/5828899> In the 64-bit ABI,
+ `sigset_t` is the correct size for every architecture.
diff --git a/benchmarks/Android.mk b/benchmarks/Android.mk
index e1580feb4..6f2651ef3 100644
--- a/benchmarks/Android.mk
+++ b/benchmarks/Android.mk
@@ -16,10 +16,6 @@
LOCAL_PATH := $(call my-dir)
-# -----------------------------------------------------------------------------
-# Benchmarks library, usable by projects outside this directory.
-# -----------------------------------------------------------------------------
-
benchmark_cflags := \
-O2 \
-fno-builtin \
@@ -29,40 +25,7 @@ benchmark_cflags := \
-Wunused \
benchmark_cppflags := \
- -std=gnu++11 \
-
-benchmarklib_src_files := \
- Benchmark.cpp \
- utils.cpp \
- main.cpp \
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libbenchmark
-LOCAL_CFLAGS := $(benchmark_cflags)
-LOCAL_CPPFLAGS := $(benchmark_cppflags)
-LOCAL_SRC_FILES := $(benchmarklib_src_files)
-LOCAL_C_INCLUDES := $(benchmark_c_includes)
-LOCAL_STATIC_LIBRARIES := libbase
-include $(BUILD_STATIC_LIBRARY)
-
-# Only supported on linux systems.
-ifeq ($(HOST_OS),linux)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libbenchmark
-LOCAL_CFLAGS := $(benchmark_cflags)
-LOCAL_CPPFLAGS := $(benchmark_cppflags)
-LOCAL_SRC_FILES := $(benchmarklib_src_files)
-LOCAL_C_INCLUDES := $(benchmark_c_includes)
-LOCAL_MULTILIB := both
-LOCAL_STATIC_LIBRARIES := libbase
-include $(BUILD_HOST_STATIC_LIBRARY)
-
-endif
-# -----------------------------------------------------------------------------
-# Benchmarks.
-# -----------------------------------------------------------------------------
benchmark_src_files := \
math_benchmark.cpp \
property_benchmark.cpp \
@@ -84,8 +47,7 @@ LOCAL_MULTILIB := both
LOCAL_CFLAGS := $(benchmark_cflags)
LOCAL_CPPFLAGS := $(benchmark_cppflags)
LOCAL_SRC_FILES := $(benchmark_src_files)
-LOCAL_STATIC_LIBRARIES := libbenchmark libbase
-include $(BUILD_EXECUTABLE)
+include $(BUILD_NATIVE_BENCHMARK)
# We don't build a static benchmark executable because it's not usually
# useful. If you're trying to run the current benchmarks on an older
@@ -106,7 +68,8 @@ LOCAL_CFLAGS := $(benchmark_cflags)
LOCAL_CPPFLAGS := $(benchmark_cppflags)
LOCAL_LDFLAGS := -lrt
LOCAL_SRC_FILES := $(benchmark_src_files)
-LOCAL_STATIC_LIBRARIES := libbenchmark libbase
+LOCAL_STATIC_LIBRARIES := libgoogle-benchmark
+# TODO: BUILD_HOST_NATIVE_BENCHMARK
include $(BUILD_HOST_EXECUTABLE)
endif
diff --git a/benchmarks/Benchmark.cpp b/benchmarks/Benchmark.cpp
deleted file mode 100644
index ea6000fe5..000000000
--- a/benchmarks/Benchmark.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <inttypes.h>
-#include <regex.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <time.h>
-
-#include <string>
-#include <vector>
-
-#include <base/stringprintf.h>
-
-#include <benchmark/Benchmark.h>
-
-#include "utils.h"
-
-namespace testing {
-
-static uint64_t NanoTime() {
- struct timespec t;
- t.tv_sec = t.tv_nsec = 0;
- clock_gettime(CLOCK_MONOTONIC, &t);
- return static_cast<uint64_t>(t.tv_sec) * 1000000000LL + t.tv_nsec;
-}
-
-bool Benchmark::header_printed_;
-
-std::vector<Benchmark*>& Benchmark::List() {
- static std::vector<Benchmark*> list;
- return list;
-}
-
-int Benchmark::MaxNameColumnWidth() {
- size_t max = 20;
- for (auto& benchmark : List()) {
- max = std::max(max, benchmark->NameColumnWidth());
- }
- return static_cast<int>(max);
-}
-
-size_t Benchmark::RunAll(std::vector<regex_t*>& regs) {
- size_t benchmarks_run = 0;
- header_printed_ = false;
- for (auto& benchmark : List()) {
- benchmarks_run += benchmark->RunAllArgs(regs);
- }
- return benchmarks_run;
-}
-
-void Benchmark::PrintHeader() {
- if (!header_printed_) {
- printf("%-*s %10s %10s\n", MaxNameColumnWidth(), "", "iterations", "ns/op");
- header_printed_ = true;
- }
-}
-
-template <typename T>
-bool BenchmarkT<T>::ShouldRun(std::vector<regex_t*>& regs, T arg) {
- if (regs.empty()) {
- return true;
- }
-
- for (const auto& re : regs) {
- if (regexec(re, GetNameStr(arg).c_str(), 0, NULL, 0) != REG_NOMATCH) {
- return true;
- }
- }
- return false;
-}
-
-void Benchmark::StopBenchmarkTiming() {
- if (start_time_ns_ != 0) {
- total_time_ns_ += NanoTime() - start_time_ns_;
- }
- start_time_ns_ = 0;
-}
-
-void Benchmark::StartBenchmarkTiming() {
- if (start_time_ns_ == 0) {
- start_time_ns_ = NanoTime();
- }
-}
-
-std::string BenchmarkWithoutArg::GetNameStr(void*) {
- return Name();
-}
-
-template <>
-std::string BenchmarkWithArg<int>::GetNameStr(int arg) {
- return Name() + "/" + PrettyInt(arg, 2);
-}
-
-template <>
-std::string BenchmarkWithArg<double>::GetNameStr(double arg) {
- return Name() + "/" + android::base::StringPrintf("%0.6f", arg);
-}
-
-template<typename T>
-void BenchmarkT<T>::RunWithArg(T arg) {
- int new_iterations = 1;
- int iterations;
- while (new_iterations < 1e8) {
- bytes_processed_ = 0;
- total_time_ns_ = 0;
- start_time_ns_ = 0;
-
- iterations = new_iterations;
- RunIterations(iterations, arg);
- if (total_time_ns_ >= 1e9) {
- break;
- }
-
- if (total_time_ns_/iterations == 0) {
- new_iterations = 1e9;
- } else {
- new_iterations = 1e9/ (total_time_ns_/iterations);
- }
- new_iterations = std::max(iterations + 1,
- std::min(new_iterations + new_iterations/2, 100*iterations));
-
- new_iterations = Round(new_iterations);
- }
-
- printf("%-*s %10s %10" PRId64, MaxNameColumnWidth(), GetNameStr(arg).c_str(),
- PrettyInt(iterations, 10).c_str(), total_time_ns_/iterations);
-
- if (total_time_ns_ > 0 && bytes_processed_ > 0) {
- double gib_processed = static_cast<double>(bytes_processed_)/1e9;
- double seconds = static_cast<double>(total_time_ns_)/1e9;
- printf(" %8.3f GiB/s", gib_processed/seconds);
- }
- printf("\n");
- fflush(stdout);
-}
-
-template class BenchmarkT<int>;
-template class BenchmarkT<double>;
-template class BenchmarkT<void*>;
-
-template class BenchmarkWithArg<int>;
-template class BenchmarkWithArg<double>;
-
-} // namespace testing
diff --git a/benchmarks/benchmark/Benchmark.h b/benchmarks/benchmark/Benchmark.h
deleted file mode 100644
index ae5c1a228..000000000
--- a/benchmarks/benchmark/Benchmark.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef BENCHMARKS_BENCHMARK_H_
-#define BENCHMARKS_BENCHMARK_H_
-
-#include <regex.h>
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-namespace testing {
-
-class Benchmark {
-public:
- Benchmark() {
- List().push_back(this);
- }
- virtual ~Benchmark() {}
-
- virtual std::string Name() = 0;
-
- virtual size_t RunAllArgs(std::vector<regex_t*>&) = 0;
-
- void SetBenchmarkBytesProcessed(uint64_t bytes) { bytes_processed_ += bytes; }
- void StopBenchmarkTiming();
- void StartBenchmarkTiming();
-
- // Run all of the benchmarks that have registered.
- static size_t RunAll(std::vector<regex_t*>&);
-
- static std::vector<Benchmark*>& List();
-
- static int MaxNameColumnWidth();
-
-protected:
- virtual size_t NameColumnWidth() = 0;
-
- uint64_t bytes_processed_;
- uint64_t total_time_ns_;
- uint64_t start_time_ns_;
-
- static bool header_printed_;
-
- static void PrintHeader();
-};
-
-template <typename T>
-class BenchmarkT : public Benchmark {
-public:
- BenchmarkT() {}
- virtual ~BenchmarkT() {}
-
-protected:
- bool ShouldRun(std::vector<regex_t*>&, T arg);
- void RunWithArg(T arg);
- virtual void RunIterations(int, T) = 0;
- virtual std::string GetNameStr(T) = 0;
-};
-
-class BenchmarkWithoutArg : public BenchmarkT<void*> {
-public:
- BenchmarkWithoutArg() {}
- virtual ~BenchmarkWithoutArg() {}
-
-protected:
- virtual size_t RunAllArgs(std::vector<regex_t*>& regs) override {
- size_t benchmarks_run = 0;
- if (BenchmarkT<void*>::ShouldRun(regs, nullptr)) {
- PrintHeader();
- RunWithArg(nullptr);
- benchmarks_run++;
- }
- return benchmarks_run;
- }
-
- virtual void RunIterations(int iters, void*) override {
- Run(iters);
- }
-
- virtual void Run(int) = 0;
-
- virtual size_t NameColumnWidth() override {
- return Name().size();
- }
-
- virtual std::string GetNameStr(void *) override;
-};
-
-template<typename T>
-class BenchmarkWithArg : public BenchmarkT<T> {
-public:
- BenchmarkWithArg() {}
- virtual ~BenchmarkWithArg() {}
-
- BenchmarkWithArg* Arg(T arg) {
- args_.push_back(arg);
- return this;
- }
-
-protected:
- virtual size_t NameColumnWidth() override {
- size_t max = 0;
- for (const auto& arg : args_) {
- max = std::max(max, GetNameStr(arg).size());
- }
- return max;
- }
-
- std::string GetNameStr(T arg) override;
-
- virtual size_t RunAllArgs(std::vector<regex_t*>& regs) override {
- size_t benchmarks_run = 0;
- for (T& arg : args_) {
- if (BenchmarkT<T>::ShouldRun(regs, arg)) {
- Benchmark::PrintHeader();
- BenchmarkT<T>::RunWithArg(arg);
- benchmarks_run++;
- }
- }
- return benchmarks_run;
- }
-
- virtual void RunIterations(int iters, T arg) override {
- Run(iters, arg);
- }
-
- virtual void Run(int iters, T arg) = 0;
-
-private:
- std::vector<T> args_;
-};
-
-} // namespace testing
-
-#define BENCHMARK_START(f, super_class) \
- class f : public super_class { \
- public: \
- f() {} \
- virtual ~f() {} \
- virtual std::string Name() override { return #f; } \
-
-#define BENCHMARK_NO_ARG(f) \
- BENCHMARK_START(f, ::testing::BenchmarkWithoutArg) \
- virtual void Run(int) override; \
- }; \
- static ::testing::Benchmark* __benchmark_##f = new f()
-
-#define BENCHMARK_WITH_ARG(f, arg_type) \
- BENCHMARK_START(f, ::testing::BenchmarkWithArg<arg_type>) \
- virtual void Run(int, arg_type) override; \
- }; \
- static ::testing::BenchmarkWithArg<arg_type>* __benchmark_##f = (new f())
-
-#endif // BENCHMARKS_BENCHMARK_H_
diff --git a/benchmarks/main.cpp b/benchmarks/main.cpp
deleted file mode 100644
index 5bce47904..000000000
--- a/benchmarks/main.cpp
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <regex.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <vector>
-
-#include <benchmark/Benchmark.h>
-
-int main(int argc, char* argv[]) {
- if (::testing::Benchmark::List().empty()) {
- fprintf(stderr, "No benchmarks registered!\n");
- exit(EXIT_FAILURE);
- }
-
- std::vector<regex_t*> regs;
- for (int i = 1; i < argc; i++) {
- regex_t* re = new regex_t;
- int errcode = regcomp(re, argv[i], 0);
- if (errcode != 0) {
- size_t errbuf_size = regerror(errcode, re, NULL, 0);
- if (errbuf_size > 0) {
- char* errbuf = new char[errbuf_size];
- regerror(errcode, re, errbuf, errbuf_size);
- fprintf(stderr, "Couldn't compile \"%s\" as a regular expression: %s\n",
- argv[i], errbuf);
- } else {
- fprintf(stderr, "Unknown compile error for \"%s\" as a regular expression!\n", argv[i]);
- }
- exit(EXIT_FAILURE);
- }
- regs.push_back(re);
- }
-
- if (::testing::Benchmark::RunAll(regs) == 0) {
- fprintf(stderr, "No matching benchmarks!\n");
- fprintf(stderr, "Available benchmarks:\n");
- for (const auto& benchmark : ::testing::Benchmark::List()) {
- fprintf(stderr, " %s\n", benchmark->Name().c_str());
- }
- exit(EXIT_FAILURE);
- }
-
- return 0;
-}
diff --git a/benchmarks/math_benchmark.cpp b/benchmarks/math_benchmark.cpp
index 4de28d1b3..36ac301c6 100644
--- a/benchmarks/math_benchmark.cpp
+++ b/benchmarks/math_benchmark.cpp
@@ -17,120 +17,213 @@
#include <fenv.h>
#include <math.h>
-#include <benchmark/Benchmark.h>
+#include <benchmark/benchmark.h>
-#define AT_COMMON_VALS \
- Arg(1234.0)->Arg(nan(""))->Arg(HUGE_VAL)->Arg(0.0)
+static const double values[] = { 1234.0, nan(""), HUGE_VAL, 0.0 };
+static const char* names[] = { "1234.0", "nan", "HUGE_VAL", "0.0" };
+
+#define BENCHMARK_COMMON_VALS(name) BENCHMARK(name)->Arg(0)->Arg(1)->Arg(2)->Arg(3)
+
+static void SetLabel(benchmark::State& state) {
+ state.SetLabel(names[state.range_x()]);
+}
// Avoid optimization.
volatile double d;
volatile double v;
-BENCHMARK_NO_ARG(BM_math_sqrt);
-void BM_math_sqrt::Run(int iters) {
- StartBenchmarkTiming();
-
+static void BM_math_sqrt(benchmark::State& state) {
d = 0.0;
v = 2.0;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
d += sqrt(v);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_math_sqrt);
-BENCHMARK_NO_ARG(BM_math_log10);
-void BM_math_log10::Run(int iters) {
- StartBenchmarkTiming();
-
+static void BM_math_log10(benchmark::State& state) {
d = 0.0;
v = 1234.0;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
d += log10(v);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_math_log10);
-BENCHMARK_NO_ARG(BM_math_logb);
-void BM_math_logb::Run(int iters) {
- StartBenchmarkTiming();
-
+static void BM_math_logb(benchmark::State& state) {
d = 0.0;
v = 1234.0;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
d += logb(v);
}
+}
+BENCHMARK(BM_math_logb);
- StopBenchmarkTiming();
+static void BM_math_isfinite_macro(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += isfinite(v);
+ }
+ SetLabel(state);
}
+BENCHMARK_COMMON_VALS(BM_math_isfinite_macro);
+
+#if defined(__BIONIC__)
+#define test_isfinite __isfinite
+#else
+#define test_isfinite __finite
+#endif
+static void BM_math_isfinite(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += test_isfinite(v);
+ }
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_isfinite);
-BENCHMARK_WITH_ARG(BM_math_isinf, double)->AT_COMMON_VALS;
-void BM_math_isinf::Run(int iters, double value) {
- StartBenchmarkTiming();
+static void BM_math_isinf_macro(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += isinf(v);
+ }
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_isinf_macro);
+static void BM_math_isinf(benchmark::State& state) {
d = 0.0;
- v = value;
- for (int i = 0; i < iters; ++i) {
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
d += (isinf)(v);
}
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_isinf);
- StopBenchmarkTiming();
+static void BM_math_isnan_macro(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += isnan(v);
+ }
+ SetLabel(state);
}
+BENCHMARK_COMMON_VALS(BM_math_isnan_macro);
-BENCHMARK_NO_ARG(BM_math_sin_fast);
-void BM_math_sin_fast::Run(int iters) {
- StartBenchmarkTiming();
+static void BM_math_isnan(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += (isnan)(v);
+ }
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_isnan);
- d = 1.0;
- for (int i = 0; i < iters; ++i) {
- d += sin(d);
+static void BM_math_isnormal_macro(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += isnormal(v);
}
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_isnormal_macro);
- StopBenchmarkTiming();
+#if defined(__BIONIC__)
+static void BM_math_isnormal(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += (__isnormal)(v);
+ }
+ SetLabel(state);
}
+BENCHMARK_COMMON_VALS(BM_math_isnormal);
+#endif
-BENCHMARK_NO_ARG(BM_math_sin_feupdateenv);
-void BM_math_sin_feupdateenv::Run(int iters) {
- StartBenchmarkTiming();
+static void BM_math_sin_fast(benchmark::State& state) {
+ d = 1.0;
+ while (state.KeepRunning()) {
+ d += sin(d);
+ }
+}
+BENCHMARK(BM_math_sin_fast);
+static void BM_math_sin_feupdateenv(benchmark::State& state) {
d = 1.0;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
fenv_t __libc_save_rm;
feholdexcept(&__libc_save_rm);
fesetround(FE_TONEAREST);
d += sin(d);
feupdateenv(&__libc_save_rm);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_math_sin_feupdateenv);
-BENCHMARK_NO_ARG(BM_math_sin_fesetenv);
-void BM_math_sin_fesetenv::Run(int iters) {
- StartBenchmarkTiming();
-
+static void BM_math_sin_fesetenv(benchmark::State& state) {
d = 1.0;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
fenv_t __libc_save_rm;
feholdexcept(&__libc_save_rm);
fesetround(FE_TONEAREST);
d += sin(d);
fesetenv(&__libc_save_rm);
}
+}
+BENCHMARK(BM_math_sin_fesetenv);
- StopBenchmarkTiming();
+static void BM_math_fpclassify(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += fpclassify(v);
+ }
+ SetLabel(state);
}
+BENCHMARK_COMMON_VALS(BM_math_fpclassify);
-BENCHMARK_WITH_ARG(BM_math_fpclassify, double)->AT_COMMON_VALS;
-void BM_math_fpclassify::Run(int iters, double value) {
- StartBenchmarkTiming();
+static void BM_math_signbit_macro(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += signbit(v);
+ }
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_signbit_macro);
+static void BM_math_signbit(benchmark::State& state) {
d = 0.0;
- v = value;
- for (int i = 0; i < iters; ++i) {
- d += fpclassify(v);
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += (__signbit)(v);
+ }
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_signbit);
+
+static void BM_math_fabs_macro(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += fabs(v);
}
+ SetLabel(state);
+}
+BENCHMARK_COMMON_VALS(BM_math_fabs_macro);
- StopBenchmarkTiming();
+static void BM_math_fabs(benchmark::State& state) {
+ d = 0.0;
+ v = values[state.range_x()];
+ while (state.KeepRunning()) {
+ d += (fabs)(v);
+ }
+ SetLabel(state);
}
+BENCHMARK_COMMON_VALS(BM_math_fabs);
diff --git a/benchmarks/property_benchmark.cpp b/benchmarks/property_benchmark.cpp
index 944cd6849..2f72d60bc 100644
--- a/benchmarks/property_benchmark.cpp
+++ b/benchmarks/property_benchmark.cpp
@@ -26,7 +26,7 @@
#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
#include <sys/_system_properties.h>
-#include <benchmark/Benchmark.h>
+#include <benchmark/benchmark.h>
extern void* __system_property_area__;
@@ -126,7 +126,8 @@ struct LocalPropertyTestState {
delete[] values;
delete[] value_lens;
}
-public:
+
+ public:
const int nprops;
char** names;
int* name_lens;
@@ -134,100 +135,79 @@ public:
int* value_lens;
bool valid;
-private:
+ private:
std::string pa_dirname;
std::string pa_filename;
void* old_pa;
};
-BENCHMARK_WITH_ARG(BM_property_get, int)->TEST_NUM_PROPS;
-void BM_property_get::Run(int iters, int nprops) {
- StopBenchmarkTiming();
+static void BM_property_get(benchmark::State& state) {
+ const size_t nprops = state.range_x();
LocalPropertyTestState pa(nprops);
- char value[PROP_VALUE_MAX];
-
- if (!pa.valid)
- return;
-
- srandom(iters * nprops);
+ if (!pa.valid) return;
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; i++) {
+ while (state.KeepRunning()) {
+ char value[PROP_VALUE_MAX];
__system_property_get(pa.names[random() % nprops], value);
}
- StopBenchmarkTiming();
}
+BENCHMARK(BM_property_get)->TEST_NUM_PROPS;
-BENCHMARK_WITH_ARG(BM_property_find, int)->TEST_NUM_PROPS;
-void BM_property_find::Run(int iters, int nprops) {
- StopBenchmarkTiming();
+static void BM_property_find(benchmark::State& state) {
+ const size_t nprops = state.range_x();
LocalPropertyTestState pa(nprops);
+ if (!pa.valid) return;
- if (!pa.valid)
- return;
-
- srandom(iters * nprops);
-
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; i++) {
+ while (state.KeepRunning()) {
__system_property_find(pa.names[random() % nprops]);
}
- StopBenchmarkTiming();
}
+BENCHMARK(BM_property_find)->TEST_NUM_PROPS;
-BENCHMARK_WITH_ARG(BM_property_read, int)->TEST_NUM_PROPS;
-void BM_property_read::Run(int iters, int nprops) {
- StopBenchmarkTiming();
+static void BM_property_read(benchmark::State& state) {
+ const size_t nprops = state.range_x();
LocalPropertyTestState pa(nprops);
+ if (!pa.valid) return;
- if (!pa.valid)
- return;
-
- srandom(iters * nprops);
- const prop_info** pinfo = new const prop_info*[iters];
+ const prop_info** pinfo = new const prop_info*[nprops];
char propvalue[PROP_VALUE_MAX];
- for (int i = 0; i < iters; i++) {
+ for (size_t i = 0; i < nprops; ++i) {
pinfo[i] = __system_property_find(pa.names[random() % nprops]);
}
- StartBenchmarkTiming();
- for (int i = 0; i < iters; i++) {
+ size_t i = 0;
+ while (state.KeepRunning()) {
__system_property_read(pinfo[i], 0, propvalue);
+ i = (i + 1) % nprops;
}
- StopBenchmarkTiming();
delete[] pinfo;
}
+BENCHMARK(BM_property_read)->TEST_NUM_PROPS;
-BENCHMARK_WITH_ARG(BM_property_serial, int)->TEST_NUM_PROPS;
-void BM_property_serial::Run(int iters, int nprops) {
- StopBenchmarkTiming();
+static void BM_property_serial(benchmark::State& state) {
+ const size_t nprops = state.range_x();
LocalPropertyTestState pa(nprops);
+ if (!pa.valid) return;
- if (!pa.valid)
- return;
-
- srandom(iters * nprops);
- const prop_info** pinfo = new const prop_info*[iters];
-
- for (int i = 0; i < iters; i++) {
+ const prop_info** pinfo = new const prop_info*[nprops];
+ for (size_t i = 0; i < nprops; ++i) {
pinfo[i] = __system_property_find(pa.names[random() % nprops]);
}
- StartBenchmarkTiming();
- for (int i = 0; i < iters; i++) {
+ size_t i = 0;
+ while (state.KeepRunning()) {
__system_property_serial(pinfo[i]);
+ i = (i + 1) % nprops;
}
- StopBenchmarkTiming();
delete[] pinfo;
}
+BENCHMARK(BM_property_serial)->TEST_NUM_PROPS;
#endif // __BIONIC__
diff --git a/benchmarks/pthread_benchmark.cpp b/benchmarks/pthread_benchmark.cpp
index ad31e7e8c..bf4d6cb6e 100644
--- a/benchmarks/pthread_benchmark.cpp
+++ b/benchmarks/pthread_benchmark.cpp
@@ -16,218 +16,178 @@
#include <pthread.h>
-#include <benchmark/Benchmark.h>
+#include <benchmark/benchmark.h>
// Stop GCC optimizing out our pure function.
/* Must not be static! */ pthread_t (*pthread_self_fp)() = pthread_self;
-BENCHMARK_NO_ARG(BM_pthread_self);
-void BM_pthread_self::Run(int iters) {
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; ++i) {
+static void BM_pthread_self(benchmark::State& state) {
+ while (state.KeepRunning()) {
pthread_self_fp();
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_pthread_self);
-BENCHMARK_NO_ARG(BM_pthread_getspecific);
-void BM_pthread_getspecific::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_getspecific(benchmark::State& state) {
pthread_key_t key;
pthread_key_create(&key, NULL);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_getspecific(key);
}
- StopBenchmarkTiming();
pthread_key_delete(key);
}
+BENCHMARK(BM_pthread_getspecific);
-BENCHMARK_NO_ARG(BM_pthread_setspecific);
-void BM_pthread_setspecific::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_setspecific(benchmark::State& state) {
pthread_key_t key;
pthread_key_create(&key, NULL);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_setspecific(key, NULL);
}
- StopBenchmarkTiming();
pthread_key_delete(key);
}
+BENCHMARK(BM_pthread_setspecific);
static void DummyPthreadOnceInitFunction() {
}
-BENCHMARK_NO_ARG(BM_pthread_once);
-void BM_pthread_once::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_once(benchmark::State& state) {
pthread_once_t once = PTHREAD_ONCE_INIT;
pthread_once(&once, DummyPthreadOnceInitFunction);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_once(&once, DummyPthreadOnceInitFunction);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_pthread_once);
-BENCHMARK_NO_ARG(BM_pthread_mutex_lock);
-void BM_pthread_mutex_lock::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_mutex_lock(benchmark::State& state) {
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_pthread_mutex_lock);
-BENCHMARK_NO_ARG(BM_pthread_mutex_lock_ERRORCHECK);
-void BM_pthread_mutex_lock_ERRORCHECK::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_mutex_lock_ERRORCHECK(benchmark::State& state) {
pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_pthread_mutex_lock_ERRORCHECK);
-BENCHMARK_NO_ARG(BM_pthread_mutex_lock_RECURSIVE);
-void BM_pthread_mutex_lock_RECURSIVE::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_mutex_lock_RECURSIVE(benchmark::State& state) {
pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_pthread_mutex_lock_RECURSIVE);
-BENCHMARK_NO_ARG(BM_pthread_rwlock_read);
-void BM_pthread_rwlock_read::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_rwlock_read(benchmark::State& state) {
pthread_rwlock_t lock;
pthread_rwlock_init(&lock, NULL);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_rwlock_rdlock(&lock);
pthread_rwlock_unlock(&lock);
}
- StopBenchmarkTiming();
pthread_rwlock_destroy(&lock);
}
+BENCHMARK(BM_pthread_rwlock_read);
-BENCHMARK_NO_ARG(BM_pthread_rwlock_write);
-void BM_pthread_rwlock_write::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_pthread_rwlock_write(benchmark::State& state) {
pthread_rwlock_t lock;
pthread_rwlock_init(&lock, NULL);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
pthread_rwlock_wrlock(&lock);
pthread_rwlock_unlock(&lock);
}
- StopBenchmarkTiming();
pthread_rwlock_destroy(&lock);
}
+BENCHMARK(BM_pthread_rwlock_write);
static void* IdleThread(void*) {
return NULL;
}
-BENCHMARK_NO_ARG(BM_pthread_create);
-void BM_pthread_create::Run(int iters) {
- StopBenchmarkTiming();
- pthread_t thread;
-
- for (int i = 0; i < iters; ++i) {
- StartBenchmarkTiming();
+static void BM_pthread_create(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ pthread_t thread;
pthread_create(&thread, NULL, IdleThread, NULL);
- StopBenchmarkTiming();
+ state.PauseTiming();
pthread_join(thread, NULL);
+ state.ResumeTiming();
}
}
+BENCHMARK(BM_pthread_create);
static void* RunThread(void* arg) {
- ::testing::Benchmark* benchmark = reinterpret_cast<::testing::Benchmark*>(arg);
- benchmark->StopBenchmarkTiming();
+ benchmark::State& state = *reinterpret_cast<benchmark::State*>(arg);
+ state.PauseTiming();
return NULL;
}
-BENCHMARK_NO_ARG(BM_pthread_create_and_run);
-void BM_pthread_create_and_run::Run(int iters) {
- StopBenchmarkTiming();
- pthread_t thread;
-
- for (int i = 0; i < iters; ++i) {
- StartBenchmarkTiming();
- pthread_create(&thread, NULL, RunThread, this);
+static void BM_pthread_create_and_run(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ pthread_t thread;
+ pthread_create(&thread, NULL, RunThread, &state);
pthread_join(thread, NULL);
+ state.ResumeTiming();
}
}
+BENCHMARK(BM_pthread_create_and_run);
static void* ExitThread(void* arg) {
- ::testing::Benchmark* benchmark = reinterpret_cast<::testing::Benchmark*>(arg);
- benchmark->StartBenchmarkTiming();
+ benchmark::State& state = *reinterpret_cast<benchmark::State*>(arg);
+ state.ResumeTiming();
pthread_exit(NULL);
}
-BENCHMARK_NO_ARG(BM_pthread_exit_and_join);
-void BM_pthread_exit_and_join::Run(int iters) {
- StopBenchmarkTiming();
- pthread_t thread;
-
- for (int i = 0; i < iters; ++i) {
- pthread_create(&thread, NULL, ExitThread, this);
+static void BM_pthread_exit_and_join(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ state.PauseTiming();
+ pthread_t thread;
+ pthread_create(&thread, NULL, ExitThread, &state);
pthread_join(thread, NULL);
- StopBenchmarkTiming();
}
}
+BENCHMARK(BM_pthread_exit_and_join);
-BENCHMARK_NO_ARG(BM_pthread_key_create);
-void BM_pthread_key_create::Run(int iters) {
- StopBenchmarkTiming();
- pthread_key_t key;
-
- for (int i = 0; i < iters; ++i) {
- StartBenchmarkTiming();
+static void BM_pthread_key_create(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ pthread_key_t key;
pthread_key_create(&key, NULL);
- StopBenchmarkTiming();
+
+ state.PauseTiming();
pthread_key_delete(key);
+ state.ResumeTiming();
}
}
+BENCHMARK(BM_pthread_key_create);
-BENCHMARK_NO_ARG(BM_pthread_key_delete);
-void BM_pthread_key_delete::Run(int iters) {
- StopBenchmarkTiming();
- pthread_key_t key;
-
- for (int i = 0; i < iters; ++i) {
+static void BM_pthread_key_delete(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ state.PauseTiming();
+ pthread_key_t key;
pthread_key_create(&key, NULL);
- StartBenchmarkTiming();
+ state.ResumeTiming();
+
pthread_key_delete(key);
- StopBenchmarkTiming();
}
}
+BENCHMARK(BM_pthread_key_delete);
diff --git a/benchmarks/semaphore_benchmark.cpp b/benchmarks/semaphore_benchmark.cpp
index 8dd56849d..d2608032b 100644
--- a/benchmarks/semaphore_benchmark.cpp
+++ b/benchmarks/semaphore_benchmark.cpp
@@ -18,101 +18,112 @@
#include <semaphore.h>
#include <stdatomic.h>
#include <stdio.h>
+#include <stdlib.h>
-#include <benchmark/Benchmark.h>
+#include <benchmark/benchmark.h>
-BENCHMARK_NO_ARG(BM_semaphore_sem_getvalue);
-void BM_semaphore_sem_getvalue::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_semaphore_sem_getvalue(benchmark::State& state) {
sem_t semaphore;
sem_init(&semaphore, 1, 1);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
int dummy;
sem_getvalue(&semaphore, &dummy);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_semaphore_sem_getvalue);
-BENCHMARK_NO_ARG(BM_semaphore_sem_wait_sem_post);
-void BM_semaphore_sem_wait_sem_post::Run(int iters) {
- StopBenchmarkTiming();
+static void BM_semaphore_sem_wait_sem_post(benchmark::State& state) {
sem_t semaphore;
sem_init(&semaphore, 1, 1);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
sem_wait(&semaphore);
sem_post(&semaphore);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_semaphore_sem_wait_sem_post);
+
+// This test reports the overhead of the underlying futex wake syscall on
+// the producer. It does not report the overhead from issuing the wake to the
+// point where the posted consumer thread wakes up. It suffers from
+// clock_gettime syscall overhead. Lock the CPU speed for consistent results
+// as we may not reach >50% cpu utilization.
+//
+// We will run a background thread that catches the sem_post wakeup and
+// loops immediately returning back to sleep in sem_wait for the next one. This
+// thread is run with policy SCHED_OTHER (normal policy), a middle policy.
+//
+// The primary thread will run at SCHED_IDLE (lowest priority policy) when
+// monitoring the background thread to detect when it hits sem_wait sleep. It
+// will do so with no clock running. Once we are ready, we will switch to
+// SCHED_FIFO (highest priority policy) to time the act of running sem_post
+// with the benchmark clock running. This ensures nothing else in the system
+// can preempt our timed activity, including the background thread. We are
+// also protected with the scheduling policy of letting a process hit a
+// resource limit rather than get hit with a context switch.
+//
+// The background thread will start executing either on another CPU, or
+// after we back down from SCHED_FIFO, but certainly not in the context of
+// the timing of the sem_post.
-/*
- * This test reports the overhead of the underlying futex wake syscall on
- * the producer. It does not report the overhead from issuing the wake to the
- * point where the posted consumer thread wakes up. It suffers from
- * clock_gettime syscall overhead. Lock the CPU speed for consistent results
- * as we may not reach >50% cpu utilization.
- *
- * We will run a background thread that catches the sem_post wakeup and
- * loops immediately returning back to sleep in sem_wait for the next one. This
- * thread is run with policy SCHED_OTHER (normal policy), a middle policy.
- *
- * The primary thread will run at SCHED_IDLE (lowest priority policy) when
- * monitoring the background thread to detect when it hits sem_wait sleep. It
- * will do so with no clock running. Once we are ready, we will switch to
- * SCHED_FIFO (highest priority policy) to time the act of running sem_post
- * with the benchmark clock running. This ensures nothing else in the system
- * can preempt our timed activity, including the background thread. We are
- * also protected with the scheduling policy of letting a process hit a
- * resource limit rather than get hit with a context switch.
- *
- * The background thread will start executing either on another CPU, or
- * after we back down from SCHED_FIFO, but certainly not in the context of
- * the timing of the sem_post.
- */
static atomic_int BM_semaphore_sem_post_running;
-static void *BM_semaphore_sem_post_start_thread(void *obj) {
- sem_t *semaphore = reinterpret_cast<sem_t *>(obj);
-
- while ((BM_semaphore_sem_post_running > 0) && !sem_wait(semaphore)) {
- ;
- }
- BM_semaphore_sem_post_running = -1;
- return NULL;
+static void* BM_semaphore_sem_post_start_thread(void* arg) {
+ sem_t* semaphore = reinterpret_cast<sem_t*>(arg);
+ while ((BM_semaphore_sem_post_running > 0) && !sem_wait(semaphore)) {
+ }
+ BM_semaphore_sem_post_running = -1;
+ return NULL;
}
-BENCHMARK_NO_ARG(BM_semaphore_sem_post);
-void BM_semaphore_sem_post::Run(int iters) {
- StopBenchmarkTiming();
+class SemaphoreFixture : public benchmark::Fixture {
+ public:
+ void SetUp(const benchmark::State&) {
+ sem_init(&semaphore, 0, 0);
+
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+
+ memset(&param, 0, sizeof(param));
+ pthread_attr_setschedparam(&attr, &param);
+ pthread_attr_setschedpolicy(&attr, SCHED_OTHER);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ pthread_t pthread;
+ pthread_create(&pthread, &attr, BM_semaphore_sem_post_start_thread, &semaphore);
+ pthread_attr_destroy(&attr);
+
+ sched_setscheduler(0, SCHED_IDLE, &param);
+
+ BM_semaphore_sem_post_running = 1;
+ }
+
+ ~SemaphoreFixture() {
+ sched_setscheduler(0, SCHED_OTHER, &param);
+
+ if (BM_semaphore_sem_post_running > 0) {
+ BM_semaphore_sem_post_running = 0;
+ }
+ do {
+ sem_post(&semaphore);
+ sched_yield();
+ } while (BM_semaphore_sem_post_running != -1);
+ }
sem_t semaphore;
- sem_init(&semaphore, 0, 0);
-
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- BM_semaphore_sem_post_running = 1;
- struct sched_param param = { 0, };
- pthread_attr_setschedparam(&attr, &param);
- pthread_attr_setschedpolicy(&attr, SCHED_OTHER);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_t pthread;
- pthread_create(&pthread, &attr, BM_semaphore_sem_post_start_thread, &semaphore);
- pthread_attr_destroy(&attr);
-
- sched_setscheduler((pid_t)0, SCHED_IDLE, &param);
- for (int i = 0; i < iters; ++i) {
+ sched_param param;
+};
+
+BENCHMARK_F(SemaphoreFixture, semaphore_sem_post)(benchmark::State& state) {
+ while (state.KeepRunning()) {
+ state.PauseTiming();
+
int trys = 3, dummy = 0;
do {
if (BM_semaphore_sem_post_running < 0) {
- sched_setscheduler((pid_t)0, SCHED_OTHER, &param);
+ sched_setscheduler(0, SCHED_OTHER, &param);
fprintf(stderr, "BM_semaphore_sem_post: start_thread died unexpectedly\n");
- return;
+ abort();
}
sched_yield();
sem_getvalue(&semaphore, &dummy);
@@ -123,21 +134,14 @@ void BM_semaphore_sem_post::Run(int iters) {
--trys;
}
} while (trys);
+
param.sched_priority = 1;
- sched_setscheduler((pid_t)0, SCHED_FIFO, &param);
- StartBenchmarkTiming();
+ sched_setscheduler(0, SCHED_FIFO, &param);
+
+ state.ResumeTiming();
sem_post(&semaphore);
- StopBenchmarkTiming(); // Remember to subtract clock syscall overhead
- param.sched_priority = 0;
- sched_setscheduler((pid_t)0, SCHED_IDLE, &param);
- }
- sched_setscheduler((pid_t)0, SCHED_OTHER, &param);
- if (BM_semaphore_sem_post_running > 0) {
- BM_semaphore_sem_post_running = 0;
+ param.sched_priority = 0;
+ sched_setscheduler(0, SCHED_IDLE, &param);
}
- do {
- sem_post(&semaphore);
- sched_yield();
- } while (!BM_semaphore_sem_post_running);
}
diff --git a/benchmarks/stdio_benchmark.cpp b/benchmarks/stdio_benchmark.cpp
index 342e56154..cc07128d4 100644
--- a/benchmarks/stdio_benchmark.cpp
+++ b/benchmarks/stdio_benchmark.cpp
@@ -16,8 +16,9 @@
#include <stdio.h>
#include <stdio_ext.h>
+#include <stdlib.h>
-#include <benchmark/Benchmark.h>
+#include <benchmark/benchmark.h>
#define KB 1024
#define MB 1024*KB
@@ -27,67 +28,62 @@
Arg(1*KB)->Arg(4*KB)->Arg(8*KB)->Arg(16*KB)->Arg(64*KB)
template <typename Fn>
-void ReadWriteTest(::testing::Benchmark* benchmark, int iters, int chunk_size, Fn f, bool buffered) {
- benchmark->StopBenchmarkTiming();
+void ReadWriteTest(benchmark::State& state, Fn f, bool buffered) {
+ size_t chunk_size = state.range_x();
+
FILE* fp = fopen("/dev/zero", "rw");
__fsetlocking(fp, FSETLOCKING_BYCALLER);
char* buf = new char[chunk_size];
- benchmark->StartBenchmarkTiming();
if (!buffered) {
setvbuf(fp, 0, _IONBF, 0);
}
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
f(buf, chunk_size, 1, fp);
}
- benchmark->StopBenchmarkTiming();
- benchmark->SetBenchmarkBytesProcessed(int64_t(iters) * int64_t(chunk_size));
+ state.SetBytesProcessed(int64_t(state.iterations()) * int64_t(chunk_size));
delete[] buf;
fclose(fp);
}
-BENCHMARK_WITH_ARG(BM_stdio_fread, int)->AT_COMMON_SIZES;
-void BM_stdio_fread::Run(int iters, int chunk_size) {
- ReadWriteTest(this, iters, chunk_size, fread, true);
+void BM_stdio_fread(benchmark::State& state) {
+ ReadWriteTest(state, fread, true);
}
+BENCHMARK(BM_stdio_fread)->AT_COMMON_SIZES;
-BENCHMARK_WITH_ARG(BM_stdio_fwrite, int)->AT_COMMON_SIZES;
-void BM_stdio_fwrite::Run(int iters, int chunk_size) {
- ReadWriteTest(this, iters, chunk_size, fwrite, true);
+void BM_stdio_fwrite(benchmark::State& state) {
+ ReadWriteTest(state, fwrite, true);
}
+BENCHMARK(BM_stdio_fwrite)->AT_COMMON_SIZES;
-BENCHMARK_WITH_ARG(BM_stdio_fread_unbuffered, int)->AT_COMMON_SIZES;
-void BM_stdio_fread_unbuffered::Run(int iters, int chunk_size) {
- ReadWriteTest(this, iters, chunk_size, fread, false);
+void BM_stdio_fread_unbuffered(benchmark::State& state) {
+ ReadWriteTest(state, fread, false);
}
+BENCHMARK(BM_stdio_fread_unbuffered)->AT_COMMON_SIZES;
-BENCHMARK_WITH_ARG(BM_stdio_fwrite_unbuffered, int)->AT_COMMON_SIZES;
-void BM_stdio_fwrite_unbuffered::Run(int iters, int chunk_size) {
- ReadWriteTest(this, iters, chunk_size, fwrite, false);
+void BM_stdio_fwrite_unbuffered(benchmark::State& state) {
+ ReadWriteTest(state, fwrite, false);
}
+BENCHMARK(BM_stdio_fwrite_unbuffered)->AT_COMMON_SIZES;
-static void FopenFgetsFclose(int iters, bool no_locking) {
+static void FopenFgetsFclose(benchmark::State& state, bool no_locking) {
char buf[1024];
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
FILE* fp = fopen("/proc/version", "re");
if (no_locking) __fsetlocking(fp, FSETLOCKING_BYCALLER);
- fgets(buf, sizeof(buf), fp);
+ if (fgets(buf, sizeof(buf), fp) == nullptr) abort();
fclose(fp);
}
}
-BENCHMARK_NO_ARG(BM_stdio_fopen_fgets_fclose_locking);
-void BM_stdio_fopen_fgets_fclose_locking::Run(int iters) {
- StartBenchmarkTiming();
- FopenFgetsFclose(iters, false);
- StopBenchmarkTiming();
+static void BM_stdio_fopen_fgets_fclose_locking(benchmark::State& state) {
+ FopenFgetsFclose(state, false);
}
+BENCHMARK(BM_stdio_fopen_fgets_fclose_locking);
-BENCHMARK_NO_ARG(BM_stdio_fopen_fgets_fclose_no_locking);
-void BM_stdio_fopen_fgets_fclose_no_locking::Run(int iters) {
- StartBenchmarkTiming();
- FopenFgetsFclose(iters, true);
- StopBenchmarkTiming();
+void BM_stdio_fopen_fgets_fclose_no_locking(benchmark::State& state) {
+ FopenFgetsFclose(state, true);
}
+BENCHMARK(BM_stdio_fopen_fgets_fclose_no_locking);
diff --git a/benchmarks/string_benchmark.cpp b/benchmarks/string_benchmark.cpp
index 866aa0047..c04409d5d 100644
--- a/benchmarks/string_benchmark.cpp
+++ b/benchmarks/string_benchmark.cpp
@@ -17,7 +17,7 @@
#include <stdint.h>
#include <string.h>
-#include <benchmark/Benchmark.h>
+#include <benchmark/benchmark.h>
#define KB 1024
#define MB 1024*KB
@@ -27,87 +27,77 @@
// TODO: test unaligned operation too? (currently everything will be 8-byte aligned by malloc.)
-BENCHMARK_WITH_ARG(BM_string_memcmp, int)->AT_COMMON_SIZES;
-void BM_string_memcmp::Run(int iters, int nbytes) {
- StopBenchmarkTiming();
+static void BM_string_memcmp(benchmark::State& state) {
+ const size_t nbytes = state.range_x();
char* src = new char[nbytes]; char* dst = new char[nbytes];
memset(src, 'x', nbytes);
memset(dst, 'x', nbytes);
- StartBenchmarkTiming();
volatile int c __attribute__((unused)) = 0;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
c += memcmp(dst, src, nbytes);
}
- StopBenchmarkTiming();
- SetBenchmarkBytesProcessed(uint64_t(iters) * uint64_t(nbytes));
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
delete[] src;
delete[] dst;
}
+BENCHMARK(BM_string_memcmp)->AT_COMMON_SIZES;
-BENCHMARK_WITH_ARG(BM_string_memcpy, int)->AT_COMMON_SIZES;
-void BM_string_memcpy::Run(int iters, int nbytes) {
- StopBenchmarkTiming();
+static void BM_string_memcpy(benchmark::State& state) {
+ const size_t nbytes = state.range_x();
char* src = new char[nbytes]; char* dst = new char[nbytes];
memset(src, 'x', nbytes);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
memcpy(dst, src, nbytes);
}
- StopBenchmarkTiming();
- SetBenchmarkBytesProcessed(uint64_t(iters) * uint64_t(nbytes));
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
delete[] src;
delete[] dst;
}
+BENCHMARK(BM_string_memcpy)->AT_COMMON_SIZES;
-BENCHMARK_WITH_ARG(BM_string_memmove, int)->AT_COMMON_SIZES;
-void BM_string_memmove::Run(int iters, int nbytes) {
- StopBenchmarkTiming();
+static void BM_string_memmove(benchmark::State& state) {
+ const size_t nbytes = state.range_x();
char* buf = new char[nbytes + 64];
memset(buf, 'x', nbytes + 64);
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
memmove(buf, buf + 1, nbytes); // Worst-case overlap.
}
- StopBenchmarkTiming();
- SetBenchmarkBytesProcessed(uint64_t(iters) * uint64_t(nbytes));
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
delete[] buf;
}
+BENCHMARK(BM_string_memmove)->AT_COMMON_SIZES;
-BENCHMARK_WITH_ARG(BM_string_memset, int)->AT_COMMON_SIZES;
-void BM_string_memset::Run(int iters, int nbytes) {
- StopBenchmarkTiming();
+static void BM_string_memset(benchmark::State& state) {
+ const size_t nbytes = state.range_x();
char* dst = new char[nbytes];
- StartBenchmarkTiming();
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
memset(dst, 0, nbytes);
}
- StopBenchmarkTiming();
- SetBenchmarkBytesProcessed(uint64_t(iters) * uint64_t(nbytes));
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
delete[] dst;
}
+BENCHMARK(BM_string_memset)->AT_COMMON_SIZES;
-BENCHMARK_WITH_ARG(BM_string_strlen, int)->AT_COMMON_SIZES;
-void BM_string_strlen::Run(int iters, int nbytes) {
- StopBenchmarkTiming();
+static void BM_string_strlen(benchmark::State& state) {
+ const size_t nbytes = state.range_x();
char* s = new char[nbytes];
memset(s, 'x', nbytes);
s[nbytes - 1] = 0;
- StartBenchmarkTiming();
volatile int c __attribute__((unused)) = 0;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
c += strlen(s);
}
- StopBenchmarkTiming();
- SetBenchmarkBytesProcessed(uint64_t(iters) * uint64_t(nbytes));
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
delete[] s;
}
+BENCHMARK(BM_string_strlen)->AT_COMMON_SIZES;
diff --git a/benchmarks/time_benchmark.cpp b/benchmarks/time_benchmark.cpp
index 6688bbc57..4a5c2da98 100644
--- a/benchmarks/time_benchmark.cpp
+++ b/benchmarks/time_benchmark.cpp
@@ -17,64 +17,45 @@
#include <sys/syscall.h>
#include <sys/time.h>
#include <time.h>
+#include <unistd.h>
-#include <benchmark/Benchmark.h>
-
-BENCHMARK_NO_ARG(BM_time_clock_gettime);
-void BM_time_clock_gettime::Run(int iters) {
- StartBenchmarkTiming();
+#include <benchmark/benchmark.h>
+static void BM_time_clock_gettime(benchmark::State& state) {
timespec t;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
clock_gettime(CLOCK_MONOTONIC, &t);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_time_clock_gettime);
-BENCHMARK_NO_ARG(BM_time_clock_gettime_syscall);
-void BM_time_clock_gettime_syscall::Run(int iters) {
- StartBenchmarkTiming();
-
+static void BM_time_clock_gettime_syscall(benchmark::State& state) {
timespec t;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
syscall(__NR_clock_gettime, CLOCK_MONOTONIC, &t);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_time_clock_gettime_syscall);
-BENCHMARK_NO_ARG(BM_time_gettimeofday);
-void BM_time_gettimeofday::Run(int iters) {
- StartBenchmarkTiming();
-
+static void BM_time_gettimeofday(benchmark::State& state) {
timeval tv;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
gettimeofday(&tv, NULL);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_time_gettimeofday);
-BENCHMARK_NO_ARG(BM_time_gettimeofday_syscall);
-void BM_time_gettimeofday_syscall::Run(int iters) {
- StartBenchmarkTiming();
-
+void BM_time_gettimeofday_syscall(benchmark::State& state) {
timeval tv;
- for (int i = 0; i < iters; ++i) {
+ while (state.KeepRunning()) {
syscall(__NR_gettimeofday, &tv, NULL);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_time_gettimeofday_syscall);
-BENCHMARK_NO_ARG(BM_time_time);
-void BM_time_time::Run(int iters) {
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; ++i) {
+void BM_time_time(benchmark::State& state) {
+ while (state.KeepRunning()) {
time(NULL);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_time_time);
diff --git a/benchmarks/unistd_benchmark.cpp b/benchmarks/unistd_benchmark.cpp
index 09ca0e6bf..b78d3eb61 100644
--- a/benchmarks/unistd_benchmark.cpp
+++ b/benchmarks/unistd_benchmark.cpp
@@ -17,55 +17,41 @@
#include <sys/syscall.h>
#include <unistd.h>
-#include <benchmark/Benchmark.h>
+#include <benchmark/benchmark.h>
-BENCHMARK_NO_ARG(BM_unistd_getpid);
-void BM_unistd_getpid::Run(int iters) {
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; ++i) {
+static void BM_unistd_getpid(benchmark::State& state) {
+ while (state.KeepRunning()) {
getpid();
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_unistd_getpid);
-BENCHMARK_NO_ARG(BM_unistd_getpid_syscall);
-void BM_unistd_getpid_syscall::Run(int iters) {
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; ++i) {
+static void BM_unistd_getpid_syscall(benchmark::State& state) {
+ while (state.KeepRunning()) {
syscall(__NR_getpid);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_unistd_getpid_syscall);
#if defined(__BIONIC__)
// Stop GCC optimizing out our pure function.
/* Must not be static! */ pid_t (*gettid_fp)() = gettid;
-BENCHMARK_NO_ARG(BM_unistd_gettid);
-void BM_unistd_gettid::Run(int iters) {
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; ++i) {
+static void BM_unistd_gettid(benchmark::State& state) {
+ while (state.KeepRunning()) {
gettid_fp();
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_unistd_gettid);
#endif
-BENCHMARK_NO_ARG(BM_unistd_gettid_syscall);
-void BM_unistd_gettid_syscall::Run(int iters) {
- StartBenchmarkTiming();
-
- for (int i = 0; i < iters; ++i) {
+void BM_unistd_gettid_syscall(benchmark::State& state) {
+ while (state.KeepRunning()) {
syscall(__NR_gettid);
}
-
- StopBenchmarkTiming();
}
+BENCHMARK(BM_unistd_gettid_syscall);
+
+BENCHMARK_MAIN()
diff --git a/benchmarks/utils.cpp b/benchmarks/utils.cpp
deleted file mode 100644
index 863b9db13..000000000
--- a/benchmarks/utils.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <inttypes.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include <string>
-
-#include "utils.h"
-
-int Round(int n) {
- int base = 1;
- while (base*10 < n) {
- base *= 10;
- }
- if (n < 2*base) {
- return 2*base;
- }
- if (n < 5*base) {
- return 5*base;
- }
- return 10*base;
-}
-
-// Similar to the code in art, but supporting both binary and decimal prefixes.
-std::string PrettyInt(long value, size_t base) {
- if (base != 2 && base != 10) abort();
-
- uint64_t count = static_cast<uint64_t>(value);
- bool negative_number = false;
- if (value < 0) {
- negative_number = true;
- count = static_cast<uint64_t>(-value);
- }
-
- // The byte thresholds at which we display amounts. A count is displayed
- // in unit U when kUnitThresholds[U] <= bytes < kUnitThresholds[U+1].
- static const uint64_t kUnitThresholds2[] = {
- 1024*1024*1024 /* Gi */, 2*1024*1024 /* Mi */, 3*1024 /* Ki */, 0,
- };
- static const uint64_t kUnitThresholds10[] = {
- 1000*1000*1000 /* G */, 2*1000*1000 /* M */, 3*1000 /* k */, 0,
- };
- static const uint64_t kAmountPerUnit2[] = { 1024*1024*1024, 1024*1024, 1024, 1 };
- static const uint64_t kAmountPerUnit10[] = { 1000*1000*1000, 1000*1000, 1000, 1 };
- static const char* const kUnitStrings2[] = { "Gi", "Mi", "Ki", "" };
- static const char* const kUnitStrings10[] = { "G", "M", "k", "" };
-
- // Which set are we using?
- const uint64_t* kUnitThresholds = ((base == 2) ? kUnitThresholds2 : kUnitThresholds10);
- const uint64_t* kAmountPerUnit = ((base == 2) ? kAmountPerUnit2 : kAmountPerUnit10);
- const char* const* kUnitStrings = ((base == 2) ? kUnitStrings2 : kUnitStrings10);
-
- size_t i = 0;
- for (; kUnitThresholds[i] != 0; ++i) {
- if (count >= kUnitThresholds[i]) {
- break;
- }
- }
- char* s = NULL;
- asprintf(&s, "%s%" PRId64 "%s", (negative_number ? "-" : ""),
- count / kAmountPerUnit[i], kUnitStrings[i]);
- std::string result(s);
- free(s);
- return result;
-}
diff --git a/libc/Android.bp b/libc/Android.bp
new file mode 100644
index 000000000..4cae16cd6
--- /dev/null
+++ b/libc/Android.bp
@@ -0,0 +1,2075 @@
+// Define the common source files for all the libc instances
+// =========================================================
+libc_common_src_files = [
+ "bionic/ether_aton.c",
+ "bionic/ether_ntoa.c",
+ "bionic/fts.c",
+ "bionic/getpriority.c",
+ "bionic/initgroups.c",
+ "bionic/isatty.c",
+ "bionic/memmem.c",
+ "bionic/pututline.c",
+ "bionic/sched_cpualloc.c",
+ "bionic/sched_cpucount.c",
+ "bionic/sigblock.c",
+ "bionic/siginterrupt.c",
+ "bionic/sigsetmask.c",
+ "bionic/system_properties_compat.c",
+ "stdio/fread.c",
+ "stdio/refill.c",
+ "stdio/snprintf.c",
+ "stdio/sprintf.c",
+ "stdio/stdio.cpp",
+ "stdio/stdio_ext.cpp",
+ "stdlib/atexit.c",
+ "stdlib/exit.c",
+
+ // Fortify implementations of libc functions.
+ "bionic/__FD_chk.cpp",
+ "bionic/__fgets_chk.cpp",
+ "bionic/__fread_chk.cpp",
+ "bionic/__fwrite_chk.cpp",
+ "bionic/__getcwd_chk.cpp",
+ "bionic/__memchr_chk.cpp",
+ "bionic/__memmove_chk.cpp",
+ "bionic/__memrchr_chk.cpp",
+ "bionic/__poll_chk.cpp",
+ "bionic/__pread64_chk.cpp",
+ "bionic/__pread_chk.cpp",
+ "bionic/__pwrite64_chk.cpp",
+ "bionic/__pwrite_chk.cpp",
+ "bionic/__read_chk.cpp",
+ "bionic/__readlink_chk.cpp",
+ "bionic/__readlinkat_chk.cpp",
+ "bionic/__recvfrom_chk.cpp",
+ "bionic/__stpcpy_chk.cpp",
+ "bionic/__stpncpy_chk.cpp",
+ "bionic/__strchr_chk.cpp",
+ "bionic/__strlcat_chk.cpp",
+ "bionic/__strlcpy_chk.cpp",
+ "bionic/__strlen_chk.cpp",
+ "bionic/__strncat_chk.cpp",
+ "bionic/__strncpy_chk.cpp",
+ "bionic/__strrchr_chk.cpp",
+ "bionic/__umask_chk.cpp",
+ "bionic/__vsnprintf_chk.cpp",
+ "bionic/__vsprintf_chk.cpp",
+ "bionic/__write_chk.cpp",
+]
+
+// Various kinds of cruft.
+// ========================================================
+libc_common_src_files += [
+ "bionic/ndk_cruft.cpp",
+]
+
+libc_common_src_files_32 = [
+ "bionic/legacy_32_bit_support.cpp",
+ "bionic/time64.c",
+]
+
+// Define some common cflags
+// ========================================================
+cc_defaults {
+ name: "libc_defaults",
+ cflags: [
+ "-D_LIBC=1",
+ "-Wall",
+ "-Wextra",
+ "-Wunused",
+
+ // Try to catch typical 32-bit assumptions that break with 64-bit pointers.
+ "-Werror=pointer-to-int-cast",
+ "-Werror=int-to-pointer-cast",
+ "-Werror=type-limits",
+ "-Werror",
+ ],
+ // TODO: split out the asflags.
+ asflags: [
+ "-D_LIBC=1",
+ "-Wall",
+ "-Wextra",
+ "-Wunused",
+
+ // Try to catch typical 32-bit assumptions that break with 64-bit pointers.
+ "-Werror=pointer-to-int-cast",
+ "-Werror=int-to-pointer-cast",
+ "-Werror=type-limits",
+ "-Werror",
+ ],
+ conlyflags: ["-std=gnu99"],
+ cppflags: [],
+ include_dirs: ["external/jemalloc/include"],
+
+ arch: {
+ // Clang/llvm has incompatible long double (fp128) for x86_64.
+ // https://llvm.org/bugs/show_bug.cgi?id=23897
+ x86_64: {
+ clang: false,
+ },
+ // b/25291096, Clang/llvm compiled libc.so for mips/mips64 failed to boot.
+ mips: {
+ clang: false,
+ },
+ mips64: {
+ clang: false,
+ },
+ },
+
+ stl: "none",
+ system_shared_libs: [],
+ sanitize: ["never"],
+ native_coverage: false,
+}
+
+// ANDROIDMK TRANSLATION ERROR: unsupported directive
+// ifeq ($(strip $(DEBUG_BIONIC_LIBC)),true)
+//libc_common_cflags += ["-DDEBUG"]
+// ANDROIDMK TRANSLATION ERROR: unsupported directive
+// endif
+
+// ========================================================
+// libc_stack_protector.a - stack protector code
+// ========================================================
+//
+// Code that implements the stack protector (or that runs
+// before TLS has been set up) needs to be compiled with
+// -fno-stack-protector, since it accesses the stack canary
+// TLS slot.
+
+cc_library_static {
+
+ srcs: [
+ "bionic/__libc_init_main_thread.cpp",
+ "bionic/__stack_chk_fail.cpp",
+ ],
+ arch: {
+ arm64: {
+ srcs: ["arch-arm64/bionic/__set_tls.c"],
+ },
+ x86: {
+ srcs: ["arch-x86/bionic/__set_tls.c"],
+ },
+ x86_64: {
+ srcs: ["arch-x86_64/bionic/__set_tls.c"],
+ },
+ },
+
+ defaults: ["libc_defaults"],
+ cflags: ["-fno-stack-protector"],
+ name: "libc_stack_protector",
+}
+
+// libc_init_static.cpp also needs to be built without stack protector,
+// because it's responsible for setting up TLS for static executables.
+// This isn't the case for dynamic executables because the dynamic linker
+// has already set up the main thread's TLS.
+
+cc_library_static {
+ name: "libc_init_static",
+ defaults: ["libc_defaults"],
+ srcs: ["bionic/libc_init_static.cpp"],
+ cflags: ["-fno-stack-protector"],
+}
+
+
+// ========================================================
+// libc_tzcode.a - upstream 'tzcode' code
+// ========================================================
+
+cc_library_static {
+
+ defaults: ["libc_defaults"],
+ srcs: [
+ "tzcode/**/*.c",
+ "upstream-openbsd/lib/libc/time/wcsftime.c", // tzcode doesn't include wcsftime, so we use the OpenBSD one.
+ ],
+
+ cflags: [
+ "-fvisibility=hidden",
+ "-Wno-unused-parameter",
+ // Don't use ridiculous amounts of stack.
+ "-DALL_STATE",
+ // Include tzsetwall, timelocal, timegm, time2posix, and posix2time.
+ "-DSTD_INSPIRED",
+ // Obviously, we want to be thread-safe.
+ "-DTHREAD_SAFE",
+ // The name of the tm_gmtoff field in our struct tm.
+ "-DTM_GMTOFF=tm_gmtoff",
+ // Where we store our tzdata.
+ "-DTZDIR=\\\"/system/usr/share/zoneinfo\\\"",
+ // Include timezone and daylight globals.
+ "-DUSG_COMPAT=1",
+ // Use the empty string (instead of " ") as the timezone abbreviation
+ // fallback.
+ "-DWILDABBR=\\\"\\\"",
+ "-DNO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU",
+ "-Dlint",
+ ],
+
+ local_include_dirs: ["tzcode/"],
+ name: "libc_tzcode",
+}
+
+// ========================================================
+// libc_dns.a - modified NetBSD DNS code
+// ========================================================
+
+cc_library_static {
+
+ defaults: ["libc_defaults"],
+ srcs: [
+ "dns/**/*.c",
+
+ "upstream-netbsd/lib/libc/isc/ev_streams.c",
+ "upstream-netbsd/lib/libc/isc/ev_timers.c",
+ "upstream-netbsd/lib/libc/resolv/mtctxres.c",
+ ],
+
+ cflags: [
+ "-DANDROID_CHANGES",
+ "-DINET6",
+ "-fvisibility=hidden",
+ "-Wno-unused-parameter",
+ "-include netbsd-compat.h",
+ ],
+
+ local_include_dirs: [
+ "dns/include",
+ "private",
+ "upstream-netbsd/lib/libc/include",
+ "upstream-netbsd/android/include",
+ ],
+
+ name: "libc_dns",
+}
+
+// ========================================================
+// libc_freebsd.a - upstream FreeBSD C library code
+// ========================================================
+//
+// These files are built with the freebsd-compat.h header file
+// automatically included.
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ "upstream-freebsd/lib/libc/gen/ldexp.c",
+ "upstream-freebsd/lib/libc/gen/sleep.c",
+ "upstream-freebsd/lib/libc/gen/usleep.c",
+ "upstream-freebsd/lib/libc/stdlib/getopt_long.c",
+ "upstream-freebsd/lib/libc/stdlib/qsort.c",
+ "upstream-freebsd/lib/libc/stdlib/quick_exit.c",
+ "upstream-freebsd/lib/libc/stdlib/realpath.c",
+ "upstream-freebsd/lib/libc/string/wcpcpy.c",
+ "upstream-freebsd/lib/libc/string/wcpncpy.c",
+ "upstream-freebsd/lib/libc/string/wcscasecmp.c",
+ "upstream-freebsd/lib/libc/string/wcscat.c",
+ "upstream-freebsd/lib/libc/string/wcschr.c",
+ "upstream-freebsd/lib/libc/string/wcscmp.c",
+ "upstream-freebsd/lib/libc/string/wcscpy.c",
+ "upstream-freebsd/lib/libc/string/wcscspn.c",
+ "upstream-freebsd/lib/libc/string/wcsdup.c",
+ "upstream-freebsd/lib/libc/string/wcslcat.c",
+ "upstream-freebsd/lib/libc/string/wcslen.c",
+ "upstream-freebsd/lib/libc/string/wcsncasecmp.c",
+ "upstream-freebsd/lib/libc/string/wcsncat.c",
+ "upstream-freebsd/lib/libc/string/wcsncmp.c",
+ "upstream-freebsd/lib/libc/string/wcsncpy.c",
+ "upstream-freebsd/lib/libc/string/wcsnlen.c",
+ "upstream-freebsd/lib/libc/string/wcspbrk.c",
+ "upstream-freebsd/lib/libc/string/wcsrchr.c",
+ "upstream-freebsd/lib/libc/string/wcsspn.c",
+ "upstream-freebsd/lib/libc/string/wcstok.c",
+ "upstream-freebsd/lib/libc/string/wmemchr.c",
+ "upstream-freebsd/lib/libc/string/wmemcmp.c",
+ "upstream-freebsd/lib/libc/string/wmemmove.c",
+ "upstream-freebsd/lib/libc/string/wmemset.c",
+ ],
+ arch: {
+ arm64: {
+ exclude_srcs: [
+ "upstream-freebsd/lib/libc/string/wmemmove.c",
+ ],
+ },
+ x86: {
+ exclude_srcs: [
+ "upstream-freebsd/lib/libc/string/wcschr.c",
+ "upstream-freebsd/lib/libc/string/wcscmp.c",
+ "upstream-freebsd/lib/libc/string/wcslen.c",
+ "upstream-freebsd/lib/libc/string/wcsrchr.c",
+ ],
+ atom: {
+ exclude_srcs: [
+ "upstream-freebsd/lib/libc/string/wmemcmp.c",
+ ],
+ },
+ ssse3: {
+ exclude_srcs: [
+ "upstream-freebsd/lib/libc/string/wcscat.c",
+ "upstream-freebsd/lib/libc/string/wcscpy.c",
+ ],
+ },
+ sse4: {
+ exclude_srcs: [
+ "upstream-freebsd/lib/libc/string/wmemcmp.c",
+ ],
+ },
+ },
+ },
+
+ cflags: [
+ "-Wno-sign-compare",
+ "-Wno-uninitialized",
+ "-include freebsd-compat.h",
+ ],
+
+ local_include_dirs: [
+ "upstream-freebsd/android/include",
+ ],
+
+ name: "libc_freebsd",
+}
+
+// ========================================================
+// libc_netbsd.a - upstream NetBSD C library code
+// ========================================================
+//
+// These files are built with the netbsd-compat.h header file
+// automatically included.
+
+cc_library_static {
+
+ defaults: ["libc_defaults"],
+ srcs: [
+ "upstream-netbsd/common/lib/libc/stdlib/random.c",
+ "upstream-netbsd/lib/libc/gen/ftw.c",
+ "upstream-netbsd/lib/libc/gen/nftw.c",
+ "upstream-netbsd/lib/libc/gen/nice.c",
+ "upstream-netbsd/lib/libc/gen/popen.c",
+ "upstream-netbsd/lib/libc/gen/psignal.c",
+ "upstream-netbsd/lib/libc/gen/utime.c",
+ "upstream-netbsd/lib/libc/gen/utmp.c",
+ "upstream-netbsd/lib/libc/inet/nsap_addr.c",
+ "upstream-netbsd/lib/libc/regex/regcomp.c",
+ "upstream-netbsd/lib/libc/regex/regerror.c",
+ "upstream-netbsd/lib/libc/regex/regexec.c",
+ "upstream-netbsd/lib/libc/regex/regfree.c",
+ "upstream-netbsd/lib/libc/stdlib/bsearch.c",
+ "upstream-netbsd/lib/libc/stdlib/div.c",
+ "upstream-netbsd/lib/libc/stdlib/drand48.c",
+ "upstream-netbsd/lib/libc/stdlib/erand48.c",
+ "upstream-netbsd/lib/libc/stdlib/jrand48.c",
+ "upstream-netbsd/lib/libc/stdlib/lcong48.c",
+ "upstream-netbsd/lib/libc/stdlib/ldiv.c",
+ "upstream-netbsd/lib/libc/stdlib/lldiv.c",
+ "upstream-netbsd/lib/libc/stdlib/lrand48.c",
+ "upstream-netbsd/lib/libc/stdlib/mrand48.c",
+ "upstream-netbsd/lib/libc/stdlib/nrand48.c",
+ "upstream-netbsd/lib/libc/stdlib/_rand48.c",
+ "upstream-netbsd/lib/libc/stdlib/rand_r.c",
+ "upstream-netbsd/lib/libc/stdlib/reallocarr.c",
+ "upstream-netbsd/lib/libc/stdlib/seed48.c",
+ "upstream-netbsd/lib/libc/stdlib/srand48.c",
+ "upstream-netbsd/lib/libc/string/memccpy.c",
+ "upstream-netbsd/lib/libc/string/strcasestr.c",
+ "upstream-netbsd/lib/libc/string/strcoll.c",
+ "upstream-netbsd/lib/libc/string/strxfrm.c",
+ ],
+ multilib: {
+ lib32: {
+ // LP32 cruft
+ srcs: ["upstream-netbsd/common/lib/libc/hash/sha1/sha1.c"],
+ },
+ },
+ cflags: [
+ "-Wno-sign-compare",
+ "-Wno-uninitialized",
+ "-Wno-unused-parameter",
+ "-DPOSIX_MISTAKE",
+ "-include netbsd-compat.h",
+ ],
+
+ local_include_dirs: [
+ "upstream-netbsd/android/include",
+ "upstream-netbsd/lib/libc/include",
+ ],
+
+ name: "libc_netbsd",
+}
+
+// ========================================================
+// libc_openbsd_ndk.a - upstream OpenBSD C library code
+// that can be safely included in the libc_ndk.a (doesn't
+// contain any troublesome global data or constructors).
+// ========================================================
+//
+// These files are built with the openbsd-compat.h header file
+// automatically included.
+
+cc_library_static {
+ name: "libc_openbsd_ndk",
+ defaults: ["libc_defaults"],
+ srcs: [
+ "upstream-openbsd/lib/libc/compat-43/killpg.c",
+ "upstream-openbsd/lib/libc/gen/alarm.c",
+ "upstream-openbsd/lib/libc/gen/ctype_.c",
+ "upstream-openbsd/lib/libc/gen/daemon.c",
+ "upstream-openbsd/lib/libc/gen/err.c",
+ "upstream-openbsd/lib/libc/gen/errx.c",
+ "upstream-openbsd/lib/libc/gen/exec.c",
+ "upstream-openbsd/lib/libc/gen/fnmatch.c",
+ "upstream-openbsd/lib/libc/gen/ftok.c",
+ "upstream-openbsd/lib/libc/gen/getprogname.c",
+ "upstream-openbsd/lib/libc/gen/isctype.c",
+ "upstream-openbsd/lib/libc/gen/setprogname.c",
+ "upstream-openbsd/lib/libc/gen/time.c",
+ "upstream-openbsd/lib/libc/gen/tolower_.c",
+ "upstream-openbsd/lib/libc/gen/toupper_.c",
+ "upstream-openbsd/lib/libc/gen/verr.c",
+ "upstream-openbsd/lib/libc/gen/verrx.c",
+ "upstream-openbsd/lib/libc/gen/vwarn.c",
+ "upstream-openbsd/lib/libc/gen/vwarnx.c",
+ "upstream-openbsd/lib/libc/gen/warn.c",
+ "upstream-openbsd/lib/libc/gen/warnx.c",
+ "upstream-openbsd/lib/libc/locale/btowc.c",
+ "upstream-openbsd/lib/libc/locale/mbrlen.c",
+ "upstream-openbsd/lib/libc/locale/mbstowcs.c",
+ "upstream-openbsd/lib/libc/locale/mbtowc.c",
+ "upstream-openbsd/lib/libc/locale/wcscoll.c",
+ "upstream-openbsd/lib/libc/locale/wcstod.c",
+ "upstream-openbsd/lib/libc/locale/wcstof.c",
+ "upstream-openbsd/lib/libc/locale/wcstoimax.c",
+ "upstream-openbsd/lib/libc/locale/wcstol.c",
+ "upstream-openbsd/lib/libc/locale/wcstold.c",
+ "upstream-openbsd/lib/libc/locale/wcstoll.c",
+ "upstream-openbsd/lib/libc/locale/wcstombs.c",
+ "upstream-openbsd/lib/libc/locale/wcstoul.c",
+ "upstream-openbsd/lib/libc/locale/wcstoull.c",
+ "upstream-openbsd/lib/libc/locale/wcstoumax.c",
+ "upstream-openbsd/lib/libc/locale/wcsxfrm.c",
+ "upstream-openbsd/lib/libc/locale/wctob.c",
+ "upstream-openbsd/lib/libc/locale/wctomb.c",
+ "upstream-openbsd/lib/libc/net/htonl.c",
+ "upstream-openbsd/lib/libc/net/htons.c",
+ "upstream-openbsd/lib/libc/net/inet_lnaof.c",
+ "upstream-openbsd/lib/libc/net/inet_makeaddr.c",
+ "upstream-openbsd/lib/libc/net/inet_netof.c",
+ "upstream-openbsd/lib/libc/net/inet_ntoa.c",
+ "upstream-openbsd/lib/libc/net/inet_ntop.c",
+ "upstream-openbsd/lib/libc/net/inet_pton.c",
+ "upstream-openbsd/lib/libc/net/ntohl.c",
+ "upstream-openbsd/lib/libc/net/ntohs.c",
+ "upstream-openbsd/lib/libc/net/res_random.c",
+ "upstream-openbsd/lib/libc/stdio/asprintf.c",
+ "upstream-openbsd/lib/libc/stdio/clrerr.c",
+ "upstream-openbsd/lib/libc/stdio/dprintf.c",
+ "upstream-openbsd/lib/libc/stdio/feof.c",
+ "upstream-openbsd/lib/libc/stdio/ferror.c",
+ "upstream-openbsd/lib/libc/stdio/fflush.c",
+ "upstream-openbsd/lib/libc/stdio/fgetc.c",
+ "upstream-openbsd/lib/libc/stdio/fgetln.c",
+ "upstream-openbsd/lib/libc/stdio/fgets.c",
+ "upstream-openbsd/lib/libc/stdio/fgetwc.c",
+ "upstream-openbsd/lib/libc/stdio/fgetws.c",
+ "upstream-openbsd/lib/libc/stdio/flags.c",
+ "upstream-openbsd/lib/libc/stdio/fmemopen.c",
+ "upstream-openbsd/lib/libc/stdio/fprintf.c",
+ "upstream-openbsd/lib/libc/stdio/fpurge.c",
+ "upstream-openbsd/lib/libc/stdio/fputc.c",
+ "upstream-openbsd/lib/libc/stdio/fputs.c",
+ "upstream-openbsd/lib/libc/stdio/fputwc.c",
+ "upstream-openbsd/lib/libc/stdio/fputws.c",
+ "upstream-openbsd/lib/libc/stdio/fscanf.c",
+ "upstream-openbsd/lib/libc/stdio/fvwrite.c",
+ "upstream-openbsd/lib/libc/stdio/fwalk.c",
+ "upstream-openbsd/lib/libc/stdio/fwide.c",
+ "upstream-openbsd/lib/libc/stdio/fwprintf.c",
+ "upstream-openbsd/lib/libc/stdio/fwrite.c",
+ "upstream-openbsd/lib/libc/stdio/fwscanf.c",
+ "upstream-openbsd/lib/libc/stdio/getc.c",
+ "upstream-openbsd/lib/libc/stdio/getchar.c",
+ "upstream-openbsd/lib/libc/stdio/getdelim.c",
+ "upstream-openbsd/lib/libc/stdio/getline.c",
+ "upstream-openbsd/lib/libc/stdio/gets.c",
+ "upstream-openbsd/lib/libc/stdio/getwc.c",
+ "upstream-openbsd/lib/libc/stdio/getwchar.c",
+ "upstream-openbsd/lib/libc/stdio/makebuf.c",
+ "upstream-openbsd/lib/libc/stdio/mktemp.c",
+ "upstream-openbsd/lib/libc/stdio/open_memstream.c",
+ "upstream-openbsd/lib/libc/stdio/open_wmemstream.c",
+ "upstream-openbsd/lib/libc/stdio/perror.c",
+ "upstream-openbsd/lib/libc/stdio/printf.c",
+ "upstream-openbsd/lib/libc/stdio/putc.c",
+ "upstream-openbsd/lib/libc/stdio/putchar.c",
+ "upstream-openbsd/lib/libc/stdio/puts.c",
+ "upstream-openbsd/lib/libc/stdio/putwc.c",
+ "upstream-openbsd/lib/libc/stdio/putwchar.c",
+ "upstream-openbsd/lib/libc/stdio/remove.c",
+ "upstream-openbsd/lib/libc/stdio/rewind.c",
+ "upstream-openbsd/lib/libc/stdio/rget.c",
+ "upstream-openbsd/lib/libc/stdio/scanf.c",
+ "upstream-openbsd/lib/libc/stdio/setbuf.c",
+ "upstream-openbsd/lib/libc/stdio/setbuffer.c",
+ "upstream-openbsd/lib/libc/stdio/setvbuf.c",
+ "upstream-openbsd/lib/libc/stdio/sscanf.c",
+ "upstream-openbsd/lib/libc/stdio/swprintf.c",
+ "upstream-openbsd/lib/libc/stdio/swscanf.c",
+ "upstream-openbsd/lib/libc/stdio/tempnam.c",
+ "upstream-openbsd/lib/libc/stdio/tmpnam.c",
+ "upstream-openbsd/lib/libc/stdio/ungetc.c",
+ "upstream-openbsd/lib/libc/stdio/ungetwc.c",
+ "upstream-openbsd/lib/libc/stdio/vasprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vdprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vfprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vfscanf.c",
+ "upstream-openbsd/lib/libc/stdio/vfwprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vfwscanf.c",
+ "upstream-openbsd/lib/libc/stdio/vprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vscanf.c",
+ "upstream-openbsd/lib/libc/stdio/vsnprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vsprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vsscanf.c",
+ "upstream-openbsd/lib/libc/stdio/vswprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vswscanf.c",
+ "upstream-openbsd/lib/libc/stdio/vwprintf.c",
+ "upstream-openbsd/lib/libc/stdio/vwscanf.c",
+ "upstream-openbsd/lib/libc/stdio/wbuf.c",
+ "upstream-openbsd/lib/libc/stdio/wprintf.c",
+ "upstream-openbsd/lib/libc/stdio/wscanf.c",
+ "upstream-openbsd/lib/libc/stdio/wsetup.c",
+ "upstream-openbsd/lib/libc/stdlib/abs.c",
+ "upstream-openbsd/lib/libc/stdlib/atoi.c",
+ "upstream-openbsd/lib/libc/stdlib/atol.c",
+ "upstream-openbsd/lib/libc/stdlib/atoll.c",
+ "upstream-openbsd/lib/libc/stdlib/getenv.c",
+ "upstream-openbsd/lib/libc/stdlib/insque.c",
+ "upstream-openbsd/lib/libc/stdlib/imaxabs.c",
+ "upstream-openbsd/lib/libc/stdlib/imaxdiv.c",
+ "upstream-openbsd/lib/libc/stdlib/labs.c",
+ "upstream-openbsd/lib/libc/stdlib/llabs.c",
+ "upstream-openbsd/lib/libc/stdlib/lsearch.c",
+ "upstream-openbsd/lib/libc/stdlib/reallocarray.c",
+ "upstream-openbsd/lib/libc/stdlib/remque.c",
+ "upstream-openbsd/lib/libc/stdlib/setenv.c",
+ "upstream-openbsd/lib/libc/stdlib/strtoimax.c",
+ "upstream-openbsd/lib/libc/stdlib/strtol.c",
+ "upstream-openbsd/lib/libc/stdlib/strtoll.c",
+ "upstream-openbsd/lib/libc/stdlib/strtoul.c",
+ "upstream-openbsd/lib/libc/stdlib/strtoull.c",
+ "upstream-openbsd/lib/libc/stdlib/strtoumax.c",
+ "upstream-openbsd/lib/libc/stdlib/system.c",
+ "upstream-openbsd/lib/libc/stdlib/tfind.c",
+ "upstream-openbsd/lib/libc/stdlib/tsearch.c",
+ "upstream-openbsd/lib/libc/string/strcasecmp.c",
+ "upstream-openbsd/lib/libc/string/strcspn.c",
+ "upstream-openbsd/lib/libc/string/strdup.c",
+ "upstream-openbsd/lib/libc/string/strndup.c",
+ "upstream-openbsd/lib/libc/string/strpbrk.c",
+ "upstream-openbsd/lib/libc/string/strsep.c",
+ "upstream-openbsd/lib/libc/string/strspn.c",
+ "upstream-openbsd/lib/libc/string/strstr.c",
+ "upstream-openbsd/lib/libc/string/strtok.c",
+ "upstream-openbsd/lib/libc/string/wmemcpy.c",
+ "upstream-openbsd/lib/libc/string/wcslcpy.c",
+ "upstream-openbsd/lib/libc/string/wcsstr.c",
+ "upstream-openbsd/lib/libc/string/wcswidth.c",
+ ],
+
+ cflags: [
+ "-Wno-sign-compare",
+ "-Wno-uninitialized",
+ "-Wno-unused-parameter",
+ "-include openbsd-compat.h",
+ ],
+
+ local_include_dirs: [
+ "private",
+ "stdio",
+ "upstream-openbsd/android/include",
+ "upstream-openbsd/lib/libc/include",
+ "upstream-openbsd/lib/libc/gdtoa/",
+ ],
+}
+
+// ========================================================
+// libc_openbsd.a - upstream OpenBSD C library code
+// ========================================================
+//
+// These files are built with the openbsd-compat.h header file
+// automatically included.
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ // These two depend on getentropy_linux.c, which isn't in libc_ndk.a.
+ "upstream-openbsd/lib/libc/crypt/arc4random.c",
+ "upstream-openbsd/lib/libc/crypt/arc4random_uniform.c",
+
+ // May be overriden by per-arch optimized versions
+ "upstream-openbsd/lib/libc/string/memchr.c",
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/memrchr.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/stpncpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ "upstream-openbsd/lib/libc/string/strcpy.c",
+ "upstream-openbsd/lib/libc/string/strlcat.c",
+ "upstream-openbsd/lib/libc/string/strlcpy.c",
+ "upstream-openbsd/lib/libc/string/strncat.c",
+ "upstream-openbsd/lib/libc/string/strncmp.c",
+ "upstream-openbsd/lib/libc/string/strncpy.c",
+ ],
+ multilib: {
+ lib32: {
+ // LP32 cruft
+ srcs: ["upstream-openbsd/lib/libc/stdio/putw.c"],
+ },
+ },
+
+ arch: {
+ arm: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/strcpy.c",
+ ],
+ cortex_a7: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ cortex_a53: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ cortex_a53_a57: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ cortex_a8: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ cortex_a9: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ cortex_a15: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ denver: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ krait: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ ],
+ },
+ },
+ arm64: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memchr.c",
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/strcpy.c",
+ "upstream-openbsd/lib/libc/string/strncmp.c",
+ ],
+ },
+
+ x86: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memchr.c",
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/memrchr.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/stpncpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ "upstream-openbsd/lib/libc/string/strcpy.c",
+ "upstream-openbsd/lib/libc/string/strncmp.c",
+ "upstream-openbsd/lib/libc/string/strncpy.c",
+ ],
+ ssse3: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/strlcat.c",
+ "upstream-openbsd/lib/libc/string/strlcpy.c",
+ "upstream-openbsd/lib/libc/string/strncat.c",
+ ],
+ },
+ },
+
+ x86_64: {
+ exclude_srcs: [
+ "upstream-openbsd/lib/libc/string/memmove.c",
+ "upstream-openbsd/lib/libc/string/stpcpy.c",
+ "upstream-openbsd/lib/libc/string/stpncpy.c",
+ "upstream-openbsd/lib/libc/string/strcat.c",
+ "upstream-openbsd/lib/libc/string/strcpy.c",
+ "upstream-openbsd/lib/libc/string/strlcat.c",
+ "upstream-openbsd/lib/libc/string/strlcpy.c",
+ "upstream-openbsd/lib/libc/string/strncat.c",
+ "upstream-openbsd/lib/libc/string/strncmp.c",
+ "upstream-openbsd/lib/libc/string/strncpy.c",
+ ],
+ },
+ },
+
+ cflags: [
+ "-Wno-sign-compare",
+ "-Wno-uninitialized",
+ "-Wno-unused-parameter",
+ "-include openbsd-compat.h",
+ ],
+
+ local_include_dirs: [
+ "private",
+ "stdio",
+ "upstream-openbsd/android/include",
+ "upstream-openbsd/lib/libc/include",
+ "upstream-openbsd/lib/libc/gdtoa/",
+ ],
+
+ name: "libc_openbsd",
+}
+
+// ========================================================
+// libc_gdtoa.a - upstream OpenBSD C library gdtoa code
+// ========================================================
+//
+// These files are built with the openbsd-compat.h header file
+// automatically included.
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ "upstream-openbsd/android/gdtoa_support.cpp",
+ "upstream-openbsd/lib/libc/gdtoa/dmisc.c",
+ "upstream-openbsd/lib/libc/gdtoa/dtoa.c",
+ "upstream-openbsd/lib/libc/gdtoa/gdtoa.c",
+ "upstream-openbsd/lib/libc/gdtoa/gethex.c",
+ "upstream-openbsd/lib/libc/gdtoa/gmisc.c",
+ "upstream-openbsd/lib/libc/gdtoa/hd_init.c",
+ "upstream-openbsd/lib/libc/gdtoa/hdtoa.c",
+ "upstream-openbsd/lib/libc/gdtoa/hexnan.c",
+ "upstream-openbsd/lib/libc/gdtoa/ldtoa.c",
+ "upstream-openbsd/lib/libc/gdtoa/misc.c",
+ "upstream-openbsd/lib/libc/gdtoa/smisc.c",
+ "upstream-openbsd/lib/libc/gdtoa/strtod.c",
+ "upstream-openbsd/lib/libc/gdtoa/strtodg.c",
+ "upstream-openbsd/lib/libc/gdtoa/strtof.c",
+ "upstream-openbsd/lib/libc/gdtoa/strtord.c",
+ "upstream-openbsd/lib/libc/gdtoa/sum.c",
+ "upstream-openbsd/lib/libc/gdtoa/ulp.c",
+ ],
+ multilib: {
+ lib64: {
+ srcs: ["upstream-openbsd/lib/libc/gdtoa/strtorQ.c"],
+ },
+ },
+
+ cflags: [
+ "-Wno-sign-compare",
+ "-Wno-uninitialized",
+ "-fvisibility=hidden",
+ "-include openbsd-compat.h",
+ ],
+
+ local_include_dirs: [
+ "private",
+ "upstream-openbsd/android/include",
+ "upstream-openbsd/lib/libc/include",
+ ],
+
+ name: "libc_gdtoa",
+}
+
+// ========================================================
+// libc_bionic.a - home-grown C library code
+// ========================================================
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ // The following implementations depend on pthread data, so we can't
+ // include them in libc_ndk.a.
+ "bionic/__cxa_thread_atexit_impl.cpp",
+ "bionic/fork.cpp",
+
+ // The data that backs getauxval is initialized in the libc init
+ // functions which are invoked by the linker. If this file is included
+ // in libc_ndk.a, only one of the copies of the global data will be
+ // initialized, resulting in nullptr dereferences.
+ "bionic/getauxval.cpp",
+
+ // These four require getauxval, which isn't available on older
+ // platforms.
+ "bionic/getentropy_linux.c",
+ "bionic/sysconf.cpp",
+ "bionic/vdso.cpp",
+ "bionic/setjmp_cookie.cpp",
+
+ "bionic/__memcpy_chk.cpp",
+ "bionic/__memset_chk.cpp",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ "bionic/strchr.cpp",
+ "bionic/strnlen.c",
+ "bionic/strrchr.cpp",
+ ],
+ cflags: ["-Wframe-larger-than=2048"],
+
+ arch: {
+ arm: {
+ srcs: [
+ "arch-arm/generic/bionic/memcmp.S",
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+
+ "arch-arm/bionic/abort_arm.S",
+ "arch-arm/bionic/atomics_arm.c",
+ "arch-arm/bionic/__bionic_clone.S",
+ "arch-arm/bionic/_exit_with_stack_teardown.S",
+ "arch-arm/bionic/libgcc_compat.c",
+ "arch-arm/bionic/popcount_tab.c",
+ "arch-arm/bionic/__restore.S",
+ "arch-arm/bionic/setjmp.S",
+ "arch-arm/bionic/syscall.S",
+ "arch-arm/bionic/vfork.S",
+ ],
+ exclude_srcs: [
+ "bionic/__memcpy_chk.cpp",
+ "bionic/__memset_chk.cpp",
+ ],
+ cortex_a7: {
+ srcs: [
+ "arch-arm/cortex-a7/bionic/memset.S",
+
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ "arch-arm/cortex-a15/bionic/stpcpy.S",
+ "arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ "arch-arm/cortex-a15/bionic/strcpy.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ "arch-arm/cortex-a15/bionic/strlen.S",
+
+ "arch-arm/denver/bionic/memmove.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+ cortex_a53: {
+ srcs: [
+ "arch-arm/cortex-a53/bionic/memcpy.S",
+ "arch-arm/cortex-a53/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a53/bionic/__strcpy_chk.S",
+
+ "arch-arm/cortex-a7/bionic/memset.S",
+
+ "arch-arm/cortex-a15/bionic/stpcpy.S",
+ "arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ "arch-arm/cortex-a15/bionic/strcpy.S",
+ "arch-arm/cortex-a15/bionic/strlen.S",
+
+ "arch-arm/denver/bionic/memmove.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+ cortex_a53_a57: {
+ srcs: [
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/stpcpy.S",
+ "arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ "arch-arm/cortex-a15/bionic/strcpy.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ "arch-arm/cortex-a15/bionic/strlen.S",
+
+ "arch-arm/denver/bionic/memmove.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+ cortex_a8: {
+ srcs: [
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/stpcpy.S",
+ "arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ "arch-arm/cortex-a15/bionic/strcpy.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ "arch-arm/cortex-a15/bionic/strlen.S",
+
+ "arch-arm/denver/bionic/memmove.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+ cortex_a9: {
+ srcs: [
+ "arch-arm/cortex-a9/bionic/memcpy.S",
+ "arch-arm/cortex-a9/bionic/memset.S",
+ "arch-arm/cortex-a9/bionic/stpcpy.S",
+ "arch-arm/cortex-a9/bionic/strcat.S",
+ "arch-arm/cortex-a9/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a9/bionic/strcmp.S",
+ "arch-arm/cortex-a9/bionic/strcpy.S",
+ "arch-arm/cortex-a9/bionic/__strcpy_chk.S",
+ "arch-arm/cortex-a9/bionic/strlen.S",
+
+ "arch-arm/denver/bionic/memmove.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+ cortex_a15: {
+ srcs: [
+ "arch-arm/cortex-a15/bionic/memcpy.S",
+ "arch-arm/cortex-a15/bionic/memset.S",
+ "arch-arm/cortex-a15/bionic/stpcpy.S",
+ "arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/__strcat_chk.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ "arch-arm/cortex-a15/bionic/strcpy.S",
+ "arch-arm/cortex-a15/bionic/__strcpy_chk.S",
+ "arch-arm/cortex-a15/bionic/strlen.S",
+
+ "arch-arm/denver/bionic/memmove.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+ denver: {
+ srcs: [
+ "arch-arm/denver/bionic/memcpy.S",
+ "arch-arm/denver/bionic/memmove.S",
+ "arch-arm/denver/bionic/memset.S",
+ "arch-arm/denver/bionic/__strcat_chk.S",
+ "arch-arm/denver/bionic/__strcpy_chk.S",
+
+ // Use cortex-a15 versions of strcat/strcpy/strlen.
+ "arch-arm/cortex-a15/bionic/stpcpy.S",
+ "arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/strcmp.S",
+ "arch-arm/cortex-a15/bionic/strcpy.S",
+ "arch-arm/cortex-a15/bionic/strlen.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+ krait: {
+ srcs: [
+ "arch-arm/krait/bionic/memcpy.S",
+ "arch-arm/krait/bionic/memset.S",
+ "arch-arm/krait/bionic/strcmp.S",
+ "arch-arm/krait/bionic/__strcat_chk.S",
+ "arch-arm/krait/bionic/__strcpy_chk.S",
+
+ // Use cortex-a15 versions of strcat/strcpy/strlen.
+ "arch-arm/cortex-a15/bionic/stpcpy.S",
+ "arch-arm/cortex-a15/bionic/strcat.S",
+ "arch-arm/cortex-a15/bionic/strcpy.S",
+ "arch-arm/cortex-a15/bionic/strlen.S",
+
+ "arch-arm/denver/bionic/memmove.S",
+ ],
+ exclude_srcs: [
+ "arch-arm/generic/bionic/memcpy.S",
+ "arch-arm/generic/bionic/memset.S",
+ "arch-arm/generic/bionic/strcmp.S",
+ "arch-arm/generic/bionic/strcpy.S",
+ "arch-arm/generic/bionic/strlen.c",
+ "bionic/__strcat_chk.cpp",
+ "bionic/__strcpy_chk.cpp",
+ ],
+ },
+
+ },
+ arm64: {
+ srcs: [
+ "arch-arm64/generic/bionic/memchr.S",
+ "arch-arm64/generic/bionic/memcmp.S",
+ "arch-arm64/generic/bionic/memcpy.S",
+ "arch-arm64/generic/bionic/memmove.S",
+ "arch-arm64/generic/bionic/memset.S",
+ "arch-arm64/generic/bionic/stpcpy.S",
+ "arch-arm64/generic/bionic/strchr.S",
+ "arch-arm64/generic/bionic/strcmp.S",
+ "arch-arm64/generic/bionic/strcpy.S",
+ "arch-arm64/generic/bionic/strlen.S",
+ "arch-arm64/generic/bionic/strncmp.S",
+ "arch-arm64/generic/bionic/strnlen.S",
+ "arch-arm64/generic/bionic/wmemmove.S",
+
+ "arch-arm64/bionic/__bionic_clone.S",
+ "arch-arm64/bionic/_exit_with_stack_teardown.S",
+ "arch-arm64/bionic/setjmp.S",
+ "arch-arm64/bionic/syscall.S",
+ "arch-arm64/bionic/vfork.S",
+ ],
+ exclude_srcs: [
+ "bionic/__memcpy_chk.cpp",
+ "bionic/strchr.cpp",
+ "bionic/strnlen.c",
+ ],
+ denver64: {
+ srcs: [
+ "arch-arm64/denver64/bionic/memcpy.S",
+ "arch-arm64/denver64/bionic/memset.S",
+ ],
+ exclude_srcs: [
+ "arch-arm64/generic/bionic/memcpy.S",
+ "arch-arm64/generic/bionic/memset.S",
+ ],
+ },
+ },
+
+ mips: {
+ srcs: [
+ "arch-mips/string/memcmp.c",
+ "arch-mips/string/memcpy.S",
+ "arch-mips/string/memset.S",
+ "arch-mips/string/strcmp.S",
+ "arch-mips/string/strlen.c",
+
+ "arch-mips/bionic/__bionic_clone.S",
+ "arch-mips/bionic/bzero.S",
+ "arch-mips/bionic/cacheflush.cpp",
+ "arch-mips/bionic/_exit_with_stack_teardown.S",
+ "arch-mips/bionic/setjmp.S",
+ "arch-mips/bionic/syscall.S",
+ "arch-mips/bionic/vfork.S",
+ ],
+ rev6: {
+ srcs: [
+ "arch-mips/string/mips_strlen.c",
+ ],
+ exclude_srcs: [
+ "arch-mips/string/strlen.c",
+ ],
+ },
+ },
+ mips64: {
+ srcs: [
+ "arch-mips/string/memcmp.c",
+ "arch-mips/string/memcpy.S",
+ "arch-mips/string/memset.S",
+ "arch-mips/string/strcmp.S",
+ "arch-mips/string/strlen.c",
+
+ "arch-mips64/bionic/__bionic_clone.S",
+ "arch-mips64/bionic/_exit_with_stack_teardown.S",
+ "arch-mips64/bionic/setjmp.S",
+ "arch-mips64/bionic/syscall.S",
+ "arch-mips64/bionic/vfork.S",
+ "arch-mips64/bionic/stat.cpp",
+ ],
+ },
+
+ x86: {
+ srcs: [
+ "arch-x86/generic/string/memcmp.S",
+ "arch-x86/generic/string/strcmp.S",
+ "arch-x86/generic/string/strncmp.S",
+ "arch-x86/generic/string/strcat.S",
+ "arch-x86/atom/string/sse2-memchr-atom.S",
+ "arch-x86/atom/string/sse2-memrchr-atom.S",
+ "arch-x86/atom/string/sse2-strchr-atom.S",
+ "arch-x86/atom/string/sse2-strnlen-atom.S",
+ "arch-x86/atom/string/sse2-strrchr-atom.S",
+ "arch-x86/atom/string/sse2-wcschr-atom.S",
+ "arch-x86/atom/string/sse2-wcsrchr-atom.S",
+ "arch-x86/atom/string/sse2-wcslen-atom.S",
+ "arch-x86/atom/string/sse2-wcscmp-atom.S",
+ "arch-x86/silvermont/string/sse2-bcopy-slm.S",
+ "arch-x86/silvermont/string/sse2-bzero-slm.S",
+ "arch-x86/silvermont/string/sse2-memcpy-slm.S",
+ "arch-x86/silvermont/string/sse2-memmove-slm.S",
+ "arch-x86/silvermont/string/sse2-memset-slm.S",
+ "arch-x86/silvermont/string/sse2-stpcpy-slm.S",
+ "arch-x86/silvermont/string/sse2-stpncpy-slm.S",
+ "arch-x86/silvermont/string/sse2-strcpy-slm.S",
+ "arch-x86/silvermont/string/sse2-strlen-slm.S",
+ "arch-x86/silvermont/string/sse2-strncpy-slm.S",
+
+ "arch-x86/bionic/__bionic_clone.S",
+ "arch-x86/bionic/_exit_with_stack_teardown.S",
+ "arch-x86/bionic/libgcc_compat.c",
+ "arch-x86/bionic/__restore.S",
+ "arch-x86/bionic/setjmp.S",
+ "arch-x86/bionic/syscall.S",
+ "arch-x86/bionic/vfork.S",
+ ],
+
+ exclude_srcs: [
+ "bionic/strchr.cpp",
+ "bionic/strnlen.c",
+ "bionic/strrchr.cpp",
+ ],
+ atom: {
+ srcs: [
+ "arch-x86/atom/string/sse2-bzero-atom.S",
+ "arch-x86/atom/string/sse2-memset-atom.S",
+ "arch-x86/atom/string/sse2-strlen-atom.S",
+ "arch-x86/atom/string/ssse3-bcopy-atom.S",
+ "arch-x86/atom/string/ssse3-memcmp-atom.S",
+ "arch-x86/atom/string/ssse3-memcpy-atom.S",
+ "arch-x86/atom/string/ssse3-memmove-atom.S",
+ "arch-x86/atom/string/ssse3-strcpy-atom.S",
+ "arch-x86/atom/string/ssse3-strncpy-atom.S",
+ "arch-x86/atom/string/ssse3-wmemcmp-atom.S",
+ ],
+ exclude_srcs: [
+ "arch-x86/generic/string/memcmp.S",
+ "arch-x86/silvermont/string/sse2-bcopy-slm.S",
+ "arch-x86/silvermont/string/sse2-bzero-slm.S",
+ "arch-x86/silvermont/string/sse2-memcpy-slm.S",
+ "arch-x86/silvermont/string/sse2-memmove-slm.S",
+ "arch-x86/silvermont/string/sse2-memset-slm.S",
+ "arch-x86/silvermont/string/sse2-strcpy-slm.S",
+ "arch-x86/silvermont/string/sse2-strlen-slm.S",
+ "arch-x86/silvermont/string/sse2-strncpy-slm.S",
+ ],
+ },
+ ssse3: {
+ srcs: [
+ "arch-x86/atom/string/ssse3-strncat-atom.S",
+ "arch-x86/atom/string/ssse3-strlcat-atom.S",
+ "arch-x86/atom/string/ssse3-strlcpy-atom.S",
+ "arch-x86/atom/string/ssse3-strcat-atom.S",
+ "arch-x86/atom/string/ssse3-strcmp-atom.S",
+ "arch-x86/atom/string/ssse3-strncmp-atom.S",
+ "arch-x86/atom/string/ssse3-wcscat-atom.S",
+ "arch-x86/atom/string/ssse3-wcscpy-atom.S",
+ ],
+ exclude_srcs: [
+ "arch-x86/generic/string/strcmp.S",
+ "arch-x86/generic/string/strncmp.S",
+ "arch-x86/generic/string/strcat.S",
+ ],
+ },
+ sse4: {
+ srcs: [
+ "arch-x86/silvermont/string/sse4-memcmp-slm.S",
+ "arch-x86/silvermont/string/sse4-wmemcmp-slm.S",
+ ],
+ exclude_srcs: [
+ "arch-x86/generic/string/memcmp.S",
+ ],
+ },
+ },
+ x86_64: {
+ srcs: [
+ "arch-x86_64/string/sse2-memcpy-slm.S",
+ "arch-x86_64/string/sse2-memmove-slm.S",
+ "arch-x86_64/string/sse2-memset-slm.S",
+ "arch-x86_64/string/sse2-stpcpy-slm.S",
+ "arch-x86_64/string/sse2-stpncpy-slm.S",
+ "arch-x86_64/string/sse2-strcat-slm.S",
+ "arch-x86_64/string/sse2-strcpy-slm.S",
+ "arch-x86_64/string/sse2-strlcat-slm.S",
+ "arch-x86_64/string/sse2-strlcpy-slm.S",
+ "arch-x86_64/string/sse2-strlen-slm.S",
+ "arch-x86_64/string/sse2-strncat-slm.S",
+ "arch-x86_64/string/sse2-strncpy-slm.S",
+ "arch-x86_64/string/sse4-memcmp-slm.S",
+ "arch-x86_64/string/ssse3-strcmp-slm.S",
+ "arch-x86_64/string/ssse3-strncmp-slm.S",
+
+ "arch-x86_64/bionic/__bionic_clone.S",
+ "arch-x86_64/bionic/_exit_with_stack_teardown.S",
+ "arch-x86_64/bionic/__restore_rt.S",
+ "arch-x86_64/bionic/setjmp.S",
+ "arch-x86_64/bionic/syscall.S",
+ "arch-x86_64/bionic/vfork.S",
+ ],
+ },
+ },
+
+ cppflags: ["-Wold-style-cast"],
+ include_dirs: ["bionic/libstdc++/include"],
+ name: "libc_bionic",
+}
+
+// ========================================================
+// libc_bionic_ndk.a- The portions of libc_bionic that can
+// be safely used in libc_ndk.a (no troublesome global data
+// or constructors).
+// ========================================================
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ "bionic/abort.cpp",
+ "bionic/accept.cpp",
+ "bionic/accept4.cpp",
+ "bionic/access.cpp",
+ "bionic/arpa_inet.cpp",
+ "bionic/assert.cpp",
+ "bionic/atof.cpp",
+ "bionic/bionic_netlink.cpp",
+ "bionic/bionic_systrace.cpp",
+ "bionic/bionic_time_conversions.cpp",
+ "bionic/brk.cpp",
+ "bionic/c16rtomb.cpp",
+ "bionic/c32rtomb.cpp",
+ "bionic/chmod.cpp",
+ "bionic/chown.cpp",
+ "bionic/clearenv.cpp",
+ "bionic/clock.cpp",
+ "bionic/clock_getcpuclockid.cpp",
+ "bionic/clock_nanosleep.cpp",
+ "bionic/clone.cpp",
+ "bionic/close.cpp",
+ "bionic/__cmsg_nxthdr.cpp",
+ "bionic/connect.cpp",
+ "bionic/ctype.cpp",
+ "bionic/dirent.cpp",
+ "bionic/dup2.cpp",
+ "bionic/epoll_create.cpp",
+ "bionic/epoll_pwait.cpp",
+ "bionic/epoll_wait.cpp",
+ "bionic/__errno.cpp",
+ "bionic/error.cpp",
+ "bionic/eventfd_read.cpp",
+ "bionic/eventfd_write.cpp",
+ "bionic/faccessat.cpp",
+ "bionic/fchmod.cpp",
+ "bionic/fchmodat.cpp",
+ "bionic/ffs.cpp",
+ "bionic/fgetxattr.cpp",
+ "bionic/flistxattr.cpp",
+ "bionic/flockfile.cpp",
+ "bionic/fpclassify.cpp",
+ "bionic/fsetxattr.cpp",
+ "bionic/ftruncate.cpp",
+ "bionic/futimens.cpp",
+ "bionic/getcwd.cpp",
+ "bionic/gethostname.cpp",
+ "bionic/getpgrp.cpp",
+ "bionic/getpid.cpp",
+ "bionic/gettid.cpp",
+ "bionic/__gnu_basename.cpp",
+ "bionic/ifaddrs.cpp",
+ "bionic/inotify_init.cpp",
+ "bionic/ioctl.cpp",
+ "bionic/lchown.cpp",
+ "bionic/lfs64_support.cpp",
+ "bionic/__libc_current_sigrtmax.cpp",
+ "bionic/__libc_current_sigrtmin.cpp",
+ "bionic/libc_init_common.cpp",
+ "bionic/libc_logging.cpp",
+ "bionic/libgen.cpp",
+ "bionic/link.cpp",
+ "bionic/locale.cpp",
+ "bionic/lockf.cpp",
+ "bionic/lstat.cpp",
+ "bionic/malloc_info.cpp",
+ "bionic/mbrtoc16.cpp",
+ "bionic/mbrtoc32.cpp",
+ "bionic/mbstate.cpp",
+ "bionic/mempcpy.cpp",
+ "bionic/mkdir.cpp",
+ "bionic/mkfifo.cpp",
+ "bionic/mknod.cpp",
+ "bionic/mntent.cpp",
+ "bionic/mremap.cpp",
+ "bionic/NetdClientDispatch.cpp",
+ "bionic/net_if.cpp",
+ "bionic/netinet_in.cpp",
+ "bionic/open.cpp",
+ "bionic/pathconf.cpp",
+ "bionic/pause.cpp",
+ "bionic/pipe.cpp",
+ "bionic/poll.cpp",
+ "bionic/posix_fadvise.cpp",
+ "bionic/posix_fallocate.cpp",
+ "bionic/posix_madvise.cpp",
+ "bionic/posix_timers.cpp",
+ "bionic/ptrace.cpp",
+ "bionic/pty.cpp",
+ "bionic/raise.cpp",
+ "bionic/rand.cpp",
+ "bionic/readlink.cpp",
+ "bionic/reboot.cpp",
+ "bionic/recv.cpp",
+ "bionic/rename.cpp",
+ "bionic/rmdir.cpp",
+ "bionic/scandir.cpp",
+ "bionic/sched_getaffinity.cpp",
+ "bionic/sched_getcpu.cpp",
+ "bionic/semaphore.cpp",
+ "bionic/send.cpp",
+ "bionic/setegid.cpp",
+ "bionic/__set_errno.cpp",
+ "bionic/seteuid.cpp",
+ "bionic/setpgrp.cpp",
+ "bionic/sigaction.cpp",
+ "bionic/sigaddset.cpp",
+ "bionic/sigdelset.cpp",
+ "bionic/sigemptyset.cpp",
+ "bionic/sigfillset.cpp",
+ "bionic/sigismember.cpp",
+ "bionic/signal.cpp",
+ "bionic/signalfd.cpp",
+ "bionic/sigpending.cpp",
+ "bionic/sigprocmask.cpp",
+ "bionic/sigqueue.cpp",
+ "bionic/sigsuspend.cpp",
+ "bionic/sigtimedwait.cpp",
+ "bionic/sigwait.cpp",
+ "bionic/sigwaitinfo.cpp",
+ "bionic/socket.cpp",
+ "bionic/stat.cpp",
+ "bionic/statvfs.cpp",
+ "bionic/strchrnul.cpp",
+ "bionic/strerror.cpp",
+ "bionic/strerror_r.cpp",
+ "bionic/strsignal.cpp",
+ "bionic/strtold.cpp",
+ "bionic/stubs.cpp",
+ "bionic/symlink.cpp",
+ "bionic/sysinfo.cpp",
+ "bionic/syslog.cpp",
+ "bionic/sys_siglist.c",
+ "bionic/sys_signame.c",
+ "bionic/system_properties.cpp",
+ "bionic/tdestroy.cpp",
+ "bionic/termios.cpp",
+ "bionic/thread_private.cpp",
+ "bionic/tmpfile.cpp",
+ "bionic/umount.cpp",
+ "bionic/unlink.cpp",
+ "bionic/utimes.cpp",
+ "bionic/wait.cpp",
+ "bionic/wchar.cpp",
+ "bionic/wctype.cpp",
+ "bionic/wmempcpy.cpp",
+ ],
+ cflags: ["-Wframe-larger-than=2048"],
+
+ multilib: {
+ lib32: {
+ // LP32 cruft
+ srcs: ["bionic/mmap.cpp"],
+ },
+ },
+
+ cppflags: ["-Wold-style-cast"],
+ local_include_dirs: ["stdio"],
+ include_dirs: ["bionic/libstdc++/include"],
+ name: "libc_bionic_ndk",
+}
+
+// ========================================================
+// libc_pthread.a - pthreads parts that previously lived in
+// libc_bionic.a. Relocated to their own library because
+// they can't be included in libc_ndk.a (as they layout of
+// pthread_t has changed over the years and has ABI
+// compatibility issues).
+// ========================================================
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ "bionic/pthread_atfork.cpp",
+ "bionic/pthread_attr.cpp",
+ "bionic/pthread_barrier.cpp",
+ "bionic/pthread_cond.cpp",
+ "bionic/pthread_create.cpp",
+ "bionic/pthread_detach.cpp",
+ "bionic/pthread_equal.cpp",
+ "bionic/pthread_exit.cpp",
+ "bionic/pthread_getcpuclockid.cpp",
+ "bionic/pthread_getschedparam.cpp",
+ "bionic/pthread_gettid_np.cpp",
+ "bionic/pthread_internal.cpp",
+ "bionic/pthread_join.cpp",
+ "bionic/pthread_key.cpp",
+ "bionic/pthread_kill.cpp",
+ "bionic/pthread_mutex.cpp",
+ "bionic/pthread_once.cpp",
+ "bionic/pthread_rwlock.cpp",
+ "bionic/pthread_self.cpp",
+ "bionic/pthread_setname_np.cpp",
+ "bionic/pthread_setschedparam.cpp",
+ "bionic/pthread_sigmask.cpp",
+ "bionic/pthread_spinlock.cpp",
+ ],
+ cflags: ["-Wframe-larger-than=2048"],
+
+ cppflags: ["-Wold-style-cast"],
+ include_dirs: ["bionic/libstdc++/include"],
+ name: "libc_pthread",
+}
+
+// ========================================================
+// libc_cxa.a - Things traditionally in libstdc++
+// ========================================================
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ "bionic/__cxa_guard.cpp",
+ "bionic/__cxa_pure_virtual.cpp",
+ "bionic/new.cpp",
+ ],
+ cflags: ["-fvisibility=hidden"],
+ include_dirs: ["bionic/libstdc++/include"],
+ name: "libc_cxa",
+ clang: true, // GCC refuses to hide new/delete
+
+ // b/17574078: Need to disable coverage until we have a prebuilt libprofile_rt.
+ // Since this is a static library built with clang, it needs to link
+ // libprofile_rt when it is linked into the final binary. Since the final binary
+ // is built with GCC, it won't link libprofile_rt. We can't very easily just add
+ // libprofile_rt to all link lines the way we've done for libgcov because
+ // libprofile_rt isn't prebuilt, and it would be tricky to write a rule that
+ // would make sure libprofile_rt is built.
+ native_coverage: false,
+}
+
+// ========================================================
+// libc_syscalls.a
+// ========================================================
+
+cc_library_static {
+ arch: {
+ arm: {
+ srcs: ["arch-arm/syscalls/**/*.S"],
+ },
+ arm64: {
+ srcs: ["arch-arm64/syscalls/**/*.S"],
+ },
+ mips: {
+ srcs: ["arch-mips/syscalls/**/*.S"],
+ },
+ mips64: {
+ srcs: ["arch-mips64/syscalls/**/*.S"],
+ },
+ x86: {
+ srcs: ["arch-x86/syscalls/**/*.S"],
+ },
+ x86_64: {
+ srcs: ["arch-x86_64/syscalls/**/*.S"],
+ },
+ },
+ name: "libc_syscalls",
+}
+
+// ========================================================
+// libc_aeabi.a
+// This is an LP32 ARM-only library that needs to be built with -fno-builtin
+// to avoid infinite recursion. For the other architectures we just build an
+// empty library to keep this makefile simple.
+// ========================================================
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ arch: {
+ arm: {
+ srcs: ["arch-arm/bionic/__aeabi.c"],
+ },
+ },
+ name: "libc_aeabi",
+ cflags: ["-fno-builtin"],
+}
+
+// ========================================================
+// libc_ndk.a
+// Compatibility library for the NDK. This library contains
+// all the parts of libc that are safe to statically link.
+// We can't safely statically link things that can only run
+// on a certain version of the OS. Examples include
+// anything that talks to netd (a large portion of the DNS
+// code) and anything that is dependent on the layout of a
+// data structure that has changed across releases (such as
+// pthread_t).
+// ========================================================
+
+cc_library_static {
+ name: "libc_ndk",
+ defaults: ["libc_defaults"],
+ srcs: libc_common_src_files + ["bionic/malloc_common.cpp"],
+ multilib: {
+ lib32: {
+ srcs: libc_common_src_files_32,
+ },
+ },
+ arch: {
+ arm: {
+ srcs: [
+ "arch-arm/bionic/exidx_dynamic.c",
+ "arch-common/bionic/crtbegin_so.c",
+ "arch-arm/bionic/atexit_legacy.c",
+ "arch-common/bionic/crtend_so.S",
+ ],
+ whole_static_libs: ["libc_aeabi"],
+ },
+ },
+
+ cflags: [
+ "-fvisibility=hidden",
+ "-DLIBC_STATIC",
+ ],
+
+ whole_static_libs: [
+ "libc_bionic_ndk",
+ "libc_cxa",
+ "libc_freebsd",
+ "libc_gdtoa",
+ "libc_malloc",
+ "libc_netbsd",
+ "libc_openbsd_ndk",
+ "libc_stack_protector",
+ "libc_syscalls",
+ "libc_tzcode",
+ "libm",
+ "libjemalloc",
+ ],
+}
+
+// ========================================================
+// libc_common.a
+// ========================================================
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: libc_common_src_files,
+ multilib: {
+ lib32: {
+ srcs: libc_common_src_files_32,
+ },
+ },
+ name: "libc_common",
+
+ whole_static_libs: [
+ "libc_bionic",
+ "libc_bionic_ndk",
+ "libc_cxa",
+ "libc_dns",
+ "libc_freebsd",
+ "libc_gdtoa",
+ "libc_malloc",
+ "libc_netbsd",
+ "libc_openbsd",
+ "libc_openbsd_ndk",
+ "libc_pthread",
+ "libc_stack_protector",
+ "libc_syscalls",
+ "libc_tzcode",
+ ],
+
+ arch: {
+ arm: {
+ whole_static_libs: ["libc_aeabi"],
+ },
+ },
+}
+
+// ========================================================
+// libc_nomalloc.a
+// ========================================================
+//
+// This is a version of the static C library that does not
+// include malloc. It's useful in situations when the user wants
+// to provide their own malloc implementation, or wants to
+// explicitly disallow the use of malloc, such as in the
+// dynamic linker.
+
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: [
+ "bionic/dl_iterate_phdr_static.cpp",
+ ],
+
+ arch: {
+ arm: {
+ srcs: ["arch-arm/bionic/exidx_static.c"],
+ },
+ },
+
+ cflags: ["-DLIBC_STATIC"],
+
+ name: "libc_nomalloc",
+
+ whole_static_libs: [
+ "libc_common",
+ "libc_init_static",
+ ],
+}
+
+// ========================================================
+// libc_malloc.a: the _prefixed_ malloc functions (like dlcalloc).
+// ========================================================
+cc_library_static {
+ defaults: ["libc_defaults"],
+ srcs: ["bionic/jemalloc_wrapper.cpp"],
+ cflags: ["-fvisibility=hidden"],
+
+ name: "libc_malloc",
+}
+
+// ========================================================
+// libc.a + libc.so
+// ========================================================
+cc_library {
+ defaults: ["libc_defaults"],
+ name: "libc",
+ product_variables: {
+ platform_sdk_version: {
+ asflags: ["-DPLATFORM_SDK_VERSION=%d"],
+ },
+ },
+ srcs: ["bionic/malloc_common.cpp"],
+ static: {
+ srcs: [
+ "bionic/dl_iterate_phdr_static.cpp",
+ "bionic/libc_init_static.cpp",
+ ],
+ cflags: ["-DLIBC_STATIC"],
+ whole_static_libs: ["libc_init_static"],
+ },
+ shared: {
+ srcs: [
+ "arch-common/bionic/crtbegin_so.c",
+ "arch-common/bionic/crtbrand.S",
+ "bionic/libc_init_dynamic.cpp",
+ "bionic/NetdClient.cpp",
+ "arch-common/bionic/crtend_so.S",
+ ],
+ },
+
+ required: ["tzdata"],
+
+ // Leave the symbols in the shared library so that stack unwinders can produce
+ // meaningful name resolution.
+ strip: "keep_symbols",
+
+ // WARNING: The only library libc.so should depend on is libdl.so! If you add other libraries,
+ // make sure to add -Wl,--exclude-libs=libgcc.a to the LOCAL_LDFLAGS for those libraries. This
+ // ensures that symbols that are pulled into those new libraries from libgcc.a are not declared
+ // external; if that were the case, then libc would not pull those symbols from libgcc.a as it
+ // should, instead relying on the external symbols from the dependent libraries. That would
+ // create a "cloaked" dependency on libgcc.a in libc though the libraries, which is not what
+ // you wanted!
+
+ shared_libs: ["libdl"],
+ whole_static_libs: ["libc_common", "libjemalloc"],
+
+ // We'd really like to do this for all architectures, but since this wasn't done
+ // before, these symbols must continue to be exported on LP32 for binary
+ // compatibility.
+ multilib: {
+ lib64: {
+ ldflags: ["-Wl,--exclude-libs,libgcc.a"],
+ },
+ },
+
+ nocrt: true,
+
+ arch: {
+ arm: {
+ //TODO: This is to work around b/24465209. Remove after root cause is fixed
+ ldflags: ["-Wl,--hash-style=both"],
+
+ // Don't re-export new/delete and friends, even if the compiler really wants to.
+ version_script: "libc.arm.map",
+ product_variables: {
+ brillo: {
+ version_script: "libc.arm.brillo.map",
+ },
+ },
+
+ shared: {
+ srcs: ["arch-arm/bionic/exidx_dynamic.c"],
+ },
+ static: {
+ srcs: ["arch-arm/bionic/exidx_static.c"],
+ },
+
+ // special for arm
+ cflags: ["-DCRT_LEGACY_WORKAROUND"],
+ srcs: [
+ "arch-arm/bionic/atexit_legacy.c",
+ ],
+ },
+ arm64: {
+ // Don't re-export new/delete and friends, even if the compiler really wants to.
+ version_script: "libc.arm64.map",
+ },
+ mips: {
+ // Don't re-export new/delete and friends, even if the compiler really wants to.
+ version_script: "libc.mips.map",
+ product_variables: {
+ brillo: {
+ version_script: "libc.mips.brillo.map",
+ },
+ },
+ },
+ mips64: {
+ // Don't re-export new/delete and friends, even if the compiler really wants to.
+ version_script: "libc.mips64.map",
+ },
+ x86: {
+ //TODO: This is to work around b/24465209. Remove after root cause is fixed
+ ldflags: ["-Wl,--hash-style=both"],
+
+ // Don't re-export new/delete and friends, even if the compiler really wants to.
+ version_script: "libc.x86.map",
+ product_variables: {
+ brillo: {
+ version_script: "libc.x86.brillo.map",
+ },
+ },
+ },
+ x86_64: {
+ // Don't re-export new/delete and friends, even if the compiler really wants to.
+ version_script: "libc.x86_64.map",
+ },
+ },
+}
+
+// ========================================================
+// libc_logging.a
+// ========================================================
+cc_library_static {
+ defaults: ["libc_defaults"],
+
+ srcs: [
+ "bionic/libc_logging.cpp",
+ ],
+
+ name: "libc_logging",
+}
+
+// ========================================================
+// libstdc++.so + libstdc++.a
+// ========================================================
+cc_library {
+ defaults: ["libc_defaults"],
+ include_dirs: ["bionic/libstdc++/include"],
+ srcs: [
+ "bionic/__cxa_guard.cpp",
+ "bionic/__cxa_pure_virtual.cpp",
+ "bionic/new.cpp",
+ ],
+ name: "libstdc++",
+ system_shared_libs: ["libc"],
+ shared: {
+ static_libs: ["libc_logging"],
+ },
+
+ //TODO: This is to work around b/24465209. Remove after root cause is fixed
+ arch: {
+ arm: {
+ ldflags: ["-Wl,--hash-style=both"],
+ },
+ x86: {
+ ldflags: ["-Wl,--hash-style=both"],
+ },
+ },
+}
+
+cc_defaults {
+ name: "crt_defaults",
+
+ no_default_compiler_flags: true,
+
+ arch: {
+ arm: {
+ local_include_dirs: ["arch-arm/include"],
+ },
+ arm64: {
+ local_include_dirs: ["arch-arm64/include"],
+ },
+ mips: {
+ local_include_dirs: ["arch-mips/include"],
+ },
+ mips64: {
+ local_include_dirs: ["arch-mips64/include"],
+ },
+ x86: {
+ local_include_dirs: ["arch-x86/include"],
+ },
+ x86_64: {
+ local_include_dirs: ["arch-x86_64/include"],
+ },
+ },
+ clang: false,
+}
+
+cc_defaults {
+ name: "crt_so_defaults",
+
+ arch: {
+ mips: {
+ cflags: ["-fPIC"],
+ },
+ mips64: {
+ cflags: ["-fPIC"],
+ },
+ x86: {
+ cflags: ["-fPIC"],
+ },
+ x86_64: {
+ cflags: ["-fPIC"],
+ },
+ },
+}
+
+// Android.mk:start
+// # crt obj files
+// # ========================================================
+// # crtbrand.c needs <stdint.h> and a #define for the platform SDK version.
+// libc_crt_target_cflags := \
+// -I$(LOCAL_PATH)/include \
+// -DPLATFORM_SDK_VERSION=$(PLATFORM_SDK_VERSION) \
+//
+// my_2nd_arch_prefix :=
+// include $(LOCAL_PATH)/arch-$(TARGET_ARCH)/$(TARGET_ARCH).mk
+// include $(LOCAL_PATH)/crt.mk
+// ifdef TARGET_2ND_ARCH
+// my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
+// include $(LOCAL_PATH)/arch-$(TARGET_2ND_ARCH)/$(TARGET_2ND_ARCH).mk
+// include $(LOCAL_PATH)/crt.mk
+// my_2nd_arch_prefix :=
+// endif
+//
+// include $(call all-makefiles-under,$(LOCAL_PATH))
+// Android.mk:end
+cc_object {
+ name: "crtbrand",
+ local_include_dirs: ["include"],
+ product_variables: {
+ platform_sdk_version: {
+ asflags: ["-DPLATFORM_SDK_VERSION=%d"],
+ },
+ },
+ srcs: ["arch-common/bionic/crtbrand.S"],
+
+ defaults: [
+ "crt_defaults",
+ "crt_so_defaults",
+ ],
+}
+
+// Android.mk:ignore
+cc_object {
+ name: "crtbegin_so1",
+ local_include_dirs: ["include"],
+ srcs: ["arch-common/bionic/crtbegin_so.c"],
+
+ defaults: [
+ "crt_defaults",
+ "crt_so_defaults",
+ ],
+}
+
+// Android.mk:ignore
+cc_object {
+ name: "crtbegin_so",
+
+ defaults: [
+ "crt_defaults",
+ "crt_so_defaults",
+ ],
+ deps: [
+ "crtbegin_so1",
+ "crtbrand",
+ ],
+}
+
+// Android.mk:ignore
+cc_object {
+ name: "crtend_so",
+ local_include_dirs: ["include"],
+ srcs: ["arch-common/bionic/crtend_so.S"],
+
+ defaults: [
+ "crt_defaults",
+ "crt_so_defaults",
+ ],
+}
+
+// Android.mk:ignore
+cc_object {
+ name: "crtbegin_static1",
+ local_include_dirs: ["include"],
+ srcs: ["arch-common/bionic/crtbegin.c"],
+
+ arch: {
+ arm64: {
+ srcs: [
+ "arch-arm64/bionic/crtbegin.c",
+ ],
+ exclude_srcs: [
+ "arch-common/bionic/crtbegin.c",
+ ],
+ },
+ mips: {
+ srcs: [
+ "arch-mips/bionic/crtbegin.c",
+ ],
+ exclude_srcs: [
+ "arch-common/bionic/crtbegin.c",
+ ],
+ },
+ mips64: {
+ srcs: [
+ "arch-mips64/bionic/crtbegin.c",
+ ],
+ exclude_srcs: [
+ "arch-common/bionic/crtbegin.c",
+ ],
+ },
+ },
+
+ defaults: ["crt_defaults"],
+}
+
+// Android.mk:ignore
+cc_object {
+ name: "crtbegin_static",
+
+ deps: [
+ "crtbegin_static1",
+ "crtbrand",
+ ],
+ defaults: ["crt_defaults"],
+}
+
+// Android.mk:ignore
+cc_object {
+ name: "crtbegin_dynamic1",
+ local_include_dirs: ["include"],
+ srcs: ["arch-common/bionic/crtbegin.c"],
+
+ arch: {
+ arm64: {
+ srcs: [
+ "arch-arm64/bionic/crtbegin.c",
+ ],
+ exclude_srcs: [
+ "arch-common/bionic/crtbegin.c",
+ ],
+ },
+ mips: {
+ srcs: [
+ "arch-mips/bionic/crtbegin.c",
+ ],
+ exclude_srcs: [
+ "arch-common/bionic/crtbegin.c",
+ ],
+ },
+ mips64: {
+ srcs: [
+ "arch-mips64/bionic/crtbegin.c",
+ ],
+ exclude_srcs: [
+ "arch-common/bionic/crtbegin.c",
+ ],
+ },
+ },
+ defaults: ["crt_defaults"],
+}
+
+// Android.mk:ignore
+cc_object {
+ name: "crtbegin_dynamic",
+
+ deps: [
+ "crtbegin_dynamic1",
+ "crtbrand",
+ ],
+ defaults: ["crt_defaults"],
+}
+
+// Android.mk:ignore
+cc_object {
+ // We rename crtend.o to crtend_android.o to avoid a
+ // name clash between gcc and bionic.
+ name: "crtend_android",
+ local_include_dirs: ["include"],
+ srcs: ["arch-common/bionic/crtend.S"],
+
+ defaults: ["crt_defaults"],
+}
diff --git a/libc/Android.mk b/libc/Android.mk
index f0c5e9fd4..1ca84c14a 100644
--- a/libc/Android.mk
+++ b/libc/Android.mk
@@ -1,6 +1,6 @@
LOCAL_PATH := $(call my-dir)
-bionic_coverage := false
+bionic_coverage ?= false
# Make everything depend on any changes to included makefiles.
libc_common_additional_dependencies := $(LOCAL_PATH)/Android.mk
@@ -39,15 +39,11 @@ endif
# Define the common source files for all the libc instances
# =========================================================
libc_common_src_files := \
- bionic/bindresvport.c \
bionic/ether_aton.c \
bionic/ether_ntoa.c \
bionic/fts.c \
bionic/getpriority.c \
- bionic/if_indextoname.c \
- bionic/if_nametoindex.c \
bionic/initgroups.c \
- bionic/ioctl.c \
bionic/isatty.c \
bionic/memmem.c \
bionic/pututline.c \
@@ -57,11 +53,11 @@ libc_common_src_files := \
bionic/siginterrupt.c \
bionic/sigsetmask.c \
bionic/system_properties_compat.c \
- stdio/findfp.c \
stdio/fread.c \
+ stdio/refill.c \
stdio/snprintf.c\
stdio/sprintf.c \
- stdio/stdio.c \
+ stdio/stdio.cpp \
stdio/stdio_ext.cpp \
stdlib/atexit.c \
stdlib/exit.c \
@@ -70,12 +66,17 @@ libc_common_src_files := \
libc_common_src_files += \
bionic/__FD_chk.cpp \
bionic/__fgets_chk.cpp \
+ bionic/__fread_chk.cpp \
+ bionic/__fwrite_chk.cpp \
+ bionic/__getcwd_chk.cpp \
bionic/__memchr_chk.cpp \
bionic/__memmove_chk.cpp \
bionic/__memrchr_chk.cpp \
bionic/__poll_chk.cpp \
bionic/__pread64_chk.cpp \
bionic/__pread_chk.cpp \
+ bionic/__pwrite64_chk.cpp \
+ bionic/__pwrite_chk.cpp \
bionic/__read_chk.cpp \
bionic/__readlink_chk.cpp \
bionic/__readlinkat_chk.cpp \
@@ -92,14 +93,17 @@ libc_common_src_files += \
bionic/__umask_chk.cpp \
bionic/__vsnprintf_chk.cpp \
bionic/__vsprintf_chk.cpp \
+ bionic/__write_chk.cpp
libc_bionic_ndk_src_files := \
bionic/abort.cpp \
bionic/accept.cpp \
bionic/accept4.cpp \
bionic/access.cpp \
+ bionic/arpa_inet.cpp \
bionic/assert.cpp \
bionic/atof.cpp \
+ bionic/bionic_netlink.cpp \
bionic/bionic_systrace.cpp \
bionic/bionic_time_conversions.cpp \
bionic/brk.cpp \
@@ -130,6 +134,7 @@ libc_bionic_ndk_src_files := \
bionic/fchmodat.cpp \
bionic/ffs.cpp \
bionic/fgetxattr.cpp \
+ bionic/flistxattr.cpp \
bionic/flockfile.cpp \
bionic/fpclassify.cpp \
bionic/fsetxattr.cpp \
@@ -141,7 +146,9 @@ libc_bionic_ndk_src_files := \
bionic/getpid.cpp \
bionic/gettid.cpp \
bionic/__gnu_basename.cpp \
+ bionic/ifaddrs.cpp \
bionic/inotify_init.cpp \
+ bionic/ioctl.cpp \
bionic/lchown.cpp \
bionic/lfs64_support.cpp \
bionic/__libc_current_sigrtmax.cpp \
@@ -151,6 +158,7 @@ libc_bionic_ndk_src_files := \
bionic/libgen.cpp \
bionic/link.cpp \
bionic/locale.cpp \
+ bionic/lockf.cpp \
bionic/lstat.cpp \
bionic/malloc_info.cpp \
bionic/mbrtoc16.cpp \
@@ -161,7 +169,10 @@ libc_bionic_ndk_src_files := \
bionic/mkfifo.cpp \
bionic/mknod.cpp \
bionic/mntent.cpp \
+ bionic/mremap.cpp \
bionic/NetdClientDispatch.cpp \
+ bionic/net_if.cpp \
+ bionic/netinet_in.cpp \
bionic/open.cpp \
bionic/pathconf.cpp \
bionic/pause.cpp \
@@ -207,6 +218,7 @@ libc_bionic_ndk_src_files := \
bionic/socket.cpp \
bionic/stat.cpp \
bionic/statvfs.cpp \
+ bionic/strchrnul.cpp \
bionic/strerror.cpp \
bionic/strerror_r.cpp \
bionic/strsignal.cpp \
@@ -232,9 +244,11 @@ libc_bionic_ndk_src_files := \
libc_bionic_src_files :=
-# The fork implementation depends on pthread data, so we can't include it in
-# libc_ndk.a.
-libc_bionic_src_files += bionic/fork.cpp
+# The following implementations depend on pthread data, so we can't include
+# them in libc_ndk.a.
+libc_bionic_src_files += \
+ bionic/__cxa_thread_atexit_impl.cpp \
+ bionic/fork.cpp \
# The data that backs getauxval is initialized in the libc init functions which
# are invoked by the linker. If this file is included in libc_ndk.a, only one of
@@ -242,10 +256,20 @@ libc_bionic_src_files += bionic/fork.cpp
# dereferences.
libc_bionic_src_files += bionic/getauxval.cpp
-# These three require getauxval, which isn't available on older platforms.
+# These four require getauxval, which isn't available on older platforms.
libc_bionic_src_files += bionic/getentropy_linux.c
libc_bionic_src_files += bionic/sysconf.cpp
libc_bionic_src_files += bionic/vdso.cpp
+libc_bionic_src_files += bionic/setjmp_cookie.cpp
+
+libc_bionic_src_files += \
+ bionic/__memcpy_chk.cpp \
+ bionic/__memset_chk.cpp \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+ bionic/strchr.cpp \
+ bionic/strnlen.c \
+ bionic/strrchr.cpp \
libc_cxa_src_files := \
bionic/__cxa_guard.cpp \
@@ -256,30 +280,33 @@ libc_upstream_freebsd_src_files := \
upstream-freebsd/lib/libc/gen/ldexp.c \
upstream-freebsd/lib/libc/gen/sleep.c \
upstream-freebsd/lib/libc/gen/usleep.c \
- upstream-freebsd/lib/libc/stdlib/abs.c \
upstream-freebsd/lib/libc/stdlib/getopt_long.c \
- upstream-freebsd/lib/libc/stdlib/imaxabs.c \
- upstream-freebsd/lib/libc/stdlib/imaxdiv.c \
- upstream-freebsd/lib/libc/stdlib/labs.c \
- upstream-freebsd/lib/libc/stdlib/llabs.c \
upstream-freebsd/lib/libc/stdlib/qsort.c \
upstream-freebsd/lib/libc/stdlib/quick_exit.c \
upstream-freebsd/lib/libc/stdlib/realpath.c \
upstream-freebsd/lib/libc/string/wcpcpy.c \
upstream-freebsd/lib/libc/string/wcpncpy.c \
upstream-freebsd/lib/libc/string/wcscasecmp.c \
+ upstream-freebsd/lib/libc/string/wcscat.c \
+ upstream-freebsd/lib/libc/string/wcschr.c \
+ upstream-freebsd/lib/libc/string/wcscmp.c \
+ upstream-freebsd/lib/libc/string/wcscpy.c \
upstream-freebsd/lib/libc/string/wcscspn.c \
upstream-freebsd/lib/libc/string/wcsdup.c \
upstream-freebsd/lib/libc/string/wcslcat.c \
+ upstream-freebsd/lib/libc/string/wcslen.c \
upstream-freebsd/lib/libc/string/wcsncasecmp.c \
upstream-freebsd/lib/libc/string/wcsncat.c \
upstream-freebsd/lib/libc/string/wcsncmp.c \
upstream-freebsd/lib/libc/string/wcsncpy.c \
upstream-freebsd/lib/libc/string/wcsnlen.c \
upstream-freebsd/lib/libc/string/wcspbrk.c \
+ upstream-freebsd/lib/libc/string/wcsrchr.c \
upstream-freebsd/lib/libc/string/wcsspn.c \
upstream-freebsd/lib/libc/string/wcstok.c \
upstream-freebsd/lib/libc/string/wmemchr.c \
+ upstream-freebsd/lib/libc/string/wmemcmp.c \
+ upstream-freebsd/lib/libc/string/wmemmove.c \
upstream-freebsd/lib/libc/string/wmemset.c \
libc_upstream_netbsd_src_files := \
@@ -344,11 +371,25 @@ libc_upstream_openbsd_gdtoa_src_files_64 := \
$(libc_upstream_openbsd_gdtoa_src_files) \
upstream-openbsd/lib/libc/gdtoa/strtorQ.c \
-# These two depend on getentropy_linux.cpp, which isn't in libc_ndk.a.
+# These two depend on getentropy_linux.c, which isn't in libc_ndk.a.
libc_upstream_openbsd_src_files := \
upstream-openbsd/lib/libc/crypt/arc4random.c \
upstream-openbsd/lib/libc/crypt/arc4random_uniform.c \
+libc_upstream_openbsd_src_files += \
+ upstream-openbsd/lib/libc/string/memchr.c \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/memrchr.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/stpncpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+ upstream-openbsd/lib/libc/string/strcpy.c \
+ upstream-openbsd/lib/libc/string/strlcat.c \
+ upstream-openbsd/lib/libc/string/strlcpy.c \
+ upstream-openbsd/lib/libc/string/strncat.c \
+ upstream-openbsd/lib/libc/string/strncmp.c \
+ upstream-openbsd/lib/libc/string/strncpy.c \
+
libc_upstream_openbsd_ndk_src_files := \
upstream-openbsd/lib/libc/compat-43/killpg.c \
upstream-openbsd/lib/libc/gen/alarm.c \
@@ -391,46 +432,35 @@ libc_upstream_openbsd_ndk_src_files := \
upstream-openbsd/lib/libc/locale/wctomb.c \
upstream-openbsd/lib/libc/net/htonl.c \
upstream-openbsd/lib/libc/net/htons.c \
- upstream-openbsd/lib/libc/net/inet_addr.c \
upstream-openbsd/lib/libc/net/inet_lnaof.c \
upstream-openbsd/lib/libc/net/inet_makeaddr.c \
upstream-openbsd/lib/libc/net/inet_netof.c \
- upstream-openbsd/lib/libc/net/inet_network.c \
upstream-openbsd/lib/libc/net/inet_ntoa.c \
upstream-openbsd/lib/libc/net/inet_ntop.c \
upstream-openbsd/lib/libc/net/inet_pton.c \
upstream-openbsd/lib/libc/net/ntohl.c \
upstream-openbsd/lib/libc/net/ntohs.c \
+ upstream-openbsd/lib/libc/net/res_random.c \
upstream-openbsd/lib/libc/stdio/asprintf.c \
upstream-openbsd/lib/libc/stdio/clrerr.c \
upstream-openbsd/lib/libc/stdio/dprintf.c \
- upstream-openbsd/lib/libc/stdio/fclose.c \
- upstream-openbsd/lib/libc/stdio/fdopen.c \
upstream-openbsd/lib/libc/stdio/feof.c \
upstream-openbsd/lib/libc/stdio/ferror.c \
upstream-openbsd/lib/libc/stdio/fflush.c \
upstream-openbsd/lib/libc/stdio/fgetc.c \
upstream-openbsd/lib/libc/stdio/fgetln.c \
- upstream-openbsd/lib/libc/stdio/fgetpos.c \
upstream-openbsd/lib/libc/stdio/fgets.c \
upstream-openbsd/lib/libc/stdio/fgetwc.c \
upstream-openbsd/lib/libc/stdio/fgetws.c \
- upstream-openbsd/lib/libc/stdio/fileno.c \
upstream-openbsd/lib/libc/stdio/flags.c \
upstream-openbsd/lib/libc/stdio/fmemopen.c \
- upstream-openbsd/lib/libc/stdio/fopen.c \
upstream-openbsd/lib/libc/stdio/fprintf.c \
upstream-openbsd/lib/libc/stdio/fpurge.c \
upstream-openbsd/lib/libc/stdio/fputc.c \
upstream-openbsd/lib/libc/stdio/fputs.c \
upstream-openbsd/lib/libc/stdio/fputwc.c \
upstream-openbsd/lib/libc/stdio/fputws.c \
- upstream-openbsd/lib/libc/stdio/freopen.c \
upstream-openbsd/lib/libc/stdio/fscanf.c \
- upstream-openbsd/lib/libc/stdio/fseek.c \
- upstream-openbsd/lib/libc/stdio/fsetpos.c \
- upstream-openbsd/lib/libc/stdio/ftell.c \
- upstream-openbsd/lib/libc/stdio/funopen.c \
upstream-openbsd/lib/libc/stdio/fvwrite.c \
upstream-openbsd/lib/libc/stdio/fwalk.c \
upstream-openbsd/lib/libc/stdio/fwide.c \
@@ -455,7 +485,6 @@ libc_upstream_openbsd_ndk_src_files := \
upstream-openbsd/lib/libc/stdio/puts.c \
upstream-openbsd/lib/libc/stdio/putwc.c \
upstream-openbsd/lib/libc/stdio/putwchar.c \
- upstream-openbsd/lib/libc/stdio/refill.c \
upstream-openbsd/lib/libc/stdio/remove.c \
upstream-openbsd/lib/libc/stdio/rewind.c \
upstream-openbsd/lib/libc/stdio/rget.c \
@@ -489,11 +518,16 @@ libc_upstream_openbsd_ndk_src_files := \
upstream-openbsd/lib/libc/stdio/wprintf.c \
upstream-openbsd/lib/libc/stdio/wscanf.c \
upstream-openbsd/lib/libc/stdio/wsetup.c \
+ upstream-openbsd/lib/libc/stdlib/abs.c \
upstream-openbsd/lib/libc/stdlib/atoi.c \
upstream-openbsd/lib/libc/stdlib/atol.c \
upstream-openbsd/lib/libc/stdlib/atoll.c \
upstream-openbsd/lib/libc/stdlib/getenv.c \
upstream-openbsd/lib/libc/stdlib/insque.c \
+ upstream-openbsd/lib/libc/stdlib/imaxabs.c \
+ upstream-openbsd/lib/libc/stdlib/imaxdiv.c \
+ upstream-openbsd/lib/libc/stdlib/labs.c \
+ upstream-openbsd/lib/libc/stdlib/llabs.c \
upstream-openbsd/lib/libc/stdlib/lsearch.c \
upstream-openbsd/lib/libc/stdlib/reallocarray.c \
upstream-openbsd/lib/libc/stdlib/remque.c \
@@ -524,6 +558,7 @@ libc_upstream_openbsd_ndk_src_files := \
libc_pthread_src_files := \
bionic/pthread_atfork.cpp \
bionic/pthread_attr.cpp \
+ bionic/pthread_barrier.cpp \
bionic/pthread_cond.cpp \
bionic/pthread_create.cpp \
bionic/pthread_detach.cpp \
@@ -543,9 +578,7 @@ libc_pthread_src_files := \
bionic/pthread_setname_np.cpp \
bionic/pthread_setschedparam.cpp \
bionic/pthread_sigmask.cpp \
-
-libc_thread_atexit_impl_src_files := \
- bionic/__cxa_thread_atexit_impl.cpp \
+ bionic/pthread_spinlock.cpp \
libc_arch_static_src_files := \
bionic/dl_iterate_phdr_static.cpp \
@@ -575,15 +608,23 @@ libc_common_cflags := \
-D_LIBC=1 \
-Wall -Wextra -Wunused \
-ifneq ($(TARGET_USES_LOGD),false)
-libc_common_cflags += -DTARGET_USES_LOGD
+use_clang := $(USE_CLANG_PLATFORM_BUILD)
+
+# Clang/llvm has incompatible long double (fp128) for x86_64.
+# https://llvm.org/bugs/show_bug.cgi?id=23897
+ifeq ($(TARGET_ARCH),x86_64)
+ use_clang := false
endif
-use_clang := $(USE_CLANG_PLATFORM_BUILD)
-ifeq ($(use_clang),)
+# b/25291096, Clang/llvm compiled libc.so for mips/mips64 failed to boot.
+ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),mips mips64))
use_clang := false
endif
+ifeq ($(use_clang),)
+ use_clang := true
+endif
+
# Try to catch typical 32-bit assumptions that break with 64-bit pointers.
libc_common_cflags += \
-Werror=pointer-to-int-cast \
@@ -595,21 +636,8 @@ ifeq ($(strip $(DEBUG_BIONIC_LIBC)),true)
libc_common_cflags += -DDEBUG
endif
-ifeq ($(MALLOC_IMPL),dlmalloc)
- libc_common_cflags += -DUSE_DLMALLOC
- libc_malloc_src := bionic/dlmalloc.c
-else
- libc_common_cflags += -DUSE_JEMALLOC
- libc_malloc_src := bionic/jemalloc_wrapper.cpp
- libc_common_c_includes += external/jemalloc/include
-endif
-
-# To customize dlmalloc's alignment, set BOARD_MALLOC_ALIGNMENT in
-# the appropriate BoardConfig.mk file.
-#
-ifneq ($(BOARD_MALLOC_ALIGNMENT),)
- libc_common_cflags += -DMALLOC_ALIGNMENT=$(BOARD_MALLOC_ALIGNMENT)
-endif
+libc_malloc_src := bionic/jemalloc_wrapper.cpp
+libc_common_c_includes += external/jemalloc/include
# Define some common conlyflags
libc_common_conlyflags := \
@@ -617,7 +645,6 @@ libc_common_conlyflags := \
# Define some common cppflags
libc_common_cppflags := \
- -std=gnu++11
# Define some common includes
# ========================================================
@@ -642,13 +669,21 @@ endef
# libc_stack_protector.a - stack protector code
# ========================================================
#
-# The stack protector code needs to be compiled
-# with -fno-stack-protector, since it modifies the
-# stack canary.
+# Code that implements the stack protector (or that runs
+# before TLS has been set up) needs to be compiled with
+# -fno-stack-protector, since it accesses the stack canary
+# TLS slot.
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := bionic/__stack_chk_fail.cpp
+LOCAL_SRC_FILES := \
+ bionic/__libc_init_main_thread.cpp \
+ bionic/__stack_chk_fail.cpp \
+
+LOCAL_SRC_FILES_arm64 := arch-arm64/bionic/__set_tls.c
+LOCAL_SRC_FILES_x86 := arch-x86/bionic/__set_tls.c
+LOCAL_SRC_FILES_x86_64 := arch-x86_64/bionic/__set_tls.c
+
LOCAL_CFLAGS := $(libc_common_cflags) -fno-stack-protector
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
LOCAL_CPPFLAGS := $(libc_common_cppflags)
@@ -658,7 +693,31 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
+LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
+
+$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
+include $(BUILD_STATIC_LIBRARY)
+
+
+# libc_init_static.cpp also needs to be built without stack protector,
+# because it's responsible for setting up TLS for static executables.
+# This isn't the case for dynamic executables because the dynamic linker
+# has already set up the main thread's TLS.
+
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := bionic/libc_init_static.cpp
+LOCAL_CFLAGS := $(libc_common_cflags) -fno-stack-protector
+LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
+LOCAL_CPPFLAGS := $(libc_common_cppflags)
+LOCAL_C_INCLUDES := $(libc_common_c_includes)
+LOCAL_MODULE := libc_init_static
+LOCAL_CLANG := $(use_clang)
+LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
+LOCAL_CXX_STL := none
+LOCAL_SYSTEM_SHARED_LIBRARIES :=
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -677,17 +736,22 @@ LOCAL_SRC_FILES += upstream-openbsd/lib/libc/time/wcsftime.c
LOCAL_CFLAGS := $(libc_common_cflags) \
-fvisibility=hidden \
+ -Wno-unused-parameter \
# Don't use ridiculous amounts of stack.
LOCAL_CFLAGS += -DALL_STATE
# Include tzsetwall, timelocal, timegm, time2posix, and posix2time.
LOCAL_CFLAGS += -DSTD_INSPIRED
+# Obviously, we want to be thread-safe.
+LOCAL_CFLAGS += -DTHREAD_SAFE
# The name of the tm_gmtoff field in our struct tm.
LOCAL_CFLAGS += -DTM_GMTOFF=tm_gmtoff
# Where we store our tzdata.
LOCAL_CFLAGS += -DTZDIR=\"/system/usr/share/zoneinfo\"
# Include timezone and daylight globals.
LOCAL_CFLAGS += -DUSG_COMPAT=1
+# Use the empty string (instead of " ") as the timezone abbreviation fallback.
+LOCAL_CFLAGS += -DWILDABBR=\"\"
LOCAL_CFLAGS += -DNO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
LOCAL_CFLAGS += -Dlint
@@ -699,7 +763,7 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -718,12 +782,6 @@ LOCAL_SRC_FILES := \
upstream-netbsd/lib/libc/isc/ev_timers.c \
upstream-netbsd/lib/libc/resolv/mtctxres.c \
-# We use the OpenBSD res_random.
-LOCAL_CFLAGS += \
- -Dres_randomid=__res_randomid
-LOCAL_SRC_FILES += \
- upstream-openbsd/lib/libc/net/res_random.c \
-
LOCAL_CFLAGS += \
$(libc_common_cflags) \
-DANDROID_CHANGES \
@@ -745,7 +803,7 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -778,11 +836,11 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
-$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_freebsd_src_files))
+$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES_EXCLUDE,libc_freebsd_src_files_exclude))
include $(BUILD_STATIC_LIBRARY)
@@ -798,7 +856,9 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(libc_upstream_netbsd_src_files)
LOCAL_CFLAGS := \
$(libc_common_cflags) \
- -Wno-sign-compare -Wno-uninitialized \
+ -Wno-sign-compare \
+ -Wno-uninitialized \
+ -Wno-unused-parameter \
-DPOSIX_MISTAKE \
-include netbsd-compat.h \
@@ -813,7 +873,7 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -854,7 +914,7 @@ LOCAL_MODULE := libc_openbsd_ndk
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -892,11 +952,12 @@ LOCAL_MODULE := libc_openbsd
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_openbsd_src_files))
+$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES_EXCLUDE,libc_openbsd_src_files_exclude))
include $(BUILD_STATIC_LIBRARY)
@@ -930,7 +991,7 @@ LOCAL_MODULE := libc_gdtoa
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -955,11 +1016,12 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_bionic_src_files))
+$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES_EXCLUDE,libc_bionic_src_files_exclude))
include $(BUILD_STATIC_LIBRARY)
@@ -983,31 +1045,13 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_bionic_ndk_src_files))
include $(BUILD_STATIC_LIBRARY)
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(libc_thread_atexit_impl_src_files)
-LOCAL_CFLAGS := $(libc_common_cflags) -Wframe-larger-than=2048
-
-LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
-LOCAL_CPPFLAGS := $(libc_common_cppflags) -Wold-style-cast
-LOCAL_C_INCLUDES := $(libc_common_c_includes)
-LOCAL_MODULE := libc_thread_atexit_impl
-# TODO: Clang tries to use __tls_get_addr which is not supported yet
-# remove after it is implemented.
-LOCAL_CLANG := false
-LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
-LOCAL_CXX_STL := none
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
-LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
-
-include $(BUILD_STATIC_LIBRARY)
# ========================================================
# libc_pthread.a - pthreads parts that previously lived in
@@ -1031,7 +1075,7 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
include $(BUILD_STATIC_LIBRARY)
@@ -1055,7 +1099,7 @@ LOCAL_CLANG := true # GCC refuses to hide new/delete
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
# b/17574078: Need to disable coverage until we have a prebuilt libprofile_rt.
# Since this is a static library built with clang, it needs to link
# libprofile_rt when it is linked into the final binary. Since the final binary
@@ -1083,7 +1127,7 @@ LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
include $(BUILD_STATIC_LIBRARY)
@@ -1105,7 +1149,7 @@ LOCAL_CFLAGS := $(libc_common_cflags) -fno-builtin
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
include $(BUILD_STATIC_LIBRARY)
@@ -1131,7 +1175,7 @@ LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
LOCAL_CFLAGS := $(libc_common_cflags) -fvisibility=hidden -O0
LOCAL_CPPFLAGS := $(libc_common_cppflags)
LOCAL_C_INCLUDES := $(libc_common_c_includes)
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
LOCAL_SYSTEM_SHARED_LIBRARIES :=
@@ -1139,7 +1183,7 @@ LOCAL_SRC_FILES := \
$(libc_common_src_files) \
$(libc_arch_dynamic_src_files) \
$(libc_ndk_stub_src_files) \
- bionic/malloc_debug_common.cpp \
+ bionic/malloc_common.cpp \
LOCAL_SRC_FILES_arm += \
arch-common/bionic/crtbegin_so.c \
@@ -1161,14 +1205,11 @@ LOCAL_WHOLE_STATIC_LIBRARIES := \
libc_syscalls \
libc_tzcode \
libm \
+ libjemalloc \
LOCAL_WHOLE_STATIC_LIBRARIES_arm := libc_aeabi
LOCAL_CXX_STL := none
-ifneq ($(MALLOC_IMPL),dlmalloc)
-LOCAL_WHOLE_STATIC_LIBRARIES += libjemalloc
-endif
-
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_common_src_files))
$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_arch_dynamic_src_files))
@@ -1205,7 +1246,6 @@ LOCAL_WHOLE_STATIC_LIBRARIES := \
libc_pthread \
libc_stack_protector \
libc_syscalls \
- libc_thread_atexit_impl \
libc_tzcode \
LOCAL_WHOLE_STATIC_LIBRARIES_arm := libc_aeabi
@@ -1215,7 +1255,7 @@ LOCAL_SYSTEM_SHARED_LIBRARIES :=
# TODO: split out the asflags.
LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -1238,7 +1278,6 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(libc_arch_static_src_files) \
- bionic/libc_init_static.cpp
LOCAL_C_INCLUDES := $(libc_common_c_includes)
LOCAL_CFLAGS := $(libc_common_cflags) \
@@ -1250,10 +1289,10 @@ LOCAL_CPPFLAGS := $(libc_common_cppflags)
LOCAL_MODULE := libc_nomalloc
LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
-LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
+LOCAL_WHOLE_STATIC_LIBRARIES := libc_common libc_init_static
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -1276,7 +1315,7 @@ LOCAL_C_INCLUDES := $(libc_common_c_includes)
LOCAL_MODULE := libc_malloc
LOCAL_CLANG := $(use_clang)
LOCAL_CXX_STL := none
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
include $(BUILD_STATIC_LIBRARY)
@@ -1289,7 +1328,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(libc_arch_static_src_files) \
- bionic/malloc_debug_common.cpp \
+ bionic/malloc_common.cpp \
bionic/libc_init_static.cpp \
LOCAL_CFLAGS := $(libc_common_cflags) \
@@ -1301,15 +1340,11 @@ LOCAL_C_INCLUDES := $(libc_common_c_includes)
LOCAL_MODULE := libc
LOCAL_CLANG := $(use_clang)
LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
-LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
-
-ifneq ($(MALLOC_IMPL),dlmalloc)
-LOCAL_WHOLE_STATIC_LIBRARIES += libjemalloc
-endif
+LOCAL_WHOLE_STATIC_LIBRARIES := libc_common libc_init_static libjemalloc
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
@@ -1331,7 +1366,7 @@ LOCAL_SRC_FILES := \
arch-common/bionic/crtbegin_so.c \
arch-common/bionic/crtbrand.S \
$(libc_arch_dynamic_src_files) \
- bionic/malloc_debug_common.cpp \
+ bionic/malloc_common.cpp \
bionic/libc_init_dynamic.cpp \
bionic/NetdClient.cpp \
arch-common/bionic/crtend_so.S \
@@ -1341,7 +1376,15 @@ LOCAL_CLANG := $(use_clang)
LOCAL_REQUIRED_MODULES := tzdata
LOCAL_ADDITIONAL_DEPENDENCIES := \
$(libc_common_additional_dependencies) \
- $(LOCAL_PATH)/libc.map \
+ $(LOCAL_PATH)/libc.arm.map \
+ $(LOCAL_PATH)/libc.arm64.map \
+ $(LOCAL_PATH)/libc.mips.map \
+ $(LOCAL_PATH)/libc.mips64.map \
+ $(LOCAL_PATH)/libc.x86.map \
+ $(LOCAL_PATH)/libc.x86_64.map \
+ $(LOCAL_PATH)/libc.arm.brillo.map \
+ $(LOCAL_PATH)/libc.mips.brillo.map \
+ $(LOCAL_PATH)/libc.x86.brillo.map \
# Leave the symbols in the shared library so that stack unwinders can produce
# meaningful name resolution.
@@ -1359,26 +1402,38 @@ LOCAL_PACK_MODULE_RELOCATIONS := false
# you wanted!
LOCAL_SHARED_LIBRARIES := libdl
-LOCAL_WHOLE_STATIC_LIBRARIES := libc_common
-
-ifneq ($(MALLOC_IMPL),dlmalloc)
-LOCAL_WHOLE_STATIC_LIBRARIES += libjemalloc
-endif
+LOCAL_WHOLE_STATIC_LIBRARIES := libc_common libjemalloc
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES :=
+# TODO: This is to work around b/24465209. Remove after root cause is fixed
+LOCAL_LDFLAGS_arm := -Wl,--hash-style=both
+LOCAL_LDFLAGS_x86 := -Wl,--hash-style=both
+
# Don't re-export new/delete and friends, even if the compiler really wants to.
-LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/libc.map
+ifdef BRILLO
+LOCAL_LDFLAGS_arm += -Wl,--version-script,$(LOCAL_PATH)/libc.arm.brillo.map
+LOCAL_LDFLAGS_mips += -Wl,--version-script,$(LOCAL_PATH)/libc.mips.brillo.map
+LOCAL_LDFLAGS_x86 += -Wl,--version-script,$(LOCAL_PATH)/libc.x86.brillo.map
+else
+LOCAL_LDFLAGS_arm += -Wl,--version-script,$(LOCAL_PATH)/libc.arm.map
+LOCAL_LDFLAGS_mips += -Wl,--version-script,$(LOCAL_PATH)/libc.mips.map
+LOCAL_LDFLAGS_x86 += -Wl,--version-script,$(LOCAL_PATH)/libc.x86.map
+endif
+
+LOCAL_LDFLAGS_arm64 += -Wl,--version-script,$(LOCAL_PATH)/libc.arm64.map
+LOCAL_LDFLAGS_mips64 += -Wl,--version-script,$(LOCAL_PATH)/libc.mips64.map
+LOCAL_LDFLAGS_x86_64 += -Wl,--version-script,$(LOCAL_PATH)/libc.x86_64.map
# We'd really like to do this for all architectures, but since this wasn't done
# before, these symbols must continue to be exported on LP32 for binary
# compatibility.
LOCAL_LDFLAGS_64 := -Wl,--exclude-libs,libgcc.a
-# TODO: This is to work around b/19059885. Remove after root cause is fixed
-LOCAL_LDFLAGS_arm := -Wl,--hash-style=both
-LOCAL_LDFLAGS_x86 := -Wl,--hash-style=both
+# Unfortunately --exclude-libs clobbers our version script, so we have to
+# prevent the build system from using this flag.
+LOCAL_NO_EXCLUDE_LIBS := true
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
$(eval $(call patch-up-arch-specific-flags,LOCAL_SRC_FILES,libc_arch_dynamic_src_files))
@@ -1391,107 +1446,35 @@ LOCAL_CFLAGS_arm += -DCRT_LEGACY_WORKAROUND
LOCAL_SRC_FILES_arm += \
arch-arm/bionic/atexit_legacy.c
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
include $(BUILD_SHARED_LIBRARY)
-
-# For all builds, except for the -user build we will enable memory
-# allocation checking (including memory leaks, buffer overwrites, etc.)
-# Note that all these checks are also controlled by env. settings
-# that can enable, or disable specific checks. Note also that some of
-# the checks are available only in emulator and are implemeted in
-# libc_malloc_qemu_instrumented.so.
-ifneq ($(TARGET_BUILD_VARIANT),user)
-
# ========================================================
-# libc_malloc_debug_leak.so
+# libc_logging.a
# ========================================================
include $(CLEAR_VARS)
LOCAL_CFLAGS := $(libc_common_cflags)
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
LOCAL_CPPFLAGS := $(libc_common_cppflags)
-
-# Make sure that unwind.h comes from libunwind.
-LOCAL_C_INCLUDES := \
- $(libc_common_c_includes) \
-
-LOCAL_SRC_FILES := \
- bionic/debug_mapinfo.cpp \
- bionic/debug_stacktrace.cpp \
- bionic/libc_logging.cpp \
- bionic/malloc_debug_leak.cpp \
- bionic/malloc_debug_check.cpp \
-
-LOCAL_MODULE := libc_malloc_debug_leak
-LOCAL_CLANG := $(use_clang)
-LOCAL_ADDITIONAL_DEPENDENCIES := \
- $(libc_common_additional_dependencies) \
- $(LOCAL_PATH)/version_script.txt \
-
-LOCAL_SHARED_LIBRARIES := libc libdl
-LOCAL_CXX_STL := none
-LOCAL_SYSTEM_SHARED_LIBRARIES :=
-# Only need this for arm since libc++ uses its own unwind code that
-# doesn't mix with the other default unwind code.
-LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm
-LOCAL_STATIC_LIBRARIES += libc++abi
-LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
-
-# Don't re-export new/delete and friends, even if the compiler really wants to.
-LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/version_script.txt
-
-# Don't install on release build
-LOCAL_MODULE_TAGS := eng debug
-LOCAL_ADDRESS_SANITIZER := false
-LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
-
-$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
-include $(BUILD_SHARED_LIBRARY)
-
-
-# ========================================================
-# libc_malloc_debug_qemu.so
-# ========================================================
-include $(CLEAR_VARS)
-
-LOCAL_CFLAGS := \
- $(libc_common_cflags) \
- -DMALLOC_QEMU_INSTRUMENT \
-
-LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
-LOCAL_CPPFLAGS := $(libc_common_cppflags)
-
LOCAL_C_INCLUDES := $(libc_common_c_includes)
LOCAL_SRC_FILES := \
bionic/libc_logging.cpp \
- bionic/malloc_debug_qemu.cpp \
-LOCAL_MODULE := libc_malloc_debug_qemu
-LOCAL_CLANG := $(use_clang)
-LOCAL_ADDITIONAL_DEPENDENCIES := \
- $(libc_common_additional_dependencies) \
- $(LOCAL_PATH)/version_script.txt \
+LOCAL_MODULE := libc_logging
-LOCAL_SHARED_LIBRARIES := libc libdl
-LOCAL_CXX_STL := none
+LOCAL_CLANG := $(use_clang)
+LOCAL_ADDITIONAL_DEPENDENCIES := $(libc_common_additional_dependencies)
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-# Don't re-export new/delete and friends, even if the compiler really wants to.
-LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/version_script.txt
-
-# Don't install on release build
-LOCAL_MODULE_TAGS := eng debug
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
$(eval $(call patch-up-arch-specific-flags,LOCAL_CFLAGS,libc_common_cflags))
-include $(BUILD_SHARED_LIBRARY)
-
-endif #!user
+include $(BUILD_STATIC_LIBRARY)
# ========================================================
# libstdc++.so
@@ -1500,14 +1483,13 @@ libstdcxx_common_src_files := \
bionic/__cxa_guard.cpp \
bionic/__cxa_pure_virtual.cpp \
bionic/new.cpp \
- bionic/libc_logging.cpp \
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(libc_common_c_includes) bionic/libstdc++/include
LOCAL_CFLAGS := $(libc_common_cflags)
LOCAL_CPPFLAGS := $(libc_common_cppflags)
-# TODO: This is to work around b/19059885. Remove after root cause is fixed
+# TODO: This is to work around b/24465209. Remove after root cause is fixed
LOCAL_LDFLAGS_arm := -Wl,--hash-style=both
LOCAL_LDFLAGS_x86 := -Wl,--hash-style=both
@@ -1516,7 +1498,8 @@ LOCAL_MODULE:= libstdc++
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES := libc
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_STATIC_LIBRARIES := libc_logging
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
include $(BUILD_SHARED_LIBRARY)
@@ -1532,10 +1515,6 @@ LOCAL_MODULE:= libstdc++
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_CXX_STL := none
LOCAL_SYSTEM_SHARED_LIBRARIES := libc
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
include $(BUILD_STATIC_LIBRARY)
-
-
-# ========================================================
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/libc/NOTICE b/libc/NOTICE
index dbe394443..2121246eb 100644
--- a/libc/NOTICE
+++ b/libc/NOTICE
@@ -85,6 +85,33 @@ POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------
+ Copyright (c) 2009-2013 The Linux Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
====================================================
Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
@@ -308,22 +335,6 @@ SUCH DAMAGE.
-------------------------------------------------------------------
Copyright (C) 2009 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
--------------------------------------------------------------------
-
-Copyright (C) 2009 The Android Open Source Project
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -688,6 +699,50 @@ SUCH DAMAGE.
-------------------------------------------------------------------
+Copyright (C) 2016 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-------------------------------------------------------------------
+
+Copyright (C) 2016 The Android Open Source Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
Copyright (c) 1980, 1983, 1988, 1993
The Regents of the University of California. All rights reserved.
@@ -894,53 +949,6 @@ SUCH DAMAGE.
-------------------------------------------------------------------
-Copyright (c) 1983, 1990, 1993
- The Regents of the University of California. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. Neither the name of the University nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
-Portions Copyright (c) 1993 by Digital Equipment Corporation.
-
-Permission to use, copy, modify, and distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies, and that
-the name of Digital Equipment Corporation not be used in advertising or
-publicity pertaining to distribution of the document or software without
-specific, written prior permission.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
-WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
-CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
-PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
-ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
--------------------------------------------------------------------
-
Copyright (c) 1983, 1993
The Regents of the University of California. All rights reserved.
@@ -1679,6 +1687,38 @@ SUCH DAMAGE.
-------------------------------------------------------------------
+Copyright (c) 1990 Regents of the University of California.
+All rights reserved.
+
+This code is derived from software contributed to Berkeley by
+Chris Torek.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
Copyright (c) 1990 The Regents of the University of California.
All rights reserved.
@@ -2889,22 +2929,6 @@ POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------
Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
-
-Permission to use, copy, modify, and distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
--------------------------------------------------------------------
-
-Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -2931,6 +2955,22 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------
+Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+-------------------------------------------------------------------
+
Copyright (c) 1999
David E. O'Brien
Copyright (c) 1988, 1993
@@ -3057,32 +3097,6 @@ POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------
-Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
Copyright (c) 2001 Wasabi Systems, Inc.
All rights reserved.
@@ -3921,35 +3935,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-------------------------------------------------------------------
-Copyright (c) 2009
- MIPS Technologies, Inc., California.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-3. Neither the name of the MIPS Technologies, Inc., nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
Copyright (c) 2009 David Schultz <das@FreeBSD.org>
All rights reserved.
@@ -4431,6 +4416,64 @@ Copyright (c) 2012, Linaro Limited
-------------------------------------------------------------------
+Copyright (c) 2012-2015
+ MIPS Technologies, Inc., California.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the MIPS Technologies, Inc., nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
+Copyright (c) 2013
+ MIPS Technologies, Inc., California.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the MIPS Technologies, Inc., nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
Copyright (c) 2013 ARM Ltd
All rights reserved.
@@ -4504,6 +4547,35 @@ POSSIBILITY OF SUCH DAMAGE.
-------------------------------------------------------------------
+Copyright (c) 2014
+ Imagination Technologies Limited.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the MIPS Technologies, Inc., nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY IMAGINATION TECHNOLOGIES LIMITED ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL IMAGINATION TECHNOLOGIES LIMITED BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
Copyright (c) 2014 Bob Beck <beck@obtuse.com>
@@ -4582,6 +4654,35 @@ Copyright (c) 2014, Linaro Limited
-------------------------------------------------------------------
+Copyright (c) 2015 Joerg Sonnenberger <joerg@NetBSD.org>.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+-------------------------------------------------------------------
+
Copyright (c)1999 Citrus Project,
All rights reserved.
diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT
index 2e2cd11a4..d5dd2063e 100644
--- a/libc/SYSCALLS.TXT
+++ b/libc/SYSCALLS.TXT
@@ -77,7 +77,6 @@ int prlimit64(pid_t, int, struct rlimit64*, const struct rlimit64*) arm,mips,x8
int setgroups:setgroups32(int, const gid_t*) arm,x86
int setgroups:setgroups(int, const gid_t*) arm64,mips,mips64,x86_64
int setpgid(pid_t, pid_t) all
-pid_t vfork(void) arm
int setregid:setregid32(gid_t, gid_t) arm,x86
int setregid:setregid(gid_t, gid_t) arm64,mips,mips64,x86_64
int chroot(const char*) all
@@ -95,10 +94,20 @@ ssize_t pread64(int, void*, size_t, off64_t) arm,mips,x86
ssize_t pread64|pread(int, void*, size_t, off_t) arm64,mips64,x86_64
ssize_t pwrite64(int, void*, size_t, off64_t) arm,mips,x86
ssize_t pwrite64|pwrite(int, void*, size_t, off_t) arm64,mips64,x86_64
+
+# On LP32, preadv/pwritev don't use off64_t --- they use pairs of 32-bit
+# arguments to avoid problems on architectures like ARM where 64-bit arguments
+# must be in a register pair starting with an even-numbered register.
+# See linux/fs/read_write.c and https://lwn.net/Articles/311630/.
+ssize_t __preadv64:preadv(int, const struct iovec*, int, long, long) arm,mips,x86
+ssize_t preadv|preadv64(int, const struct iovec*, int, off_t) arm64,mips64,x86_64
+ssize_t __pwritev64:pwritev(int, const struct iovec*, int, long, long) arm,mips,x86
+ssize_t pwritev|pwritev64(int, const struct iovec*, int, off_t) arm64,mips64,x86_64
+
int ___close:close(int) all
pid_t __getpid:getpid() all
int munmap(void*, size_t) all
-void* mremap(void*, size_t, size_t, unsigned long) all
+void* ___mremap:mremap(void*, size_t, size_t, int, void*) all
int msync(const void*, size_t, int) all
int mprotect(const void*, size_t, int) all
int madvise(void*, size_t, int) all
@@ -124,7 +133,7 @@ int fchown:fchown(int, uid_t, gid_t) arm64,mips,mips64,x86_64
void sync(void) all
int ___fsetxattr:fsetxattr(int, const char*, const void*, size_t, int) all
ssize_t ___fgetxattr:fgetxattr(int, const char*, void*, size_t) all
-ssize_t flistxattr(int, char*, size_t) all
+ssize_t ___flistxattr:flistxattr(int, char*, size_t) all
int fremovexattr(int, const char*) all
int __getdents64:getdents64(unsigned int, struct dirent*, unsigned int) arm,arm64,mips,mips64,x86,x86_64
@@ -214,6 +223,8 @@ int __timer_delete:timer_delete(__kernel_timer_t)
int timerfd_create(clockid_t, int) all
int timerfd_settime(int, int, const struct itimerspec*, struct itimerspec*) all
int timerfd_gettime(int, struct itimerspec*) all
+int adjtimex(struct timex*) all
+int clock_adjtime(clockid_t, struct timex*) all
# signals
int __sigaction:sigaction(int, const struct sigaction*, struct sigaction*) arm,mips,x86
@@ -333,7 +344,7 @@ int __set_tls:set_thread_area(void*) mips,mips64
int __set_thread_area:set_thread_area(void*) x86
# vdso stuff.
-int clock_gettime(clockid_t, timespec*) arm,mips,mips64,x86
-int __clock_gettime:clock_gettime(clockid_t, timespec*) arm64,x86_64
-int gettimeofday(timeval*, timezone*) arm,mips,mips64,x86
-int __gettimeofday:gettimeofday(timeval*, timezone*) arm64,x86_64
+int clock_gettime(clockid_t, timespec*) arm,mips,mips64
+int __clock_gettime:clock_gettime(clockid_t, timespec*) arm64,x86,x86_64
+int gettimeofday(timeval*, timezone*) arm,mips,mips64
+int __gettimeofday:gettimeofday(timeval*, timezone*) arm64,x86,x86_64
diff --git a/libc/arch-arm/arm.mk b/libc/arch-arm/arm.mk
index d72a160d0..76f465e81 100644
--- a/libc/arch-arm/arm.mk
+++ b/libc/arch-arm/arm.mk
@@ -1,33 +1,19 @@
# 32-bit arm.
-#
-# Default implementations of functions that are commonly optimized.
-#
-
libc_bionic_src_files_arm += \
- bionic/strchr.cpp \
- bionic/strnlen.c \
- bionic/strrchr.cpp \
+ arch-arm/generic/bionic/memcmp.S \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
-libc_freebsd_src_files_arm += \
- upstream-freebsd/lib/libc/string/wcscat.c \
- upstream-freebsd/lib/libc/string/wcschr.c \
- upstream-freebsd/lib/libc/string/wcscmp.c \
- upstream-freebsd/lib/libc/string/wcscpy.c \
- upstream-freebsd/lib/libc/string/wcslen.c \
- upstream-freebsd/lib/libc/string/wcsrchr.c \
- upstream-freebsd/lib/libc/string/wmemcmp.c \
- upstream-freebsd/lib/libc/string/wmemmove.c \
+libc_bionic_src_files_exclude_arm += \
+ bionic/__memcpy_chk.cpp \
+ bionic/__memset_chk.cpp \
-libc_openbsd_src_files_arm += \
- upstream-openbsd/lib/libc/string/memchr.c \
- upstream-openbsd/lib/libc/string/memrchr.c \
- upstream-openbsd/lib/libc/string/stpncpy.c \
- upstream-openbsd/lib/libc/string/strlcat.c \
- upstream-openbsd/lib/libc/string/strlcpy.c \
- upstream-openbsd/lib/libc/string/strncat.c \
- upstream-openbsd/lib/libc/string/strncmp.c \
- upstream-openbsd/lib/libc/string/strncpy.c \
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/strcpy.c \
#
# Inherently architecture-specific code.
@@ -39,9 +25,11 @@ libc_bionic_src_files_arm += \
arch-arm/bionic/__bionic_clone.S \
arch-arm/bionic/_exit_with_stack_teardown.S \
arch-arm/bionic/libgcc_compat.c \
+ arch-arm/bionic/popcount_tab.c \
arch-arm/bionic/__restore.S \
arch-arm/bionic/setjmp.S \
arch-arm/bionic/syscall.S \
+ arch-arm/bionic/vfork.S \
libc_arch_static_src_files_arm := arch-arm/bionic/exidx_static.c
libc_arch_dynamic_src_files_arm := arch-arm/bionic/exidx_dynamic.c
@@ -50,6 +38,7 @@ libc_arch_dynamic_src_files_arm := arch-arm/bionic/exidx_dynamic.c
ifeq ($(strip $(TARGET_$(my_2nd_arch_prefix)CPU_VARIANT)),)
$(warning TARGET_$(my_2nd_arch_prefix)ARCH is arm, but TARGET_$(my_2nd_arch_prefix)CPU_VARIANT is not defined)
endif
+ifneq ($(TARGET_$(my_2nd_arch_prefix)CPU_VARIANT),generic)
cpu_variant_mk := $(LOCAL_PATH)/arch-arm/$(TARGET_$(my_2nd_arch_prefix)CPU_VARIANT)/$(TARGET_$(my_2nd_arch_prefix)CPU_VARIANT).mk
ifeq ($(wildcard $(cpu_variant_mk)),)
$(error "TARGET_$(my_2nd_arch_prefix)CPU_VARIANT not set or set to an unknown value. Possible values are cortex-a7, cortex-a8, cortex-a9, cortex-a15, krait, denver. Use generic for devices that do not have a CPU similar to any of the supported cpu variants.")
@@ -58,6 +47,7 @@ include $(cpu_variant_mk)
libc_common_additional_dependencies += $(cpu_variant_mk)
cpu_variant_mk :=
+endif
libc_crt_target_cflags_arm := \
diff --git a/libc/arch-arm/bionic/__aeabi.c b/libc/arch-arm/bionic/__aeabi.c
index 254c7a6ca..1620d4526 100644
--- a/libc/arch-arm/bionic/__aeabi.c
+++ b/libc/arch-arm/bionic/__aeabi.c
@@ -51,34 +51,62 @@ extern int __cxa_atexit(void (*)(void*), void*, void*);
*/
int __attribute__((weak))
-__aeabi_atexit(void *object, void (*destructor) (void *), void *dso_handle) {
+__aeabi_atexit_impl(void *object, void (*destructor) (void *), void *dso_handle) {
return __cxa_atexit(destructor, object, dso_handle);
}
+int __attribute__((weak))
+__aeabi_atexit_impl2(void *object, void (*destructor) (void *), void *dso_handle) {
+ return __cxa_atexit(destructor, object, dso_handle);
+}
+
+
+void __attribute__((weak)) __aeabi_memcpy8_impl(void *dest, const void *src, size_t n) {
+ memcpy(dest, src, n);
+}
+
+void __attribute__((weak)) __aeabi_memcpy4_impl(void *dest, const void *src, size_t n) {
+ memcpy(dest, src, n);
+}
-void __attribute__((weak))
-__aeabi_memcpy8(void *dest, const void *src, size_t n) {
+void __attribute__((weak)) __aeabi_memcpy_impl(void *dest, const void *src, size_t n) {
memcpy(dest, src, n);
}
-void __attribute__((weak)) __aeabi_memcpy4(void *dest, const void *src, size_t n) {
+void __attribute__((weak)) __aeabi_memcpy8_impl2(void *dest, const void *src, size_t n) {
memcpy(dest, src, n);
}
-void __attribute__((weak)) __aeabi_memcpy(void *dest, const void *src, size_t n) {
+void __attribute__((weak)) __aeabi_memcpy4_impl2(void *dest, const void *src, size_t n) {
memcpy(dest, src, n);
}
+void __attribute__((weak)) __aeabi_memcpy_impl2(void *dest, const void *src, size_t n) {
+ memcpy(dest, src, n);
+}
+
+
+void __attribute__((weak)) __aeabi_memmove8_impl(void *dest, const void *src, size_t n) {
+ memmove(dest, src, n);
+}
+
+void __attribute__((weak)) __aeabi_memmove4_impl(void *dest, const void *src, size_t n) {
+ memmove(dest, src, n);
+}
+
+void __attribute__((weak)) __aeabi_memmove_impl(void *dest, const void *src, size_t n) {
+ memmove(dest, src, n);
+}
-void __attribute__((weak)) __aeabi_memmove8(void *dest, const void *src, size_t n) {
+void __attribute__((weak)) __aeabi_memmove8_impl2(void *dest, const void *src, size_t n) {
memmove(dest, src, n);
}
-void __attribute__((weak)) __aeabi_memmove4(void *dest, const void *src, size_t n) {
+void __attribute__((weak)) __aeabi_memmove4_impl2(void *dest, const void *src, size_t n) {
memmove(dest, src, n);
}
-void __attribute__((weak)) __aeabi_memmove(void *dest, const void *src, size_t n) {
+void __attribute__((weak)) __aeabi_memmove_impl2(void *dest, const void *src, size_t n) {
memmove(dest, src, n);
}
@@ -87,27 +115,71 @@ void __attribute__((weak)) __aeabi_memmove(void *dest, const void *src, size_t n
* This allows __aeabi_memclr to tail-call __aeabi_memset
*/
-void __attribute__((weak)) __aeabi_memset8(void *dest, size_t n, int c) {
+void __attribute__((weak)) __aeabi_memset8_impl(void *dest, size_t n, int c) {
+ memset(dest, c, n);
+}
+
+void __attribute__((weak)) __aeabi_memset4_impl(void *dest, size_t n, int c) {
memset(dest, c, n);
}
-void __attribute__((weak)) __aeabi_memset4(void *dest, size_t n, int c) {
+void __attribute__((weak)) __aeabi_memset_impl(void *dest, size_t n, int c) {
memset(dest, c, n);
}
-void __attribute__((weak)) __aeabi_memset(void *dest, size_t n, int c) {
+void __attribute__((weak)) __aeabi_memset8_impl2(void *dest, size_t n, int c) {
memset(dest, c, n);
}
+void __attribute__((weak)) __aeabi_memset4_impl2(void *dest, size_t n, int c) {
+ memset(dest, c, n);
+}
-void __attribute__((weak)) __aeabi_memclr8(void *dest, size_t n) {
- __aeabi_memset8(dest, n, 0);
+void __attribute__((weak)) __aeabi_memset_impl2(void *dest, size_t n, int c) {
+ memset(dest, c, n);
}
-void __attribute__((weak)) __aeabi_memclr4(void *dest, size_t n) {
- __aeabi_memset4(dest, n, 0);
+
+void __attribute__((weak)) __aeabi_memclr8_impl(void *dest, size_t n) {
+ __aeabi_memset8_impl(dest, n, 0);
}
-void __attribute__((weak)) __aeabi_memclr(void *dest, size_t n) {
- __aeabi_memset(dest, n, 0);
+void __attribute__((weak)) __aeabi_memclr4_impl(void *dest, size_t n) {
+ __aeabi_memset4_impl(dest, n, 0);
}
+
+void __attribute__((weak)) __aeabi_memclr_impl(void *dest, size_t n) {
+ __aeabi_memset_impl(dest, n, 0);
+}
+
+void __attribute__((weak)) __aeabi_memclr8_impl2(void *dest, size_t n) {
+ __aeabi_memset8_impl(dest, n, 0);
+}
+
+void __attribute__((weak)) __aeabi_memclr4_impl2(void *dest, size_t n) {
+ __aeabi_memset4_impl(dest, n, 0);
+}
+
+void __attribute__((weak)) __aeabi_memclr_impl2(void *dest, size_t n) {
+ __aeabi_memset_impl(dest, n, 0);
+}
+
+#define __AEABI_SYMVERS(fn_name) \
+__asm__(".symver " #fn_name "_impl, " #fn_name "@@LIBC_N"); \
+__asm__(".symver " #fn_name "_impl2, " #fn_name "@LIBC_PRIVATE")
+
+__AEABI_SYMVERS(__aeabi_atexit);
+__AEABI_SYMVERS(__aeabi_memcpy8);
+__AEABI_SYMVERS(__aeabi_memcpy4);
+__AEABI_SYMVERS(__aeabi_memcpy);
+__AEABI_SYMVERS(__aeabi_memmove8);
+__AEABI_SYMVERS(__aeabi_memmove4);
+__AEABI_SYMVERS(__aeabi_memmove);
+__AEABI_SYMVERS(__aeabi_memset8);
+__AEABI_SYMVERS(__aeabi_memset4);
+__AEABI_SYMVERS(__aeabi_memset);
+__AEABI_SYMVERS(__aeabi_memclr8);
+__AEABI_SYMVERS(__aeabi_memclr4);
+__AEABI_SYMVERS(__aeabi_memclr);
+
+#undef __AEABI_SYMVERS
diff --git a/libc/arch-arm/bionic/__restore.S b/libc/arch-arm/bionic/__restore.S
index 98981256b..8c1e41d53 100644
--- a/libc/arch-arm/bionic/__restore.S
+++ b/libc/arch-arm/bionic/__restore.S
@@ -34,7 +34,9 @@
// __restore_rt (but covered by the .fnstart/.fnend) so that although they're
// not inside the functions from objdump's point of view, an unwinder that
// blindly looks at the previous instruction (but is then smart enough to check
-// the DWARF information to find out where it landed) gets the right answer.
+// the unwind information to find out where it landed) gets the right answer.
+// Make sure not to have both DWARF and ARM unwind information, so only
+// use the ARM unwind information.
// We need to place .fnstart ourselves (but we may as well keep the free .fnend).
#undef __bionic_asm_custom_entry
@@ -44,18 +46,18 @@
.save {r0-r15}
.pad #32
nop
-ENTRY_PRIVATE(__restore)
+ENTRY_PRIVATE_NO_DWARF(__restore)
// This function must have exactly this instruction sequence.
mov r7, #__NR_sigreturn
swi #0
-END(__restore)
+END_NO_DWARF(__restore)
.fnstart
.save {r0-r15}
.pad #160
nop
-ENTRY_PRIVATE(__restore_rt)
+ENTRY_PRIVATE_NO_DWARF(__restore_rt)
// This function must have exactly this instruction sequence.
mov r7, #__NR_rt_sigreturn
swi #0
-END(__restore_rt)
+END_NO_DWARF(__restore_rt)
diff --git a/libc/arch-arm/bionic/exidx_dynamic.c b/libc/arch-arm/bionic/exidx_dynamic.c
index c7b7156b0..60ac8af58 100644
--- a/libc/arch-arm/bionic/exidx_dynamic.c
+++ b/libc/arch-arm/bionic/exidx_dynamic.c
@@ -37,7 +37,13 @@
* the expectation that libc will define it and call through to
* a differently-named function in the dynamic linker.
*/
-_Unwind_Ptr __gnu_Unwind_Find_exidx(_Unwind_Ptr pc, int *pcount)
-{
+_Unwind_Ptr __gnu_Unwind_Find_exidx_impl(_Unwind_Ptr pc, int *pcount) {
return dl_unwind_find_exidx(pc, pcount);
}
+
+_Unwind_Ptr __gnu_Unwind_Find_exidx_impl2(_Unwind_Ptr pc, int *pcount) {
+ return dl_unwind_find_exidx(pc, pcount);
+}
+
+__asm__(".symver __gnu_Unwind_Find_exidx_impl,__gnu_Unwind_Find_exidx@LIBC_PRIVATE");
+__asm__(".symver __gnu_Unwind_Find_exidx_impl2,__gnu_Unwind_Find_exidx@@LIBC_N");
diff --git a/libc/arch-arm/bionic/popcount_tab.c b/libc/arch-arm/bionic/popcount_tab.c
new file mode 100644
index 000000000..eb2faa9c7
--- /dev/null
+++ b/libc/arch-arm/bionic/popcount_tab.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+// Export this to maintain ABI compatibilty with libgcc, since compiler-rt
+// doesn't use a table-driven implementation of __popcount.
+const unsigned char __popcount_tab[256] = {
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,
+ 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4,
+ 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4,
+ 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5,
+ 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2,
+ 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,
+ 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5,
+ 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5,
+ 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
diff --git a/libc/arch-arm/bionic/setjmp.S b/libc/arch-arm/bionic/setjmp.S
index 8220c0825..91d158a36 100644
--- a/libc/arch-arm/bionic/setjmp.S
+++ b/libc/arch-arm/bionic/setjmp.S
@@ -36,10 +36,13 @@
// According to the ARM AAPCS document, we only need to save
// the following registers:
//
-// Core r4-r14
-//
-// VFP d8-d15 (see section 5.1.2.1)
+// Core r4-r11, sp, lr
+// AAPCS 5.1.1:
+// A subroutine must preserve the contents of the registers r4-r8, r10, r11
+// and SP (and r9 in PCS variants that designate r9 as v6).
//
+// VFP d8-d15
+// AAPCS 5.1.2.1:
// Registers s16-s31 (d8-d15, q4-q7) must be preserved across subroutine
// calls; registers s0-s15 (d0-d7, q0-q3) do not need to be preserved
// (and can be used for passing arguments or returning results in standard
@@ -49,15 +52,16 @@
// FPSCR saved because glibc does.
// The internal structure of a jmp_buf is totally private.
-// Current layout (may change in the future):
+// Current layout (changes from release to release):
//
-// word name description
-// 0 magic magic number
-// 1 sigmask signal mask (not used with _setjmp / _longjmp)
-// 2 float_base base of float registers (d8 to d15)
-// 18 float_state floating-point status and control register
-// 19 core_base base of core registers (r4 to r14)
-// 30 reserved reserved entries (room to grow)
+// word name description
+// 0 sigflag/cookie setjmp cookie in top 31 bits, signal mask flag in low bit
+// 1 sigmask signal mask (not used with _setjmp / _longjmp)
+// 2 float_base base of float registers (d8 to d15)
+// 18 float_state floating-point status and control register
+// 19 core_base base of core registers (r4-r11, r13-r14)
+// 29 checksum checksum of all of the core registers, to give better error messages.
+// 30 reserved reserved entries (room to grow)
// 64
//
// NOTE: float_base must be at an even word index, since the
@@ -69,6 +73,7 @@
#define _JB_FLOAT_BASE (_JB_SIGMASK+1)
#define _JB_FLOAT_STATE (_JB_FLOAT_BASE + (15-8+1)*2)
#define _JB_CORE_BASE (_JB_FLOAT_STATE+1)
+#define _JB_CHECKSUM (_JB_CORE_BASE+10)
ENTRY(setjmp)
mov r1, #1
@@ -80,33 +85,91 @@ ENTRY(_setjmp)
b sigsetjmp
END(_setjmp)
+#define MANGLE_REGISTERS 1
+#define USE_CHECKSUM 1
+
+.macro m_mangle_registers reg
+#if MANGLE_REGISTERS
+ eor r4, r4, \reg
+ eor r5, r5, \reg
+ eor r6, r6, \reg
+ eor r7, r7, \reg
+ eor r8, r8, \reg
+ eor r9, r9, \reg
+ eor r10, r10, \reg
+ eor r11, r11, \reg
+ eor r13, r13, \reg
+ eor r14, r14, \reg
+#endif
+.endm
+
+.macro m_unmangle_registers reg
+ m_mangle_registers \reg
+.endm
+
+.macro m_calculate_checksum dst, src, scratch
+ mov \dst, #0
+ .irp i,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
+ ldr \scratch, [\src, #(\i * 4)]
+ eor \dst, \dst, \scratch
+ .endr
+.endm
+
// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
ENTRY(sigsetjmp)
- // Record whether or not we're saving the signal mask.
+ stmfd sp!, {r0, lr}
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset r0, 0
+ .cfi_rel_offset lr, 4
+
+ mov r0, r1
+ bl __bionic_setjmp_cookie_get
+ mov r1, r0
+
+ ldmfd sp, {r0}
+
+ // Save the setjmp cookie for later.
+ bic r2, r1, #1
+ stmfd sp!, {r2}
+ .cfi_adjust_cfa_offset 4
+
+ // Record the setjmp cookie and whether or not we're saving the signal mask.
str r1, [r0, #(_JB_SIGFLAG * 4)]
// Do we need to save the signal mask?
- teq r1, #0
+ tst r1, #1
beq 1f
- // Get current signal mask.
- stmfd sp!, {r0, r14}
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset r14, 4
- mov r0, #0
- bl sigblock
- mov r1, r0
- ldmfd sp!, {r0, r14}
- .cfi_def_cfa_offset 0
+ // Align the stack.
+ sub sp, #4
+ .cfi_adjust_cfa_offset 4
- // Save the signal mask.
- str r1, [r0, #(_JB_SIGMASK * 4)]
+ // Save the current signal mask.
+ add r2, r0, #(_JB_SIGMASK * 4)
+ mov r0, #2 // SIG_SETMASK
+ mov r1, #0
+ bl sigprocmask
+
+ // Unalign the stack.
+ add sp, #4
+ .cfi_adjust_cfa_offset -4
1:
+ ldmfd sp!, {r2}
+ .cfi_adjust_cfa_offset -4
+ ldmfd sp!, {r0, lr}
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r0
+ .cfi_restore lr
+
// Save core registers.
add r1, r0, #(_JB_CORE_BASE * 4)
- stmia r1, {r4-r14}
+ m_mangle_registers r2
+
+ // ARM deprecates using sp in the register list for stmia.
+ stmia r1, {r4-r11, lr}
+ str sp, [r1, #(9 * 4)]
+ m_unmangle_registers r2
// Save floating-point registers.
add r1, r0, #(_JB_FLOAT_BASE * 4)
@@ -116,35 +179,51 @@ ENTRY(sigsetjmp)
fmrx r1, fpscr
str r1, [r0, #(_JB_FLOAT_STATE * 4)]
+#if USE_CHECKSUM
+ // Calculate the checksum.
+ m_calculate_checksum r12, r0, r2
+ str r12, [r0, #(_JB_CHECKSUM * 4)]
+#endif
+
mov r0, #0
bx lr
END(sigsetjmp)
// void siglongjmp(sigjmp_buf env, int value);
ENTRY(siglongjmp)
- // Do we need to restore the signal mask?
- ldr r2, [r0, #(_JB_SIGFLAG * 4)]
- teq r2, #0
- beq 1f
-
- // Restore the signal mask.
- stmfd sp!, {r0, r1, r14}
+ stmfd sp!, {r0, r1, lr}
.cfi_def_cfa_offset 12
.cfi_rel_offset r0, 0
.cfi_rel_offset r1, 4
- .cfi_rel_offset r14, 8
- sub sp, sp, #4 // Align the stack.
- .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset lr, 8
+
+#if USE_CHECKSUM
+ // Check the checksum before doing anything.
+ m_calculate_checksum r12, r0, r3
+ ldr r2, [r0, #(_JB_CHECKSUM * 4)]
+
+ teq r2, r12
+ bne __bionic_setjmp_checksum_mismatch
+#endif
+
+ // Fetch the signal flag.
+ ldr r1, [r0, #(_JB_SIGFLAG * 4)]
+ // Do we need to restore the signal mask?
+ ands r1, r1, #1
+ beq 1f
+
+ // Restore the signal mask.
ldr r0, [r0, #(_JB_SIGMASK * 4)]
bl sigsetmask
- add sp, sp, #4 // Unalign the stack.
- .cfi_adjust_cfa_offset -4
- ldmfd sp!, {r0, r1, r14}
- .cfi_def_cfa_offset 0
-
1:
+ ldmfd sp!, {r0, r1, lr}
+ .cfi_adjust_cfa_offset -12
+ .cfi_restore r0
+ .cfi_restore r1
+ .cfi_restore lr
+
// Restore floating-point registers.
add r2, r0, #(_JB_FLOAT_BASE * 4)
vldmia r2, {d8-d15}
@@ -153,17 +232,30 @@ ENTRY(siglongjmp)
ldr r2, [r0, #(_JB_FLOAT_STATE * 4)]
fmxr fpscr, r2
+ // Load the cookie.
+ ldr r3, [r0, #(_JB_SIGFLAG * 4)]
+ bic r3, r3, #1
+
// Restore core registers.
add r2, r0, #(_JB_CORE_BASE * 4)
- ldmia r2, {r4-r14}
- // Validate sp and r14.
- teq sp, #0
- teqne r14, #0
- bleq longjmperror
+ // ARM deprecates using sp in the register list for ldmia.
+ ldmia r2, {r4-r11, lr}
+ ldr sp, [r2, #(9 * 4)]
+ m_unmangle_registers r3
+
+ // Save the return value/address and check the setjmp cookie.
+ stmfd sp!, {r1, lr}
+ .cfi_adjust_cfa_offset 8
+ .cfi_rel_offset lr, 4
+ mov r0, r3
+ bl __bionic_setjmp_cookie_check
+
+ // Restore return value/address.
+ ldmfd sp!, {r0, lr}
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore lr
- // Set return value.
- mov r0, r1
teq r0, #0
moveq r0, #1
bx lr
diff --git a/libc/arch-arm/bionic/vfork.S b/libc/arch-arm/bionic/vfork.S
new file mode 100644
index 000000000..1b7cbad75
--- /dev/null
+++ b/libc/arch-arm/bionic/vfork.S
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <private/bionic_asm.h>
+
+ENTRY(vfork)
+ // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+ mrc p15, 0, r3, c13, c0, 3
+ ldr r3, [r3, #4]
+ mov r0, #0
+ str r0, [r3, #12]
+
+ mov ip, r7
+ ldr r7, =__NR_vfork
+ swi #0
+ mov r7, ip
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno_internal
+END(vfork)
diff --git a/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S b/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S
index a2e9c229e..3692f0425 100644
--- a/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S
+++ b/libc/arch-arm/cortex-a15/bionic/__strcat_chk.S
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,191 +26,7 @@
* SUCH DAMAGE.
*/
-#include <private/bionic_asm.h>
-#include <private/libc_events.h>
+// Indicate which memcpy base file to include.
+#define MEMCPY_BASE "memcpy_base.S"
- .syntax unified
-
- .thumb
- .thumb_func
-
-// Get the length of src string, then get the source of the dst string.
-// Check that the two lengths together don't exceed the threshold, then
-// do a memcpy of the data.
-ENTRY(__strcat_chk)
- pld [r0, #0]
- push {r0, lr}
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
- push {r4, r5}
- .cfi_adjust_cfa_offset 8
- .cfi_rel_offset r4, 0
- .cfi_rel_offset r5, 4
-
- mov lr, r2
-
- // Save the dst register to r5
- mov r5, r0
-
- // Zero out r4
- eor r4, r4, r4
-
- // r1 contains the address of the string to count.
-.L_strlen_start:
- mov r0, r1
- ands r3, r1, #7
- beq .L_mainloop
-
- // Align to a double word (64 bits).
- rsb r3, r3, #8
- lsls ip, r3, #31
- beq .L_align_to_32
-
- ldrb r2, [r1], #1
- cbz r2, .L_update_count_and_finish
-
-.L_align_to_32:
- bcc .L_align_to_64
- ands ip, r3, #2
- beq .L_align_to_64
-
- ldrb r2, [r1], #1
- cbz r2, .L_update_count_and_finish
- ldrb r2, [r1], #1
- cbz r2, .L_update_count_and_finish
-
-.L_align_to_64:
- tst r3, #4
- beq .L_mainloop
- ldr r3, [r1], #4
-
- sub ip, r3, #0x01010101
- bic ip, ip, r3
- ands ip, ip, #0x80808080
- bne .L_zero_in_second_register
-
- .p2align 2
-.L_mainloop:
- ldrd r2, r3, [r1], #8
-
- pld [r1, #64]
-
- sub ip, r2, #0x01010101
- bic ip, ip, r2
- ands ip, ip, #0x80808080
- bne .L_zero_in_first_register
-
- sub ip, r3, #0x01010101
- bic ip, ip, r3
- ands ip, ip, #0x80808080
- bne .L_zero_in_second_register
- b .L_mainloop
-
-.L_update_count_and_finish:
- sub r3, r1, r0
- sub r3, r3, #1
- b .L_finish
-
-.L_zero_in_first_register:
- sub r3, r1, r0
- lsls r2, ip, #17
- bne .L_sub8_and_finish
- bcs .L_sub7_and_finish
- lsls ip, ip, #1
- bne .L_sub6_and_finish
-
- sub r3, r3, #5
- b .L_finish
-
-.L_sub8_and_finish:
- sub r3, r3, #8
- b .L_finish
-
-.L_sub7_and_finish:
- sub r3, r3, #7
- b .L_finish
-
-.L_sub6_and_finish:
- sub r3, r3, #6
- b .L_finish
-
-.L_zero_in_second_register:
- sub r3, r1, r0
- lsls r2, ip, #17
- bne .L_sub4_and_finish
- bcs .L_sub3_and_finish
- lsls ip, ip, #1
- bne .L_sub2_and_finish
-
- sub r3, r3, #1
- b .L_finish
-
-.L_sub4_and_finish:
- sub r3, r3, #4
- b .L_finish
-
-.L_sub3_and_finish:
- sub r3, r3, #3
- b .L_finish
-
-.L_sub2_and_finish:
- sub r3, r3, #2
-
-.L_finish:
- cmp r4, #0
- bne .L_strlen_done
-
- // Time to get the dst string length.
- mov r1, r5
-
- // Save the original source address to r5.
- mov r5, r0
-
- // Save the current length (adding 1 for the terminator).
- add r4, r3, #1
- b .L_strlen_start
-
- // r0 holds the pointer to the dst string.
- // r3 holds the dst string length.
- // r4 holds the src string length + 1.
-.L_strlen_done:
- add r2, r3, r4
- cmp r2, lr
- bhi __strcat_chk_failed
-
- // Set up the registers for the memcpy code.
- mov r1, r5
- pld [r1, #64]
- mov r2, r4
- add r0, r0, r3
- pop {r4, r5}
-END(__strcat_chk)
-
-#define MEMCPY_BASE __strcat_chk_memcpy_base
-#define MEMCPY_BASE_ALIGNED __strcat_chk_memcpy_base_aligned
-
-#include "memcpy_base.S"
-
-ENTRY_PRIVATE(__strcat_chk_failed)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
- .cfi_adjust_cfa_offset 8
- .cfi_rel_offset r4, 0
- .cfi_rel_offset r5, 4
-
- ldr r0, error_message
- ldr r1, error_code
-1:
- add r0, pc
- bl __fortify_chk_fail
-error_code:
- .word BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW
-error_message:
- .word error_string-(1b+4)
-END(__strcat_chk_failed)
-
- .data
-error_string:
- .string "strcat: prevented write past end of buffer"
+#include "__strcat_chk_common.S"
diff --git a/libc/arch-arm/cortex-a15/bionic/__strcat_chk_common.S b/libc/arch-arm/cortex-a15/bionic/__strcat_chk_common.S
new file mode 100644
index 000000000..de66967ee
--- /dev/null
+++ b/libc/arch-arm/cortex-a15/bionic/__strcat_chk_common.S
@@ -0,0 +1,212 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <private/bionic_asm.h>
+#include <private/libc_events.h>
+
+ .syntax unified
+
+ .thumb
+ .thumb_func
+
+// Get the length of src string, then get the source of the dst string.
+// Check that the two lengths together don't exceed the threshold, then
+// do a memcpy of the data.
+ENTRY(__strcat_chk)
+ pld [r0, #0]
+ push {r0, lr}
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset r0, 0
+ .cfi_rel_offset lr, 4
+ push {r4, r5}
+ .cfi_adjust_cfa_offset 8
+ .cfi_rel_offset r4, 0
+ .cfi_rel_offset r5, 4
+
+ mov lr, r2
+
+ // Save the dst register to r5
+ mov r5, r0
+
+ // Zero out r4
+ eor r4, r4, r4
+
+ // r1 contains the address of the string to count.
+.L_strlen_start:
+ mov r0, r1
+ ands r3, r1, #7
+ beq .L_mainloop
+
+ // Align to a double word (64 bits).
+ rsb r3, r3, #8
+ lsls ip, r3, #31
+ beq .L_align_to_32
+
+ ldrb r2, [r1], #1
+ cbz r2, .L_update_count_and_finish
+
+.L_align_to_32:
+ bcc .L_align_to_64
+ ands ip, r3, #2
+ beq .L_align_to_64
+
+ ldrb r2, [r1], #1
+ cbz r2, .L_update_count_and_finish
+ ldrb r2, [r1], #1
+ cbz r2, .L_update_count_and_finish
+
+.L_align_to_64:
+ tst r3, #4
+ beq .L_mainloop
+ ldr r3, [r1], #4
+
+ sub ip, r3, #0x01010101
+ bic ip, ip, r3
+ ands ip, ip, #0x80808080
+ bne .L_zero_in_second_register
+
+ .p2align 2
+.L_mainloop:
+ ldrd r2, r3, [r1], #8
+
+ pld [r1, #64]
+
+ sub ip, r2, #0x01010101
+ bic ip, ip, r2
+ ands ip, ip, #0x80808080
+ bne .L_zero_in_first_register
+
+ sub ip, r3, #0x01010101
+ bic ip, ip, r3
+ ands ip, ip, #0x80808080
+ bne .L_zero_in_second_register
+ b .L_mainloop
+
+.L_update_count_and_finish:
+ sub r3, r1, r0
+ sub r3, r3, #1
+ b .L_finish
+
+.L_zero_in_first_register:
+ sub r3, r1, r0
+ lsls r2, ip, #17
+ bne .L_sub8_and_finish
+ bcs .L_sub7_and_finish
+ lsls ip, ip, #1
+ bne .L_sub6_and_finish
+
+ sub r3, r3, #5
+ b .L_finish
+
+.L_sub8_and_finish:
+ sub r3, r3, #8
+ b .L_finish
+
+.L_sub7_and_finish:
+ sub r3, r3, #7
+ b .L_finish
+
+.L_sub6_and_finish:
+ sub r3, r3, #6
+ b .L_finish
+
+.L_zero_in_second_register:
+ sub r3, r1, r0
+ lsls r2, ip, #17
+ bne .L_sub4_and_finish
+ bcs .L_sub3_and_finish
+ lsls ip, ip, #1
+ bne .L_sub2_and_finish
+
+ sub r3, r3, #1
+ b .L_finish
+
+.L_sub4_and_finish:
+ sub r3, r3, #4
+ b .L_finish
+
+.L_sub3_and_finish:
+ sub r3, r3, #3
+ b .L_finish
+
+.L_sub2_and_finish:
+ sub r3, r3, #2
+
+.L_finish:
+ cmp r4, #0
+ bne .L_strlen_done
+
+ // Time to get the dst string length.
+ mov r1, r5
+
+ // Save the original source address to r5.
+ mov r5, r0
+
+ // Save the current length (adding 1 for the terminator).
+ add r4, r3, #1
+ b .L_strlen_start
+
+ // r0 holds the pointer to the dst string.
+ // r3 holds the dst string length.
+ // r4 holds the src string length + 1.
+.L_strlen_done:
+ add r2, r3, r4
+ cmp r2, lr
+ bhi .L_strcat_chk_failed
+
+ // Set up the registers for the memcpy code.
+ mov r1, r5
+ pld [r1, #64]
+ mov r2, r4
+ add r0, r0, r3
+ pop {r4, r5}
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r4
+ .cfi_restore r5
+
+#include MEMCPY_BASE
+
+ // Undo the above cfi directives
+ .cfi_adjust_cfa_offset 8
+ .cfi_rel_offset r4, 0
+ .cfi_rel_offset r5, 4
+.L_strcat_chk_failed:
+ ldr r0, error_message
+ ldr r1, error_code
+1:
+ add r0, pc
+ bl __fortify_chk_fail
+error_code:
+ .word BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW
+error_message:
+ .word error_string-(1b+4)
+END(__strcat_chk)
+
+ .data
+error_string:
+ .string "strcat: prevented write past end of buffer"
diff --git a/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S b/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S
index db766863a..d8cb3d9d7 100644
--- a/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S
+++ b/libc/arch-arm/cortex-a15/bionic/__strcpy_chk.S
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,155 +26,7 @@
* SUCH DAMAGE.
*/
-#include <private/bionic_asm.h>
-#include <private/libc_events.h>
+// Indicate which memcpy base file to include.
+#define MEMCPY_BASE "memcpy_base.S"
- .syntax unified
-
- .thumb
- .thumb_func
-
-// Get the length of the source string first, then do a memcpy of the data
-// instead of a strcpy.
-ENTRY(__strcpy_chk)
- pld [r0, #0]
- push {r0, lr}
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
-
- mov lr, r2
- mov r0, r1
-
- ands r3, r1, #7
- beq .L_mainloop
-
- // Align to a double word (64 bits).
- rsb r3, r3, #8
- lsls ip, r3, #31
- beq .L_align_to_32
-
- ldrb r2, [r0], #1
- cbz r2, .L_update_count_and_finish
-
-.L_align_to_32:
- bcc .L_align_to_64
- ands ip, r3, #2
- beq .L_align_to_64
-
- ldrb r2, [r0], #1
- cbz r2, .L_update_count_and_finish
- ldrb r2, [r0], #1
- cbz r2, .L_update_count_and_finish
-
-.L_align_to_64:
- tst r3, #4
- beq .L_mainloop
- ldr r3, [r0], #4
-
- sub ip, r3, #0x01010101
- bic ip, ip, r3
- ands ip, ip, #0x80808080
- bne .L_zero_in_second_register
-
- .p2align 2
-.L_mainloop:
- ldrd r2, r3, [r0], #8
-
- pld [r0, #64]
-
- sub ip, r2, #0x01010101
- bic ip, ip, r2
- ands ip, ip, #0x80808080
- bne .L_zero_in_first_register
-
- sub ip, r3, #0x01010101
- bic ip, ip, r3
- ands ip, ip, #0x80808080
- bne .L_zero_in_second_register
- b .L_mainloop
-
-.L_update_count_and_finish:
- sub r3, r0, r1
- sub r3, r3, #1
- b .L_check_size
-
-.L_zero_in_first_register:
- sub r3, r0, r1
- lsls r2, ip, #17
- bne .L_sub8_and_finish
- bcs .L_sub7_and_finish
- lsls ip, ip, #1
- bne .L_sub6_and_finish
-
- sub r3, r3, #5
- b .L_check_size
-
-.L_sub8_and_finish:
- sub r3, r3, #8
- b .L_check_size
-
-.L_sub7_and_finish:
- sub r3, r3, #7
- b .L_check_size
-
-.L_sub6_and_finish:
- sub r3, r3, #6
- b .L_check_size
-
-.L_zero_in_second_register:
- sub r3, r0, r1
- lsls r2, ip, #17
- bne .L_sub4_and_finish
- bcs .L_sub3_and_finish
- lsls ip, ip, #1
- bne .L_sub2_and_finish
-
- sub r3, r3, #1
- b .L_check_size
-
-.L_sub4_and_finish:
- sub r3, r3, #4
- b .L_check_size
-
-.L_sub3_and_finish:
- sub r3, r3, #3
- b .L_check_size
-
-.L_sub2_and_finish:
- sub r3, r3, #2
-
-.L_check_size:
- pld [r1, #0]
- pld [r1, #64]
- ldr r0, [sp]
- cmp r3, lr
- bhs __strcpy_chk_failed
-
- // Add 1 for copy length to get the string terminator.
- add r2, r3, #1
-END(__strcpy_chk)
-
-#define MEMCPY_BASE __strcpy_chk_memcpy_base
-#define MEMCPY_BASE_ALIGNED __strcpy_chk_memcpy_base_aligned
-#include "memcpy_base.S"
-
-ENTRY_PRIVATE(__strcpy_chk_failed)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
-
- ldr r0, error_message
- ldr r1, error_code
-1:
- add r0, pc
- bl __fortify_chk_fail
-error_code:
- .word BIONIC_EVENT_STRCPY_BUFFER_OVERFLOW
-error_message:
- .word error_string-(1b+4)
-END(__strcpy_chk_failed)
-
- .data
-error_string:
- .string "strcpy: prevented write past end of buffer"
+#include "__strcpy_chk_common.S"
diff --git a/libc/arch-arm/cortex-a15/bionic/__strcpy_chk_common.S b/libc/arch-arm/cortex-a15/bionic/__strcpy_chk_common.S
new file mode 100644
index 000000000..69ebcb497
--- /dev/null
+++ b/libc/arch-arm/cortex-a15/bionic/__strcpy_chk_common.S
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <private/bionic_asm.h>
+#include <private/libc_events.h>
+
+ .syntax unified
+
+ .thumb
+ .thumb_func
+
+// Get the length of the source string first, then do a memcpy of the data
+// instead of a strcpy.
+ENTRY(__strcpy_chk)
+ pld [r0, #0]
+ push {r0, lr}
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset r0, 0
+ .cfi_rel_offset lr, 4
+
+ mov lr, r2
+ mov r0, r1
+
+ ands r3, r1, #7
+ beq .L_mainloop
+
+ // Align to a double word (64 bits).
+ rsb r3, r3, #8
+ lsls ip, r3, #31
+ beq .L_align_to_32
+
+ ldrb r2, [r0], #1
+ cbz r2, .L_update_count_and_finish
+
+.L_align_to_32:
+ bcc .L_align_to_64
+ ands ip, r3, #2
+ beq .L_align_to_64
+
+ ldrb r2, [r0], #1
+ cbz r2, .L_update_count_and_finish
+ ldrb r2, [r0], #1
+ cbz r2, .L_update_count_and_finish
+
+.L_align_to_64:
+ tst r3, #4
+ beq .L_mainloop
+ ldr r3, [r0], #4
+
+ sub ip, r3, #0x01010101
+ bic ip, ip, r3
+ ands ip, ip, #0x80808080
+ bne .L_zero_in_second_register
+
+ .p2align 2
+.L_mainloop:
+ ldrd r2, r3, [r0], #8
+
+ pld [r0, #64]
+
+ sub ip, r2, #0x01010101
+ bic ip, ip, r2
+ ands ip, ip, #0x80808080
+ bne .L_zero_in_first_register
+
+ sub ip, r3, #0x01010101
+ bic ip, ip, r3
+ ands ip, ip, #0x80808080
+ bne .L_zero_in_second_register
+ b .L_mainloop
+
+.L_update_count_and_finish:
+ sub r3, r0, r1
+ sub r3, r3, #1
+ b .L_check_size
+
+.L_zero_in_first_register:
+ sub r3, r0, r1
+ lsls r2, ip, #17
+ bne .L_sub8_and_finish
+ bcs .L_sub7_and_finish
+ lsls ip, ip, #1
+ bne .L_sub6_and_finish
+
+ sub r3, r3, #5
+ b .L_check_size
+
+.L_sub8_and_finish:
+ sub r3, r3, #8
+ b .L_check_size
+
+.L_sub7_and_finish:
+ sub r3, r3, #7
+ b .L_check_size
+
+.L_sub6_and_finish:
+ sub r3, r3, #6
+ b .L_check_size
+
+.L_zero_in_second_register:
+ sub r3, r0, r1
+ lsls r2, ip, #17
+ bne .L_sub4_and_finish
+ bcs .L_sub3_and_finish
+ lsls ip, ip, #1
+ bne .L_sub2_and_finish
+
+ sub r3, r3, #1
+ b .L_check_size
+
+.L_sub4_and_finish:
+ sub r3, r3, #4
+ b .L_check_size
+
+.L_sub3_and_finish:
+ sub r3, r3, #3
+ b .L_check_size
+
+.L_sub2_and_finish:
+ sub r3, r3, #2
+
+.L_check_size:
+ pld [r1, #0]
+ pld [r1, #64]
+ ldr r0, [sp]
+ cmp r3, lr
+ bhs .L_strcpy_chk_failed
+
+ // Add 1 for copy length to get the string terminator.
+ add r2, r3, #1
+
+#include MEMCPY_BASE
+
+.L_strcpy_chk_failed:
+ ldr r0, error_message
+ ldr r1, error_code
+1:
+ add r0, pc
+ bl __fortify_chk_fail
+error_code:
+ .word BIONIC_EVENT_STRCPY_BUFFER_OVERFLOW
+error_message:
+ .word error_string-(1b+4)
+END(__strcpy_chk)
+
+ .data
+error_string:
+ .string "strcpy: prevented write past end of buffer"
diff --git a/libc/arch-arm/cortex-a15/bionic/memcpy.S b/libc/arch-arm/cortex-a15/bionic/memcpy.S
index 410b663e2..537f3de2f 100644
--- a/libc/arch-arm/cortex-a15/bionic/memcpy.S
+++ b/libc/arch-arm/cortex-a15/bionic/memcpy.S
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -25,79 +25,8 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-/*
- * Copyright (c) 2013 ARM Ltd
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the company may not be used to endorse or promote
- * products derived from this software without specific prior written
- * permission.
- *
- * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-// Prototype: void *memcpy (void *dst, const void *src, size_t count).
-
-#include <private/bionic_asm.h>
-#include <private/libc_events.h>
-
- .text
- .syntax unified
- .fpu neon
-
-ENTRY(__memcpy_chk)
- cmp r2, r3
- bhi __memcpy_chk_fail
-
- // Fall through to memcpy...
-END(__memcpy_chk)
-
-ENTRY(memcpy)
- pld [r1, #64]
- push {r0, lr}
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
-END(memcpy)
-
-#define MEMCPY_BASE __memcpy_base
-#define MEMCPY_BASE_ALIGNED __memcpy_base_aligned
-#include "memcpy_base.S"
-
-ENTRY_PRIVATE(__memcpy_chk_fail)
- // Preserve lr for backtrace.
- push {lr}
- .cfi_def_cfa_offset 4
- .cfi_rel_offset lr, 0
- ldr r0, error_message
- ldr r1, error_code
-1:
- add r0, pc
- bl __fortify_chk_fail
-error_code:
- .word BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW
-error_message:
- .word error_string-(1b+8)
-END(__memcpy_chk_fail)
+// Indicate which memcpy base file to include.
+#define MEMCPY_BASE "memcpy_base.S"
- .data
-error_string:
- .string "memcpy: prevented write past end of buffer"
+#include "memcpy_common.S"
diff --git a/libc/arch-arm/cortex-a15/bionic/memcpy_base.S b/libc/arch-arm/cortex-a15/bionic/memcpy_base.S
index 2a7385247..aac737df5 100644
--- a/libc/arch-arm/cortex-a15/bionic/memcpy_base.S
+++ b/libc/arch-arm/cortex-a15/bionic/memcpy_base.S
@@ -53,11 +53,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-ENTRY_PRIVATE(MEMCPY_BASE)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
-
+.L_memcpy_base:
// Assumes that n >= 0, and dst, src are valid pointers.
// For any sizes less than 832 use the neon code that doesn't
// care about the src alignment. This avoids any checks
@@ -168,12 +164,6 @@ ENTRY_PRIVATE(MEMCPY_BASE)
eor r3, r0, r1
ands r3, r3, #0x3
bne .L_copy_unknown_alignment
-END(MEMCPY_BASE)
-
-ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
// To try and improve performance, stack layout changed,
// i.e., not keeping the stack looking like users expect
@@ -185,7 +175,7 @@ ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
strd r6, r7, [sp, #-8]!
.cfi_adjust_cfa_offset 8
.cfi_rel_offset r6, 0
- .cfi_rel_offset r7, 0
+ .cfi_rel_offset r7, 4
strd r8, r9, [sp, #-8]!
.cfi_adjust_cfa_offset 8
.cfi_rel_offset r8, 0
@@ -291,10 +281,28 @@ ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
// Restore registers: optimized pop {r0, pc}
ldrd r8, r9, [sp], #8
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r8
+ .cfi_restore r9
ldrd r6, r7, [sp], #8
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r6
+ .cfi_restore r7
ldrd r4, r5, [sp], #8
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r4
+ .cfi_restore r5
pop {r0, pc}
+ // Put the cfi directives back for the below instructions.
+ .cfi_adjust_cfa_offset 24
+ .cfi_rel_offset r4, 0
+ .cfi_rel_offset r5, 4
+ .cfi_rel_offset r6, 8
+ .cfi_rel_offset r7, 12
+ .cfi_rel_offset r8, 16
+ .cfi_rel_offset r9, 20
+
.L_dst_not_word_aligned:
// Align dst to word.
rsb ip, ip, #4
@@ -315,4 +323,12 @@ ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
// Src is guaranteed to be at least word aligned by this point.
b .L_word_aligned
-END(MEMCPY_BASE_ALIGNED)
+
+ // Undo any cfi directives from above.
+ .cfi_adjust_cfa_offset -24
+ .cfi_restore r4
+ .cfi_restore r5
+ .cfi_restore r6
+ .cfi_restore r7
+ .cfi_restore r8
+ .cfi_restore r9
diff --git a/libc/arch-arm/cortex-a15/bionic/memcpy_common.S b/libc/arch-arm/cortex-a15/bionic/memcpy_common.S
new file mode 100644
index 000000000..464fb46b3
--- /dev/null
+++ b/libc/arch-arm/cortex-a15/bionic/memcpy_common.S
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * Copyright (c) 2013 ARM Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the company may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <private/bionic_asm.h>
+#include <private/libc_events.h>
+
+ .text
+ .syntax unified
+ .fpu neon
+
+ENTRY(__memcpy_chk)
+ cmp r2, r3
+ bhi .L_memcpy_chk_fail
+
+ // Fall through to memcpy...
+END(__memcpy_chk)
+
+// Prototype: void *memcpy (void *dst, const void *src, size_t count).
+ENTRY(memcpy)
+ pld [r1, #64]
+ push {r0, lr}
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset r0, 0
+ .cfi_rel_offset lr, 4
+
+#include MEMCPY_BASE
+
+ // Undo the cfi instructions from above.
+ .cfi_def_cfa_offset 0
+ .cfi_restore r0
+ .cfi_restore lr
+.L_memcpy_chk_fail:
+ // Preserve lr for backtrace.
+ push {lr}
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset lr, 0
+
+ ldr r0, error_message
+ ldr r1, error_code
+1:
+ add r0, pc
+ bl __fortify_chk_fail
+error_code:
+ .word BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW
+error_message:
+ .word error_string-(1b+8)
+END(memcpy)
+
+ .data
+error_string:
+ .string "memcpy: prevented write past end of buffer"
diff --git a/libc/arch-arm/cortex-a15/bionic/strcat.S b/libc/arch-arm/cortex-a15/bionic/strcat.S
index b95be940e..157cc9f1d 100644
--- a/libc/arch-arm/cortex-a15/bionic/strcat.S
+++ b/libc/arch-arm/cortex-a15/bionic/strcat.S
@@ -70,7 +70,7 @@
.macro m_scan_byte
ldrb r3, [r0]
- cbz r3, strcat_r0_scan_done
+ cbz r3, .L_strcat_r0_scan_done
add r0, #1
.endm // m_scan_byte
@@ -84,10 +84,10 @@ ENTRY(strcat)
// Quick check to see if src is empty.
ldrb r2, [r1]
pld [r1, #0]
- cbnz r2, strcat_continue
+ cbnz r2, .L_strcat_continue
bx lr
-strcat_continue:
+.L_strcat_continue:
// To speed up really small dst strings, unroll checking the first 4 bytes.
m_push
m_scan_byte
@@ -96,95 +96,102 @@ strcat_continue:
m_scan_byte
ands r3, r0, #7
- beq strcat_mainloop
+ beq .L_strcat_mainloop
// Align to a double word (64 bits).
rsb r3, r3, #8
lsls ip, r3, #31
- beq strcat_align_to_32
+ beq .L_strcat_align_to_32
ldrb r5, [r0]
- cbz r5, strcat_r0_scan_done
+ cbz r5, .L_strcat_r0_scan_done
add r0, r0, #1
-strcat_align_to_32:
- bcc strcat_align_to_64
+.L_strcat_align_to_32:
+ bcc .L_strcat_align_to_64
ldrb r2, [r0]
- cbz r2, strcat_r0_scan_done
+ cbz r2, .L_strcat_r0_scan_done
add r0, r0, #1
ldrb r4, [r0]
- cbz r4, strcat_r0_scan_done
+ cbz r4, .L_strcat_r0_scan_done
add r0, r0, #1
-strcat_align_to_64:
+.L_strcat_align_to_64:
tst r3, #4
- beq strcat_mainloop
+ beq .L_strcat_mainloop
ldr r3, [r0], #4
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcat_zero_in_second_register
- b strcat_mainloop
+ bne .L_strcat_zero_in_second_register
+ b .L_strcat_mainloop
-strcat_r0_scan_done:
+.L_strcat_r0_scan_done:
// For short copies, hard-code checking the first 8 bytes since this
// new code doesn't win until after about 8 bytes.
- m_copy_byte reg=r2, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r3, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r4, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r5, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r2, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r3, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r4, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r5, cmd=cbnz, label=strcpy_continue
-
-strcpy_finish:
+ m_copy_byte reg=r2, cmd=cbz, label=.L_strcpy_finish
+ m_copy_byte reg=r3, cmd=cbz, label=.L_strcpy_finish
+ m_copy_byte reg=r4, cmd=cbz, label=.L_strcpy_finish
+ m_copy_byte reg=r5, cmd=cbz, label=.L_strcpy_finish
+ m_copy_byte reg=r2, cmd=cbz, label=.L_strcpy_finish
+ m_copy_byte reg=r3, cmd=cbz, label=.L_strcpy_finish
+ m_copy_byte reg=r4, cmd=cbz, label=.L_strcpy_finish
+ m_copy_byte reg=r5, cmd=cbnz, label=.L_strcpy_continue
+
+.L_strcpy_finish:
m_pop
-strcpy_continue:
+.L_strcpy_continue:
ands r3, r0, #7
- beq strcpy_check_src_align
+ beq .L_strcpy_check_src_align
// Align to a double word (64 bits).
rsb r3, r3, #8
lsls ip, r3, #31
- beq strcpy_align_to_32
+ beq .L_strcpy_align_to_32
ldrb r2, [r1], #1
strb r2, [r0], #1
- cbz r2, strcpy_complete
+ cbz r2, .L_strcpy_complete
-strcpy_align_to_32:
- bcc strcpy_align_to_64
+.L_strcpy_align_to_32:
+ bcc .L_strcpy_align_to_64
ldrb r2, [r1], #1
strb r2, [r0], #1
- cbz r2, strcpy_complete
+ cbz r2, .L_strcpy_complete
ldrb r2, [r1], #1
strb r2, [r0], #1
- cbz r2, strcpy_complete
+ cbz r2, .L_strcpy_complete
-strcpy_align_to_64:
+.L_strcpy_align_to_64:
tst r3, #4
- beq strcpy_check_src_align
- ldr r2, [r1], #4
-
- sub ip, r2, #0x01010101
- bic ip, ip, r2
- ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
- str r2, [r0], #4
+ beq .L_strcpy_check_src_align
+ // Read one byte at a time since we don't know the src alignment
+ // and we don't want to read into a different page.
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .L_strcpy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .L_strcpy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .L_strcpy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .L_strcpy_complete
-strcpy_check_src_align:
+.L_strcpy_check_src_align:
// At this point dst is aligned to a double word, check if src
// is also aligned to a double word.
ands r3, r1, #7
- bne strcpy_unaligned_copy
+ bne .L_strcpy_unaligned_copy
.p2align 2
-strcpy_mainloop:
+.L_strcpy_mainloop:
ldrd r2, r3, [r1], #8
pld [r1, #64]
@@ -192,128 +199,128 @@ strcpy_mainloop:
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .L_strcpy_zero_in_first_register
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .L_strcpy_zero_in_second_register
strd r2, r3, [r0], #8
- b strcpy_mainloop
+ b .L_strcpy_mainloop
-strcpy_complete:
+.L_strcpy_complete:
m_pop
-strcpy_zero_in_first_register:
+.L_strcpy_zero_in_first_register:
lsls lr, ip, #17
- bne strcpy_copy1byte
- bcs strcpy_copy2bytes
+ bne .L_strcpy_copy1byte
+ bcs .L_strcpy_copy2bytes
lsls ip, ip, #1
- bne strcpy_copy3bytes
+ bne .L_strcpy_copy3bytes
-strcpy_copy4bytes:
+.L_strcpy_copy4bytes:
// Copy 4 bytes to the destiniation.
str r2, [r0]
m_pop
-strcpy_copy1byte:
+.L_strcpy_copy1byte:
strb r2, [r0]
m_pop
-strcpy_copy2bytes:
+.L_strcpy_copy2bytes:
strh r2, [r0]
m_pop
-strcpy_copy3bytes:
+.L_strcpy_copy3bytes:
strh r2, [r0], #2
lsr r2, #16
strb r2, [r0]
m_pop
-strcpy_zero_in_second_register:
+.L_strcpy_zero_in_second_register:
lsls lr, ip, #17
- bne strcpy_copy5bytes
- bcs strcpy_copy6bytes
+ bne .L_strcpy_copy5bytes
+ bcs .L_strcpy_copy6bytes
lsls ip, ip, #1
- bne strcpy_copy7bytes
+ bne .L_strcpy_copy7bytes
// Copy 8 bytes to the destination.
strd r2, r3, [r0]
m_pop
-strcpy_copy5bytes:
+.L_strcpy_copy5bytes:
str r2, [r0], #4
strb r3, [r0]
m_pop
-strcpy_copy6bytes:
+.L_strcpy_copy6bytes:
str r2, [r0], #4
strh r3, [r0]
m_pop
-strcpy_copy7bytes:
+.L_strcpy_copy7bytes:
str r2, [r0], #4
strh r3, [r0], #2
lsr r3, #16
strb r3, [r0]
m_pop
-strcpy_unaligned_copy:
+.L_strcpy_unaligned_copy:
// Dst is aligned to a double word, while src is at an unknown alignment.
// There are 7 different versions of the unaligned copy code
// to prevent overreading the src. The mainloop of every single version
// will store 64 bits per loop. The difference is how much of src can
// be read without potentially crossing a page boundary.
tbb [pc, r3]
-strcpy_unaligned_branchtable:
+.L_strcpy_unaligned_branchtable:
.byte 0
- .byte ((strcpy_unalign7 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign6 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign5 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign4 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign3 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign2 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign1 - strcpy_unaligned_branchtable)/2)
+ .byte ((.L_strcpy_unalign7 - .L_strcpy_unaligned_branchtable)/2)
+ .byte ((.L_strcpy_unalign6 - .L_strcpy_unaligned_branchtable)/2)
+ .byte ((.L_strcpy_unalign5 - .L_strcpy_unaligned_branchtable)/2)
+ .byte ((.L_strcpy_unalign4 - .L_strcpy_unaligned_branchtable)/2)
+ .byte ((.L_strcpy_unalign3 - .L_strcpy_unaligned_branchtable)/2)
+ .byte ((.L_strcpy_unalign2 - .L_strcpy_unaligned_branchtable)/2)
+ .byte ((.L_strcpy_unalign1 - .L_strcpy_unaligned_branchtable)/2)
.p2align 2
// Can read 7 bytes before possibly crossing a page.
-strcpy_unalign7:
+.L_strcpy_unalign7:
ldr r2, [r1], #4
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .L_strcpy_zero_in_first_register
ldrb r3, [r1]
- cbz r3, strcpy_unalign7_copy5bytes
+ cbz r3, .L_strcpy_unalign7_copy5bytes
ldrb r4, [r1, #1]
- cbz r4, strcpy_unalign7_copy6bytes
+ cbz r4, .L_strcpy_unalign7_copy6bytes
ldrb r5, [r1, #2]
- cbz r5, strcpy_unalign7_copy7bytes
+ cbz r5, .L_strcpy_unalign7_copy7bytes
ldr r3, [r1], #4
pld [r1, #64]
lsrs ip, r3, #24
strd r2, r3, [r0], #8
- beq strcpy_unalign_return
- b strcpy_unalign7
+ beq .L_strcpy_unalign_return
+ b .L_strcpy_unalign7
-strcpy_unalign7_copy5bytes:
+.L_strcpy_unalign7_copy5bytes:
str r2, [r0], #4
strb r3, [r0]
-strcpy_unalign_return:
+.L_strcpy_unalign_return:
m_pop
-strcpy_unalign7_copy6bytes:
+.L_strcpy_unalign7_copy6bytes:
str r2, [r0], #4
strb r3, [r0], #1
strb r4, [r0], #1
m_pop
-strcpy_unalign7_copy7bytes:
+.L_strcpy_unalign7_copy7bytes:
str r2, [r0], #4
strb r3, [r0], #1
strb r4, [r0], #1
@@ -322,41 +329,41 @@ strcpy_unalign7_copy7bytes:
.p2align 2
// Can read 6 bytes before possibly crossing a page.
-strcpy_unalign6:
+.L_strcpy_unalign6:
ldr r2, [r1], #4
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .L_strcpy_zero_in_first_register
ldrb r4, [r1]
- cbz r4, strcpy_unalign_copy5bytes
+ cbz r4, .L_strcpy_unalign_copy5bytes
ldrb r5, [r1, #1]
- cbz r5, strcpy_unalign_copy6bytes
+ cbz r5, .L_strcpy_unalign_copy6bytes
ldr r3, [r1], #4
pld [r1, #64]
tst r3, #0xff0000
- beq strcpy_copy7bytes
+ beq .L_strcpy_copy7bytes
lsrs ip, r3, #24
strd r2, r3, [r0], #8
- beq strcpy_unalign_return
- b strcpy_unalign6
+ beq .L_strcpy_unalign_return
+ b .L_strcpy_unalign6
.p2align 2
// Can read 5 bytes before possibly crossing a page.
-strcpy_unalign5:
+.L_strcpy_unalign5:
ldr r2, [r1], #4
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .L_strcpy_zero_in_first_register
ldrb r4, [r1]
- cbz r4, strcpy_unalign_copy5bytes
+ cbz r4, .L_strcpy_unalign_copy5bytes
ldr r3, [r1], #4
@@ -365,17 +372,17 @@ strcpy_unalign5:
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .L_strcpy_zero_in_second_register
strd r2, r3, [r0], #8
- b strcpy_unalign5
+ b .L_strcpy_unalign5
-strcpy_unalign_copy5bytes:
+.L_strcpy_unalign_copy5bytes:
str r2, [r0], #4
strb r4, [r0]
m_pop
-strcpy_unalign_copy6bytes:
+.L_strcpy_unalign_copy6bytes:
str r2, [r0], #4
strb r4, [r0], #1
strb r5, [r0]
@@ -383,13 +390,13 @@ strcpy_unalign_copy6bytes:
.p2align 2
// Can read 4 bytes before possibly crossing a page.
-strcpy_unalign4:
+.L_strcpy_unalign4:
ldr r2, [r1], #4
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .L_strcpy_zero_in_first_register
ldr r3, [r1], #4
pld [r1, #64]
@@ -397,20 +404,20 @@ strcpy_unalign4:
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .L_strcpy_zero_in_second_register
strd r2, r3, [r0], #8
- b strcpy_unalign4
+ b .L_strcpy_unalign4
.p2align 2
// Can read 3 bytes before possibly crossing a page.
-strcpy_unalign3:
+.L_strcpy_unalign3:
ldrb r2, [r1]
- cbz r2, strcpy_unalign3_copy1byte
+ cbz r2, .L_strcpy_unalign3_copy1byte
ldrb r3, [r1, #1]
- cbz r3, strcpy_unalign3_copy2bytes
+ cbz r3, .L_strcpy_unalign3_copy2bytes
ldrb r4, [r1, #2]
- cbz r4, strcpy_unalign3_copy3bytes
+ cbz r4, .L_strcpy_unalign3_copy3bytes
ldr r2, [r1], #4
ldr r3, [r1], #4
@@ -418,26 +425,26 @@ strcpy_unalign3:
pld [r1, #64]
lsrs lr, r2, #24
- beq strcpy_copy4bytes
+ beq .L_strcpy_copy4bytes
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .L_strcpy_zero_in_second_register
strd r2, r3, [r0], #8
- b strcpy_unalign3
+ b .L_strcpy_unalign3
-strcpy_unalign3_copy1byte:
+.L_strcpy_unalign3_copy1byte:
strb r2, [r0]
m_pop
-strcpy_unalign3_copy2bytes:
+.L_strcpy_unalign3_copy2bytes:
strb r2, [r0], #1
strb r3, [r0]
m_pop
-strcpy_unalign3_copy3bytes:
+.L_strcpy_unalign3_copy3bytes:
strb r2, [r0], #1
strb r3, [r0], #1
strb r4, [r0]
@@ -445,34 +452,34 @@ strcpy_unalign3_copy3bytes:
.p2align 2
// Can read 2 bytes before possibly crossing a page.
-strcpy_unalign2:
+.L_strcpy_unalign2:
ldrb r2, [r1]
- cbz r2, strcpy_unalign_copy1byte
+ cbz r2, .L_strcpy_unalign_copy1byte
ldrb r4, [r1, #1]
- cbz r4, strcpy_unalign_copy2bytes
+ cbz r4, .L_strcpy_unalign_copy2bytes
ldr r2, [r1], #4
ldr r3, [r1], #4
pld [r1, #64]
tst r2, #0xff0000
- beq strcpy_copy3bytes
+ beq .L_strcpy_copy3bytes
lsrs ip, r2, #24
- beq strcpy_copy4bytes
+ beq .L_strcpy_copy4bytes
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .L_strcpy_zero_in_second_register
strd r2, r3, [r0], #8
- b strcpy_unalign2
+ b .L_strcpy_unalign2
.p2align 2
// Can read 1 byte before possibly crossing a page.
-strcpy_unalign1:
+.L_strcpy_unalign1:
ldrb r2, [r1]
- cbz r2, strcpy_unalign_copy1byte
+ cbz r2, .L_strcpy_unalign_copy1byte
ldr r2, [r1], #4
ldr r3, [r1], #4
@@ -482,27 +489,27 @@ strcpy_unalign1:
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .L_strcpy_zero_in_first_register
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .L_strcpy_zero_in_second_register
strd r2, r3, [r0], #8
- b strcpy_unalign1
+ b .L_strcpy_unalign1
-strcpy_unalign_copy1byte:
+.L_strcpy_unalign_copy1byte:
strb r2, [r0]
m_pop
-strcpy_unalign_copy2bytes:
+.L_strcpy_unalign_copy2bytes:
strb r2, [r0], #1
strb r4, [r0]
m_pop
.p2align 2
-strcat_mainloop:
+.L_strcat_mainloop:
ldrd r2, r3, [r0], #8
pld [r0, #64]
@@ -510,59 +517,59 @@ strcat_mainloop:
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcat_zero_in_first_register
+ bne .L_strcat_zero_in_first_register
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcat_zero_in_second_register
- b strcat_mainloop
+ bne .L_strcat_zero_in_second_register
+ b .L_strcat_mainloop
-strcat_zero_in_first_register:
+.L_strcat_zero_in_first_register:
// Prefetch the src now, it's going to be used soon.
pld [r1, #0]
lsls lr, ip, #17
- bne strcat_sub8
- bcs strcat_sub7
+ bne .L_strcat_sub8
+ bcs .L_strcat_sub7
lsls ip, ip, #1
- bne strcat_sub6
+ bne .L_strcat_sub6
sub r0, r0, #5
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
-strcat_sub8:
+.L_strcat_sub8:
sub r0, r0, #8
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
-strcat_sub7:
+.L_strcat_sub7:
sub r0, r0, #7
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
-strcat_sub6:
+.L_strcat_sub6:
sub r0, r0, #6
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
-strcat_zero_in_second_register:
+.L_strcat_zero_in_second_register:
// Prefetch the src now, it's going to be used soon.
pld [r1, #0]
lsls lr, ip, #17
- bne strcat_sub4
- bcs strcat_sub3
+ bne .L_strcat_sub4
+ bcs .L_strcat_sub3
lsls ip, ip, #1
- bne strcat_sub2
+ bne .L_strcat_sub2
sub r0, r0, #1
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
-strcat_sub4:
+.L_strcat_sub4:
sub r0, r0, #4
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
-strcat_sub3:
+.L_strcat_sub3:
sub r0, r0, #3
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
-strcat_sub2:
+.L_strcat_sub2:
sub r0, r0, #2
- b strcat_r0_scan_done
+ b .L_strcat_r0_scan_done
END(strcat)
diff --git a/libc/arch-arm/cortex-a15/bionic/string_copy.S b/libc/arch-arm/cortex-a15/bionic/string_copy.S
index 20f0e91b0..92d1c9804 100644
--- a/libc/arch-arm/cortex-a15/bionic/string_copy.S
+++ b/libc/arch-arm/cortex-a15/bionic/string_copy.S
@@ -149,13 +149,20 @@ ENTRY(strcpy)
.Lstringcopy_align_to_64:
tst r3, #4
beq .Lstringcopy_check_src_align
- ldr r2, [r1], #4
-
- sub ip, r2, #0x01010101
- bic ip, ip, r2
- ands ip, ip, #0x80808080
- bne .Lstringcopy_zero_in_first_register
- str r2, [r0], #4
+ // Read one byte at a time since we don't have any idea about the alignment
+ // of the source and we don't want to read into a different page.
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
.Lstringcopy_check_src_align:
// At this point dst is aligned to a double word, check if src
diff --git a/libc/arch-arm/cortex-a15/bionic/strlen.S b/libc/arch-arm/cortex-a15/bionic/strlen.S
index 9a0ce62a9..4fd62842c 100644
--- a/libc/arch-arm/cortex-a15/bionic/strlen.S
+++ b/libc/arch-arm/cortex-a15/bionic/strlen.S
@@ -65,38 +65,38 @@ ENTRY(strlen)
mov r1, r0
ands r3, r0, #7
- beq mainloop
+ beq .L_mainloop
// Align to a double word (64 bits).
rsb r3, r3, #8
lsls ip, r3, #31
- beq align_to_32
+ beq .L_align_to_32
ldrb r2, [r1], #1
- cbz r2, update_count_and_return
+ cbz r2, .L_update_count_and_return
-align_to_32:
- bcc align_to_64
+.L_align_to_32:
+ bcc .L_align_to_64
ands ip, r3, #2
- beq align_to_64
+ beq .L_align_to_64
ldrb r2, [r1], #1
- cbz r2, update_count_and_return
+ cbz r2, .L_update_count_and_return
ldrb r2, [r1], #1
- cbz r2, update_count_and_return
+ cbz r2, .L_update_count_and_return
-align_to_64:
+.L_align_to_64:
tst r3, #4
- beq mainloop
+ beq .L_mainloop
ldr r3, [r1], #4
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne zero_in_second_register
+ bne .L_zero_in_second_register
.p2align 2
-mainloop:
+.L_mainloop:
ldrd r2, r3, [r1], #8
pld [r1, #64]
@@ -104,62 +104,62 @@ mainloop:
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne zero_in_first_register
+ bne .L_zero_in_first_register
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne zero_in_second_register
- b mainloop
+ bne .L_zero_in_second_register
+ b .L_mainloop
-update_count_and_return:
+.L_update_count_and_return:
sub r0, r1, r0
sub r0, r0, #1
bx lr
-zero_in_first_register:
+.L_zero_in_first_register:
sub r0, r1, r0
lsls r3, ip, #17
- bne sub8_and_return
- bcs sub7_and_return
+ bne .L_sub8_and_return
+ bcs .L_sub7_and_return
lsls ip, ip, #1
- bne sub6_and_return
+ bne .L_sub6_and_return
sub r0, r0, #5
bx lr
-sub8_and_return:
+.L_sub8_and_return:
sub r0, r0, #8
bx lr
-sub7_and_return:
+.L_sub7_and_return:
sub r0, r0, #7
bx lr
-sub6_and_return:
+.L_sub6_and_return:
sub r0, r0, #6
bx lr
-zero_in_second_register:
+.L_zero_in_second_register:
sub r0, r1, r0
lsls r3, ip, #17
- bne sub4_and_return
- bcs sub3_and_return
+ bne .L_sub4_and_return
+ bcs .L_sub3_and_return
lsls ip, ip, #1
- bne sub2_and_return
+ bne .L_sub2_and_return
sub r0, r0, #1
bx lr
-sub4_and_return:
+.L_sub4_and_return:
sub r0, r0, #4
bx lr
-sub3_and_return:
+.L_sub3_and_return:
sub r0, r0, #3
bx lr
-sub2_and_return:
+.L_sub2_and_return:
sub r0, r0, #2
bx lr
END(strlen)
diff --git a/libc/arch-arm/cortex-a15/cortex-a15.mk b/libc/arch-arm/cortex-a15/cortex-a15.mk
index 6fa327022..20202a7c6 100644
--- a/libc/arch-arm/cortex-a15/cortex-a15.mk
+++ b/libc/arch-arm/cortex-a15/cortex-a15.mk
@@ -1,3 +1,17 @@
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+
+libc_bionic_src_files_exclude_arm += \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+
libc_bionic_src_files_arm += \
arch-arm/cortex-a15/bionic/memcpy.S \
arch-arm/cortex-a15/bionic/memset.S \
@@ -10,7 +24,4 @@ libc_bionic_src_files_arm += \
arch-arm/cortex-a15/bionic/strlen.S \
libc_bionic_src_files_arm += \
- arch-arm/generic/bionic/memcmp.S \
-
-libc_bionic_src_files_arm += \
arch-arm/denver/bionic/memmove.S \
diff --git a/libc/arch-arm/cortex-a53.a57/cortex-a53.a57.mk b/libc/arch-arm/cortex-a53.a57/cortex-a53.a57.mk
new file mode 100644
index 000000000..6455d0480
--- /dev/null
+++ b/libc/arch-arm/cortex-a53.a57/cortex-a53.a57.mk
@@ -0,0 +1,32 @@
+# This file represents the best optimized routines that are the middle
+# ground when running on a big/little system that is cortex-a57/cortex-a53.
+# The cortex-a7 optimized routines, and the cortex-a53 optimized routines
+# decrease performance on cortex-a57 processors by as much as 20%.
+
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+
+libc_bionic_src_files_exclude_arm += \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+
+libc_bionic_src_files_arm += \
+ arch-arm/cortex-a15/bionic/memcpy.S \
+ arch-arm/cortex-a15/bionic/memset.S \
+ arch-arm/cortex-a15/bionic/stpcpy.S \
+ arch-arm/cortex-a15/bionic/strcat.S \
+ arch-arm/cortex-a15/bionic/__strcat_chk.S \
+ arch-arm/cortex-a15/bionic/strcmp.S \
+ arch-arm/cortex-a15/bionic/strcpy.S \
+ arch-arm/cortex-a15/bionic/__strcpy_chk.S \
+ arch-arm/cortex-a15/bionic/strlen.S \
+
+libc_bionic_src_files_arm += \
+ arch-arm/denver/bionic/memmove.S \
diff --git a/libc/bionic/malloc_debug_backtrace.h b/libc/arch-arm/cortex-a53/bionic/__strcat_chk.S
index 774548b59..c5bc98a72 100644
--- a/libc/bionic/malloc_debug_backtrace.h
+++ b/libc/arch-arm/cortex-a53/bionic/__strcat_chk.S
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,12 +26,7 @@
* SUCH DAMAGE.
*/
-#ifndef MALLOC_DEBUG_BACKTRACE_H
-#define MALLOC_DEBUG_BACKTRACE_H
+// Indicate which memcpy base file to include.
+#define MEMCPY_BASE "arch-arm/cortex-a53/bionic/memcpy_base.S"
-extern bool g_backtrace_enabled;
-
-#define GET_BACKTRACE(bt, depth) \
- (g_backtrace_enabled ? get_backtrace(bt, depth) : 0)
-
-#endif // MALLOC_DEBUG_BACKTRACE_H
+#include "arch-arm/cortex-a15/bionic/__strcat_chk_common.S"
diff --git a/libc/private/bionic_time.h b/libc/arch-arm/cortex-a53/bionic/__strcpy_chk.S
index 030dcfd99..1f8945d9f 100644
--- a/libc/private/bionic_time.h
+++ b/libc/arch-arm/cortex-a53/bionic/__strcpy_chk.S
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -25,17 +25,8 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-#ifndef _BIONIC_TIME_H
-#define _BIONIC_TIME_H
-#include <time.h>
-#include <sys/cdefs.h>
+// Indicate which memcpy base file to include.
+#define MEMCPY_BASE "arch-arm/cortex-a53/bionic/memcpy_base.S"
-__BEGIN_DECLS
-
-// We can't remove this (and this file) until we fix MtpUtils.cpp.
-time_t mktime_tz(struct tm* const, char const*);
-
-__END_DECLS
-
-#endif /* _BIONIC_TIME_H */
+#include "arch-arm/cortex-a15/bionic/__strcpy_chk_common.S"
diff --git a/libc/include/sys/shm.h b/libc/arch-arm/cortex-a53/bionic/memcpy.S
index c691c29fa..664f57442 100644
--- a/libc/include/sys/shm.h
+++ b/libc/arch-arm/cortex-a53/bionic/memcpy.S
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,9 +26,7 @@
* SUCH DAMAGE.
*/
-#ifndef _SYS_SHM_H_
-#define _SYS_SHM_H_
+// Indicate which memcpy base file to include.
+#define MEMCPY_BASE "arch-arm/cortex-a53/bionic/memcpy_base.S"
-#include <linux/shm.h>
-
-#endif /* _SYS_SHM_H_ */
+#include "arch-arm/cortex-a15/bionic/memcpy_common.S"
diff --git a/libc/arch-arm/cortex-a53/bionic/memcpy_base.S b/libc/arch-arm/cortex-a53/bionic/memcpy_base.S
new file mode 100644
index 000000000..2749fc83d
--- /dev/null
+++ b/libc/arch-arm/cortex-a53/bionic/memcpy_base.S
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * Copyright (c) 2013 ARM Ltd
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the company may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+.L_memcpy_base:
+ // Assumes that n >= 0, and dst, src are valid pointers.
+ cmp r2, #16
+ blo .L_copy_less_than_16_unknown_align
+
+.L_copy_unknown_alignment:
+ // Unknown alignment of src and dst.
+ // Assumes that the first few bytes have already been prefetched.
+
+ // Align destination to 128 bits. The mainloop store instructions
+ // require this alignment or they will throw an exception.
+ rsb r3, r0, #0
+ ands r3, r3, #0xF
+ beq 2f
+
+ // Copy up to 15 bytes (count in r3).
+ sub r2, r2, r3
+ movs ip, r3, lsl #31
+
+ itt mi
+ ldrbmi lr, [r1], #1
+ strbmi lr, [r0], #1
+ itttt cs
+ ldrbcs ip, [r1], #1
+ ldrbcs lr, [r1], #1
+ strbcs ip, [r0], #1
+ strbcs lr, [r0], #1
+
+ movs ip, r3, lsl #29
+ bge 1f
+ // Copies 4 bytes, dst 32 bits aligned before, at least 64 bits after.
+ vld4.8 {d0[0], d1[0], d2[0], d3[0]}, [r1]!
+ vst4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0, :32]!
+1: bcc 2f
+ // Copies 8 bytes, dst 64 bits aligned before, at least 128 bits after.
+ vld1.8 {d0}, [r1]!
+ vst1.8 {d0}, [r0, :64]!
+
+2: // Make sure we have at least 64 bytes to copy.
+ subs r2, r2, #64
+ blo 2f
+
+1: // The main loop copies 64 bytes at a time.
+ vld1.8 {d0 - d3}, [r1]!
+ vld1.8 {d4 - d7}, [r1]!
+ subs r2, r2, #64
+ vstmia r0!, {d0 - d7}
+ pld [r1, #(64*10)]
+ bhs 1b
+
+2: // Fix-up the remaining count and make sure we have >= 32 bytes left.
+ adds r2, r2, #32
+ blo 3f
+
+ // 32 bytes. These cache lines were already preloaded.
+ vld1.8 {d0 - d3}, [r1]!
+ sub r2, r2, #32
+ vst1.8 {d0 - d3}, [r0, :128]!
+3: // Less than 32 left.
+ add r2, r2, #32
+ tst r2, #0x10
+ beq .L_copy_less_than_16_unknown_align
+ // Copies 16 bytes, destination 128 bits aligned.
+ vld1.8 {d0, d1}, [r1]!
+ vst1.8 {d0, d1}, [r0, :128]!
+
+.L_copy_less_than_16_unknown_align:
+ // Copy up to 15 bytes (count in r2).
+ movs ip, r2, lsl #29
+ bcc 1f
+ vld1.8 {d0}, [r1]!
+ vst1.8 {d0}, [r0]!
+1: bge 2f
+ vld4.8 {d0[0], d1[0], d2[0], d3[0]}, [r1]!
+ vst4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]!
+
+2: // Copy 0 to 4 bytes.
+ lsls r2, r2, #31
+ itt ne
+ ldrbne lr, [r1], #1
+ strbne lr, [r0], #1
+ itttt cs
+ ldrbcs ip, [r1], #1
+ ldrbcs lr, [r1]
+ strbcs ip, [r0], #1
+ strbcs lr, [r0]
+
+ pop {r0, pc}
diff --git a/libc/arch-arm/cortex-a53/cortex-a53.mk b/libc/arch-arm/cortex-a53/cortex-a53.mk
index b5c337c68..9b431ae48 100644
--- a/libc/arch-arm/cortex-a53/cortex-a53.mk
+++ b/libc/arch-arm/cortex-a53/cortex-a53.mk
@@ -1 +1,31 @@
-include bionic/libc/arch-arm/cortex-a7/cortex-a7.mk
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+
+libc_bionic_src_files_exclude_arm += \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+
+libc_bionic_src_files_arm += \
+ arch-arm/cortex-a53/bionic/memcpy.S \
+ arch-arm/cortex-a53/bionic/__strcat_chk.S \
+ arch-arm/cortex-a53/bionic/__strcpy_chk.S \
+
+libc_bionic_src_files_arm += \
+ arch-arm/cortex-a7/bionic/memset.S \
+
+libc_bionic_src_files_arm += \
+ arch-arm/cortex-a15/bionic/stpcpy.S \
+ arch-arm/cortex-a15/bionic/strcat.S \
+ arch-arm/cortex-a15/bionic/strcmp.S \
+ arch-arm/cortex-a15/bionic/strcpy.S \
+ arch-arm/cortex-a15/bionic/strlen.S \
+
+libc_bionic_src_files_arm += \
+ arch-arm/denver/bionic/memmove.S \
diff --git a/libc/arch-arm/cortex-a7/bionic/memset.S b/libc/arch-arm/cortex-a7/bionic/memset.S
new file mode 100644
index 000000000..6365b066a
--- /dev/null
+++ b/libc/arch-arm/cortex-a7/bionic/memset.S
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <machine/cpu-features.h>
+#include <private/bionic_asm.h>
+#include <private/libc_events.h>
+
+ /*
+ * Optimized memset() for ARM.
+ *
+ * memset() returns its first argument.
+ */
+
+ .fpu neon
+ .syntax unified
+
+ENTRY(__memset_chk)
+ cmp r2, r3
+ bls .L_done
+
+ // Preserve lr for backtrace.
+ push {lr}
+ .cfi_def_cfa_offset 4
+ .cfi_rel_offset lr, 0
+
+ ldr r0, error_message
+ ldr r1, error_code
+1:
+ add r0, pc
+ bl __fortify_chk_fail
+error_code:
+ .word BIONIC_EVENT_MEMSET_BUFFER_OVERFLOW
+error_message:
+ .word error_string-(1b+8)
+END(__memset_chk)
+
+ENTRY(bzero)
+ mov r2, r1
+ mov r1, #0
+.L_done:
+ // Fall through to memset...
+END(bzero)
+
+ENTRY(memset)
+ mov r3, r0
+ // At this point only d0, d1 are going to be used below.
+ vdup.8 q0, r1
+ cmp r2, #16
+ blo .L_set_less_than_16_unknown_align
+
+.L_check_alignment:
+ // Align destination to a double word to avoid the store crossing
+ // a cache line boundary.
+ ands ip, r3, #7
+ bne .L_do_double_word_align
+
+.L_double_word_aligned:
+ // Duplicate since the less than 64 can use d2, d3.
+ vmov q1, q0
+ subs r2, #64
+ blo .L_set_less_than_64
+
+ // Duplicate the copy value so that we can store 64 bytes at a time.
+ vmov q2, q0
+ vmov q3, q0
+
+1: // Main loop stores 64 bytes at a time.
+ subs r2, #64
+ vstmia r3!, {d0 - d7}
+ bge 1b
+
+.L_set_less_than_64:
+ // Restore r2 to the count of bytes left to set.
+ add r2, #64
+ lsls ip, r2, #27
+ bcc .L_set_less_than_32
+ // Set 32 bytes.
+ vstmia r3!, {d0 - d3}
+
+.L_set_less_than_32:
+ bpl .L_set_less_than_16
+ // Set 16 bytes.
+ vstmia r3!, {d0, d1}
+
+.L_set_less_than_16:
+ // Less than 16 bytes to set.
+ lsls ip, r2, #29
+ bcc .L_set_less_than_8
+
+ // Set 8 bytes.
+ vstmia r3!, {d0}
+
+.L_set_less_than_8:
+ bpl .L_set_less_than_4
+ // Set 4 bytes
+ vst1.32 {d0[0]}, [r3]!
+
+.L_set_less_than_4:
+ lsls ip, r2, #31
+ it ne
+ strbne r1, [r3], #1
+ itt cs
+ strbcs r1, [r3], #1
+ strbcs r1, [r3]
+ bx lr
+
+.L_do_double_word_align:
+ rsb ip, ip, #8
+ sub r2, r2, ip
+
+ // Do this comparison now, otherwise we'll need to save a
+ // register to the stack since we've used all available
+ // registers.
+ cmp ip, #4
+ blo 1f
+
+ // Need to do a four byte copy.
+ movs ip, ip, lsl #31
+ it mi
+ strbmi r1, [r3], #1
+ itt cs
+ strbcs r1, [r3], #1
+ strbcs r1, [r3], #1
+ vst1.32 {d0[0]}, [r3]!
+ b .L_double_word_aligned
+
+1:
+ // No four byte copy.
+ movs ip, ip, lsl #31
+ it mi
+ strbmi r1, [r3], #1
+ itt cs
+ strbcs r1, [r3], #1
+ strbcs r1, [r3], #1
+ b .L_double_word_aligned
+
+.L_set_less_than_16_unknown_align:
+ // Set up to 15 bytes.
+ movs ip, r2, lsl #29
+ bcc 1f
+ vst1.8 {d0}, [r3]!
+1: bge 2f
+ vst1.32 {d0[0]}, [r3]!
+2: movs ip, r2, lsl #31
+ it mi
+ strbmi r1, [r3], #1
+ itt cs
+ strbcs r1, [r3], #1
+ strbcs r1, [r3], #1
+ bx lr
+END(memset)
+
+ .data
+error_string:
+ .string "memset: prevented write past end of buffer"
diff --git a/libc/arch-arm/cortex-a7/cortex-a7.mk b/libc/arch-arm/cortex-a7/cortex-a7.mk
index 9af03d94b..f570d0f05 100644
--- a/libc/arch-arm/cortex-a7/cortex-a7.mk
+++ b/libc/arch-arm/cortex-a7/cortex-a7.mk
@@ -1 +1,29 @@
-include bionic/libc/arch-arm/cortex-a15/cortex-a15.mk
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+
+libc_bionic_src_files_exclude_arm += \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+
+libc_bionic_src_files_arm += \
+ arch-arm/cortex-a7/bionic/memset.S \
+
+libc_bionic_src_files_arm += \
+ arch-arm/cortex-a15/bionic/memcpy.S \
+ arch-arm/cortex-a15/bionic/stpcpy.S \
+ arch-arm/cortex-a15/bionic/strcat.S \
+ arch-arm/cortex-a15/bionic/__strcat_chk.S \
+ arch-arm/cortex-a15/bionic/strcmp.S \
+ arch-arm/cortex-a15/bionic/strcpy.S \
+ arch-arm/cortex-a15/bionic/__strcpy_chk.S \
+ arch-arm/cortex-a15/bionic/strlen.S \
+
+libc_bionic_src_files_arm += \
+ arch-arm/denver/bionic/memmove.S \
diff --git a/libc/arch-arm/cortex-a9/bionic/memcpy_base.S b/libc/arch-arm/cortex-a9/bionic/memcpy_base.S
index 5e813050a..966b9b3c0 100644
--- a/libc/arch-arm/cortex-a9/bionic/memcpy_base.S
+++ b/libc/arch-arm/cortex-a9/bionic/memcpy_base.S
@@ -44,7 +44,7 @@ ENTRY_PRIVATE(MEMCPY_BASE)
/* check if buffers are aligned. If so, run arm-only version */
eor r3, r0, r1
ands r3, r3, #0x3
- beq __memcpy_base_aligned
+ beq MEMCPY_BASE_ALIGNED
/* Check the upper size limit for Neon unaligned memory access in memcpy */
cmp r2, #224
@@ -133,8 +133,7 @@ ENTRY_PRIVATE(MEMCPY_BASE)
strbcs ip, [r0], #1
strbcs lr, [r0], #1
- ldmfd sp!, {r0, lr}
- bx lr
+ ldmfd sp!, {r0, pc}
END(MEMCPY_BASE)
ENTRY_PRIVATE(MEMCPY_BASE_ALIGNED)
diff --git a/libc/arch-arm/cortex-a9/bionic/memset.S b/libc/arch-arm/cortex-a9/bionic/memset.S
index 8ee6ac26c..b39fcc4ae 100644
--- a/libc/arch-arm/cortex-a9/bionic/memset.S
+++ b/libc/arch-arm/cortex-a9/bionic/memset.S
@@ -69,12 +69,9 @@ END(bzero)
ENTRY(memset)
// The neon memset only wins for less than 132.
cmp r2, #132
- bhi __memset_large_copy
-
- stmfd sp!, {r0}
- .cfi_def_cfa_offset 4
- .cfi_rel_offset r0, 0
+ bhi .L_memset_large_copy
+ mov r3, r0
vdup.8 q0, r1
/* make sure we have at least 32 bytes to write */
@@ -84,7 +81,7 @@ ENTRY(memset)
1: /* The main loop writes 32 bytes at a time */
subs r2, r2, #32
- vst1.8 {d0 - d3}, [r0]!
+ vst1.8 {d0 - d3}, [r3]!
bhs 1b
2: /* less than 32 left */
@@ -93,22 +90,20 @@ ENTRY(memset)
beq 3f
// writes 16 bytes, 128-bits aligned
- vst1.8 {d0, d1}, [r0]!
+ vst1.8 {d0, d1}, [r3]!
3: /* write up to 15-bytes (count in r2) */
movs ip, r2, lsl #29
bcc 1f
- vst1.8 {d0}, [r0]!
+ vst1.8 {d0}, [r3]!
1: bge 2f
- vst1.32 {d0[0]}, [r0]!
+ vst1.32 {d0[0]}, [r3]!
2: movs ip, r2, lsl #31
- strbmi r1, [r0], #1
- strbcs r1, [r0], #1
- strbcs r1, [r0], #1
- ldmfd sp!, {r0}
+ strbmi r1, [r3], #1
+ strbcs r1, [r3], #1
+ strbcs r1, [r3], #1
bx lr
-END(memset)
-ENTRY_PRIVATE(__memset_large_copy)
+.L_memset_large_copy:
/* compute the offset to align the destination
* offset = (4-(src&3))&3 = -src & 3
*/
@@ -136,8 +131,7 @@ ENTRY_PRIVATE(__memset_large_copy)
strbcs r1, [r0], #1
strbmi r1, [r0], #1
subs r2, r2, r3
- popls {r0, r4-r7, lr} /* return */
- bxls lr
+ popls {r0, r4-r7, pc} /* return */
/* align the destination to a cache-line */
mov r12, r1
@@ -180,9 +174,8 @@ ENTRY_PRIVATE(__memset_large_copy)
strhmi r1, [r0], #2
movs r2, r2, lsl #2
strbcs r1, [r0]
- ldmfd sp!, {r0, r4-r7, lr}
- bx lr
-END(__memset_large_copy)
+ ldmfd sp!, {r0, r4-r7, pc}
+END(memset)
.data
error_string:
diff --git a/libc/arch-arm/cortex-a9/bionic/strcat.S b/libc/arch-arm/cortex-a9/bionic/strcat.S
index f5a855e39..9077a7449 100644
--- a/libc/arch-arm/cortex-a9/bionic/strcat.S
+++ b/libc/arch-arm/cortex-a9/bionic/strcat.S
@@ -70,7 +70,7 @@
.macro m_scan_byte
ldrb r3, [r0]
- cbz r3, strcat_r0_scan_done
+ cbz r3, .Lstrcat_r0_scan_done
add r0, #1
.endm // m_scan_byte
@@ -84,10 +84,10 @@ ENTRY(strcat)
// Quick check to see if src is empty.
ldrb r2, [r1]
pld [r1, #0]
- cbnz r2, strcat_continue
+ cbnz r2, .Lstrcat_continue
bx lr
-strcat_continue:
+.Lstrcat_continue:
// To speed up really small dst strings, unroll checking the first 4 bytes.
m_push
m_scan_byte
@@ -96,10 +96,10 @@ strcat_continue:
m_scan_byte
ands r3, r0, #7
- bne strcat_align_src
+ bne .Lstrcat_align_src
.p2align 2
-strcat_mainloop:
+.Lstrcat_mainloop:
ldmia r0!, {r2, r3}
pld [r0, #64]
@@ -107,28 +107,28 @@ strcat_mainloop:
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcat_zero_in_first_register
+ bne .Lstrcat_zero_in_first_register
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcat_zero_in_second_register
- b strcat_mainloop
+ bne .Lstrcat_zero_in_second_register
+ b .Lstrcat_mainloop
-strcat_zero_in_first_register:
+.Lstrcat_zero_in_first_register:
sub r0, r0, #4
-strcat_zero_in_second_register:
+.Lstrcat_zero_in_second_register:
// Check for zero in byte 0.
tst ip, #0x80
it ne
subne r0, r0, #4
- bne strcat_r0_scan_done
+ bne .Lstrcat_r0_scan_done
// Check for zero in byte 1.
tst ip, #0x8000
it ne
subne r0, r0, #3
- bne strcat_r0_scan_done
+ bne .Lstrcat_r0_scan_done
// Check for zero in byte 2.
tst ip, #0x800000
it ne
@@ -137,33 +137,33 @@ strcat_zero_in_second_register:
// Zero is in byte 3.
subeq r0, r0, #1
-strcat_r0_scan_done:
+.Lstrcat_r0_scan_done:
// Unroll the first 8 bytes that will be copied.
- m_copy_byte reg=r2, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r3, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r4, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r5, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r2, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r3, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r4, cmd=cbz, label=strcpy_finish
- m_copy_byte reg=r5, cmd=cbnz, label=strcpy_continue
-
-strcpy_finish:
+ m_copy_byte reg=r2, cmd=cbz, label=.Lstrcpy_finish
+ m_copy_byte reg=r3, cmd=cbz, label=.Lstrcpy_finish
+ m_copy_byte reg=r4, cmd=cbz, label=.Lstrcpy_finish
+ m_copy_byte reg=r5, cmd=cbz, label=.Lstrcpy_finish
+ m_copy_byte reg=r2, cmd=cbz, label=.Lstrcpy_finish
+ m_copy_byte reg=r3, cmd=cbz, label=.Lstrcpy_finish
+ m_copy_byte reg=r4, cmd=cbz, label=.Lstrcpy_finish
+ m_copy_byte reg=r5, cmd=cbnz, label=.Lstrcpy_continue
+
+.Lstrcpy_finish:
m_ret inst=pop
-strcpy_continue:
+.Lstrcpy_continue:
pld [r1, #0]
ands r3, r0, #7
- bne strcpy_align_dst
+ bne .Lstrcpy_align_dst
-strcpy_check_src_align:
+.Lstrcpy_check_src_align:
// At this point dst is aligned to a double word, check if src
// is also aligned to a double word.
ands r3, r1, #7
- bne strcpy_unaligned_copy
+ bne .Lstrcpy_unaligned_copy
.p2align 2
-strcpy_mainloop:
+.Lstrcpy_mainloop:
ldmia r1!, {r2, r3}
pld [r1, #64]
@@ -171,17 +171,17 @@ strcpy_mainloop:
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .Lstrcpy_zero_in_first_register
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .Lstrcpy_zero_in_second_register
stmia r0!, {r2, r3}
- b strcpy_mainloop
+ b .Lstrcpy_mainloop
-strcpy_zero_in_first_register:
+.Lstrcpy_zero_in_first_register:
lsls lr, ip, #17
itt ne
strbne r2, [r0]
@@ -198,7 +198,7 @@ strcpy_zero_in_first_register:
strb r3, [r0]
m_ret inst=pop
-strcpy_zero_in_second_register:
+.Lstrcpy_zero_in_second_register:
lsls lr, ip, #17
ittt ne
stmiane r0!, {r2}
@@ -218,18 +218,18 @@ strcpy_zero_in_second_register:
strb r4, [r0]
m_ret inst=pop
-strcpy_align_dst:
+.Lstrcpy_align_dst:
// Align to a double word (64 bits).
rsb r3, r3, #8
lsls ip, r3, #31
- beq strcpy_align_to_32
+ beq .Lstrcpy_align_to_32
ldrb r2, [r1], #1
strb r2, [r0], #1
- cbz r2, strcpy_complete
+ cbz r2, .Lstrcpy_complete
-strcpy_align_to_32:
- bcc strcpy_align_to_64
+.Lstrcpy_align_to_32:
+ bcc .Lstrcpy_align_to_64
ldrb r4, [r1], #1
strb r4, [r0], #1
@@ -242,76 +242,83 @@ strcpy_align_to_32:
it eq
m_ret inst=popeq
-strcpy_align_to_64:
+.Lstrcpy_align_to_64:
tst r3, #4
- beq strcpy_check_src_align
- ldr r2, [r1], #4
-
- sub ip, r2, #0x01010101
- bic ip, ip, r2
- ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
- stmia r0!, {r2}
- b strcpy_check_src_align
+ beq .Lstrcpy_check_src_align
+ // Read one byte at a time since we don't know the src alignment
+ // and we don't want to read into a different page.
+ ldrb r4, [r1], #1
+ strb r4, [r0], #1
+ cbz r4, .Lstrcpy_complete
+ ldrb r5, [r1], #1
+ strb r5, [r0], #1
+ cbz r5, .Lstrcpy_complete
+ ldrb r4, [r1], #1
+ strb r4, [r0], #1
+ cbz r4, .Lstrcpy_complete
+ ldrb r5, [r1], #1
+ strb r5, [r0], #1
+ cbz r5, .Lstrcpy_complete
+ b .Lstrcpy_check_src_align
-strcpy_complete:
+.Lstrcpy_complete:
m_ret inst=pop
-strcpy_unaligned_copy:
+.Lstrcpy_unaligned_copy:
// Dst is aligned to a double word, while src is at an unknown alignment.
// There are 7 different versions of the unaligned copy code
// to prevent overreading the src. The mainloop of every single version
// will store 64 bits per loop. The difference is how much of src can
// be read without potentially crossing a page boundary.
tbb [pc, r3]
-strcpy_unaligned_branchtable:
+.Lstrcpy_unaligned_branchtable:
.byte 0
- .byte ((strcpy_unalign7 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign6 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign5 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign4 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign3 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign2 - strcpy_unaligned_branchtable)/2)
- .byte ((strcpy_unalign1 - strcpy_unaligned_branchtable)/2)
+ .byte ((.Lstrcpy_unalign7 - .Lstrcpy_unaligned_branchtable)/2)
+ .byte ((.Lstrcpy_unalign6 - .Lstrcpy_unaligned_branchtable)/2)
+ .byte ((.Lstrcpy_unalign5 - .Lstrcpy_unaligned_branchtable)/2)
+ .byte ((.Lstrcpy_unalign4 - .Lstrcpy_unaligned_branchtable)/2)
+ .byte ((.Lstrcpy_unalign3 - .Lstrcpy_unaligned_branchtable)/2)
+ .byte ((.Lstrcpy_unalign2 - .Lstrcpy_unaligned_branchtable)/2)
+ .byte ((.Lstrcpy_unalign1 - .Lstrcpy_unaligned_branchtable)/2)
.p2align 2
// Can read 7 bytes before possibly crossing a page.
-strcpy_unalign7:
+.Lstrcpy_unalign7:
ldr r2, [r1], #4
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .Lstrcpy_zero_in_first_register
ldrb r3, [r1]
- cbz r3, strcpy_unalign7_copy5bytes
+ cbz r3, .Lstrcpy_unalign7_copy5bytes
ldrb r4, [r1, #1]
- cbz r4, strcpy_unalign7_copy6bytes
+ cbz r4, .Lstrcpy_unalign7_copy6bytes
ldrb r5, [r1, #2]
- cbz r5, strcpy_unalign7_copy7bytes
+ cbz r5, .Lstrcpy_unalign7_copy7bytes
ldr r3, [r1], #4
pld [r1, #64]
lsrs ip, r3, #24
stmia r0!, {r2, r3}
- beq strcpy_unalign_return
- b strcpy_unalign7
+ beq .Lstrcpy_unalign_return
+ b .Lstrcpy_unalign7
-strcpy_unalign7_copy5bytes:
+.Lstrcpy_unalign7_copy5bytes:
stmia r0!, {r2}
strb r3, [r0]
-strcpy_unalign_return:
+.Lstrcpy_unalign_return:
m_ret inst=pop
-strcpy_unalign7_copy6bytes:
+.Lstrcpy_unalign7_copy6bytes:
stmia r0!, {r2}
strb r3, [r0], #1
strb r4, [r0], #1
m_ret inst=pop
-strcpy_unalign7_copy7bytes:
+.Lstrcpy_unalign7_copy7bytes:
stmia r0!, {r2}
strb r3, [r0], #1
strb r4, [r0], #1
@@ -320,30 +327,30 @@ strcpy_unalign7_copy7bytes:
.p2align 2
// Can read 6 bytes before possibly crossing a page.
-strcpy_unalign6:
+.Lstrcpy_unalign6:
ldr r2, [r1], #4
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .Lstrcpy_zero_in_first_register
ldrb r4, [r1]
- cbz r4, strcpy_unalign_copy5bytes
+ cbz r4, .Lstrcpy_unalign_copy5bytes
ldrb r5, [r1, #1]
- cbz r5, strcpy_unalign_copy6bytes
+ cbz r5, .Lstrcpy_unalign_copy6bytes
ldr r3, [r1], #4
pld [r1, #64]
tst r3, #0xff0000
- beq strcpy_unalign6_copy7bytes
+ beq .Lstrcpy_unalign6_copy7bytes
lsrs ip, r3, #24
stmia r0!, {r2, r3}
- beq strcpy_unalign_return
- b strcpy_unalign6
+ beq .Lstrcpy_unalign_return
+ b .Lstrcpy_unalign6
-strcpy_unalign6_copy7bytes:
+.Lstrcpy_unalign6_copy7bytes:
stmia r0!, {r2}
strh r3, [r0], #2
lsr r3, #16
@@ -352,16 +359,16 @@ strcpy_unalign6_copy7bytes:
.p2align 2
// Can read 5 bytes before possibly crossing a page.
-strcpy_unalign5:
+.Lstrcpy_unalign5:
ldr r2, [r1], #4
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .Lstrcpy_zero_in_first_register
ldrb r4, [r1]
- cbz r4, strcpy_unalign_copy5bytes
+ cbz r4, .Lstrcpy_unalign_copy5bytes
ldr r3, [r1], #4
@@ -370,17 +377,17 @@ strcpy_unalign5:
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .Lstrcpy_zero_in_second_register
stmia r0!, {r2, r3}
- b strcpy_unalign5
+ b .Lstrcpy_unalign5
-strcpy_unalign_copy5bytes:
+.Lstrcpy_unalign_copy5bytes:
stmia r0!, {r2}
strb r4, [r0]
m_ret inst=pop
-strcpy_unalign_copy6bytes:
+.Lstrcpy_unalign_copy6bytes:
stmia r0!, {r2}
strb r4, [r0], #1
strb r5, [r0]
@@ -388,13 +395,13 @@ strcpy_unalign_copy6bytes:
.p2align 2
// Can read 4 bytes before possibly crossing a page.
-strcpy_unalign4:
+.Lstrcpy_unalign4:
ldmia r1!, {r2}
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .Lstrcpy_zero_in_first_register
ldmia r1!, {r3}
pld [r1, #64]
@@ -402,20 +409,20 @@ strcpy_unalign4:
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .Lstrcpy_zero_in_second_register
stmia r0!, {r2, r3}
- b strcpy_unalign4
+ b .Lstrcpy_unalign4
.p2align 2
// Can read 3 bytes before possibly crossing a page.
-strcpy_unalign3:
+.Lstrcpy_unalign3:
ldrb r2, [r1]
- cbz r2, strcpy_unalign3_copy1byte
+ cbz r2, .Lstrcpy_unalign3_copy1byte
ldrb r3, [r1, #1]
- cbz r3, strcpy_unalign3_copy2bytes
+ cbz r3, .Lstrcpy_unalign3_copy2bytes
ldrb r4, [r1, #2]
- cbz r4, strcpy_unalign3_copy3bytes
+ cbz r4, .Lstrcpy_unalign3_copy3bytes
ldr r2, [r1], #4
ldr r3, [r1], #4
@@ -423,26 +430,26 @@ strcpy_unalign3:
pld [r1, #64]
lsrs lr, r2, #24
- beq strcpy_unalign_copy4bytes
+ beq .Lstrcpy_unalign_copy4bytes
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .Lstrcpy_zero_in_second_register
stmia r0!, {r2, r3}
- b strcpy_unalign3
+ b .Lstrcpy_unalign3
-strcpy_unalign3_copy1byte:
+.Lstrcpy_unalign3_copy1byte:
strb r2, [r0]
m_ret inst=pop
-strcpy_unalign3_copy2bytes:
+.Lstrcpy_unalign3_copy2bytes:
strb r2, [r0], #1
strb r3, [r0]
m_ret inst=pop
-strcpy_unalign3_copy3bytes:
+.Lstrcpy_unalign3_copy3bytes:
strb r2, [r0], #1
strb r3, [r0], #1
strb r4, [r0]
@@ -450,34 +457,34 @@ strcpy_unalign3_copy3bytes:
.p2align 2
// Can read 2 bytes before possibly crossing a page.
-strcpy_unalign2:
+.Lstrcpy_unalign2:
ldrb r2, [r1]
- cbz r2, strcpy_unalign_copy1byte
+ cbz r2, .Lstrcpy_unalign_copy1byte
ldrb r3, [r1, #1]
- cbz r3, strcpy_unalign_copy2bytes
+ cbz r3, .Lstrcpy_unalign_copy2bytes
ldr r2, [r1], #4
ldr r3, [r1], #4
pld [r1, #64]
tst r2, #0xff0000
- beq strcpy_unalign_copy3bytes
+ beq .Lstrcpy_unalign_copy3bytes
lsrs ip, r2, #24
- beq strcpy_unalign_copy4bytes
+ beq .Lstrcpy_unalign_copy4bytes
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .Lstrcpy_zero_in_second_register
stmia r0!, {r2, r3}
- b strcpy_unalign2
+ b .Lstrcpy_unalign2
.p2align 2
// Can read 1 byte before possibly crossing a page.
-strcpy_unalign1:
+.Lstrcpy_unalign1:
ldrb r2, [r1]
- cbz r2, strcpy_unalign_copy1byte
+ cbz r2, .Lstrcpy_unalign_copy1byte
ldr r2, [r1], #4
ldr r3, [r1], #4
@@ -487,62 +494,62 @@ strcpy_unalign1:
sub ip, r2, #0x01010101
bic ip, ip, r2
ands ip, ip, #0x80808080
- bne strcpy_zero_in_first_register
+ bne .Lstrcpy_zero_in_first_register
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcpy_zero_in_second_register
+ bne .Lstrcpy_zero_in_second_register
stmia r0!, {r2, r3}
- b strcpy_unalign1
+ b .Lstrcpy_unalign1
-strcpy_unalign_copy1byte:
+.Lstrcpy_unalign_copy1byte:
strb r2, [r0]
m_ret inst=pop
-strcpy_unalign_copy2bytes:
+.Lstrcpy_unalign_copy2bytes:
strb r2, [r0], #1
strb r3, [r0]
m_ret inst=pop
-strcpy_unalign_copy3bytes:
+.Lstrcpy_unalign_copy3bytes:
strh r2, [r0], #2
lsr r2, #16
strb r2, [r0]
m_ret inst=pop
-strcpy_unalign_copy4bytes:
+.Lstrcpy_unalign_copy4bytes:
stmia r0, {r2}
m_ret inst=pop
-strcat_align_src:
+.Lstrcat_align_src:
// Align to a double word (64 bits).
rsb r3, r3, #8
lsls ip, r3, #31
- beq strcat_align_to_32
+ beq .Lstrcat_align_to_32
ldrb r2, [r0], #1
- cbz r2, strcat_r0_update
+ cbz r2, .Lstrcat_r0_update
-strcat_align_to_32:
- bcc strcat_align_to_64
+.Lstrcat_align_to_32:
+ bcc .Lstrcat_align_to_64
ldrb r2, [r0], #1
- cbz r2, strcat_r0_update
+ cbz r2, .Lstrcat_r0_update
ldrb r2, [r0], #1
- cbz r2, strcat_r0_update
+ cbz r2, .Lstrcat_r0_update
-strcat_align_to_64:
+.Lstrcat_align_to_64:
tst r3, #4
- beq strcat_mainloop
+ beq .Lstrcat_mainloop
ldr r3, [r0], #4
sub ip, r3, #0x01010101
bic ip, ip, r3
ands ip, ip, #0x80808080
- bne strcat_zero_in_second_register
- b strcat_mainloop
+ bne .Lstrcat_zero_in_second_register
+ b .Lstrcat_mainloop
-strcat_r0_update:
+.Lstrcat_r0_update:
sub r0, r0, #1
- b strcat_r0_scan_done
+ b .Lstrcat_r0_scan_done
END(strcat)
diff --git a/libc/arch-arm/cortex-a9/bionic/string_copy.S b/libc/arch-arm/cortex-a9/bionic/string_copy.S
index caf5a11fe..642db0f19 100644
--- a/libc/arch-arm/cortex-a9/bionic/string_copy.S
+++ b/libc/arch-arm/cortex-a9/bionic/string_copy.S
@@ -244,13 +244,20 @@ ENTRY(strcpy)
.Lstringcopy_align_to_64:
tst r3, #4
beq .Lstringcopy_check_src_align
- ldr r2, [r1], #4
-
- sub ip, r2, #0x01010101
- bic ip, ip, r2
- ands ip, ip, #0x80808080
- bne .Lstringcopy_zero_in_first_register
- stmia r0!, {r2}
+ // Read one byte at a time since we don't have any idea about the alignment
+ // of the source and we don't want to read into a different page.
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
+ ldrb r2, [r1], #1
+ strb r2, [r0], #1
+ cbz r2, .Lstringcopy_complete
b .Lstringcopy_check_src_align
.Lstringcopy_complete:
diff --git a/libc/arch-arm/cortex-a9/cortex-a9.mk b/libc/arch-arm/cortex-a9/cortex-a9.mk
index 7b38de15c..8a26d6b70 100644
--- a/libc/arch-arm/cortex-a9/cortex-a9.mk
+++ b/libc/arch-arm/cortex-a9/cortex-a9.mk
@@ -1,3 +1,18 @@
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+ upstream-openbsd/lib/libc/string/strcpy.c \
+
+libc_bionic_src_files_exclude_arm += \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+
libc_bionic_src_files_arm += \
arch-arm/cortex-a9/bionic/memcpy.S \
arch-arm/cortex-a9/bionic/memset.S \
@@ -10,7 +25,4 @@ libc_bionic_src_files_arm += \
arch-arm/cortex-a9/bionic/strlen.S \
libc_bionic_src_files_arm += \
- arch-arm/generic/bionic/memcmp.S \
-
-libc_bionic_src_files_arm += \
arch-arm/denver/bionic/memmove.S \
diff --git a/libc/arch-arm/denver/denver.mk b/libc/arch-arm/denver/denver.mk
index 5fddf955a..f1679919b 100644
--- a/libc/arch-arm/denver/denver.mk
+++ b/libc/arch-arm/denver/denver.mk
@@ -1,5 +1,18 @@
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+
+libc_bionic_src_files_exclude_arm += \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+
libc_bionic_src_files_arm += \
- arch-arm/generic/bionic/memcmp.S \
arch-arm/denver/bionic/memcpy.S \
arch-arm/denver/bionic/memmove.S \
arch-arm/denver/bionic/memset.S \
diff --git a/libc/arch-arm/generic/bionic/memcmp.S b/libc/arch-arm/generic/bionic/memcmp.S
index c78dbd4bf..6643d5515 100644
--- a/libc/arch-arm/generic/bionic/memcmp.S
+++ b/libc/arch-arm/generic/bionic/memcmp.S
@@ -221,8 +221,7 @@ ENTRY(memcmp)
bne 8b
9: /* restore registers and return */
- ldmfd sp!, {r4, lr}
- bx lr
+ ldmfd sp!, {r4, pc}
10: /* process less than 12 bytes */
cmp r2, #0
diff --git a/libc/arch-arm/generic/bionic/memcpy.S b/libc/arch-arm/generic/bionic/memcpy.S
index ea5a3998b..65cba4c5e 100644
--- a/libc/arch-arm/generic/bionic/memcpy.S
+++ b/libc/arch-arm/generic/bionic/memcpy.S
@@ -194,8 +194,7 @@ ENTRY(memcpy)
/* we're done! restore everything and return */
1: ldmfd sp!, {r5-r11}
- ldmfd sp!, {r0, r4, lr}
- bx lr
+ ldmfd sp!, {r0, r4, pc}
/********************************************************************/
@@ -385,8 +384,7 @@ ENTRY(memcpy)
/* we're done! restore sp and spilled registers and return */
add sp, sp, #28
- ldmfd sp!, {r0, r4, lr}
- bx lr
+ ldmfd sp!, {r0, r4, pc}
END(memcpy)
// Only reached when the __memcpy_chk check fails.
diff --git a/libc/arch-arm/generic/bionic/memset.S b/libc/arch-arm/generic/bionic/memset.S
index d17a9c4e0..b8eabbf83 100644
--- a/libc/arch-arm/generic/bionic/memset.S
+++ b/libc/arch-arm/generic/bionic/memset.S
@@ -82,8 +82,7 @@ ENTRY(memset)
strbcs r1, [r0], #1
strbmi r1, [r0], #1
subs r2, r2, r3
- popls {r0, r4-r7, lr} /* return */
- bxls lr
+ popls {r0, r4-r7, pc} /* return */
/* align the destination to a cache-line */
mov r12, r1
@@ -126,8 +125,7 @@ ENTRY(memset)
strhmi r1, [r0], #2
movs r2, r2, lsl #2
strbcs r1, [r0]
- ldmfd sp!, {r0, r4-r7, lr}
- bx lr
+ ldmfd sp!, {r0, r4-r7, pc}
END(memset)
.data
diff --git a/libc/arch-arm/generic/generic.mk b/libc/arch-arm/generic/generic.mk
deleted file mode 100644
index e49d6d200..000000000
--- a/libc/arch-arm/generic/generic.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-libc_bionic_src_files_arm += \
- arch-arm/generic/bionic/memcmp.S \
- arch-arm/generic/bionic/memcpy.S \
- arch-arm/generic/bionic/memset.S \
- arch-arm/generic/bionic/strcmp.S \
- arch-arm/generic/bionic/strcpy.S \
- arch-arm/generic/bionic/strlen.c \
- bionic/__strcat_chk.cpp \
- bionic/__strcpy_chk.cpp \
-
-libc_openbsd_src_files_arm += \
- upstream-openbsd/lib/libc/string/memmove.c \
- upstream-openbsd/lib/libc/string/stpcpy.c \
- upstream-openbsd/lib/libc/string/strcat.c \
diff --git a/libc/arch-arm/krait/bionic/__strcat_chk.S b/libc/arch-arm/krait/bionic/__strcat_chk.S
index 246f159c0..1a39c5b88 100644
--- a/libc/arch-arm/krait/bionic/__strcat_chk.S
+++ b/libc/arch-arm/krait/bionic/__strcat_chk.S
@@ -40,7 +40,7 @@
ENTRY(__strcat_chk)
pld [r0, #0]
push {r0, lr}
- .cfi_def_cfa_offset 8
+ .cfi_adjust_cfa_offset 8
.cfi_rel_offset r0, 0
.cfi_rel_offset lr, 4
push {r4, r5}
@@ -177,7 +177,7 @@ ENTRY(__strcat_chk)
.L_strlen_done:
add r2, r3, r4
cmp r2, lr
- bhi __strcat_chk_failed
+ bhi .L_strcat_chk_failed
// Set up the registers for the memcpy code.
mov r1, r5
@@ -185,20 +185,17 @@ ENTRY(__strcat_chk)
mov r2, r4
add r0, r0, r3
pop {r4, r5}
-END(__strcat_chk)
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r4
+ .cfi_restore r5
-#define MEMCPY_BASE __strcat_chk_memcpy_base
-#define MEMCPY_BASE_ALIGNED __strcat_chk_memcpy_base_aligned
#include "memcpy_base.S"
-ENTRY_PRIVATE(__strcat_chk_failed)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
+ // Undo the above cfi directives.
.cfi_adjust_cfa_offset 8
.cfi_rel_offset r4, 0
.cfi_rel_offset r5, 4
-
+.L_strcat_chk_failed:
ldr r0, error_message
ldr r1, error_code
1:
@@ -208,7 +205,7 @@ error_code:
.word BIONIC_EVENT_STRCAT_BUFFER_OVERFLOW
error_message:
.word error_string-(1b+4)
-END(__strcat_chk_failed)
+END(__strcat_chk)
.data
error_string:
diff --git a/libc/arch-arm/krait/bionic/__strcpy_chk.S b/libc/arch-arm/krait/bionic/__strcpy_chk.S
index db766863a..00202f3da 100644
--- a/libc/arch-arm/krait/bionic/__strcpy_chk.S
+++ b/libc/arch-arm/krait/bionic/__strcpy_chk.S
@@ -39,7 +39,7 @@
ENTRY(__strcpy_chk)
pld [r0, #0]
push {r0, lr}
- .cfi_def_cfa_offset 8
+ .cfi_adjust_cfa_offset 8
.cfi_rel_offset r0, 0
.cfi_rel_offset lr, 4
@@ -149,21 +149,14 @@ ENTRY(__strcpy_chk)
pld [r1, #64]
ldr r0, [sp]
cmp r3, lr
- bhs __strcpy_chk_failed
+ bhs .L_strcpy_chk_failed
// Add 1 for copy length to get the string terminator.
add r2, r3, #1
-END(__strcpy_chk)
-#define MEMCPY_BASE __strcpy_chk_memcpy_base
-#define MEMCPY_BASE_ALIGNED __strcpy_chk_memcpy_base_aligned
#include "memcpy_base.S"
-ENTRY_PRIVATE(__strcpy_chk_failed)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
-
+.L_strcpy_chk_failed:
ldr r0, error_message
ldr r1, error_code
1:
@@ -173,7 +166,7 @@ error_code:
.word BIONIC_EVENT_STRCPY_BUFFER_OVERFLOW
error_message:
.word error_string-(1b+4)
-END(__strcpy_chk_failed)
+END(__strcpy_chk)
.data
error_string:
diff --git a/libc/arch-arm/krait/bionic/memcpy.S b/libc/arch-arm/krait/bionic/memcpy.S
index 9ff46a8ac..5d27b574f 100644
--- a/libc/arch-arm/krait/bionic/memcpy.S
+++ b/libc/arch-arm/krait/bionic/memcpy.S
@@ -45,7 +45,7 @@
ENTRY(__memcpy_chk)
cmp r2, r3
- bhi __memcpy_chk_fail
+ bhi .L_memcpy_chk_fail
// Fall through to memcpy...
END(__memcpy_chk)
@@ -53,19 +53,20 @@ END(__memcpy_chk)
ENTRY(memcpy)
pld [r1, #64]
stmfd sp!, {r0, lr}
- .cfi_def_cfa_offset 8
+ .cfi_adjust_cfa_offset 8
.cfi_rel_offset r0, 0
.cfi_rel_offset lr, 4
-END(memcpy)
-#define MEMCPY_BASE __memcpy_base
-#define MEMCPY_BASE_ALIGNED __memcpy_base_aligned
#include "memcpy_base.S"
-ENTRY_PRIVATE(__memcpy_chk_fail)
+ // Undo the cfi directives from above.
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r0
+ .cfi_restore lr
+.L_memcpy_chk_fail:
// Preserve lr for backtrace.
push {lr}
- .cfi_def_cfa_offset 4
+ .cfi_adjust_cfa_offset 4
.cfi_rel_offset lr, 0
ldr r0, error_message
@@ -77,7 +78,7 @@ error_code:
.word BIONIC_EVENT_MEMCPY_BUFFER_OVERFLOW
error_message:
.word error_string-(1b+4)
-END(__memcpy_chk_fail)
+END(memcpy)
.data
error_string:
diff --git a/libc/arch-arm/krait/bionic/memcpy_base.S b/libc/arch-arm/krait/bionic/memcpy_base.S
index 035dcf126..76c5a8459 100644
--- a/libc/arch-arm/krait/bionic/memcpy_base.S
+++ b/libc/arch-arm/krait/bionic/memcpy_base.S
@@ -1,123 +1,191 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-
-/*
- * This code assumes it is running on a processor that supports all arm v7
- * instructions, that supports neon instructions, and that has a 32 byte
- * cache line.
- */
-
-// Assumes neon instructions and a cache line size of 32 bytes.
-
-ENTRY_PRIVATE(MEMCPY_BASE)
- .cfi_def_cfa_offset 8
- .cfi_rel_offset r0, 0
- .cfi_rel_offset lr, 4
-
- /* do we have at least 16-bytes to copy (needed for alignment below) */
- cmp r2, #16
- blo 5f
-
- /* align destination to cache-line for the write-buffer */
- rsb r3, r0, #0
- ands r3, r3, #0xF
- beq 2f
-
- /* copy up to 15-bytes (count in r3) */
- sub r2, r2, r3
- movs ip, r3, lsl #31
- itt mi
- ldrbmi lr, [r1], #1
- strbmi lr, [r0], #1
- itttt cs
- ldrbcs ip, [r1], #1
- ldrbcs lr, [r1], #1
- strbcs ip, [r0], #1
- strbcs lr, [r0], #1
- movs ip, r3, lsl #29
- bge 1f
- // copies 4 bytes, destination 32-bits aligned
- vld4.8 {d0[0], d1[0], d2[0], d3[0]}, [r1]!
- vst4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0, :32]!
-1: bcc 2f
- // copies 8 bytes, destination 64-bits aligned
- vld1.8 {d0}, [r1]!
- vst1.8 {d0}, [r0, :64]!
-
-2: /* make sure we have at least 64 bytes to copy */
- subs r2, r2, #64
- blo 2f
-
-1: /* The main loop copies 64 bytes at a time */
- vld1.8 {d0 - d3}, [r1]!
- vld1.8 {d4 - d7}, [r1]!
- pld [r1, #(32*8)]
- subs r2, r2, #64
- vst1.8 {d0 - d3}, [r0, :128]!
- vst1.8 {d4 - d7}, [r0, :128]!
- bhs 1b
-
-2: /* fix-up the remaining count and make sure we have >= 32 bytes left */
- adds r2, r2, #32
- blo 4f
-
- /* Copy 32 bytes. These cache lines were already preloaded */
- vld1.8 {d0 - d3}, [r1]!
- sub r2, r2, #32
- vst1.8 {d0 - d3}, [r0, :128]!
-
-4: /* less than 32 left */
- add r2, r2, #32
- tst r2, #0x10
- beq 5f
- // copies 16 bytes, 128-bits aligned
- vld1.8 {d0, d1}, [r1]!
- vst1.8 {d0, d1}, [r0, :128]!
-
-5: /* copy up to 15-bytes (count in r2) */
- movs ip, r2, lsl #29
- bcc 1f
- vld1.8 {d0}, [r1]!
- vst1.8 {d0}, [r0]!
-1: bge 2f
- vld4.8 {d0[0], d1[0], d2[0], d3[0]}, [r1]!
- vst4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]!
-2: movs ip, r2, lsl #31
- itt mi
- ldrbmi r3, [r1], #1
- strbmi r3, [r0], #1
- itttt cs
- ldrbcs ip, [r1], #1
- ldrbcs lr, [r1], #1
- strbcs ip, [r0], #1
- strbcs lr, [r0], #1
-
- ldmfd sp!, {r0, lr}
- bx lr
-END(MEMCPY_BASE)
+/***************************************************************************
+ Copyright (c) 2009-2013 The Linux Foundation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of The Linux Foundation nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ ***************************************************************************/
+
+/* Assumes neon instructions and a cache line size of 64 bytes. */
+
+#include <machine/cpu-features.h>
+#include <machine/asm.h>
+
+#define PLDOFFS (10)
+#define PLDTHRESH (PLDOFFS)
+#define BBTHRESH (4096/64)
+#define PLDSIZE (64)
+
+#if (PLDOFFS < 1)
+#error Routine does not support offsets less than 1
+#endif
+
+#if (PLDTHRESH < PLDOFFS)
+#error PLD threshold must be greater than or equal to the PLD offset
+#endif
+
+ .text
+ .fpu neon
+
+.L_memcpy_base:
+ cmp r2, #4
+ blt .L_neon_lt4
+ cmp r2, #16
+ blt .L_neon_lt16
+ cmp r2, #32
+ blt .L_neon_16
+ cmp r2, #64
+ blt .L_neon_copy_32_a
+
+ mov r12, r2, lsr #6
+ cmp r12, #PLDTHRESH
+ ble .L_neon_copy_64_loop_nopld
+
+ push {r9, r10}
+ .cfi_adjust_cfa_offset 8
+ .cfi_rel_offset r9, 0
+ .cfi_rel_offset r10, 4
+
+ cmp r12, #BBTHRESH
+ ble .L_neon_prime_pump
+
+ add lr, r0, #0x400
+ add r9, r1, #(PLDOFFS*PLDSIZE)
+ sub lr, lr, r9
+ lsl lr, lr, #21
+ lsr lr, lr, #21
+ add lr, lr, #(PLDOFFS*PLDSIZE)
+ cmp r12, lr, lsr #6
+ ble .L_neon_prime_pump
+
+ itt gt
+ movgt r9, #(PLDOFFS)
+ rsbsgt r9, r9, lr, lsr #6
+ ble .L_neon_prime_pump
+
+ add r10, r1, lr
+ bic r10, #0x3F
+
+ sub r12, r12, lr, lsr #6
+
+ cmp r9, r12
+ itee le
+ suble r12, r12, r9
+ movgt r9, r12
+ movgt r12, #0
+
+ pld [r1, #((PLDOFFS-1)*PLDSIZE)]
+.L_neon_copy_64_loop_outer_doublepld:
+ pld [r1, #((PLDOFFS)*PLDSIZE)]
+ vld1.32 {q0, q1}, [r1]!
+ vld1.32 {q2, q3}, [r1]!
+ ldr r3, [r10]
+ subs r9, r9, #1
+ vst1.32 {q0, q1}, [r0]!
+ vst1.32 {q2, q3}, [r0]!
+ add r10, #64
+ bne .L_neon_copy_64_loop_outer_doublepld
+ cmp r12, #0
+ beq .L_neon_pop_before_nopld
+
+ cmp r12, #(512*1024/64)
+ blt .L_neon_copy_64_loop_outer
+
+.L_neon_copy_64_loop_ddr:
+ vld1.32 {q0, q1}, [r1]!
+ vld1.32 {q2, q3}, [r1]!
+ pld [r10]
+ subs r12, r12, #1
+ vst1.32 {q0, q1}, [r0]!
+ vst1.32 {q2, q3}, [r0]!
+ add r10, #64
+ bne .L_neon_copy_64_loop_ddr
+ b .L_neon_pop_before_nopld
+
+.L_neon_prime_pump:
+ mov lr, #(PLDOFFS*PLDSIZE)
+ add r10, r1, #(PLDOFFS*PLDSIZE)
+ bic r10, #0x3F
+ sub r12, r12, #PLDOFFS
+ ldr r3, [r10, #(-1*PLDSIZE)]
+
+.L_neon_copy_64_loop_outer:
+ vld1.32 {q0, q1}, [r1]!
+ vld1.32 {q2, q3}, [r1]!
+ ldr r3, [r10]
+ subs r12, r12, #1
+ vst1.32 {q0, q1}, [r0]!
+ vst1.32 {q2, q3}, [r0]!
+ add r10, #64
+ bne .L_neon_copy_64_loop_outer
+
+.L_neon_pop_before_nopld:
+ mov r12, lr, lsr #6
+ pop {r9, r10}
+ .cfi_adjust_cfa_offset -8
+ .cfi_restore r9
+ .cfi_restore r10
+
+.L_neon_copy_64_loop_nopld:
+ vld1.32 {q8, q9}, [r1]!
+ vld1.32 {q10, q11}, [r1]!
+ subs r12, r12, #1
+ vst1.32 {q8, q9}, [r0]!
+ vst1.32 {q10, q11}, [r0]!
+ bne .L_neon_copy_64_loop_nopld
+ ands r2, r2, #0x3f
+ beq .L_neon_exit
+
+.L_neon_copy_32_a:
+ movs r3, r2, lsl #27
+ bcc .L_neon_16
+ vld1.32 {q0,q1}, [r1]!
+ vst1.32 {q0,q1}, [r0]!
+
+.L_neon_16:
+ bpl .L_neon_lt16
+ vld1.32 {q8}, [r1]!
+ vst1.32 {q8}, [r0]!
+ ands r2, r2, #0x0f
+ beq .L_neon_exit
+
+.L_neon_lt16:
+ movs r3, r2, lsl #29
+ bcc 1f
+ vld1.8 {d0}, [r1]!
+ vst1.8 {d0}, [r0]!
+1:
+ bge .L_neon_lt4
+ vld4.8 {d0[0], d1[0], d2[0], d3[0]}, [r1]!
+ vst4.8 {d0[0], d1[0], d2[0], d3[0]}, [r0]!
+
+.L_neon_lt4:
+ movs r2, r2, lsl #31
+ itt cs
+ ldrhcs r3, [r1], #2
+ strhcs r3, [r0], #2
+ itt mi
+ ldrbmi r3, [r1]
+ strbmi r3, [r0]
+
+.L_neon_exit:
+ pop {r0, pc}
diff --git a/libc/arch-arm/krait/bionic/memset.S b/libc/arch-arm/krait/bionic/memset.S
index a4fbe178f..ae05965f4 100644
--- a/libc/arch-arm/krait/bionic/memset.S
+++ b/libc/arch-arm/krait/bionic/memset.S
@@ -69,10 +69,7 @@ END(bzero)
/* memset() returns its first argument. */
ENTRY(memset)
- stmfd sp!, {r0}
- .cfi_def_cfa_offset 4
- .cfi_rel_offset r0, 0
-
+ mov r3, r0
vdup.8 q0, r1
/* make sure we have at least 32 bytes to write */
@@ -82,7 +79,7 @@ ENTRY(memset)
1: /* The main loop writes 32 bytes at a time */
subs r2, r2, #32
- vst1.8 {d0 - d3}, [r0]!
+ vst1.8 {d0 - d3}, [r3]!
bhs 1b
2: /* less than 32 left */
@@ -91,18 +88,17 @@ ENTRY(memset)
beq 3f
// writes 16 bytes, 128-bits aligned
- vst1.8 {d0, d1}, [r0]!
+ vst1.8 {d0, d1}, [r3]!
3: /* write up to 15-bytes (count in r2) */
movs ip, r2, lsl #29
bcc 1f
- vst1.8 {d0}, [r0]!
+ vst1.8 {d0}, [r3]!
1: bge 2f
- vst1.32 {d0[0]}, [r0]!
+ vst1.32 {d0[0]}, [r3]!
2: movs ip, r2, lsl #31
- strbmi r1, [r0], #1
- strbcs r1, [r0], #1
- strbcs r1, [r0], #1
- ldmfd sp!, {r0}
+ strbmi r1, [r3], #1
+ strbcs r1, [r3], #1
+ strbcs r1, [r3], #1
bx lr
END(memset)
diff --git a/libc/arch-arm/krait/krait.mk b/libc/arch-arm/krait/krait.mk
index 88b4d663c..f8e34529f 100644
--- a/libc/arch-arm/krait/krait.mk
+++ b/libc/arch-arm/krait/krait.mk
@@ -1,3 +1,18 @@
+libc_openbsd_src_files_exclude_arm += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+
+libc_bionic_src_files_exclude_arm += \
+ arch-arm/generic/bionic/memcpy.S \
+ arch-arm/generic/bionic/memset.S \
+ arch-arm/generic/bionic/strcmp.S \
+ arch-arm/generic/bionic/strcpy.S \
+ arch-arm/generic/bionic/strlen.c \
+ bionic/__strcat_chk.cpp \
+ bionic/__strcpy_chk.cpp \
+
libc_bionic_src_files_arm += \
arch-arm/krait/bionic/memcpy.S \
arch-arm/krait/bionic/memset.S \
@@ -13,7 +28,4 @@ libc_bionic_src_files_arm += \
arch-arm/cortex-a15/bionic/strlen.S \
libc_bionic_src_files_arm += \
- arch-arm/generic/bionic/memcmp.S \
-
-libc_bionic_src_files_arm += \
arch-arm/denver/bionic/memmove.S \
diff --git a/libc/arch-arm/syscalls/___clock_nanosleep.S b/libc/arch-arm/syscalls/___clock_nanosleep.S
index 31420bb19..ef8f06505 100644
--- a/libc/arch-arm/syscalls/___clock_nanosleep.S
+++ b/libc/arch-arm/syscalls/___clock_nanosleep.S
@@ -4,9 +4,11 @@
ENTRY(___clock_nanosleep)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_nanosleep
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___close.S b/libc/arch-arm/syscalls/___close.S
index db8a23036..05d33528d 100644
--- a/libc/arch-arm/syscalls/___close.S
+++ b/libc/arch-arm/syscalls/___close.S
@@ -4,9 +4,11 @@
ENTRY(___close)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_close
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___faccessat.S b/libc/arch-arm/syscalls/___faccessat.S
index 1d09cf7c5..8bb4cf830 100644
--- a/libc/arch-arm/syscalls/___faccessat.S
+++ b/libc/arch-arm/syscalls/___faccessat.S
@@ -4,9 +4,11 @@
ENTRY(___faccessat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_faccessat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___fchmod.S b/libc/arch-arm/syscalls/___fchmod.S
index c6da4f89e..b2312cb50 100644
--- a/libc/arch-arm/syscalls/___fchmod.S
+++ b/libc/arch-arm/syscalls/___fchmod.S
@@ -4,9 +4,11 @@
ENTRY(___fchmod)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchmod
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___fchmodat.S b/libc/arch-arm/syscalls/___fchmodat.S
index 91bbda5c0..4773610db 100644
--- a/libc/arch-arm/syscalls/___fchmodat.S
+++ b/libc/arch-arm/syscalls/___fchmodat.S
@@ -4,9 +4,11 @@
ENTRY(___fchmodat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchmodat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/___fgetxattr.S b/libc/arch-arm/syscalls/___fgetxattr.S
index e776cd6d3..25be039da 100644
--- a/libc/arch-arm/syscalls/___fgetxattr.S
+++ b/libc/arch-arm/syscalls/___fgetxattr.S
@@ -4,9 +4,11 @@
ENTRY(___fgetxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fgetxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/flistxattr.S b/libc/arch-arm/syscalls/___flistxattr.S
index ee09295f6..904e4ca7a 100644
--- a/libc/arch-arm/syscalls/flistxattr.S
+++ b/libc/arch-arm/syscalls/___flistxattr.S
@@ -2,13 +2,16 @@
#include <private/bionic_asm.h>
-ENTRY(flistxattr)
+ENTRY(___flistxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_flistxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
b __set_errno_internal
-END(flistxattr)
+END(___flistxattr)
+.hidden ___flistxattr
diff --git a/libc/arch-arm/syscalls/___mremap.S b/libc/arch-arm/syscalls/___mremap.S
new file mode 100644
index 000000000..ade8d7897
--- /dev/null
+++ b/libc/arch-arm/syscalls/___mremap.S
@@ -0,0 +1,23 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(___mremap)
+ mov ip, sp
+ stmfd sp!, {r4, r5, r6, r7}
+ .cfi_def_cfa_offset 16
+ .cfi_rel_offset r4, 0
+ .cfi_rel_offset r5, 4
+ .cfi_rel_offset r6, 8
+ .cfi_rel_offset r7, 12
+ ldmfd ip, {r4, r5, r6}
+ ldr r7, =__NR_mremap
+ swi #0
+ ldmfd sp!, {r4, r5, r6, r7}
+ .cfi_def_cfa_offset 0
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno_internal
+END(___mremap)
+.hidden ___mremap
diff --git a/libc/arch-arm/syscalls/___rt_sigqueueinfo.S b/libc/arch-arm/syscalls/___rt_sigqueueinfo.S
index 25b0d576c..1367e5602 100644
--- a/libc/arch-arm/syscalls/___rt_sigqueueinfo.S
+++ b/libc/arch-arm/syscalls/___rt_sigqueueinfo.S
@@ -4,9 +4,11 @@
ENTRY(___rt_sigqueueinfo)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigqueueinfo
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__accept4.S b/libc/arch-arm/syscalls/__accept4.S
index dca5699e0..42aa47cc2 100644
--- a/libc/arch-arm/syscalls/__accept4.S
+++ b/libc/arch-arm/syscalls/__accept4.S
@@ -4,9 +4,11 @@
ENTRY(__accept4)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_accept4
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__brk.S b/libc/arch-arm/syscalls/__brk.S
index be304da43..246924c9a 100644
--- a/libc/arch-arm/syscalls/__brk.S
+++ b/libc/arch-arm/syscalls/__brk.S
@@ -4,9 +4,11 @@
ENTRY(__brk)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_brk
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__connect.S b/libc/arch-arm/syscalls/__connect.S
index a2a997ebe..873b14dd1 100644
--- a/libc/arch-arm/syscalls/__connect.S
+++ b/libc/arch-arm/syscalls/__connect.S
@@ -4,9 +4,11 @@
ENTRY(__connect)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_connect
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__exit.S b/libc/arch-arm/syscalls/__exit.S
index 6ebd5b36b..4ed31b008 100644
--- a/libc/arch-arm/syscalls/__exit.S
+++ b/libc/arch-arm/syscalls/__exit.S
@@ -4,9 +4,11 @@
ENTRY(__exit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_exit
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__fcntl64.S b/libc/arch-arm/syscalls/__fcntl64.S
index 229c5c605..0afdbee6c 100644
--- a/libc/arch-arm/syscalls/__fcntl64.S
+++ b/libc/arch-arm/syscalls/__fcntl64.S
@@ -4,9 +4,11 @@
ENTRY(__fcntl64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fcntl64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__fstatfs64.S b/libc/arch-arm/syscalls/__fstatfs64.S
index 9c0c439ec..9117313ee 100644
--- a/libc/arch-arm/syscalls/__fstatfs64.S
+++ b/libc/arch-arm/syscalls/__fstatfs64.S
@@ -4,9 +4,11 @@
ENTRY(__fstatfs64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fstatfs64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getcpu.S b/libc/arch-arm/syscalls/__getcpu.S
index d523d8e68..430acb307 100644
--- a/libc/arch-arm/syscalls/__getcpu.S
+++ b/libc/arch-arm/syscalls/__getcpu.S
@@ -4,9 +4,11 @@
ENTRY(__getcpu)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getcpu
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getcwd.S b/libc/arch-arm/syscalls/__getcwd.S
index 4ff666732..53000b82a 100644
--- a/libc/arch-arm/syscalls/__getcwd.S
+++ b/libc/arch-arm/syscalls/__getcwd.S
@@ -4,9 +4,11 @@
ENTRY(__getcwd)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getcwd
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getdents64.S b/libc/arch-arm/syscalls/__getdents64.S
index dac3bfc82..0ea61b8b4 100644
--- a/libc/arch-arm/syscalls/__getdents64.S
+++ b/libc/arch-arm/syscalls/__getdents64.S
@@ -4,9 +4,11 @@
ENTRY(__getdents64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getdents64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getpid.S b/libc/arch-arm/syscalls/__getpid.S
index dbb192e74..b55538532 100644
--- a/libc/arch-arm/syscalls/__getpid.S
+++ b/libc/arch-arm/syscalls/__getpid.S
@@ -4,9 +4,11 @@
ENTRY(__getpid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__getpriority.S b/libc/arch-arm/syscalls/__getpriority.S
index e637d6fd4..34f4beae2 100644
--- a/libc/arch-arm/syscalls/__getpriority.S
+++ b/libc/arch-arm/syscalls/__getpriority.S
@@ -4,9 +4,11 @@
ENTRY(__getpriority)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpriority
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__ioctl.S b/libc/arch-arm/syscalls/__ioctl.S
index fcd1157d4..5871e58c1 100644
--- a/libc/arch-arm/syscalls/__ioctl.S
+++ b/libc/arch-arm/syscalls/__ioctl.S
@@ -4,9 +4,11 @@
ENTRY(__ioctl)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ioctl
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__openat.S b/libc/arch-arm/syscalls/__openat.S
index 9b774dbb9..403d9b5c3 100644
--- a/libc/arch-arm/syscalls/__openat.S
+++ b/libc/arch-arm/syscalls/__openat.S
@@ -4,9 +4,11 @@
ENTRY(__openat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_openat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__preadv64.S b/libc/arch-arm/syscalls/__preadv64.S
new file mode 100644
index 000000000..19eaaa54e
--- /dev/null
+++ b/libc/arch-arm/syscalls/__preadv64.S
@@ -0,0 +1,22 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(__preadv64)
+ mov ip, sp
+ stmfd sp!, {r4, r5, r6, r7}
+ .cfi_def_cfa_offset 16
+ .cfi_rel_offset r4, 0
+ .cfi_rel_offset r5, 4
+ .cfi_rel_offset r6, 8
+ .cfi_rel_offset r7, 12
+ ldmfd ip, {r4, r5, r6}
+ ldr r7, =__NR_preadv
+ swi #0
+ ldmfd sp!, {r4, r5, r6, r7}
+ .cfi_def_cfa_offset 0
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno_internal
+END(__preadv64)
diff --git a/libc/arch-arm/syscalls/__ptrace.S b/libc/arch-arm/syscalls/__ptrace.S
index 975ab0fd8..8ad554d98 100644
--- a/libc/arch-arm/syscalls/__ptrace.S
+++ b/libc/arch-arm/syscalls/__ptrace.S
@@ -4,9 +4,11 @@
ENTRY(__ptrace)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ptrace
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__pwritev64.S b/libc/arch-arm/syscalls/__pwritev64.S
new file mode 100644
index 000000000..afcbe403e
--- /dev/null
+++ b/libc/arch-arm/syscalls/__pwritev64.S
@@ -0,0 +1,22 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(__pwritev64)
+ mov ip, sp
+ stmfd sp!, {r4, r5, r6, r7}
+ .cfi_def_cfa_offset 16
+ .cfi_rel_offset r4, 0
+ .cfi_rel_offset r5, 4
+ .cfi_rel_offset r6, 8
+ .cfi_rel_offset r7, 12
+ ldmfd ip, {r4, r5, r6}
+ ldr r7, =__NR_pwritev
+ swi #0
+ ldmfd sp!, {r4, r5, r6, r7}
+ .cfi_def_cfa_offset 0
+ cmn r0, #(MAX_ERRNO + 1)
+ bxls lr
+ neg r0, r0
+ b __set_errno_internal
+END(__pwritev64)
diff --git a/libc/arch-arm/syscalls/__reboot.S b/libc/arch-arm/syscalls/__reboot.S
index 03f8c89c4..15ca81477 100644
--- a/libc/arch-arm/syscalls/__reboot.S
+++ b/libc/arch-arm/syscalls/__reboot.S
@@ -4,9 +4,11 @@
ENTRY(__reboot)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_reboot
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigaction.S b/libc/arch-arm/syscalls/__rt_sigaction.S
index 2c210123d..21d99773c 100644
--- a/libc/arch-arm/syscalls/__rt_sigaction.S
+++ b/libc/arch-arm/syscalls/__rt_sigaction.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigaction)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigaction
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigpending.S b/libc/arch-arm/syscalls/__rt_sigpending.S
index 6a32e5025..b726b854c 100644
--- a/libc/arch-arm/syscalls/__rt_sigpending.S
+++ b/libc/arch-arm/syscalls/__rt_sigpending.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigpending)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigpending
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigprocmask.S b/libc/arch-arm/syscalls/__rt_sigprocmask.S
index 136dc7956..11b326f2e 100644
--- a/libc/arch-arm/syscalls/__rt_sigprocmask.S
+++ b/libc/arch-arm/syscalls/__rt_sigprocmask.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigprocmask)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigprocmask
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigsuspend.S b/libc/arch-arm/syscalls/__rt_sigsuspend.S
index 2cef4a4f8..5d06418e3 100644
--- a/libc/arch-arm/syscalls/__rt_sigsuspend.S
+++ b/libc/arch-arm/syscalls/__rt_sigsuspend.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigsuspend)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigsuspend
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__rt_sigtimedwait.S b/libc/arch-arm/syscalls/__rt_sigtimedwait.S
index cb43ad1c8..dc7c3e727 100644
--- a/libc/arch-arm/syscalls/__rt_sigtimedwait.S
+++ b/libc/arch-arm/syscalls/__rt_sigtimedwait.S
@@ -4,9 +4,11 @@
ENTRY(__rt_sigtimedwait)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_rt_sigtimedwait
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__sched_getaffinity.S b/libc/arch-arm/syscalls/__sched_getaffinity.S
index 6613ea573..21f833046 100644
--- a/libc/arch-arm/syscalls/__sched_getaffinity.S
+++ b/libc/arch-arm/syscalls/__sched_getaffinity.S
@@ -4,9 +4,11 @@
ENTRY(__sched_getaffinity)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_getaffinity
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__set_tid_address.S b/libc/arch-arm/syscalls/__set_tid_address.S
index d3558f5ab..79dfd7f2e 100644
--- a/libc/arch-arm/syscalls/__set_tid_address.S
+++ b/libc/arch-arm/syscalls/__set_tid_address.S
@@ -4,9 +4,11 @@
ENTRY(__set_tid_address)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_set_tid_address
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__set_tls.S b/libc/arch-arm/syscalls/__set_tls.S
index 4d5d96330..a9a4b9ad5 100644
--- a/libc/arch-arm/syscalls/__set_tls.S
+++ b/libc/arch-arm/syscalls/__set_tls.S
@@ -4,9 +4,11 @@
ENTRY(__set_tls)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__ARM_NR_set_tls
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__sigaction.S b/libc/arch-arm/syscalls/__sigaction.S
index 600593d25..8f3f14388 100644
--- a/libc/arch-arm/syscalls/__sigaction.S
+++ b/libc/arch-arm/syscalls/__sigaction.S
@@ -4,9 +4,11 @@
ENTRY(__sigaction)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sigaction
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__signalfd4.S b/libc/arch-arm/syscalls/__signalfd4.S
index 630a71f24..51a27c887 100644
--- a/libc/arch-arm/syscalls/__signalfd4.S
+++ b/libc/arch-arm/syscalls/__signalfd4.S
@@ -4,9 +4,11 @@
ENTRY(__signalfd4)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_signalfd4
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__socket.S b/libc/arch-arm/syscalls/__socket.S
index fffe0cc49..c50cd6feb 100644
--- a/libc/arch-arm/syscalls/__socket.S
+++ b/libc/arch-arm/syscalls/__socket.S
@@ -4,9 +4,11 @@
ENTRY(__socket)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_socket
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__statfs64.S b/libc/arch-arm/syscalls/__statfs64.S
index ec4321864..320b0ee93 100644
--- a/libc/arch-arm/syscalls/__statfs64.S
+++ b/libc/arch-arm/syscalls/__statfs64.S
@@ -4,9 +4,11 @@
ENTRY(__statfs64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_statfs64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_create.S b/libc/arch-arm/syscalls/__timer_create.S
index 2e4c63420..fd7567b0a 100644
--- a/libc/arch-arm/syscalls/__timer_create.S
+++ b/libc/arch-arm/syscalls/__timer_create.S
@@ -4,9 +4,11 @@
ENTRY(__timer_create)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_create
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_delete.S b/libc/arch-arm/syscalls/__timer_delete.S
index 237024c7b..6761abbe6 100644
--- a/libc/arch-arm/syscalls/__timer_delete.S
+++ b/libc/arch-arm/syscalls/__timer_delete.S
@@ -4,9 +4,11 @@
ENTRY(__timer_delete)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_delete
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_getoverrun.S b/libc/arch-arm/syscalls/__timer_getoverrun.S
index f29d5b361..a925d835d 100644
--- a/libc/arch-arm/syscalls/__timer_getoverrun.S
+++ b/libc/arch-arm/syscalls/__timer_getoverrun.S
@@ -4,9 +4,11 @@
ENTRY(__timer_getoverrun)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_getoverrun
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_gettime.S b/libc/arch-arm/syscalls/__timer_gettime.S
index e6dc2edf1..c0da770fe 100644
--- a/libc/arch-arm/syscalls/__timer_gettime.S
+++ b/libc/arch-arm/syscalls/__timer_gettime.S
@@ -4,9 +4,11 @@
ENTRY(__timer_gettime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_gettime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/__timer_settime.S b/libc/arch-arm/syscalls/__timer_settime.S
index 4aea279a6..de4e7e674 100644
--- a/libc/arch-arm/syscalls/__timer_settime.S
+++ b/libc/arch-arm/syscalls/__timer_settime.S
@@ -4,9 +4,11 @@
ENTRY(__timer_settime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timer_settime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/_exit.S b/libc/arch-arm/syscalls/_exit.S
index 77da74356..1c3d17475 100644
--- a/libc/arch-arm/syscalls/_exit.S
+++ b/libc/arch-arm/syscalls/_exit.S
@@ -4,9 +4,11 @@
ENTRY(_exit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_exit_group
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/acct.S b/libc/arch-arm/syscalls/acct.S
index dbc5d5800..cdf1099cd 100644
--- a/libc/arch-arm/syscalls/acct.S
+++ b/libc/arch-arm/syscalls/acct.S
@@ -4,9 +4,11 @@
ENTRY(acct)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_acct
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mremap.S b/libc/arch-arm/syscalls/adjtimex.S
index 505ea3c5d..6ebae7e64 100644
--- a/libc/arch-arm/syscalls/mremap.S
+++ b/libc/arch-arm/syscalls/adjtimex.S
@@ -2,13 +2,15 @@
#include <private/bionic_asm.h>
-ENTRY(mremap)
+ENTRY(adjtimex)
mov ip, r7
- ldr r7, =__NR_mremap
+ .cfi_register r7, ip
+ ldr r7, =__NR_adjtimex
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
b __set_errno_internal
-END(mremap)
+END(adjtimex)
diff --git a/libc/arch-arm/syscalls/bind.S b/libc/arch-arm/syscalls/bind.S
index c901417da..af518d83d 100644
--- a/libc/arch-arm/syscalls/bind.S
+++ b/libc/arch-arm/syscalls/bind.S
@@ -4,9 +4,11 @@
ENTRY(bind)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_bind
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/cacheflush.S b/libc/arch-arm/syscalls/cacheflush.S
index 76f4623b1..752749a13 100644
--- a/libc/arch-arm/syscalls/cacheflush.S
+++ b/libc/arch-arm/syscalls/cacheflush.S
@@ -4,9 +4,11 @@
ENTRY(cacheflush)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__ARM_NR_cacheflush
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/capget.S b/libc/arch-arm/syscalls/capget.S
index 59a5a3c70..9be110b64 100644
--- a/libc/arch-arm/syscalls/capget.S
+++ b/libc/arch-arm/syscalls/capget.S
@@ -4,9 +4,11 @@
ENTRY(capget)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_capget
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/capset.S b/libc/arch-arm/syscalls/capset.S
index af284ab70..0bd50093e 100644
--- a/libc/arch-arm/syscalls/capset.S
+++ b/libc/arch-arm/syscalls/capset.S
@@ -4,9 +4,11 @@
ENTRY(capset)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_capset
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/chdir.S b/libc/arch-arm/syscalls/chdir.S
index 25f27ba19..c75f5e2d6 100644
--- a/libc/arch-arm/syscalls/chdir.S
+++ b/libc/arch-arm/syscalls/chdir.S
@@ -4,9 +4,11 @@
ENTRY(chdir)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_chdir
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/chroot.S b/libc/arch-arm/syscalls/chroot.S
index 6f829a6ac..d197d4246 100644
--- a/libc/arch-arm/syscalls/chroot.S
+++ b/libc/arch-arm/syscalls/chroot.S
@@ -4,9 +4,11 @@
ENTRY(chroot)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_chroot
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/vfork.S b/libc/arch-arm/syscalls/clock_adjtime.S
index 5f4cb3dbd..e59a24064 100644
--- a/libc/arch-arm/syscalls/vfork.S
+++ b/libc/arch-arm/syscalls/clock_adjtime.S
@@ -2,13 +2,15 @@
#include <private/bionic_asm.h>
-ENTRY(vfork)
+ENTRY(clock_adjtime)
mov ip, r7
- ldr r7, =__NR_vfork
+ .cfi_register r7, ip
+ ldr r7, =__NR_clock_adjtime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
b __set_errno_internal
-END(vfork)
+END(clock_adjtime)
diff --git a/libc/arch-arm/syscalls/clock_getres.S b/libc/arch-arm/syscalls/clock_getres.S
index 48fa07cc4..e10112779 100644
--- a/libc/arch-arm/syscalls/clock_getres.S
+++ b/libc/arch-arm/syscalls/clock_getres.S
@@ -4,9 +4,11 @@
ENTRY(clock_getres)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_getres
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/clock_gettime.S b/libc/arch-arm/syscalls/clock_gettime.S
index 317481d46..61a95dd2c 100644
--- a/libc/arch-arm/syscalls/clock_gettime.S
+++ b/libc/arch-arm/syscalls/clock_gettime.S
@@ -4,9 +4,11 @@
ENTRY(clock_gettime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_gettime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/clock_settime.S b/libc/arch-arm/syscalls/clock_settime.S
index bf54702ee..f00a07240 100644
--- a/libc/arch-arm/syscalls/clock_settime.S
+++ b/libc/arch-arm/syscalls/clock_settime.S
@@ -4,9 +4,11 @@
ENTRY(clock_settime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_clock_settime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/delete_module.S b/libc/arch-arm/syscalls/delete_module.S
index 57580c950..80dd0f5fb 100644
--- a/libc/arch-arm/syscalls/delete_module.S
+++ b/libc/arch-arm/syscalls/delete_module.S
@@ -4,9 +4,11 @@
ENTRY(delete_module)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_delete_module
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/dup.S b/libc/arch-arm/syscalls/dup.S
index 2cd69d769..0d06bdc17 100644
--- a/libc/arch-arm/syscalls/dup.S
+++ b/libc/arch-arm/syscalls/dup.S
@@ -4,9 +4,11 @@
ENTRY(dup)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_dup
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/dup3.S b/libc/arch-arm/syscalls/dup3.S
index 4613d634d..7dea858a5 100644
--- a/libc/arch-arm/syscalls/dup3.S
+++ b/libc/arch-arm/syscalls/dup3.S
@@ -4,9 +4,11 @@
ENTRY(dup3)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_dup3
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/epoll_create1.S b/libc/arch-arm/syscalls/epoll_create1.S
index 108c24fe3..8b413d95f 100644
--- a/libc/arch-arm/syscalls/epoll_create1.S
+++ b/libc/arch-arm/syscalls/epoll_create1.S
@@ -4,9 +4,11 @@
ENTRY(epoll_create1)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_epoll_create1
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/epoll_ctl.S b/libc/arch-arm/syscalls/epoll_ctl.S
index 473af6a54..807dd69ba 100644
--- a/libc/arch-arm/syscalls/epoll_ctl.S
+++ b/libc/arch-arm/syscalls/epoll_ctl.S
@@ -4,9 +4,11 @@
ENTRY(epoll_ctl)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_epoll_ctl
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/eventfd.S b/libc/arch-arm/syscalls/eventfd.S
index ca6bceee7..51f4a499a 100644
--- a/libc/arch-arm/syscalls/eventfd.S
+++ b/libc/arch-arm/syscalls/eventfd.S
@@ -4,9 +4,11 @@
ENTRY(eventfd)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_eventfd2
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/execve.S b/libc/arch-arm/syscalls/execve.S
index 3eca81049..1b72f0e9f 100644
--- a/libc/arch-arm/syscalls/execve.S
+++ b/libc/arch-arm/syscalls/execve.S
@@ -4,9 +4,11 @@
ENTRY(execve)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_execve
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fchdir.S b/libc/arch-arm/syscalls/fchdir.S
index 705ad32cb..dca18c416 100644
--- a/libc/arch-arm/syscalls/fchdir.S
+++ b/libc/arch-arm/syscalls/fchdir.S
@@ -4,9 +4,11 @@
ENTRY(fchdir)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchdir
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fchown.S b/libc/arch-arm/syscalls/fchown.S
index 45ad9bfe3..51ee60cb1 100644
--- a/libc/arch-arm/syscalls/fchown.S
+++ b/libc/arch-arm/syscalls/fchown.S
@@ -4,9 +4,11 @@
ENTRY(fchown)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fchown32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fdatasync.S b/libc/arch-arm/syscalls/fdatasync.S
index 7fefd22fa..f97adc613 100644
--- a/libc/arch-arm/syscalls/fdatasync.S
+++ b/libc/arch-arm/syscalls/fdatasync.S
@@ -4,9 +4,11 @@
ENTRY(fdatasync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fdatasync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/flock.S b/libc/arch-arm/syscalls/flock.S
index c946fe994..e2874f6c0 100644
--- a/libc/arch-arm/syscalls/flock.S
+++ b/libc/arch-arm/syscalls/flock.S
@@ -4,9 +4,11 @@
ENTRY(flock)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_flock
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fremovexattr.S b/libc/arch-arm/syscalls/fremovexattr.S
index f4e950b9c..89be70499 100644
--- a/libc/arch-arm/syscalls/fremovexattr.S
+++ b/libc/arch-arm/syscalls/fremovexattr.S
@@ -4,9 +4,11 @@
ENTRY(fremovexattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fremovexattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fstat64.S b/libc/arch-arm/syscalls/fstat64.S
index 798bba7f6..c2c710135 100644
--- a/libc/arch-arm/syscalls/fstat64.S
+++ b/libc/arch-arm/syscalls/fstat64.S
@@ -4,9 +4,11 @@
ENTRY(fstat64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fstat64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fstatat64.S b/libc/arch-arm/syscalls/fstatat64.S
index 03e005299..545dc166b 100644
--- a/libc/arch-arm/syscalls/fstatat64.S
+++ b/libc/arch-arm/syscalls/fstatat64.S
@@ -4,9 +4,11 @@
ENTRY(fstatat64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fstatat64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/fsync.S b/libc/arch-arm/syscalls/fsync.S
index 1dfff05f4..24b9a878d 100644
--- a/libc/arch-arm/syscalls/fsync.S
+++ b/libc/arch-arm/syscalls/fsync.S
@@ -4,9 +4,11 @@
ENTRY(fsync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_fsync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/ftruncate64.S b/libc/arch-arm/syscalls/ftruncate64.S
index ac0caa88f..ee1a2a6f1 100644
--- a/libc/arch-arm/syscalls/ftruncate64.S
+++ b/libc/arch-arm/syscalls/ftruncate64.S
@@ -4,9 +4,11 @@
ENTRY(ftruncate64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ftruncate64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getegid.S b/libc/arch-arm/syscalls/getegid.S
index afa9cc8f1..f4e17b5a9 100644
--- a/libc/arch-arm/syscalls/getegid.S
+++ b/libc/arch-arm/syscalls/getegid.S
@@ -4,9 +4,11 @@
ENTRY(getegid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getegid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/geteuid.S b/libc/arch-arm/syscalls/geteuid.S
index 10c8a25f4..01898f80c 100644
--- a/libc/arch-arm/syscalls/geteuid.S
+++ b/libc/arch-arm/syscalls/geteuid.S
@@ -4,9 +4,11 @@
ENTRY(geteuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_geteuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getgid.S b/libc/arch-arm/syscalls/getgid.S
index 877276227..ee124a6b3 100644
--- a/libc/arch-arm/syscalls/getgid.S
+++ b/libc/arch-arm/syscalls/getgid.S
@@ -4,9 +4,11 @@
ENTRY(getgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getgroups.S b/libc/arch-arm/syscalls/getgroups.S
index 366299b60..4c1bfdb07 100644
--- a/libc/arch-arm/syscalls/getgroups.S
+++ b/libc/arch-arm/syscalls/getgroups.S
@@ -4,9 +4,11 @@
ENTRY(getgroups)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getgroups32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getitimer.S b/libc/arch-arm/syscalls/getitimer.S
index 80fb0f21d..b9773ad14 100644
--- a/libc/arch-arm/syscalls/getitimer.S
+++ b/libc/arch-arm/syscalls/getitimer.S
@@ -4,9 +4,11 @@
ENTRY(getitimer)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getitimer
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getpeername.S b/libc/arch-arm/syscalls/getpeername.S
index 25f00268c..6bf600263 100644
--- a/libc/arch-arm/syscalls/getpeername.S
+++ b/libc/arch-arm/syscalls/getpeername.S
@@ -4,9 +4,11 @@
ENTRY(getpeername)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpeername
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getpgid.S b/libc/arch-arm/syscalls/getpgid.S
index 36c4c19c5..d5c9c8aed 100644
--- a/libc/arch-arm/syscalls/getpgid.S
+++ b/libc/arch-arm/syscalls/getpgid.S
@@ -4,9 +4,11 @@
ENTRY(getpgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getpgid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getppid.S b/libc/arch-arm/syscalls/getppid.S
index 606b2e01a..91db24e9f 100644
--- a/libc/arch-arm/syscalls/getppid.S
+++ b/libc/arch-arm/syscalls/getppid.S
@@ -4,9 +4,11 @@
ENTRY(getppid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getppid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getresgid.S b/libc/arch-arm/syscalls/getresgid.S
index a5e4689f5..8fb7f28d2 100644
--- a/libc/arch-arm/syscalls/getresgid.S
+++ b/libc/arch-arm/syscalls/getresgid.S
@@ -4,9 +4,11 @@
ENTRY(getresgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getresgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getresuid.S b/libc/arch-arm/syscalls/getresuid.S
index 74c26a764..ebec6e18e 100644
--- a/libc/arch-arm/syscalls/getresuid.S
+++ b/libc/arch-arm/syscalls/getresuid.S
@@ -4,9 +4,11 @@
ENTRY(getresuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getresuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getrlimit.S b/libc/arch-arm/syscalls/getrlimit.S
index 166da6398..0c9e6625b 100644
--- a/libc/arch-arm/syscalls/getrlimit.S
+++ b/libc/arch-arm/syscalls/getrlimit.S
@@ -4,9 +4,11 @@
ENTRY(getrlimit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_ugetrlimit
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getrusage.S b/libc/arch-arm/syscalls/getrusage.S
index 93979c668..e74a4ad32 100644
--- a/libc/arch-arm/syscalls/getrusage.S
+++ b/libc/arch-arm/syscalls/getrusage.S
@@ -4,9 +4,11 @@
ENTRY(getrusage)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getrusage
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getsid.S b/libc/arch-arm/syscalls/getsid.S
index 87d38fbba..c918820ce 100644
--- a/libc/arch-arm/syscalls/getsid.S
+++ b/libc/arch-arm/syscalls/getsid.S
@@ -4,9 +4,11 @@
ENTRY(getsid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getsid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getsockname.S b/libc/arch-arm/syscalls/getsockname.S
index 5dc4eab96..a30a291c7 100644
--- a/libc/arch-arm/syscalls/getsockname.S
+++ b/libc/arch-arm/syscalls/getsockname.S
@@ -4,9 +4,11 @@
ENTRY(getsockname)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getsockname
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/gettimeofday.S b/libc/arch-arm/syscalls/gettimeofday.S
index 174f94b04..f5ed67424 100644
--- a/libc/arch-arm/syscalls/gettimeofday.S
+++ b/libc/arch-arm/syscalls/gettimeofday.S
@@ -4,9 +4,11 @@
ENTRY(gettimeofday)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_gettimeofday
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getuid.S b/libc/arch-arm/syscalls/getuid.S
index 3d07d3cb3..cdc86bc10 100644
--- a/libc/arch-arm/syscalls/getuid.S
+++ b/libc/arch-arm/syscalls/getuid.S
@@ -4,9 +4,11 @@
ENTRY(getuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/getxattr.S b/libc/arch-arm/syscalls/getxattr.S
index 6661aaf84..116d917c2 100644
--- a/libc/arch-arm/syscalls/getxattr.S
+++ b/libc/arch-arm/syscalls/getxattr.S
@@ -4,9 +4,11 @@
ENTRY(getxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_getxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/init_module.S b/libc/arch-arm/syscalls/init_module.S
index 82515336e..8fecf68b1 100644
--- a/libc/arch-arm/syscalls/init_module.S
+++ b/libc/arch-arm/syscalls/init_module.S
@@ -4,9 +4,11 @@
ENTRY(init_module)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_init_module
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/inotify_add_watch.S b/libc/arch-arm/syscalls/inotify_add_watch.S
index b945bd17f..61e666cbf 100644
--- a/libc/arch-arm/syscalls/inotify_add_watch.S
+++ b/libc/arch-arm/syscalls/inotify_add_watch.S
@@ -4,9 +4,11 @@
ENTRY(inotify_add_watch)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_inotify_add_watch
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/inotify_init1.S b/libc/arch-arm/syscalls/inotify_init1.S
index 32090de97..6cf066ef6 100644
--- a/libc/arch-arm/syscalls/inotify_init1.S
+++ b/libc/arch-arm/syscalls/inotify_init1.S
@@ -4,9 +4,11 @@
ENTRY(inotify_init1)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_inotify_init1
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/inotify_rm_watch.S b/libc/arch-arm/syscalls/inotify_rm_watch.S
index e8230e2f3..1455da14c 100644
--- a/libc/arch-arm/syscalls/inotify_rm_watch.S
+++ b/libc/arch-arm/syscalls/inotify_rm_watch.S
@@ -4,9 +4,11 @@
ENTRY(inotify_rm_watch)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_inotify_rm_watch
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/kill.S b/libc/arch-arm/syscalls/kill.S
index 0b5f4a4f8..82df86128 100644
--- a/libc/arch-arm/syscalls/kill.S
+++ b/libc/arch-arm/syscalls/kill.S
@@ -4,9 +4,11 @@
ENTRY(kill)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_kill
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/klogctl.S b/libc/arch-arm/syscalls/klogctl.S
index b76b2b58d..47a03c653 100644
--- a/libc/arch-arm/syscalls/klogctl.S
+++ b/libc/arch-arm/syscalls/klogctl.S
@@ -4,9 +4,11 @@
ENTRY(klogctl)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_syslog
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/lgetxattr.S b/libc/arch-arm/syscalls/lgetxattr.S
index b033a9afc..157271c8e 100644
--- a/libc/arch-arm/syscalls/lgetxattr.S
+++ b/libc/arch-arm/syscalls/lgetxattr.S
@@ -4,9 +4,11 @@
ENTRY(lgetxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_lgetxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/listen.S b/libc/arch-arm/syscalls/listen.S
index 3aaa80154..5ad75c0a3 100644
--- a/libc/arch-arm/syscalls/listen.S
+++ b/libc/arch-arm/syscalls/listen.S
@@ -4,9 +4,11 @@
ENTRY(listen)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_listen
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/listxattr.S b/libc/arch-arm/syscalls/listxattr.S
index 51ff267b9..093927dde 100644
--- a/libc/arch-arm/syscalls/listxattr.S
+++ b/libc/arch-arm/syscalls/listxattr.S
@@ -4,9 +4,11 @@
ENTRY(listxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_listxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/llistxattr.S b/libc/arch-arm/syscalls/llistxattr.S
index 46e8116fc..5d0e7c806 100644
--- a/libc/arch-arm/syscalls/llistxattr.S
+++ b/libc/arch-arm/syscalls/llistxattr.S
@@ -4,9 +4,11 @@
ENTRY(llistxattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_llistxattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/lremovexattr.S b/libc/arch-arm/syscalls/lremovexattr.S
index a945062f2..4e0bcec75 100644
--- a/libc/arch-arm/syscalls/lremovexattr.S
+++ b/libc/arch-arm/syscalls/lremovexattr.S
@@ -4,9 +4,11 @@
ENTRY(lremovexattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_lremovexattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/lseek.S b/libc/arch-arm/syscalls/lseek.S
index 00aeab3aa..cbdc441e3 100644
--- a/libc/arch-arm/syscalls/lseek.S
+++ b/libc/arch-arm/syscalls/lseek.S
@@ -4,9 +4,11 @@
ENTRY(lseek)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_lseek
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/madvise.S b/libc/arch-arm/syscalls/madvise.S
index 4d3cdcde9..c2d7d2051 100644
--- a/libc/arch-arm/syscalls/madvise.S
+++ b/libc/arch-arm/syscalls/madvise.S
@@ -4,9 +4,11 @@
ENTRY(madvise)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_madvise
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mincore.S b/libc/arch-arm/syscalls/mincore.S
index f1154d0a1..c93fe948e 100644
--- a/libc/arch-arm/syscalls/mincore.S
+++ b/libc/arch-arm/syscalls/mincore.S
@@ -4,9 +4,11 @@
ENTRY(mincore)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mincore
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mkdirat.S b/libc/arch-arm/syscalls/mkdirat.S
index 1f8957beb..4f93c61ae 100644
--- a/libc/arch-arm/syscalls/mkdirat.S
+++ b/libc/arch-arm/syscalls/mkdirat.S
@@ -4,9 +4,11 @@
ENTRY(mkdirat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mkdirat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mknodat.S b/libc/arch-arm/syscalls/mknodat.S
index 1a2bf6ff3..91baae89f 100644
--- a/libc/arch-arm/syscalls/mknodat.S
+++ b/libc/arch-arm/syscalls/mknodat.S
@@ -4,9 +4,11 @@
ENTRY(mknodat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mknodat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mlock.S b/libc/arch-arm/syscalls/mlock.S
index 8a4fc7aa3..eb72f6f10 100644
--- a/libc/arch-arm/syscalls/mlock.S
+++ b/libc/arch-arm/syscalls/mlock.S
@@ -4,9 +4,11 @@
ENTRY(mlock)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mlock
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mlockall.S b/libc/arch-arm/syscalls/mlockall.S
index b49ca0540..2984087da 100644
--- a/libc/arch-arm/syscalls/mlockall.S
+++ b/libc/arch-arm/syscalls/mlockall.S
@@ -4,9 +4,11 @@
ENTRY(mlockall)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mlockall
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/mprotect.S b/libc/arch-arm/syscalls/mprotect.S
index cb5130666..9bb128259 100644
--- a/libc/arch-arm/syscalls/mprotect.S
+++ b/libc/arch-arm/syscalls/mprotect.S
@@ -4,9 +4,11 @@
ENTRY(mprotect)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_mprotect
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/msync.S b/libc/arch-arm/syscalls/msync.S
index 220fb4d56..bcbab042d 100644
--- a/libc/arch-arm/syscalls/msync.S
+++ b/libc/arch-arm/syscalls/msync.S
@@ -4,9 +4,11 @@
ENTRY(msync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_msync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/munlock.S b/libc/arch-arm/syscalls/munlock.S
index 05bf94128..bf1b814f8 100644
--- a/libc/arch-arm/syscalls/munlock.S
+++ b/libc/arch-arm/syscalls/munlock.S
@@ -4,9 +4,11 @@
ENTRY(munlock)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_munlock
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/munlockall.S b/libc/arch-arm/syscalls/munlockall.S
index e2c5dd5fd..b45a5a210 100644
--- a/libc/arch-arm/syscalls/munlockall.S
+++ b/libc/arch-arm/syscalls/munlockall.S
@@ -4,9 +4,11 @@
ENTRY(munlockall)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_munlockall
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/munmap.S b/libc/arch-arm/syscalls/munmap.S
index 740c3608e..2b7a1215b 100644
--- a/libc/arch-arm/syscalls/munmap.S
+++ b/libc/arch-arm/syscalls/munmap.S
@@ -4,9 +4,11 @@
ENTRY(munmap)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_munmap
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/nanosleep.S b/libc/arch-arm/syscalls/nanosleep.S
index fcd6e90cb..83fd32357 100644
--- a/libc/arch-arm/syscalls/nanosleep.S
+++ b/libc/arch-arm/syscalls/nanosleep.S
@@ -4,9 +4,11 @@
ENTRY(nanosleep)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_nanosleep
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/personality.S b/libc/arch-arm/syscalls/personality.S
index d43d76384..5ad6132f8 100644
--- a/libc/arch-arm/syscalls/personality.S
+++ b/libc/arch-arm/syscalls/personality.S
@@ -4,9 +4,11 @@
ENTRY(personality)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_personality
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/pipe2.S b/libc/arch-arm/syscalls/pipe2.S
index 1cbdfb2d7..f543f9d2c 100644
--- a/libc/arch-arm/syscalls/pipe2.S
+++ b/libc/arch-arm/syscalls/pipe2.S
@@ -4,9 +4,11 @@
ENTRY(pipe2)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_pipe2
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/prlimit64.S b/libc/arch-arm/syscalls/prlimit64.S
index 3ae9e1b19..0f04aaa6f 100644
--- a/libc/arch-arm/syscalls/prlimit64.S
+++ b/libc/arch-arm/syscalls/prlimit64.S
@@ -4,9 +4,11 @@
ENTRY(prlimit64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_prlimit64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/read.S b/libc/arch-arm/syscalls/read.S
index 1c3b39578..5051358ab 100644
--- a/libc/arch-arm/syscalls/read.S
+++ b/libc/arch-arm/syscalls/read.S
@@ -4,9 +4,11 @@
ENTRY(read)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_read
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/readlinkat.S b/libc/arch-arm/syscalls/readlinkat.S
index e7cc8ff23..36d46fa6c 100644
--- a/libc/arch-arm/syscalls/readlinkat.S
+++ b/libc/arch-arm/syscalls/readlinkat.S
@@ -4,9 +4,11 @@
ENTRY(readlinkat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_readlinkat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/readv.S b/libc/arch-arm/syscalls/readv.S
index c7807bde8..565af6a41 100644
--- a/libc/arch-arm/syscalls/readv.S
+++ b/libc/arch-arm/syscalls/readv.S
@@ -4,9 +4,11 @@
ENTRY(readv)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_readv
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/recvmsg.S b/libc/arch-arm/syscalls/recvmsg.S
index 995a9e348..19a9fca04 100644
--- a/libc/arch-arm/syscalls/recvmsg.S
+++ b/libc/arch-arm/syscalls/recvmsg.S
@@ -4,9 +4,11 @@
ENTRY(recvmsg)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_recvmsg
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/removexattr.S b/libc/arch-arm/syscalls/removexattr.S
index 3a32e5cea..46f847dd2 100644
--- a/libc/arch-arm/syscalls/removexattr.S
+++ b/libc/arch-arm/syscalls/removexattr.S
@@ -4,9 +4,11 @@
ENTRY(removexattr)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_removexattr
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/renameat.S b/libc/arch-arm/syscalls/renameat.S
index 98e86dc32..89fc513ed 100644
--- a/libc/arch-arm/syscalls/renameat.S
+++ b/libc/arch-arm/syscalls/renameat.S
@@ -4,9 +4,11 @@
ENTRY(renameat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_renameat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_get_priority_max.S b/libc/arch-arm/syscalls/sched_get_priority_max.S
index 187e68039..23b1d6282 100644
--- a/libc/arch-arm/syscalls/sched_get_priority_max.S
+++ b/libc/arch-arm/syscalls/sched_get_priority_max.S
@@ -4,9 +4,11 @@
ENTRY(sched_get_priority_max)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_get_priority_max
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_get_priority_min.S b/libc/arch-arm/syscalls/sched_get_priority_min.S
index 68bf7dfc0..65a967ca2 100644
--- a/libc/arch-arm/syscalls/sched_get_priority_min.S
+++ b/libc/arch-arm/syscalls/sched_get_priority_min.S
@@ -4,9 +4,11 @@
ENTRY(sched_get_priority_min)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_get_priority_min
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_getparam.S b/libc/arch-arm/syscalls/sched_getparam.S
index 32b97b850..700041e66 100644
--- a/libc/arch-arm/syscalls/sched_getparam.S
+++ b/libc/arch-arm/syscalls/sched_getparam.S
@@ -4,9 +4,11 @@
ENTRY(sched_getparam)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_getparam
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_getscheduler.S b/libc/arch-arm/syscalls/sched_getscheduler.S
index 330c2080f..b4f5d1348 100644
--- a/libc/arch-arm/syscalls/sched_getscheduler.S
+++ b/libc/arch-arm/syscalls/sched_getscheduler.S
@@ -4,9 +4,11 @@
ENTRY(sched_getscheduler)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_getscheduler
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_rr_get_interval.S b/libc/arch-arm/syscalls/sched_rr_get_interval.S
index 5d176ac2b..ea30b6210 100644
--- a/libc/arch-arm/syscalls/sched_rr_get_interval.S
+++ b/libc/arch-arm/syscalls/sched_rr_get_interval.S
@@ -4,9 +4,11 @@
ENTRY(sched_rr_get_interval)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_rr_get_interval
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_setaffinity.S b/libc/arch-arm/syscalls/sched_setaffinity.S
index 6653471f5..636845b28 100644
--- a/libc/arch-arm/syscalls/sched_setaffinity.S
+++ b/libc/arch-arm/syscalls/sched_setaffinity.S
@@ -4,9 +4,11 @@
ENTRY(sched_setaffinity)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_setaffinity
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_setparam.S b/libc/arch-arm/syscalls/sched_setparam.S
index 16e1997a8..f24b96e01 100644
--- a/libc/arch-arm/syscalls/sched_setparam.S
+++ b/libc/arch-arm/syscalls/sched_setparam.S
@@ -4,9 +4,11 @@
ENTRY(sched_setparam)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_setparam
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_setscheduler.S b/libc/arch-arm/syscalls/sched_setscheduler.S
index 2ec9fecf1..5bfa202f9 100644
--- a/libc/arch-arm/syscalls/sched_setscheduler.S
+++ b/libc/arch-arm/syscalls/sched_setscheduler.S
@@ -4,9 +4,11 @@
ENTRY(sched_setscheduler)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_setscheduler
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sched_yield.S b/libc/arch-arm/syscalls/sched_yield.S
index 1ec328f3c..7b93a6e68 100644
--- a/libc/arch-arm/syscalls/sched_yield.S
+++ b/libc/arch-arm/syscalls/sched_yield.S
@@ -4,9 +4,11 @@
ENTRY(sched_yield)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sched_yield
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendfile.S b/libc/arch-arm/syscalls/sendfile.S
index afae0213a..52e78d0c0 100644
--- a/libc/arch-arm/syscalls/sendfile.S
+++ b/libc/arch-arm/syscalls/sendfile.S
@@ -4,9 +4,11 @@
ENTRY(sendfile)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendfile
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendfile64.S b/libc/arch-arm/syscalls/sendfile64.S
index d0ad0b865..416e9d28a 100644
--- a/libc/arch-arm/syscalls/sendfile64.S
+++ b/libc/arch-arm/syscalls/sendfile64.S
@@ -4,9 +4,11 @@
ENTRY(sendfile64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendfile64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendmmsg.S b/libc/arch-arm/syscalls/sendmmsg.S
index 8bb5f8065..f97d264cb 100644
--- a/libc/arch-arm/syscalls/sendmmsg.S
+++ b/libc/arch-arm/syscalls/sendmmsg.S
@@ -4,9 +4,11 @@
ENTRY(sendmmsg)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendmmsg
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sendmsg.S b/libc/arch-arm/syscalls/sendmsg.S
index fd381408f..215219a76 100644
--- a/libc/arch-arm/syscalls/sendmsg.S
+++ b/libc/arch-arm/syscalls/sendmsg.S
@@ -4,9 +4,11 @@
ENTRY(sendmsg)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sendmsg
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setfsgid.S b/libc/arch-arm/syscalls/setfsgid.S
index f677a9480..2f0f08c57 100644
--- a/libc/arch-arm/syscalls/setfsgid.S
+++ b/libc/arch-arm/syscalls/setfsgid.S
@@ -4,9 +4,11 @@
ENTRY(setfsgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setfsgid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setfsuid.S b/libc/arch-arm/syscalls/setfsuid.S
index 5d27a4d2d..ce663e0ee 100644
--- a/libc/arch-arm/syscalls/setfsuid.S
+++ b/libc/arch-arm/syscalls/setfsuid.S
@@ -4,9 +4,11 @@
ENTRY(setfsuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setfsuid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setgid.S b/libc/arch-arm/syscalls/setgid.S
index d9b2b889a..6f1cbed44 100644
--- a/libc/arch-arm/syscalls/setgid.S
+++ b/libc/arch-arm/syscalls/setgid.S
@@ -4,9 +4,11 @@
ENTRY(setgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setgroups.S b/libc/arch-arm/syscalls/setgroups.S
index 169de73f7..1fb494c0a 100644
--- a/libc/arch-arm/syscalls/setgroups.S
+++ b/libc/arch-arm/syscalls/setgroups.S
@@ -4,9 +4,11 @@
ENTRY(setgroups)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setgroups32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sethostname.S b/libc/arch-arm/syscalls/sethostname.S
index 0a98fd3ee..c4c2db5e7 100644
--- a/libc/arch-arm/syscalls/sethostname.S
+++ b/libc/arch-arm/syscalls/sethostname.S
@@ -4,9 +4,11 @@
ENTRY(sethostname)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sethostname
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setitimer.S b/libc/arch-arm/syscalls/setitimer.S
index 31b277b7c..511a5d1f3 100644
--- a/libc/arch-arm/syscalls/setitimer.S
+++ b/libc/arch-arm/syscalls/setitimer.S
@@ -4,9 +4,11 @@
ENTRY(setitimer)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setitimer
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setns.S b/libc/arch-arm/syscalls/setns.S
index 59203ef4a..b1902dc85 100644
--- a/libc/arch-arm/syscalls/setns.S
+++ b/libc/arch-arm/syscalls/setns.S
@@ -4,9 +4,11 @@
ENTRY(setns)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setns
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setpgid.S b/libc/arch-arm/syscalls/setpgid.S
index 4a91520b9..fe05fc95e 100644
--- a/libc/arch-arm/syscalls/setpgid.S
+++ b/libc/arch-arm/syscalls/setpgid.S
@@ -4,9 +4,11 @@
ENTRY(setpgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setpgid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setpriority.S b/libc/arch-arm/syscalls/setpriority.S
index 2053ce101..960eee096 100644
--- a/libc/arch-arm/syscalls/setpriority.S
+++ b/libc/arch-arm/syscalls/setpriority.S
@@ -4,9 +4,11 @@
ENTRY(setpriority)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setpriority
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setregid.S b/libc/arch-arm/syscalls/setregid.S
index f1bdc6011..0b5f444e5 100644
--- a/libc/arch-arm/syscalls/setregid.S
+++ b/libc/arch-arm/syscalls/setregid.S
@@ -4,9 +4,11 @@
ENTRY(setregid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setregid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setresgid.S b/libc/arch-arm/syscalls/setresgid.S
index 9b8968acd..64677d365 100644
--- a/libc/arch-arm/syscalls/setresgid.S
+++ b/libc/arch-arm/syscalls/setresgid.S
@@ -4,9 +4,11 @@
ENTRY(setresgid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setresgid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setresuid.S b/libc/arch-arm/syscalls/setresuid.S
index c26a95542..e3888f6d4 100644
--- a/libc/arch-arm/syscalls/setresuid.S
+++ b/libc/arch-arm/syscalls/setresuid.S
@@ -4,9 +4,11 @@
ENTRY(setresuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setresuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setreuid.S b/libc/arch-arm/syscalls/setreuid.S
index 796191a25..15c266554 100644
--- a/libc/arch-arm/syscalls/setreuid.S
+++ b/libc/arch-arm/syscalls/setreuid.S
@@ -4,9 +4,11 @@
ENTRY(setreuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setreuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setrlimit.S b/libc/arch-arm/syscalls/setrlimit.S
index c87b21b78..b9014eb1b 100644
--- a/libc/arch-arm/syscalls/setrlimit.S
+++ b/libc/arch-arm/syscalls/setrlimit.S
@@ -4,9 +4,11 @@
ENTRY(setrlimit)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setrlimit
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setsid.S b/libc/arch-arm/syscalls/setsid.S
index 83bda1b03..fb7147431 100644
--- a/libc/arch-arm/syscalls/setsid.S
+++ b/libc/arch-arm/syscalls/setsid.S
@@ -4,9 +4,11 @@
ENTRY(setsid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setsid
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/settimeofday.S b/libc/arch-arm/syscalls/settimeofday.S
index 5763f40ef..00dfdebf8 100644
--- a/libc/arch-arm/syscalls/settimeofday.S
+++ b/libc/arch-arm/syscalls/settimeofday.S
@@ -4,9 +4,11 @@
ENTRY(settimeofday)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_settimeofday
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/setuid.S b/libc/arch-arm/syscalls/setuid.S
index 55b349cb0..447ed1b64 100644
--- a/libc/arch-arm/syscalls/setuid.S
+++ b/libc/arch-arm/syscalls/setuid.S
@@ -4,9 +4,11 @@
ENTRY(setuid)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_setuid32
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/shutdown.S b/libc/arch-arm/syscalls/shutdown.S
index 889934a97..51ed0cf0f 100644
--- a/libc/arch-arm/syscalls/shutdown.S
+++ b/libc/arch-arm/syscalls/shutdown.S
@@ -4,9 +4,11 @@
ENTRY(shutdown)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_shutdown
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sigaltstack.S b/libc/arch-arm/syscalls/sigaltstack.S
index b61b25d10..2f97800af 100644
--- a/libc/arch-arm/syscalls/sigaltstack.S
+++ b/libc/arch-arm/syscalls/sigaltstack.S
@@ -4,9 +4,11 @@
ENTRY(sigaltstack)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sigaltstack
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/socketpair.S b/libc/arch-arm/syscalls/socketpair.S
index f3c8a4bed..e537235e6 100644
--- a/libc/arch-arm/syscalls/socketpair.S
+++ b/libc/arch-arm/syscalls/socketpair.S
@@ -4,9 +4,11 @@
ENTRY(socketpair)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_socketpair
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/swapoff.S b/libc/arch-arm/syscalls/swapoff.S
index a7aaa8245..25832efdf 100644
--- a/libc/arch-arm/syscalls/swapoff.S
+++ b/libc/arch-arm/syscalls/swapoff.S
@@ -4,9 +4,11 @@
ENTRY(swapoff)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_swapoff
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/swapon.S b/libc/arch-arm/syscalls/swapon.S
index 6ea93c3c8..df4c71ed8 100644
--- a/libc/arch-arm/syscalls/swapon.S
+++ b/libc/arch-arm/syscalls/swapon.S
@@ -4,9 +4,11 @@
ENTRY(swapon)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_swapon
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/symlinkat.S b/libc/arch-arm/syscalls/symlinkat.S
index d330a54e7..ec2ee4fba 100644
--- a/libc/arch-arm/syscalls/symlinkat.S
+++ b/libc/arch-arm/syscalls/symlinkat.S
@@ -4,9 +4,11 @@
ENTRY(symlinkat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_symlinkat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sync.S b/libc/arch-arm/syscalls/sync.S
index 48ecfc0c3..b73dcaa05 100644
--- a/libc/arch-arm/syscalls/sync.S
+++ b/libc/arch-arm/syscalls/sync.S
@@ -4,9 +4,11 @@
ENTRY(sync)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sync
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/sysinfo.S b/libc/arch-arm/syscalls/sysinfo.S
index 709478e7d..1584ea401 100644
--- a/libc/arch-arm/syscalls/sysinfo.S
+++ b/libc/arch-arm/syscalls/sysinfo.S
@@ -4,9 +4,11 @@
ENTRY(sysinfo)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_sysinfo
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/tee.S b/libc/arch-arm/syscalls/tee.S
index a019c005c..efd12ca42 100644
--- a/libc/arch-arm/syscalls/tee.S
+++ b/libc/arch-arm/syscalls/tee.S
@@ -4,9 +4,11 @@
ENTRY(tee)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_tee
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/tgkill.S b/libc/arch-arm/syscalls/tgkill.S
index 206846535..43fe62cbd 100644
--- a/libc/arch-arm/syscalls/tgkill.S
+++ b/libc/arch-arm/syscalls/tgkill.S
@@ -4,9 +4,11 @@
ENTRY(tgkill)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_tgkill
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/timerfd_create.S b/libc/arch-arm/syscalls/timerfd_create.S
index 89a80cd9c..4aa310782 100644
--- a/libc/arch-arm/syscalls/timerfd_create.S
+++ b/libc/arch-arm/syscalls/timerfd_create.S
@@ -4,9 +4,11 @@
ENTRY(timerfd_create)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timerfd_create
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/timerfd_gettime.S b/libc/arch-arm/syscalls/timerfd_gettime.S
index 4a7df7616..6ae93e462 100644
--- a/libc/arch-arm/syscalls/timerfd_gettime.S
+++ b/libc/arch-arm/syscalls/timerfd_gettime.S
@@ -4,9 +4,11 @@
ENTRY(timerfd_gettime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timerfd_gettime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/timerfd_settime.S b/libc/arch-arm/syscalls/timerfd_settime.S
index 2e0fe93a6..2dd4aac0c 100644
--- a/libc/arch-arm/syscalls/timerfd_settime.S
+++ b/libc/arch-arm/syscalls/timerfd_settime.S
@@ -4,9 +4,11 @@
ENTRY(timerfd_settime)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_timerfd_settime
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/times.S b/libc/arch-arm/syscalls/times.S
index 289c18510..1ff636d6a 100644
--- a/libc/arch-arm/syscalls/times.S
+++ b/libc/arch-arm/syscalls/times.S
@@ -4,9 +4,11 @@
ENTRY(times)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_times
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/truncate.S b/libc/arch-arm/syscalls/truncate.S
index bb33beba2..0bee4d2a5 100644
--- a/libc/arch-arm/syscalls/truncate.S
+++ b/libc/arch-arm/syscalls/truncate.S
@@ -4,9 +4,11 @@
ENTRY(truncate)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_truncate
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/truncate64.S b/libc/arch-arm/syscalls/truncate64.S
index 9cafbb5f6..74e9eb277 100644
--- a/libc/arch-arm/syscalls/truncate64.S
+++ b/libc/arch-arm/syscalls/truncate64.S
@@ -4,9 +4,11 @@
ENTRY(truncate64)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_truncate64
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/umask.S b/libc/arch-arm/syscalls/umask.S
index 5dc446104..ca3e058cb 100644
--- a/libc/arch-arm/syscalls/umask.S
+++ b/libc/arch-arm/syscalls/umask.S
@@ -4,9 +4,11 @@
ENTRY(umask)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_umask
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/umount2.S b/libc/arch-arm/syscalls/umount2.S
index 435eda432..6e1ba3215 100644
--- a/libc/arch-arm/syscalls/umount2.S
+++ b/libc/arch-arm/syscalls/umount2.S
@@ -4,9 +4,11 @@
ENTRY(umount2)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_umount2
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/uname.S b/libc/arch-arm/syscalls/uname.S
index 8af612331..4f2b8a201 100644
--- a/libc/arch-arm/syscalls/uname.S
+++ b/libc/arch-arm/syscalls/uname.S
@@ -4,9 +4,11 @@
ENTRY(uname)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_uname
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/unlinkat.S b/libc/arch-arm/syscalls/unlinkat.S
index 96257e6f9..ac7bfaec4 100644
--- a/libc/arch-arm/syscalls/unlinkat.S
+++ b/libc/arch-arm/syscalls/unlinkat.S
@@ -4,9 +4,11 @@
ENTRY(unlinkat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_unlinkat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/unshare.S b/libc/arch-arm/syscalls/unshare.S
index 8054171a5..4558a6082 100644
--- a/libc/arch-arm/syscalls/unshare.S
+++ b/libc/arch-arm/syscalls/unshare.S
@@ -4,9 +4,11 @@
ENTRY(unshare)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_unshare
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/utimensat.S b/libc/arch-arm/syscalls/utimensat.S
index f3c2fa2b8..95245076f 100644
--- a/libc/arch-arm/syscalls/utimensat.S
+++ b/libc/arch-arm/syscalls/utimensat.S
@@ -4,9 +4,11 @@
ENTRY(utimensat)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_utimensat
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/vmsplice.S b/libc/arch-arm/syscalls/vmsplice.S
index cc12ca52d..90ab8b41b 100644
--- a/libc/arch-arm/syscalls/vmsplice.S
+++ b/libc/arch-arm/syscalls/vmsplice.S
@@ -4,9 +4,11 @@
ENTRY(vmsplice)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_vmsplice
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/wait4.S b/libc/arch-arm/syscalls/wait4.S
index 26a492917..40bb5a562 100644
--- a/libc/arch-arm/syscalls/wait4.S
+++ b/libc/arch-arm/syscalls/wait4.S
@@ -4,9 +4,11 @@
ENTRY(wait4)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_wait4
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/write.S b/libc/arch-arm/syscalls/write.S
index bf89d7ff8..4abbe6bab 100644
--- a/libc/arch-arm/syscalls/write.S
+++ b/libc/arch-arm/syscalls/write.S
@@ -4,9 +4,11 @@
ENTRY(write)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_write
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm/syscalls/writev.S b/libc/arch-arm/syscalls/writev.S
index 15b527507..3103237b4 100644
--- a/libc/arch-arm/syscalls/writev.S
+++ b/libc/arch-arm/syscalls/writev.S
@@ -4,9 +4,11 @@
ENTRY(writev)
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =__NR_writev
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
diff --git a/libc/arch-arm64/arm64.mk b/libc/arch-arm64/arm64.mk
index 470a03838..9a7607260 100644
--- a/libc/arch-arm64/arm64.mk
+++ b/libc/arch-arm64/arm64.mk
@@ -1,32 +1,38 @@
# 64-bit arm.
#
-# Default implementations of functions that are commonly optimized.
+# Generic arm64 optimizations, may be overriden by CPU variants.
#
libc_bionic_src_files_arm64 += \
- bionic/__memset_chk.cpp \
- bionic/__strcpy_chk.cpp \
- bionic/__strcat_chk.cpp \
- bionic/strrchr.cpp \
+ arch-arm64/generic/bionic/memchr.S \
+ arch-arm64/generic/bionic/memcmp.S \
+ arch-arm64/generic/bionic/memcpy.S \
+ arch-arm64/generic/bionic/memmove.S \
+ arch-arm64/generic/bionic/memset.S \
+ arch-arm64/generic/bionic/stpcpy.S \
+ arch-arm64/generic/bionic/strchr.S \
+ arch-arm64/generic/bionic/strcmp.S \
+ arch-arm64/generic/bionic/strcpy.S \
+ arch-arm64/generic/bionic/strlen.S \
+ arch-arm64/generic/bionic/strncmp.S \
+ arch-arm64/generic/bionic/strnlen.S \
+ arch-arm64/generic/bionic/wmemmove.S \
-libc_freebsd_src_files_arm64 += \
- upstream-freebsd/lib/libc/string/wcscat.c \
- upstream-freebsd/lib/libc/string/wcschr.c \
- upstream-freebsd/lib/libc/string/wcscmp.c \
- upstream-freebsd/lib/libc/string/wcscpy.c \
- upstream-freebsd/lib/libc/string/wcslen.c \
- upstream-freebsd/lib/libc/string/wcsrchr.c \
- upstream-freebsd/lib/libc/string/wmemcmp.c \
+libc_bionic_src_files_exclude_arm64 += \
+ bionic/__memcpy_chk.cpp \
+ bionic/strchr.cpp \
+ bionic/strnlen.c \
-libc_openbsd_src_files_arm64 += \
- upstream-openbsd/lib/libc/string/memrchr.c \
- upstream-openbsd/lib/libc/string/stpncpy.c \
- upstream-openbsd/lib/libc/string/strcat.c \
- upstream-openbsd/lib/libc/string/strlcat.c \
- upstream-openbsd/lib/libc/string/strlcpy.c \
- upstream-openbsd/lib/libc/string/strncat.c \
- upstream-openbsd/lib/libc/string/strncpy.c \
+libc_freebsd_src_files_exclude_arm64 += \
+ upstream-freebsd/lib/libc/string/wmemmove.c \
+
+libc_openbsd_src_files_exclude_arm64 += \
+ upstream-openbsd/lib/libc/string/memchr.c \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/strcpy.c \
+ upstream-openbsd/lib/libc/string/strncmp.c \
#
# Inherently architecture-specific code.
@@ -36,7 +42,6 @@ libc_bionic_src_files_arm64 += \
arch-arm64/bionic/__bionic_clone.S \
arch-arm64/bionic/_exit_with_stack_teardown.S \
arch-arm64/bionic/setjmp.S \
- arch-arm64/bionic/__set_tls.c \
arch-arm64/bionic/syscall.S \
arch-arm64/bionic/vfork.S \
@@ -54,6 +59,7 @@ libc_crt_target_crtbegin_so_file_arm64 := \
ifeq ($(strip $(TARGET_CPU_VARIANT)),)
$(warning TARGET_ARCH is arm64, but TARGET_CPU_VARIANT is not defined)
endif
+ifneq ($(TARGET_CPU_VARIANT),generic)
cpu_variant_mk := $(LOCAL_PATH)/arch-arm64/$(TARGET_CPU_VARIANT)/$(TARGET_CPU_VARIANT).mk
ifeq ($(wildcard $(cpu_variant_mk)),)
$(error "TARGET_CPU_VARIANT not set or set to an unknown value. Possible values are generic, denver64. Use generic for devices that do not have a CPU similar to any of the supported cpu variants.")
@@ -62,3 +68,4 @@ include $(cpu_variant_mk)
libc_common_additional_dependencies += $(cpu_variant_mk)
cpu_variant_mk :=
+endif
diff --git a/libc/arch-arm64/bionic/setjmp.S b/libc/arch-arm64/bionic/setjmp.S
index ba0a226e0..25501348a 100644
--- a/libc/arch-arm64/bionic/setjmp.S
+++ b/libc/arch-arm64/bionic/setjmp.S
@@ -37,6 +37,18 @@
// NOTE: All the registers saved here will have 64 bit vales.
// AAPCS mandates that the higher part of q registers do not need to
// be saved by the callee.
+//
+// The internal structure of a jmp_buf is totally private.
+// Current layout (changes from release to release):
+//
+// word name description
+// 0 sigflag/cookie setjmp cookie in top 31 bits, signal mask flag in low bit
+// 1 sigmask signal mask (not used with _setjmp / _longjmp)
+// 2 core_base base of core registers (x19-x30, sp)
+// 15 float_base base of float registers (d8-d15)
+// 23 checksum checksum of core registers
+// 24 reserved reserved entries (room to grow)
+// 32
#define _JB_SIGFLAG 0
#define _JB_SIGMASK (_JB_SIGFLAG + 1)
@@ -51,6 +63,40 @@
#define _JB_D12_D13 (_JB_D14_D15 + 2)
#define _JB_D10_D11 (_JB_D12_D13 + 2)
#define _JB_D8_D9 (_JB_D10_D11 + 2)
+#define _JB_CHECKSUM (_JB_D8_D9 + 2)
+
+#define MANGLE_REGISTERS 1
+#define USE_CHECKSUM 1
+
+.macro m_mangle_registers reg, sp_reg
+#if MANGLE_REGISTERS
+ eor x19, x19, \reg
+ eor x20, x20, \reg
+ eor x21, x21, \reg
+ eor x22, x22, \reg
+ eor x23, x23, \reg
+ eor x24, x24, \reg
+ eor x25, x25, \reg
+ eor x26, x26, \reg
+ eor x27, x27, \reg
+ eor x28, x28, \reg
+ eor x29, x29, \reg
+ eor x30, x30, \reg
+ eor \sp_reg, \sp_reg, \reg
+#endif
+.endm
+
+.macro m_calculate_checksum dst, src, scratch
+ mov \dst, #0
+ .irp i,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
+ ldr \scratch, [\src, #(\i * 8)]
+ eor \dst, \dst, \scratch
+ .endr
+.endm
+
+.macro m_unmangle_registers reg, sp_reg
+ m_mangle_registers \reg, sp_reg=\sp_reg
+.endm
ENTRY(setjmp)
mov w1, #1
@@ -64,23 +110,47 @@ END(_setjmp)
// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
ENTRY(sigsetjmp)
- // Record whether or not we're saving the signal mask.
- str w1, [x0, #(_JB_SIGFLAG * 8)]
+ stp x0, x30, [sp, #-16]!
+ .cfi_def_cfa_offset 16
+ .cfi_rel_offset x0, 0
+ .cfi_rel_offset x30, 8
+
+ // Get the cookie and store it along with the signal flag.
+ mov x0, x1
+ bl __bionic_setjmp_cookie_get
+ mov x1, x0
+ ldr x0, [sp, #0]
+ str x1, [x0, #(_JB_SIGFLAG * 8)]
// Do we need to save the signal mask?
- cbz w1, 1f
+ tbz w1, #0, 1f
+
+ // Save the cookie for later.
+ stp x1, xzr, [sp, #-16]!
+ .cfi_adjust_cfa_offset 16
// Save current signal mask.
- stp x0, x30, [sp, #-16]!
// The 'how' argument is ignored if new_mask is NULL.
mov x1, #0 // NULL.
add x2, x0, #(_JB_SIGMASK * 8) // old_mask.
bl sigprocmask
- ldp x0, x30, [sp], #16
+
+ ldp x1, xzr, [sp], #16
+ .cfi_adjust_cfa_offset -16
1:
+ // Restore original x0 and lr.
+ ldp x0, x30, [sp], #16
+ .cfi_adjust_cfa_offset -16
+ .cfi_restore x0
+ .cfi_restore x30
+
+ // Mask off the signal flag bit.
+ bic x1, x1, #1
+
// Save core registers.
mov x10, sp
+ m_mangle_registers x1, sp_reg=x10
stp x30, x10, [x0, #(_JB_X30_SP * 8)]
stp x28, x29, [x0, #(_JB_X28_X29 * 8)]
stp x26, x27, [x0, #(_JB_X26_X27 * 8)]
@@ -88,6 +158,7 @@ ENTRY(sigsetjmp)
stp x22, x23, [x0, #(_JB_X22_X23 * 8)]
stp x20, x21, [x0, #(_JB_X20_X21 * 8)]
str x19, [x0, #(_JB_X19 * 8)]
+ m_unmangle_registers x1, sp_reg=x10
// Save floating point registers.
stp d14, d15, [x0, #(_JB_D14_D15 * 8)]
@@ -95,37 +166,82 @@ ENTRY(sigsetjmp)
stp d10, d11, [x0, #(_JB_D10_D11 * 8)]
stp d8, d9, [x0, #(_JB_D8_D9 * 8)]
+#if USE_CHECKSUM
+ // Calculate the checksum.
+ m_calculate_checksum x12, x0, x2
+ str x12, [x0, #(_JB_CHECKSUM * 8)]
+#endif
+
mov w0, #0
ret
END(sigsetjmp)
// void siglongjmp(sigjmp_buf env, int value);
ENTRY(siglongjmp)
+#if USE_CHECKSUM
+ // Check the checksum before doing anything.
+ m_calculate_checksum x12, x0, x2
+ ldr x2, [x0, #(_JB_CHECKSUM * 8)]
+
+ cmp x2, x12
+ bne __bionic_setjmp_checksum_mismatch
+#endif
+
// Do we need to restore the signal mask?
- ldr w9, [x0, #(_JB_SIGFLAG * 8)]
- cbz w9, 1f
+ ldr x2, [x0, #(_JB_SIGFLAG * 8)]
+ tbz w2, #0, 1f
- // Restore signal mask.
stp x0, x30, [sp, #-16]!
+ .cfi_adjust_cfa_offset 16
+ .cfi_rel_offset x0, 0
+ .cfi_rel_offset x30, 8
+
+ // Restore signal mask.
mov x19, x1 // Save 'value'.
+
mov x2, x0
mov x0, #2 // SIG_SETMASK
add x1, x2, #(_JB_SIGMASK * 8) // new_mask.
mov x2, #0 // NULL.
bl sigprocmask
mov x1, x19 // Restore 'value'.
+
+ // Restore original x0 and lr.
ldp x0, x30, [sp], #16
+ .cfi_adjust_cfa_offset -16
+ .cfi_restore x0
+ .cfi_restore x30
+ ldr x2, [x0, #(_JB_SIGFLAG * 8)]
1:
// Restore core registers.
+ bic x2, x2, #1
ldp x30, x10, [x0, #(_JB_X30_SP * 8)]
- mov sp, x10
ldp x28, x29, [x0, #(_JB_X28_X29 * 8)]
ldp x26, x27, [x0, #(_JB_X26_X27 * 8)]
ldp x24, x25, [x0, #(_JB_X24_X25 * 8)]
ldp x22, x23, [x0, #(_JB_X22_X23 * 8)]
ldp x20, x21, [x0, #(_JB_X20_X21 * 8)]
ldr x19, [x0, #(_JB_X19 * 8)]
+ m_unmangle_registers x2, sp_reg=x10
+ mov sp, x10
+
+ stp x0, x1, [sp, #-16]!
+ .cfi_adjust_cfa_offset 16
+ .cfi_rel_offset x0, 0
+ .cfi_rel_offset x1, 8
+ stp x30, xzr, [sp, #-16]!
+ .cfi_adjust_cfa_offset 16
+ .cfi_rel_offset x30, 0
+ ldr x0, [x0, #(_JB_SIGFLAG * 8)]
+ bl __bionic_setjmp_cookie_check
+ ldp x30, xzr, [sp], #16
+ .cfi_adjust_cfa_offset -16
+ .cfi_restore x30
+ ldp x0, x1, [sp], #16
+ .cfi_adjust_cfa_offset -16
+ .cfi_restore x0
+ .cfi_restore x1
// Restore floating point registers.
ldp d14, d15, [x0, #(_JB_D14_D15 * 8)]
@@ -133,13 +249,6 @@ ENTRY(siglongjmp)
ldp d10, d11, [x0, #(_JB_D10_D11 * 8)]
ldp d8, d9, [x0, #(_JB_D8_D9 * 8)]
- // Validate sp (sp mod 16 = 0) and lr (lr mod 4 = 0).
- tst x30, #3
- b.ne longjmperror
- mov x10, sp
- tst x10, #15
- b.ne longjmperror
-
// Set return value.
cmp w1, wzr
csinc w0, w1, wzr, ne
diff --git a/libc/arch-arm64/bionic/vfork.S b/libc/arch-arm64/bionic/vfork.S
index b6a672d43..92fa333d5 100644
--- a/libc/arch-arm64/bionic/vfork.S
+++ b/libc/arch-arm64/bionic/vfork.S
@@ -31,6 +31,11 @@
#include <linux/sched.h>
ENTRY(vfork)
+ // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+ mrs x0, tpidr_el0
+ ldr x0, [x0, #8]
+ str wzr, [x0, #20]
+
mov x0, #(CLONE_VM | CLONE_VFORK | SIGCHLD)
mov x1, xzr
mov x2, xzr
diff --git a/libc/arch-arm64/cortex-a53/cortex-a53.mk b/libc/arch-arm64/cortex-a53/cortex-a53.mk
index 676e8860a..e69de29bb 100644
--- a/libc/arch-arm64/cortex-a53/cortex-a53.mk
+++ b/libc/arch-arm64/cortex-a53/cortex-a53.mk
@@ -1 +0,0 @@
-include bionic/libc/arch-arm64/generic/generic.mk
diff --git a/libc/arch-arm64/denver64/denver64.mk b/libc/arch-arm64/denver64/denver64.mk
index d619c1157..703af4550 100644
--- a/libc/arch-arm64/denver64/denver64.mk
+++ b/libc/arch-arm64/denver64/denver64.mk
@@ -1,14 +1,7 @@
libc_bionic_src_files_arm64 += \
- arch-arm64/generic/bionic/memchr.S \
- arch-arm64/generic/bionic/memcmp.S \
arch-arm64/denver64/bionic/memcpy.S \
- arch-arm64/generic/bionic/memmove.S \
arch-arm64/denver64/bionic/memset.S \
- arch-arm64/generic/bionic/stpcpy.S \
- arch-arm64/generic/bionic/strchr.S \
- arch-arm64/generic/bionic/strcmp.S \
- arch-arm64/generic/bionic/strcpy.S \
- arch-arm64/generic/bionic/strlen.S \
- arch-arm64/generic/bionic/strncmp.S \
- arch-arm64/generic/bionic/strnlen.S \
- arch-arm64/generic/bionic/wmemmove.S
+
+libc_bionic_src_files_exclude_arm64 += \
+ arch-arm64/generic/bionic/memcpy.S \
+ arch-arm64/generic/bionic/memset.S \
diff --git a/libc/arch-arm64/generic/bionic/memmove.S b/libc/arch-arm64/generic/bionic/memmove.S
index 8b366a314..739ce4982 100644
--- a/libc/arch-arm64/generic/bionic/memmove.S
+++ b/libc/arch-arm64/generic/bionic/memmove.S
@@ -35,10 +35,6 @@
#include <private/bionic_asm.h>
/* Parameters and result. */
-#ifdef BCOPY
-#define origdstin x1
-#define origsrc x0
-#endif
#define dstin x0
#define src x1
#define count x2
@@ -59,13 +55,7 @@
#define D_l x13
#define D_h x14
-#ifdef BCOPY
-ENTRY(bcopy)
- /* Swap src and dst so that a branch to memcpy doesn't cause issues. */
- mov tmp1, origsrc
- mov origsrc, origdstin
- mov origdstin, tmp1
-#elif defined(WMEMMOVE)
+#if defined(WMEMMOVE)
ENTRY(wmemmove)
lsl count, count, #2
#else
@@ -332,9 +322,7 @@ ENTRY(memmove)
tst count, #0x3f
b.ne .Ltail63down
ret
-#ifdef BCOPY
-END(bcopy)
-#elif defined(WMEMMOVE)
+#if defined(WMEMMOVE)
END(wmemmove)
#else
END(memmove)
diff --git a/libc/arch-arm64/generic/generic.mk b/libc/arch-arm64/generic/generic.mk
deleted file mode 100644
index 1b595aacb..000000000
--- a/libc/arch-arm64/generic/generic.mk
+++ /dev/null
@@ -1,14 +0,0 @@
-libc_bionic_src_files_arm64 += \
- arch-arm64/generic/bionic/memchr.S \
- arch-arm64/generic/bionic/memcmp.S \
- arch-arm64/generic/bionic/memcpy.S \
- arch-arm64/generic/bionic/memmove.S \
- arch-arm64/generic/bionic/memset.S \
- arch-arm64/generic/bionic/stpcpy.S \
- arch-arm64/generic/bionic/strchr.S \
- arch-arm64/generic/bionic/strcmp.S \
- arch-arm64/generic/bionic/strcpy.S \
- arch-arm64/generic/bionic/strlen.S \
- arch-arm64/generic/bionic/strncmp.S \
- arch-arm64/generic/bionic/strnlen.S \
- arch-arm64/generic/bionic/wmemmove.S
diff --git a/libc/arch-arm64/syscalls/flistxattr.S b/libc/arch-arm64/syscalls/___flistxattr.S
index 8921bb4cc..02c84784e 100644
--- a/libc/arch-arm64/syscalls/flistxattr.S
+++ b/libc/arch-arm64/syscalls/___flistxattr.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(flistxattr)
+ENTRY(___flistxattr)
mov x8, __NR_flistxattr
svc #0
@@ -11,4 +11,5 @@ ENTRY(flistxattr)
b.hi __set_errno_internal
ret
-END(flistxattr)
+END(___flistxattr)
+.hidden ___flistxattr
diff --git a/libc/arch-arm64/syscalls/mremap.S b/libc/arch-arm64/syscalls/___mremap.S
index 69b91d6bc..aeb93bcef 100644
--- a/libc/arch-arm64/syscalls/mremap.S
+++ b/libc/arch-arm64/syscalls/___mremap.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(mremap)
+ENTRY(___mremap)
mov x8, __NR_mremap
svc #0
@@ -11,4 +11,5 @@ ENTRY(mremap)
b.hi __set_errno_internal
ret
-END(mremap)
+END(___mremap)
+.hidden ___mremap
diff --git a/libc/arch-arm64/syscalls/adjtimex.S b/libc/arch-arm64/syscalls/adjtimex.S
new file mode 100644
index 000000000..712e46811
--- /dev/null
+++ b/libc/arch-arm64/syscalls/adjtimex.S
@@ -0,0 +1,14 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(adjtimex)
+ mov x8, __NR_adjtimex
+ svc #0
+
+ cmn x0, #(MAX_ERRNO + 1)
+ cneg x0, x0, hi
+ b.hi __set_errno_internal
+
+ ret
+END(adjtimex)
diff --git a/libc/arch-arm64/syscalls/clock_adjtime.S b/libc/arch-arm64/syscalls/clock_adjtime.S
new file mode 100644
index 000000000..c2c191ed1
--- /dev/null
+++ b/libc/arch-arm64/syscalls/clock_adjtime.S
@@ -0,0 +1,14 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(clock_adjtime)
+ mov x8, __NR_clock_adjtime
+ svc #0
+
+ cmn x0, #(MAX_ERRNO + 1)
+ cneg x0, x0, hi
+ b.hi __set_errno_internal
+
+ ret
+END(clock_adjtime)
diff --git a/libc/arch-arm64/syscalls/preadv.S b/libc/arch-arm64/syscalls/preadv.S
new file mode 100644
index 000000000..cb8300d51
--- /dev/null
+++ b/libc/arch-arm64/syscalls/preadv.S
@@ -0,0 +1,16 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(preadv)
+ mov x8, __NR_preadv
+ svc #0
+
+ cmn x0, #(MAX_ERRNO + 1)
+ cneg x0, x0, hi
+ b.hi __set_errno_internal
+
+ ret
+END(preadv)
+
+ALIAS_SYMBOL(preadv64, preadv)
diff --git a/libc/arch-arm64/syscalls/pwritev.S b/libc/arch-arm64/syscalls/pwritev.S
new file mode 100644
index 000000000..621466a6a
--- /dev/null
+++ b/libc/arch-arm64/syscalls/pwritev.S
@@ -0,0 +1,16 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(pwritev)
+ mov x8, __NR_pwritev
+ svc #0
+
+ cmn x0, #(MAX_ERRNO + 1)
+ cneg x0, x0, hi
+ b.hi __set_errno_internal
+
+ ret
+END(pwritev)
+
+ALIAS_SYMBOL(pwritev64, pwritev)
diff --git a/libc/arch-mips/bionic/setjmp.S b/libc/arch-mips/bionic/setjmp.S
index 3ef0f1129..73002e8a8 100644
--- a/libc/arch-mips/bionic/setjmp.S
+++ b/libc/arch-mips/bionic/setjmp.S
@@ -132,10 +132,9 @@
/* field: byte offset: size: */
/* dynam filler (0*4) 0-4 bytes of rounddown filler, DON'T TOUCH!!
often overlays user storage!! */
-#define SC_MAGIC_OFFSET (1*4) /* 4 bytes, identify jmpbuf, first actual field */
-#define SC_FLAG_OFFSET (2*4) /* 4 bytes, savesigs flag */
-#define SC_FPSR_OFFSET (3*4) /* 4 bytes, floating point control/status reg */
+#define SC_FPSR_OFFSET (1*4) /* 4 bytes, floating point control/status reg */
/* following fields are 8-byte aligned */
+#define SC_FLAG_OFFSET (2*4) /* 8 bytes, cookie and savesigs flag, first actual field */
#define SC_MASK_OFFSET (4*4) /* 16 bytes, mips32/mips64 version of sigset_t */
#define SC_SPARE_OFFSET (8*4) /* 8 bytes, reserved for future uses */
@@ -166,6 +165,16 @@
#error _JBLEN is too small
#endif
+.macro m_mangle_reg_and_store reg, cookie, temp, offset
+ xor \temp, \reg, \cookie
+ REG_S \temp, \offset
+.endm
+
+.macro m_unmangle_reg_and_load reg, cookie, temp, offset
+ REG_L \temp, \offset
+ xor \reg, \temp, \cookie
+.endm
+
/*
*
* GPOFF and FRAMESIZE must be the same for all setjmp/longjmp routines
@@ -190,36 +199,46 @@ setjmp_common:
li t0, ~7
and a0, t0 # round jmpbuf addr DOWN to 8-byte boundary
#endif
- sw a1, SC_FLAG_OFFSET(a0) # save savesigs flag
- beqz a1, 1f # do saving of signal mask?
-
REG_S ra, RAOFF(sp) # spill state
REG_S a0, A0OFF(sp)
+
+ # get the cookie and store it along with the signal flag.
+ move a0, a1
+ jal __bionic_setjmp_cookie_get
+ REG_L a0, A0OFF(sp)
+
+ REG_S v0, SC_FLAG_OFFSET(a0) # save cookie and savesigs flag
+ andi t0, v0, 1 # extract savesigs flag
+
+ beqz t0, 1f # do saving of signal mask?
+
# call sigprocmask(int how ignored, sigset_t* null, sigset_t* SC_MASK(a0)):
LA a2, SC_MASK_OFFSET(a0) # gets current signal mask
li a0, 0 # how; ignored when new mask is null
li a1, 0 # null new mask
jal sigprocmask # get current signal mask
REG_L a0, A0OFF(sp)
- REG_L ra, RAOFF(sp)
1:
- li v0, 0xACEDBADE # sigcontext magic number
- sw v0, SC_MAGIC_OFFSET(a0)
+ REG_L gp, GPOFF(sp) # restore spills
+ REG_L ra, RAOFF(sp)
+ REG_L t0, SC_FLAG_OFFSET(a0) # move cookie to temp reg
+
# callee-saved long-sized regs:
- REG_S ra, SC_REGS+0*REGSZ(a0)
- REG_S s0, SC_REGS+1*REGSZ(a0)
- REG_S s1, SC_REGS+2*REGSZ(a0)
- REG_S s2, SC_REGS+3*REGSZ(a0)
- REG_S s3, SC_REGS+4*REGSZ(a0)
- REG_S s4, SC_REGS+5*REGSZ(a0)
- REG_S s5, SC_REGS+6*REGSZ(a0)
- REG_S s6, SC_REGS+7*REGSZ(a0)
- REG_S s7, SC_REGS+8*REGSZ(a0)
- REG_S s8, SC_REGS+9*REGSZ(a0)
- REG_L v0, GPOFF(sp)
- REG_S v0, SC_REGS+10*REGSZ(a0) # save gp
- PTR_ADDU v0, sp, FRAMESZ
- REG_S v0, SC_REGS+11*REGSZ(a0) # save orig sp
+ PTR_ADDU v1, sp, FRAMESZ # save orig sp
+
+ # m_mangle_reg_and_store reg, cookie, temp, offset
+ m_mangle_reg_and_store ra, t0, t1, SC_REGS+0*REGSZ(a0)
+ m_mangle_reg_and_store s0, t0, t2, SC_REGS+1*REGSZ(a0)
+ m_mangle_reg_and_store s1, t0, t3, SC_REGS+2*REGSZ(a0)
+ m_mangle_reg_and_store s2, t0, t1, SC_REGS+3*REGSZ(a0)
+ m_mangle_reg_and_store s3, t0, t2, SC_REGS+4*REGSZ(a0)
+ m_mangle_reg_and_store s4, t0, t3, SC_REGS+5*REGSZ(a0)
+ m_mangle_reg_and_store s5, t0, t1, SC_REGS+6*REGSZ(a0)
+ m_mangle_reg_and_store s6, t0, t2, SC_REGS+7*REGSZ(a0)
+ m_mangle_reg_and_store s7, t0, t3, SC_REGS+8*REGSZ(a0)
+ m_mangle_reg_and_store s8, t0, t1, SC_REGS+9*REGSZ(a0)
+ m_mangle_reg_and_store gp, t0, t2, SC_REGS+10*REGSZ(a0)
+ m_mangle_reg_and_store v1, t0, t3, SC_REGS+11*REGSZ(a0)
cfc1 v0, $31
@@ -288,36 +307,41 @@ NON_LEAF(siglongjmp, FRAMESZ, ra)
li t0, ~7
and a0, t0 # round jmpbuf addr DOWN to 8-byte boundary
#endif
- lw v0, SC_MAGIC_OFFSET(a0)
- li t0, 0xACEDBADE
- bne v0, t0, longjmp_botch # jump if error
- lw t0, SC_FLAG_OFFSET(a0) # get savesigs flag
+ move s1, a1 # temp spill
+ move s0, a0
+
+ # extract savesigs flag
+ REG_L s2, SC_FLAG_OFFSET(s0)
+ andi t0, s2, 1
beqz t0, 1f # restore signal mask?
- REG_S a1, A1OFF(sp) # temp spill
- REG_S a0, A0OFF(sp)
- # call sigprocmask(int how SIG_SETMASK, sigset_t* SC_MASK(a0), sigset_t* null):
- LA a1, SC_MASK_OFFSET(a0) # signals being restored
+ # call sigprocmask(int how SIG_SETMASK, sigset_t* SC_MASK(a0), sigset_t* null):
+ LA a1, SC_MASK_OFFSET(s0) # signals being restored
li a0, 3 # mips SIG_SETMASK
li a2, 0 # null
jal sigprocmask # restore signal mask
- REG_L a0, A0OFF(sp)
- REG_L a1, A1OFF(sp)
1:
+ move t0, s2 # get cookie to temp reg
+ move a1, s1
+ move a0, s0
+
# callee-saved long-sized regs:
- REG_L ra, SC_REGS+0*REGSZ(a0)
- REG_L s0, SC_REGS+1*REGSZ(a0)
- REG_L s1, SC_REGS+2*REGSZ(a0)
- REG_L s2, SC_REGS+3*REGSZ(a0)
- REG_L s3, SC_REGS+4*REGSZ(a0)
- REG_L s4, SC_REGS+5*REGSZ(a0)
- REG_L s5, SC_REGS+6*REGSZ(a0)
- REG_L s6, SC_REGS+7*REGSZ(a0)
- REG_L s7, SC_REGS+8*REGSZ(a0)
- REG_L s8, SC_REGS+9*REGSZ(a0)
- REG_L gp, SC_REGS+10*REGSZ(a0)
- REG_L sp, SC_REGS+11*REGSZ(a0)
+
+ # m_unmangle_reg_and_load reg, cookie, temp, offset
+ # don't restore gp yet, old value is needed for cookie_check call
+ m_unmangle_reg_and_load ra, t0, t1, SC_REGS+0*REGSZ(a0)
+ m_unmangle_reg_and_load s0, t0, t2, SC_REGS+1*REGSZ(a0)
+ m_unmangle_reg_and_load s1, t0, t3, SC_REGS+2*REGSZ(a0)
+ m_unmangle_reg_and_load s2, t0, t1, SC_REGS+3*REGSZ(a0)
+ m_unmangle_reg_and_load s3, t0, t2, SC_REGS+4*REGSZ(a0)
+ m_unmangle_reg_and_load s4, t0, t3, SC_REGS+5*REGSZ(a0)
+ m_unmangle_reg_and_load s5, t0, t1, SC_REGS+6*REGSZ(a0)
+ m_unmangle_reg_and_load s6, t0, t2, SC_REGS+7*REGSZ(a0)
+ m_unmangle_reg_and_load s7, t0, t3, SC_REGS+8*REGSZ(a0)
+ m_unmangle_reg_and_load s8, t0, t1, SC_REGS+9*REGSZ(a0)
+ m_unmangle_reg_and_load v1, t0, t2, SC_REGS+10*REGSZ(a0)
+ m_unmangle_reg_and_load sp, t0, t3, SC_REGS+11*REGSZ(a0)
lw v0, SC_FPSR_OFFSET(a0)
ctc1 v0, $31 # restore old fr mode before fp values
@@ -341,15 +365,22 @@ NON_LEAF(siglongjmp, FRAMESZ, ra)
l.d $f28, SC_FPREGS+4*REGSZ_FP(a0)
l.d $f30, SC_FPREGS+5*REGSZ_FP(a0)
#endif
- bne a1, zero, 1f
- li a1, 1 # never return 0!
-1:
- move v0, a1
- j ra # return to setjmp call site
-longjmp_botch:
- jal longjmperror
- jal abort
+ # check cookie
+ PTR_SUBU sp, FRAMESZ
+ REG_S v1, GPOFF(sp)
+ REG_S ra, RAOFF(sp)
+ REG_S a1, A1OFF(sp)
+ move a0, t0
+ jal __bionic_setjmp_cookie_check
+ REG_L gp, GPOFF(sp)
+ REG_L ra, RAOFF(sp)
+ REG_L a1, A1OFF(sp)
+ PTR_ADDU sp, FRAMESZ
+
+ sltiu t0, a1, 1 # never return 0!
+ xor v0, a1, t0
+ j ra # return to setjmp call site
END(siglongjmp)
ALIAS_SYMBOL(longjmp, siglongjmp)
diff --git a/libc/arch-mips/bionic/vfork.S b/libc/arch-mips/bionic/vfork.S
index 18496249b..7ccf70b2f 100644
--- a/libc/arch-mips/bionic/vfork.S
+++ b/libc/arch-mips/bionic/vfork.S
@@ -37,6 +37,14 @@ ENTRY(vfork)
.set noreorder
.cpload t9
+ // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+ .set push
+ .set mips32r2
+ rdhwr v0, $29 // v0 = tls; kernel trap on mips32r1
+ .set pop
+ lw v0, REGSZ*1(v0) // v0 = v0[TLS_SLOT_THREAD_ID ie 1]
+ sw $0, REGSZ*2+4(v0) // v0->cached_pid_ = 0
+
li a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
li a1, 0
li a2, 0
diff --git a/libc/arch-mips/mips.mk b/libc/arch-mips/mips.mk
index 05e719854..b184abb9a 100644
--- a/libc/arch-mips/mips.mk
+++ b/libc/arch-mips/mips.mk
@@ -1,45 +1,10 @@
# 32-bit mips.
-#
-# Default implementations of functions that are commonly optimized.
-#
-
libc_bionic_src_files_mips += \
arch-mips/string/memcmp.c \
arch-mips/string/memcpy.S \
arch-mips/string/memset.S \
arch-mips/string/strcmp.S \
- bionic/__memcpy_chk.cpp \
- bionic/__memset_chk.cpp \
- bionic/__strcpy_chk.cpp \
- bionic/__strcat_chk.cpp \
- bionic/strchr.cpp \
- bionic/strnlen.c \
- bionic/strrchr.cpp \
-
-libc_freebsd_src_files_mips += \
- upstream-freebsd/lib/libc/string/wcscat.c \
- upstream-freebsd/lib/libc/string/wcschr.c \
- upstream-freebsd/lib/libc/string/wcscmp.c \
- upstream-freebsd/lib/libc/string/wcscpy.c \
- upstream-freebsd/lib/libc/string/wcslen.c \
- upstream-freebsd/lib/libc/string/wcsrchr.c \
- upstream-freebsd/lib/libc/string/wmemcmp.c \
- upstream-freebsd/lib/libc/string/wmemmove.c \
-
-libc_openbsd_src_files_mips += \
- upstream-openbsd/lib/libc/string/memchr.c \
- upstream-openbsd/lib/libc/string/memmove.c \
- upstream-openbsd/lib/libc/string/memrchr.c \
- upstream-openbsd/lib/libc/string/stpcpy.c \
- upstream-openbsd/lib/libc/string/stpncpy.c \
- upstream-openbsd/lib/libc/string/strcat.c \
- upstream-openbsd/lib/libc/string/strcpy.c \
- upstream-openbsd/lib/libc/string/strlcat.c \
- upstream-openbsd/lib/libc/string/strlcpy.c \
- upstream-openbsd/lib/libc/string/strncat.c \
- upstream-openbsd/lib/libc/string/strncmp.c \
- upstream-openbsd/lib/libc/string/strncpy.c \
#
# Inherently architecture-specific code.
diff --git a/libc/arch-mips/syscalls/flistxattr.S b/libc/arch-mips/syscalls/___flistxattr.S
index 0b715327d..5a4a53d5b 100644
--- a/libc/arch-mips/syscalls/flistxattr.S
+++ b/libc/arch-mips/syscalls/___flistxattr.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(flistxattr)
+ENTRY(___flistxattr)
.set noreorder
.cpload t9
li v0, __NR_flistxattr
@@ -16,4 +16,5 @@ ENTRY(flistxattr)
j t9
nop
.set reorder
-END(flistxattr)
+END(___flistxattr)
+.hidden ___flistxattr
diff --git a/libc/arch-mips/syscalls/mremap.S b/libc/arch-mips/syscalls/___mremap.S
index 7cbb94e7e..82e2eb366 100644
--- a/libc/arch-mips/syscalls/mremap.S
+++ b/libc/arch-mips/syscalls/___mremap.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(mremap)
+ENTRY(___mremap)
.set noreorder
.cpload t9
li v0, __NR_mremap
@@ -16,4 +16,5 @@ ENTRY(mremap)
j t9
nop
.set reorder
-END(mremap)
+END(___mremap)
+.hidden ___mremap
diff --git a/libc/arch-mips/syscalls/__preadv64.S b/libc/arch-mips/syscalls/__preadv64.S
new file mode 100644
index 000000000..a46b86983
--- /dev/null
+++ b/libc/arch-mips/syscalls/__preadv64.S
@@ -0,0 +1,19 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(__preadv64)
+ .set noreorder
+ .cpload t9
+ li v0, __NR_preadv
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ la t9,__set_errno_internal
+ j t9
+ nop
+ .set reorder
+END(__preadv64)
diff --git a/libc/arch-mips/syscalls/__pwritev64.S b/libc/arch-mips/syscalls/__pwritev64.S
new file mode 100644
index 000000000..1222942f2
--- /dev/null
+++ b/libc/arch-mips/syscalls/__pwritev64.S
@@ -0,0 +1,19 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(__pwritev64)
+ .set noreorder
+ .cpload t9
+ li v0, __NR_pwritev
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ la t9,__set_errno_internal
+ j t9
+ nop
+ .set reorder
+END(__pwritev64)
diff --git a/libc/arch-mips/syscalls/adjtimex.S b/libc/arch-mips/syscalls/adjtimex.S
new file mode 100644
index 000000000..fef215f9c
--- /dev/null
+++ b/libc/arch-mips/syscalls/adjtimex.S
@@ -0,0 +1,19 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(adjtimex)
+ .set noreorder
+ .cpload t9
+ li v0, __NR_adjtimex
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ la t9,__set_errno_internal
+ j t9
+ nop
+ .set reorder
+END(adjtimex)
diff --git a/libc/arch-mips/syscalls/clock_adjtime.S b/libc/arch-mips/syscalls/clock_adjtime.S
new file mode 100644
index 000000000..f8a4ce22d
--- /dev/null
+++ b/libc/arch-mips/syscalls/clock_adjtime.S
@@ -0,0 +1,19 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(clock_adjtime)
+ .set noreorder
+ .cpload t9
+ li v0, __NR_clock_adjtime
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ la t9,__set_errno_internal
+ j t9
+ nop
+ .set reorder
+END(clock_adjtime)
diff --git a/libc/arch-mips64/bionic/vfork.S b/libc/arch-mips64/bionic/vfork.S
index d180a8cf2..e0a39ed38 100644
--- a/libc/arch-mips64/bionic/vfork.S
+++ b/libc/arch-mips64/bionic/vfork.S
@@ -46,6 +46,12 @@ LEAF(vfork,FRAMESZ)
PTR_SUBU sp, FRAMESZ
#endif
SETUP_GP64(a5, vfork)
+
+ // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+ rdhwr v0, $29 // v0 = tls
+ REG_L v0, REGSZ*1(v0) // v0 = v0[TLS_SLOT_THREAD_ID ie 1]
+ sw $0, REGSZ*2+4(v0) // v0->cached_pid_ = 0
+
LI a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
move a1, $0
move a2, $0
diff --git a/libc/arch-mips64/mips64.mk b/libc/arch-mips64/mips64.mk
index 77573851c..20ee639ee 100644
--- a/libc/arch-mips64/mips64.mk
+++ b/libc/arch-mips64/mips64.mk
@@ -1,46 +1,11 @@
# 64-bit mips.
-#
-# Default implementations of functions that are commonly optimized.
-#
-
libc_bionic_src_files_mips64 += \
arch-mips/string/memcmp.c \
arch-mips/string/memcpy.S \
arch-mips/string/memset.S \
arch-mips/string/strcmp.S \
arch-mips/string/strlen.c \
- bionic/__memcpy_chk.cpp \
- bionic/__memset_chk.cpp \
- bionic/__strcpy_chk.cpp \
- bionic/__strcat_chk.cpp \
- bionic/strchr.cpp \
- bionic/strnlen.c \
- bionic/strrchr.cpp \
-
-libc_freebsd_src_files_mips64 += \
- upstream-freebsd/lib/libc/string/wcscat.c \
- upstream-freebsd/lib/libc/string/wcschr.c \
- upstream-freebsd/lib/libc/string/wcscmp.c \
- upstream-freebsd/lib/libc/string/wcscpy.c \
- upstream-freebsd/lib/libc/string/wcslen.c \
- upstream-freebsd/lib/libc/string/wcsrchr.c \
- upstream-freebsd/lib/libc/string/wmemcmp.c \
- upstream-freebsd/lib/libc/string/wmemmove.c \
-
-libc_openbsd_src_files_mips64 += \
- upstream-openbsd/lib/libc/string/memchr.c \
- upstream-openbsd/lib/libc/string/memmove.c \
- upstream-openbsd/lib/libc/string/memrchr.c \
- upstream-openbsd/lib/libc/string/stpcpy.c \
- upstream-openbsd/lib/libc/string/stpncpy.c \
- upstream-openbsd/lib/libc/string/strcat.c \
- upstream-openbsd/lib/libc/string/strcpy.c \
- upstream-openbsd/lib/libc/string/strlcat.c \
- upstream-openbsd/lib/libc/string/strlcpy.c \
- upstream-openbsd/lib/libc/string/strncat.c \
- upstream-openbsd/lib/libc/string/strncmp.c \
- upstream-openbsd/lib/libc/string/strncpy.c \
#
# Inherently architecture-specific code.
diff --git a/libc/arch-mips64/syscalls/flistxattr.S b/libc/arch-mips64/syscalls/___flistxattr.S
index 1d5b1b028..586bcf747 100644
--- a/libc/arch-mips64/syscalls/flistxattr.S
+++ b/libc/arch-mips64/syscalls/___flistxattr.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(flistxattr)
+ENTRY(___flistxattr)
.set push
.set noreorder
li v0, __NR_flistxattr
@@ -22,4 +22,5 @@ ENTRY(flistxattr)
j t9
move ra, t0
.set pop
-END(flistxattr)
+END(___flistxattr)
+.hidden ___flistxattr
diff --git a/libc/arch-mips64/syscalls/mremap.S b/libc/arch-mips64/syscalls/___mremap.S
index cf7f1ded8..5004d505a 100644
--- a/libc/arch-mips64/syscalls/mremap.S
+++ b/libc/arch-mips64/syscalls/___mremap.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(mremap)
+ENTRY(___mremap)
.set push
.set noreorder
li v0, __NR_mremap
@@ -22,4 +22,5 @@ ENTRY(mremap)
j t9
move ra, t0
.set pop
-END(mremap)
+END(___mremap)
+.hidden ___mremap
diff --git a/libc/arch-mips64/syscalls/adjtimex.S b/libc/arch-mips64/syscalls/adjtimex.S
new file mode 100644
index 000000000..57b012cc6
--- /dev/null
+++ b/libc/arch-mips64/syscalls/adjtimex.S
@@ -0,0 +1,25 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(adjtimex)
+ .set push
+ .set noreorder
+ li v0, __NR_adjtimex
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ move t0, ra
+ bal 2f
+ nop
+2:
+ .cpsetup ra, t1, 2b
+ LA t9,__set_errno_internal
+ .cpreturn
+ j t9
+ move ra, t0
+ .set pop
+END(adjtimex)
diff --git a/libc/arch-mips64/syscalls/clock_adjtime.S b/libc/arch-mips64/syscalls/clock_adjtime.S
new file mode 100644
index 000000000..206e9fdd9
--- /dev/null
+++ b/libc/arch-mips64/syscalls/clock_adjtime.S
@@ -0,0 +1,25 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(clock_adjtime)
+ .set push
+ .set noreorder
+ li v0, __NR_clock_adjtime
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ move t0, ra
+ bal 2f
+ nop
+2:
+ .cpsetup ra, t1, 2b
+ LA t9,__set_errno_internal
+ .cpreturn
+ j t9
+ move ra, t0
+ .set pop
+END(clock_adjtime)
diff --git a/libc/arch-mips64/syscalls/preadv.S b/libc/arch-mips64/syscalls/preadv.S
new file mode 100644
index 000000000..df43a8dc1
--- /dev/null
+++ b/libc/arch-mips64/syscalls/preadv.S
@@ -0,0 +1,27 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(preadv)
+ .set push
+ .set noreorder
+ li v0, __NR_preadv
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ move t0, ra
+ bal 2f
+ nop
+2:
+ .cpsetup ra, t1, 2b
+ LA t9,__set_errno_internal
+ .cpreturn
+ j t9
+ move ra, t0
+ .set pop
+END(preadv)
+
+ALIAS_SYMBOL(preadv64, preadv)
diff --git a/libc/arch-mips64/syscalls/pwritev.S b/libc/arch-mips64/syscalls/pwritev.S
new file mode 100644
index 000000000..f55cec02b
--- /dev/null
+++ b/libc/arch-mips64/syscalls/pwritev.S
@@ -0,0 +1,27 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(pwritev)
+ .set push
+ .set noreorder
+ li v0, __NR_pwritev
+ syscall
+ bnez a3, 1f
+ move a0, v0
+ j ra
+ nop
+1:
+ move t0, ra
+ bal 2f
+ nop
+2:
+ .cpsetup ra, t1, 2b
+ LA t9,__set_errno_internal
+ .cpreturn
+ j t9
+ move ra, t0
+ .set pop
+END(pwritev)
+
+ALIAS_SYMBOL(pwritev64, pwritev)
diff --git a/libc/arch-x86/atom/atom.mk b/libc/arch-x86/atom/atom.mk
index 3f28fb236..1afabaca0 100644
--- a/libc/arch-x86/atom/atom.mk
+++ b/libc/arch-x86/atom/atom.mk
@@ -1,32 +1,27 @@
libc_bionic_src_files_x86 += \
arch-x86/atom/string/sse2-bzero-atom.S \
- arch-x86/atom/string/sse2-memchr-atom.S \
- arch-x86/atom/string/sse2-memrchr-atom.S \
arch-x86/atom/string/sse2-memset-atom.S \
- arch-x86/atom/string/sse2-strchr-atom.S \
arch-x86/atom/string/sse2-strlen-atom.S \
- arch-x86/atom/string/sse2-strnlen-atom.S \
- arch-x86/atom/string/sse2-strrchr-atom.S \
- arch-x86/atom/string/sse2-wcschr-atom.S \
- arch-x86/atom/string/sse2-wcsrchr-atom.S \
- arch-x86/atom/string/sse2-wcslen-atom.S \
- arch-x86/atom/string/sse2-wcscmp-atom.S \
arch-x86/atom/string/ssse3-bcopy-atom.S \
arch-x86/atom/string/ssse3-memcmp-atom.S \
arch-x86/atom/string/ssse3-memcpy-atom.S \
arch-x86/atom/string/ssse3-memmove-atom.S \
- arch-x86/atom/string/ssse3-strcat-atom.S \
- arch-x86/atom/string/ssse3-strcmp-atom.S \
arch-x86/atom/string/ssse3-strcpy-atom.S \
- arch-x86/atom/string/ssse3-strlcat-atom.S \
- arch-x86/atom/string/ssse3-strlcpy-atom.S \
- arch-x86/atom/string/ssse3-strncat-atom.S \
- arch-x86/atom/string/ssse3-strncmp-atom.S \
arch-x86/atom/string/ssse3-strncpy-atom.S \
- arch-x86/atom/string/ssse3-wcscat-atom.S \
- arch-x86/atom/string/ssse3-wcscpy-atom.S \
arch-x86/atom/string/ssse3-wmemcmp-atom.S
-libc_bionic_src_files_x86 += \
- arch-x86/silvermont/string/sse2-stpcpy-slm.S \
- arch-x86/silvermont/string/sse2-stpncpy-slm.S
+libc_bionic_src_files_exclude_x86 += \
+ arch-x86/generic/string/memcmp.S \
+
+libc_bionic_src_files_exclude_x86 += \
+ arch-x86/silvermont/string/sse2-bcopy-slm.S \
+ arch-x86/silvermont/string/sse2-bzero-slm.S \
+ arch-x86/silvermont/string/sse2-memcpy-slm.S \
+ arch-x86/silvermont/string/sse2-memmove-slm.S \
+ arch-x86/silvermont/string/sse2-memset-slm.S \
+ arch-x86/silvermont/string/sse2-strcpy-slm.S \
+ arch-x86/silvermont/string/sse2-strlen-slm.S \
+ arch-x86/silvermont/string/sse2-strncpy-slm.S \
+
+libc_freebsd_src_files_exclude_x86 += \
+ upstream-freebsd/lib/libc/string/wmemcmp.c \
diff --git a/libc/arch-x86/atom/string/sse2-strrchr-atom.S b/libc/arch-x86/atom/string/sse2-strrchr-atom.S
index da3dc3bcb..e916bc1e5 100644
--- a/libc/arch-x86/atom/string/sse2-strrchr-atom.S
+++ b/libc/arch-x86/atom/string/sse2-strrchr-atom.S
@@ -278,7 +278,7 @@ L(find_zero):
jnz L(FindZeroExit2)
test $0x04, %cl
jnz L(FindZeroExit3)
- and $1 << 4 - 1, %eax
+ and $(1 << 4) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -296,7 +296,7 @@ L(find_zero_8):
jnz L(FindZeroExit6)
test $0x40, %cl
jnz L(FindZeroExit7)
- and $1 << 8 - 1, %eax
+ and $(1 << 8) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -317,7 +317,7 @@ L(find_zero_high):
jnz L(FindZeroExit10)
test $0x04, %ch
jnz L(FindZeroExit11)
- and $1 << 12 - 1, %eax
+ and $(1 << 12) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -335,7 +335,7 @@ L(find_zero_high_8):
jnz L(FindZeroExit14)
test $0x40, %ch
jnz L(FindZeroExit15)
- and $1 << 16 - 1, %eax
+ and $(1 << 16) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -359,7 +359,7 @@ L(FindZeroExit1):
.p2align 4
L(FindZeroExit2):
- and $1 << 2 - 1, %eax
+ and $(1 << 2) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -371,7 +371,7 @@ L(FindZeroExit2):
.p2align 4
L(FindZeroExit3):
- and $1 << 3 - 1, %eax
+ and $(1 << 3) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -383,7 +383,7 @@ L(FindZeroExit3):
.p2align 4
L(FindZeroExit5):
- and $1 << 5 - 1, %eax
+ and $(1 << 5) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -395,7 +395,7 @@ L(FindZeroExit5):
.p2align 4
L(FindZeroExit6):
- and $1 << 6 - 1, %eax
+ and $(1 << 6) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -407,7 +407,7 @@ L(FindZeroExit6):
.p2align 4
L(FindZeroExit7):
- and $1 << 7 - 1, %eax
+ and $(1 << 7) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -419,7 +419,7 @@ L(FindZeroExit7):
.p2align 4
L(FindZeroExit9):
- and $1 << 9 - 1, %eax
+ and $(1 << 9) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -431,7 +431,7 @@ L(FindZeroExit9):
.p2align 4
L(FindZeroExit10):
- and $1 << 10 - 1, %eax
+ and $(1 << 10) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -443,7 +443,7 @@ L(FindZeroExit10):
.p2align 4
L(FindZeroExit11):
- and $1 << 11 - 1, %eax
+ and $(1 << 11) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -455,7 +455,7 @@ L(FindZeroExit11):
.p2align 4
L(FindZeroExit13):
- and $1 << 13 - 1, %eax
+ and $(1 << 13) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -467,7 +467,7 @@ L(FindZeroExit13):
.p2align 4
L(FindZeroExit14):
- and $1 << 14 - 1, %eax
+ and $(1 << 14) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -479,7 +479,7 @@ L(FindZeroExit14):
.p2align 4
L(FindZeroExit15):
- and $1 << 15 - 1, %eax
+ and $(1 << 15) - 1, %eax
jz L(return_value)
POP (%ebx)
@@ -619,7 +619,7 @@ L(prolog_find_zero_1):
jnz L(PrologFindZeroExit2)
test $0x04, %cl
jnz L(PrologFindZeroExit3)
- and $1 << 4 - 1, %eax
+ and $(1 << 4) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
@@ -632,7 +632,7 @@ L(prolog_find_zero_8):
jnz L(PrologFindZeroExit6)
test $0x40, %cl
jnz L(PrologFindZeroExit7)
- and $1 << 8 - 1, %eax
+ and $(1 << 8) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
@@ -648,7 +648,7 @@ L(prolog_find_zero_high):
jnz L(PrologFindZeroExit10)
test $0x04, %ch
jnz L(PrologFindZeroExit11)
- and $1 << 12 - 1, %eax
+ and $(1 << 12) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
@@ -661,7 +661,7 @@ L(prolog_find_zero_high_8):
jnz L(PrologFindZeroExit14)
test $0x40, %ch
jnz L(PrologFindZeroExit15)
- and $1 << 16 - 1, %eax
+ and $(1 << 16) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
@@ -675,77 +675,77 @@ L(PrologFindZeroExit1):
.p2align 4
L(PrologFindZeroExit2):
- and $1 << 2 - 1, %eax
+ and $(1 << 2) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit3):
- and $1 << 3 - 1, %eax
+ and $(1 << 3) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit5):
- and $1 << 5 - 1, %eax
+ and $(1 << 5) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit6):
- and $1 << 6 - 1, %eax
+ and $(1 << 6) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit7):
- and $1 << 7 - 1, %eax
+ and $(1 << 7) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit9):
- and $1 << 9 - 1, %eax
+ and $(1 << 9) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit10):
- and $1 << 10 - 1, %eax
+ and $(1 << 10) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit11):
- and $1 << 11 - 1, %eax
+ and $(1 << 11) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit13):
- and $1 << 13 - 1, %eax
+ and $(1 << 13) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit14):
- and $1 << 14 - 1, %eax
+ and $(1 << 14) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
.p2align 4
L(PrologFindZeroExit15):
- and $1 << 15 - 1, %eax
+ and $(1 << 15) - 1, %eax
jnz L(match_case1)
xor %eax, %eax
RETURN
diff --git a/libc/arch-x86/atom/string/sse2-wcsrchr-atom.S b/libc/arch-x86/atom/string/sse2-wcsrchr-atom.S
index e30779d4c..1a55df24a 100644
--- a/libc/arch-x86/atom/string/sse2-wcsrchr-atom.S
+++ b/libc/arch-x86/atom/string/sse2-wcsrchr-atom.S
@@ -280,7 +280,7 @@ L(find_zero):
.p2align 4
L(find_zero_in_second_wchar):
- and $1 << 5 - 1, %eax
+ and $(1 << 5) - 1, %eax
jz L(return_value)
POP (%esi)
@@ -296,7 +296,7 @@ L(find_zero_in_second_wchar):
L(find_zero_in_third_or_fourth_wchar):
test $15, %ch
jz L(find_zero_in_fourth_wchar)
- and $1 << 9 - 1, %eax
+ and $(1 << 9) - 1, %eax
jz L(return_value)
POP (%esi)
@@ -368,7 +368,7 @@ L(prolog_find_zero_1):
.p2align 4
L(prolog_find_zero_in_second_wchar):
- and $1 << 5 - 1, %eax
+ and $(1 << 5) - 1, %eax
jz L(return_null)
test $15 << 4, %al
@@ -380,7 +380,7 @@ L(prolog_find_zero_in_second_wchar):
L(prolog_find_zero_in_third_or_fourth_wchar):
test $15, %ch
jz L(prolog_find_zero_in_fourth_wchar)
- and $1 << 9 - 1, %eax
+ and $(1 << 9) - 1, %eax
jz L(return_null)
test %ah, %ah
diff --git a/libc/arch-x86/atom/string/ssse3-strcmp-atom.S b/libc/arch-x86/atom/string/ssse3-strcmp-atom.S
index 12753790d..ee253b938 100644
--- a/libc/arch-x86/atom/string/ssse3-strcmp-atom.S
+++ b/libc/arch-x86/atom/string/ssse3-strcmp-atom.S
@@ -115,6 +115,7 @@ name: \
ENTRY (STRCMP)
#ifdef USE_AS_STRNCMP
PUSH (%ebp)
+ cfi_remember_state
#endif
movl STR1(%esp), %edx
movl STR2(%esp), %eax
@@ -213,9 +214,6 @@ L(crosspage):
PUSH (%ebx)
PUSH (%edi)
PUSH (%esi)
-#ifdef USE_AS_STRNCMP
- cfi_remember_state
-#endif
movl %edx, %edi
movl %eax, %ecx
@@ -2103,7 +2101,6 @@ L(neq_bigger):
RETURN
#ifdef USE_AS_STRNCMP
- cfi_restore_state
.p2align 4
L(more8byteseq):
POP (%esi)
@@ -2120,7 +2117,7 @@ L(eq):
ret
#ifdef USE_AS_STRNCMP
- CFI_PUSH (%ebp)
+ cfi_restore_state
.p2align 4
L(less16bytes_sncmp):
diff --git a/libc/arch-x86/atom/string/ssse3-strcpy-atom.S b/libc/arch-x86/atom/string/ssse3-strcpy-atom.S
index 30254caae..3690b0dd2 100644
--- a/libc/arch-x86/atom/string/ssse3-strcpy-atom.S
+++ b/libc/arch-x86/atom/string/ssse3-strcpy-atom.S
@@ -3147,7 +3147,7 @@ L(ExitTail16):
#endif
#ifdef USE_AS_STRNCPY
-# ifndef USE_AS_STRCAT
+# if !defined(USE_AS_STRCAT) && !defined(USE_AS_STRLCPY)
CFI_PUSH (%esi)
CFI_PUSH (%edi)
# endif
diff --git a/libc/arch-x86/bionic/setjmp.S b/libc/arch-x86/bionic/setjmp.S
index 18ad810ee..efb645993 100644
--- a/libc/arch-x86/bionic/setjmp.S
+++ b/libc/arch-x86/bionic/setjmp.S
@@ -32,6 +32,21 @@
#include <private/bionic_asm.h>
+// The internal structure of a jmp_buf is totally private.
+// Current layout (changes from release to release):
+//
+// word name description
+// 0 edx registers
+// 1 ebx
+// 2 esp
+// 3 ebp
+// 4 esi
+// 5 edi
+// 6 sigmask signal mask (not used with _setjmp / _longjmp)
+// 7 sigflag/cookie setjmp cookie in top 31 bits, signal mask flag in low bit
+// 8 checksum checksum of the core registers, to give better error messages.
+// 9 reserved
+
#define _JB_EDX 0
#define _JB_EBX 1
#define _JB_ESP 2
@@ -40,31 +55,58 @@
#define _JB_EDI 5
#define _JB_SIGMASK 6
#define _JB_SIGFLAG 7
+#define _JB_CHECKSUM 8
+
+.macro m_mangle_registers reg
+ xorl \reg,%edx
+ xorl \reg,%ebx
+ xorl \reg,%esp
+ xorl \reg,%ebp
+ xorl \reg,%esi
+ xorl \reg,%edi
+.endm
+
+.macro m_unmangle_registers reg
+ m_mangle_registers \reg
+.endm
+
+.macro m_calculate_checksum dst, src
+ movl $0, \dst
+ .irp i,0,1,2,3,4,5
+ xorl (\i*4)(\src), \dst
+ .endr
+.endm
ENTRY(setjmp)
movl 4(%esp),%ecx
- movl $1,(_JB_SIGFLAG * 4)(%ecx)
- jmp .L_sigsetjmp_signal_mask
+ mov $1,%eax
+ jmp .L_sigsetjmp
END(setjmp)
ENTRY(_setjmp)
movl 4(%esp),%ecx
- movl $0,(_JB_SIGFLAG * 4)(%ecx)
- jmp .L_sigsetjmp_no_signal_mask
+ movl $0,%eax
+ jmp .L_sigsetjmp
END(_setjmp)
ENTRY(sigsetjmp)
movl 4(%esp),%ecx
movl 8(%esp),%eax
- // Record whether or not the signal mask is valid.
+.L_sigsetjmp:
+ PIC_PROLOGUE
+ pushl %eax
+ call PIC_PLT(__bionic_setjmp_cookie_get)
+ addl $4,%esp
+ PIC_EPILOGUE
+
+ // Record the setjmp cookie and whether or not we're saving the signal mask.
movl %eax,(_JB_SIGFLAG * 4)(%ecx)
// Do we need to save the signal mask?
- testl %eax,%eax
+ testl $1,%eax
jz 1f
-.L_sigsetjmp_signal_mask:
// Get the current signal mask.
PIC_PROLOGUE
pushl $0
@@ -76,25 +118,40 @@ ENTRY(sigsetjmp)
movl 4(%esp),%ecx
movl %eax,(_JB_SIGMASK * 4)(%ecx)
-.L_sigsetjmp_no_signal_mask:
1:
+ // Fetch the setjmp cookie and clear the signal flag bit.
+ movl (_JB_SIGFLAG * 4)(%ecx),%eax
+ andl $-2,%eax
+
// Save the callee-save registers.
movl 0(%esp),%edx
+ m_mangle_registers %eax
movl %edx,(_JB_EDX * 4)(%ecx)
movl %ebx,(_JB_EBX * 4)(%ecx)
movl %esp,(_JB_ESP * 4)(%ecx)
movl %ebp,(_JB_EBP * 4)(%ecx)
movl %esi,(_JB_ESI * 4)(%ecx)
movl %edi,(_JB_EDI * 4)(%ecx)
+ m_unmangle_registers %eax
+
+ m_calculate_checksum %eax, %ecx
+ movl %eax, (_JB_CHECKSUM * 4)(%ecx)
xorl %eax,%eax
ret
END(sigsetjmp)
ENTRY(siglongjmp)
- // Do we have a signal mask to restore?
movl 4(%esp),%edx
- cmpl $0,(_JB_SIGFLAG * 4)(%edx)
+
+ // Check the checksum before doing anything.
+ m_calculate_checksum %eax, %edx
+ xorl (_JB_CHECKSUM * 4)(%edx), %eax
+ jnz 3f
+
+ // Do we have a signal mask to restore?
+ movl (_JB_SIGFLAG * 4)(%edx), %eax
+ testl $1,%eax
jz 1f
// Restore the signal mask.
@@ -108,12 +165,31 @@ ENTRY(siglongjmp)
// Restore the callee-save registers.
movl 4(%esp),%edx
movl 8(%esp),%eax
- movl (_JB_EDX * 4)(%edx),%ecx
- movl (_JB_EBX * 4)(%edx),%ebx
- movl (_JB_ESP * 4)(%edx),%esp
- movl (_JB_EBP * 4)(%edx),%ebp
- movl (_JB_ESI * 4)(%edx),%esi
- movl (_JB_EDI * 4)(%edx),%edi
+
+ movl (_JB_SIGFLAG * 4)(%edx),%ecx
+ andl $-2,%ecx
+
+ movl %ecx,%ebx
+ movl %ecx,%esp
+ movl %ecx,%ebp
+ movl %ecx,%esi
+ movl %ecx,%edi
+ xorl (_JB_EDX * 4)(%edx),%ecx
+ xorl (_JB_EBX * 4)(%edx),%ebx
+ xorl (_JB_ESP * 4)(%edx),%esp
+ xorl (_JB_EBP * 4)(%edx),%ebp
+ xorl (_JB_ESI * 4)(%edx),%esi
+ xorl (_JB_EDI * 4)(%edx),%edi
+
+ PIC_PROLOGUE
+ pushl %eax
+ pushl %ecx
+ pushl (_JB_SIGFLAG * 4)(%edx)
+ call PIC_PLT(__bionic_setjmp_cookie_check)
+ addl $4,%esp
+ popl %ecx
+ popl %eax
+ PIC_EPILOGUE
testl %eax,%eax
jnz 2f
@@ -121,6 +197,11 @@ ENTRY(siglongjmp)
2:
movl %ecx,0(%esp)
ret
+
+3:
+ PIC_PROLOGUE
+ pushl (_JB_SIGMASK * 4)(%edx)
+ call PIC_PLT(__bionic_setjmp_checksum_mismatch)
END(siglongjmp)
ALIAS_SYMBOL(longjmp, siglongjmp)
diff --git a/libc/arch-x86/bionic/syscall.S b/libc/arch-x86/bionic/syscall.S
index 2a1510273..12402aca4 100644
--- a/libc/arch-x86/bionic/syscall.S
+++ b/libc/arch-x86/bionic/syscall.S
@@ -27,18 +27,25 @@ ENTRY(syscall)
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
+ # Get and save the system call entry address.
+ call __kernel_syscall
+ push %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
# Load all the arguments from the calling frame.
# (Not all will be valid, depending on the syscall.)
- mov 20(%esp),%eax
- mov 24(%esp),%ebx
- mov 28(%esp),%ecx
- mov 32(%esp),%edx
- mov 36(%esp),%esi
- mov 40(%esp),%edi
- mov 44(%esp),%ebp
+ mov 24(%esp),%eax
+ mov 28(%esp),%ebx
+ mov 32(%esp),%ecx
+ mov 36(%esp),%edx
+ mov 40(%esp),%esi
+ mov 44(%esp),%edi
+ mov 48(%esp),%ebp
# Make the system call.
- int $0x80
+ call *(%esp)
+ addl $4, %esp
# Error?
cmpl $-MAX_ERRNO, %eax
diff --git a/libc/arch-x86/bionic/vfork.S b/libc/arch-x86/bionic/vfork.S
index ca7af0f7a..5c71b8dbc 100644
--- a/libc/arch-x86/bionic/vfork.S
+++ b/libc/arch-x86/bionic/vfork.S
@@ -34,6 +34,12 @@ ENTRY(vfork)
popl %ecx // Grab the return address.
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+ movl %gs:0, %eax
+ movl 4(%eax), %eax
+ movl $0, 12(%eax)
+
movl $__NR_vfork, %eax
int $0x80
cmpl $-MAX_ERRNO, %eax
diff --git a/libc/arch-x86/generic/generic.mk b/libc/arch-x86/generic/generic.mk
deleted file mode 100644
index 4aee5dc63..000000000
--- a/libc/arch-x86/generic/generic.mk
+++ /dev/null
@@ -1,52 +0,0 @@
-libc_bionic_src_files_x86 += \
- arch-x86/atom/string/sse2-memchr-atom.S \
- arch-x86/atom/string/sse2-memrchr-atom.S \
- arch-x86/atom/string/sse2-strchr-atom.S \
- arch-x86/atom/string/sse2-strnlen-atom.S \
- arch-x86/atom/string/sse2-strrchr-atom.S \
- arch-x86/atom/string/sse2-wcschr-atom.S \
- arch-x86/atom/string/sse2-wcsrchr-atom.S \
- arch-x86/atom/string/sse2-wcslen-atom.S \
- arch-x86/atom/string/sse2-wcscmp-atom.S \
- arch-x86/silvermont/string/sse2-bcopy-slm.S \
- arch-x86/silvermont/string/sse2-bzero-slm.S \
- arch-x86/silvermont/string/sse2-memcpy-slm.S \
- arch-x86/silvermont/string/sse2-memmove-slm.S \
- arch-x86/silvermont/string/sse2-memset-slm.S \
- arch-x86/silvermont/string/sse2-stpcpy-slm.S \
- arch-x86/silvermont/string/sse2-stpncpy-slm.S \
- arch-x86/silvermont/string/sse2-strcpy-slm.S \
- arch-x86/silvermont/string/sse2-strlen-slm.S \
- arch-x86/silvermont/string/sse2-strncpy-slm.S
-
-ifeq ($(ARCH_X86_HAVE_SSSE3),true)
-libc_bionic_src_files_x86 += \
- arch-x86/atom/string/ssse3-strncat-atom.S \
- arch-x86/atom/string/ssse3-strlcat-atom.S \
- arch-x86/atom/string/ssse3-strlcpy-atom.S \
- arch-x86/atom/string/ssse3-strcmp-atom.S \
- arch-x86/atom/string/ssse3-strncmp-atom.S \
- arch-x86/atom/string/ssse3-strcat-atom.S \
- arch-x86/atom/string/ssse3-wcscat-atom.S \
- arch-x86/atom/string/ssse3-wcscpy-atom.S
-else
-libc_bionic_src_files_x86 += \
- arch-x86/generic/string/strcmp.S \
- arch-x86/generic/string/strncmp.S \
- arch-x86/generic/string/strcat.S \
- upstream-freebsd/lib/libc/string/wcscpy.c \
- upstream-freebsd/lib/libc/string/wcscat.c \
- upstream-openbsd/lib/libc/string/strlcat.c \
- upstream-openbsd/lib/libc/string/strlcpy.c \
- upstream-openbsd/lib/libc/string/strncat.c
-endif
-
-ifeq ($(ARCH_X86_HAVE_SSE4),true)
- libc_bionic_src_files_x86 += \
- arch-x86/silvermont/string/sse4-memcmp-slm.S \
- arch-x86/silvermont/string/sse4-wmemcmp-slm.S
-else
-libc_bionic_src_files_x86 += \
- arch-x86/generic/string/memcmp.S \
- upstream-freebsd/lib/libc/string/wmemcmp.c
-endif
diff --git a/libc/arch-x86/silvermont/silvermont.mk b/libc/arch-x86/silvermont/silvermont.mk
index 176bee339..e69de29bb 100644
--- a/libc/arch-x86/silvermont/silvermont.mk
+++ b/libc/arch-x86/silvermont/silvermont.mk
@@ -1,32 +0,0 @@
-libc_bionic_src_files_x86 += \
- arch-x86/silvermont/string/sse2-bcopy-slm.S \
- arch-x86/silvermont/string/sse2-bzero-slm.S \
- arch-x86/silvermont/string/sse2-memcpy-slm.S \
- arch-x86/silvermont/string/sse2-memmove-slm.S \
- arch-x86/silvermont/string/sse2-memset-slm.S \
- arch-x86/silvermont/string/sse2-stpcpy-slm.S \
- arch-x86/silvermont/string/sse2-stpncpy-slm.S \
- arch-x86/silvermont/string/sse2-strcpy-slm.S \
- arch-x86/silvermont/string/sse2-strlen-slm.S \
- arch-x86/silvermont/string/sse2-strncpy-slm.S \
- arch-x86/silvermont/string/sse4-memcmp-slm.S \
- arch-x86/silvermont/string/sse4-wmemcmp-slm.S
-
-libc_bionic_src_files_x86 += \
- arch-x86/atom/string/sse2-memchr-atom.S \
- arch-x86/atom/string/sse2-memrchr-atom.S \
- arch-x86/atom/string/sse2-strchr-atom.S \
- arch-x86/atom/string/sse2-strrchr-atom.S \
- arch-x86/atom/string/sse2-strnlen-atom.S \
- arch-x86/atom/string/sse2-wcschr-atom.S \
- arch-x86/atom/string/sse2-wcsrchr-atom.S \
- arch-x86/atom/string/sse2-wcslen-atom.S \
- arch-x86/atom/string/sse2-wcscmp-atom.S \
- arch-x86/atom/string/ssse3-strncat-atom.S \
- arch-x86/atom/string/ssse3-strlcat-atom.S \
- arch-x86/atom/string/ssse3-strlcpy-atom.S \
- arch-x86/atom/string/ssse3-strcmp-atom.S \
- arch-x86/atom/string/ssse3-strncmp-atom.S \
- arch-x86/atom/string/ssse3-strcat-atom.S \
- arch-x86/atom/string/ssse3-wcscat-atom.S \
- arch-x86/atom/string/ssse3-wcscpy-atom.S
diff --git a/libc/arch-x86/silvermont/string/sse2-memmove-slm.S b/libc/arch-x86/silvermont/string/sse2-memmove-slm.S
index b971f0b39..6a8f0673c 100644
--- a/libc/arch-x86/silvermont/string/sse2-memmove-slm.S
+++ b/libc/arch-x86/silvermont/string/sse2-memmove-slm.S
@@ -327,6 +327,9 @@ L(mm_len_9_16_bytes_forward):
movq %xmm1, -8(%edx, %ecx)
jmp L(mm_return)
+ CFI_POP (%edi)
+ CFI_POP (%esi)
+
L(mm_recalc_len):
/* Compute in %ecx how many bytes are left to copy after
the main loop stops. */
diff --git a/libc/arch-x86/syscalls/___clock_nanosleep.S b/libc/arch-x86/syscalls/___clock_nanosleep.S
index 088a92eff..699874917 100644
--- a/libc/arch-x86/syscalls/___clock_nanosleep.S
+++ b/libc/arch-x86/syscalls/___clock_nanosleep.S
@@ -15,12 +15,20 @@ ENTRY(___clock_nanosleep)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_clock_nanosleep, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/___close.S b/libc/arch-x86/syscalls/___close.S
index 796944b64..b9ebdaaaf 100644
--- a/libc/arch-x86/syscalls/___close.S
+++ b/libc/arch-x86/syscalls/___close.S
@@ -6,9 +6,17 @@ ENTRY(___close)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_close, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/___faccessat.S b/libc/arch-x86/syscalls/___faccessat.S
index 361a6ea6e..b92b03d11 100644
--- a/libc/arch-x86/syscalls/___faccessat.S
+++ b/libc/arch-x86/syscalls/___faccessat.S
@@ -12,11 +12,19 @@ ENTRY(___faccessat)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_faccessat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/___fchmod.S b/libc/arch-x86/syscalls/___fchmod.S
index 119a69564..92e864c9d 100644
--- a/libc/arch-x86/syscalls/___fchmod.S
+++ b/libc/arch-x86/syscalls/___fchmod.S
@@ -9,10 +9,18 @@ ENTRY(___fchmod)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_fchmod, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/___fchmodat.S b/libc/arch-x86/syscalls/___fchmodat.S
index b15bb6448..81edf96fc 100644
--- a/libc/arch-x86/syscalls/___fchmodat.S
+++ b/libc/arch-x86/syscalls/___fchmodat.S
@@ -12,11 +12,19 @@ ENTRY(___fchmodat)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_fchmodat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/___fgetxattr.S b/libc/arch-x86/syscalls/___fgetxattr.S
index 28915113c..712728d11 100644
--- a/libc/arch-x86/syscalls/___fgetxattr.S
+++ b/libc/arch-x86/syscalls/___fgetxattr.S
@@ -15,12 +15,20 @@ ENTRY(___fgetxattr)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_fgetxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mremap.S b/libc/arch-x86/syscalls/___flistxattr.S
index 869ef5de9..a22ef3598 100644
--- a/libc/arch-x86/syscalls/mremap.S
+++ b/libc/arch-x86/syscalls/___flistxattr.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(mremap)
+ENTRY(___flistxattr)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
@@ -12,15 +12,19 @@ ENTRY(mremap)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- pushl %esi
+
+ call __kernel_syscall
+ pushl %eax
.cfi_adjust_cfa_offset 4
- .cfi_rel_offset esi, 0
+ .cfi_rel_offset eax, 0
+
mov 20(%esp), %ebx
mov 24(%esp), %ecx
mov 28(%esp), %edx
- mov 32(%esp), %esi
- movl $__NR_mremap, %eax
- int $0x80
+ movl $__NR_flistxattr, %eax
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
@@ -28,9 +32,9 @@ ENTRY(mremap)
call __set_errno_internal
addl $4, %esp
1:
- popl %esi
popl %edx
popl %ecx
popl %ebx
ret
-END(mremap)
+END(___flistxattr)
+.hidden ___flistxattr
diff --git a/libc/arch-x86/syscalls/___fsetxattr.S b/libc/arch-x86/syscalls/___fsetxattr.S
index 287dafcda..b90c9727d 100644
--- a/libc/arch-x86/syscalls/___fsetxattr.S
+++ b/libc/arch-x86/syscalls/___fsetxattr.S
@@ -18,13 +18,21 @@ ENTRY(___fsetxattr)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_fsetxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/___mremap.S b/libc/arch-x86/syscalls/___mremap.S
new file mode 100644
index 000000000..9d9bfcb17
--- /dev/null
+++ b/libc/arch-x86/syscalls/___mremap.S
@@ -0,0 +1,50 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(___mremap)
+ pushl %ebx
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset ebx, 0
+ pushl %ecx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset ecx, 0
+ pushl %edx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset edx, 0
+ pushl %esi
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset esi, 0
+ pushl %edi
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset edi, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
+ movl $__NR_mremap, %eax
+ call *(%esp)
+ addl $4, %esp
+
+ cmpl $-MAX_ERRNO, %eax
+ jb 1f
+ negl %eax
+ pushl %eax
+ call __set_errno_internal
+ addl $4, %esp
+1:
+ popl %edi
+ popl %esi
+ popl %edx
+ popl %ecx
+ popl %ebx
+ ret
+END(___mremap)
+.hidden ___mremap
diff --git a/libc/arch-x86/syscalls/___rt_sigqueueinfo.S b/libc/arch-x86/syscalls/___rt_sigqueueinfo.S
index 97d167fb5..e2997079a 100644
--- a/libc/arch-x86/syscalls/___rt_sigqueueinfo.S
+++ b/libc/arch-x86/syscalls/___rt_sigqueueinfo.S
@@ -12,11 +12,19 @@ ENTRY(___rt_sigqueueinfo)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_rt_sigqueueinfo, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__accept4.S b/libc/arch-x86/syscalls/__accept4.S
index 7b16dd488..112a8a7e1 100644
--- a/libc/arch-x86/syscalls/__accept4.S
+++ b/libc/arch-x86/syscalls/__accept4.S
@@ -9,11 +9,19 @@ ENTRY(__accept4)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $18, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__brk.S b/libc/arch-x86/syscalls/__brk.S
index 22acdad3a..bf2f1d22c 100644
--- a/libc/arch-x86/syscalls/__brk.S
+++ b/libc/arch-x86/syscalls/__brk.S
@@ -6,9 +6,17 @@ ENTRY(__brk)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_brk, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/clock_gettime.S b/libc/arch-x86/syscalls/__clock_gettime.S
index 0875cfbd9..0c0c1c409 100644
--- a/libc/arch-x86/syscalls/clock_gettime.S
+++ b/libc/arch-x86/syscalls/__clock_gettime.S
@@ -2,17 +2,25 @@
#include <private/bionic_asm.h>
-ENTRY(clock_gettime)
+ENTRY(__clock_gettime)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_clock_gettime, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
@@ -23,4 +31,4 @@ ENTRY(clock_gettime)
popl %ecx
popl %ebx
ret
-END(clock_gettime)
+END(__clock_gettime)
diff --git a/libc/arch-x86/syscalls/__connect.S b/libc/arch-x86/syscalls/__connect.S
index 475d452be..5ea160ca3 100644
--- a/libc/arch-x86/syscalls/__connect.S
+++ b/libc/arch-x86/syscalls/__connect.S
@@ -9,11 +9,19 @@ ENTRY(__connect)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $3, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__epoll_pwait.S b/libc/arch-x86/syscalls/__epoll_pwait.S
index 171caa55b..375076034 100644
--- a/libc/arch-x86/syscalls/__epoll_pwait.S
+++ b/libc/arch-x86/syscalls/__epoll_pwait.S
@@ -21,14 +21,22 @@ ENTRY(__epoll_pwait)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_epoll_pwait, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__exit.S b/libc/arch-x86/syscalls/__exit.S
index 8cf366329..841c8cfc7 100644
--- a/libc/arch-x86/syscalls/__exit.S
+++ b/libc/arch-x86/syscalls/__exit.S
@@ -6,9 +6,17 @@ ENTRY(__exit)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_exit, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__fadvise64.S b/libc/arch-x86/syscalls/__fadvise64.S
index 6e4298a17..d580a61c6 100644
--- a/libc/arch-x86/syscalls/__fadvise64.S
+++ b/libc/arch-x86/syscalls/__fadvise64.S
@@ -21,14 +21,22 @@ ENTRY(__fadvise64)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_fadvise64_64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__fcntl64.S b/libc/arch-x86/syscalls/__fcntl64.S
index d900a52d8..c886411c3 100644
--- a/libc/arch-x86/syscalls/__fcntl64.S
+++ b/libc/arch-x86/syscalls/__fcntl64.S
@@ -12,11 +12,19 @@ ENTRY(__fcntl64)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_fcntl64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__fstatfs64.S b/libc/arch-x86/syscalls/__fstatfs64.S
index 9b44743dd..2c9743528 100644
--- a/libc/arch-x86/syscalls/__fstatfs64.S
+++ b/libc/arch-x86/syscalls/__fstatfs64.S
@@ -12,11 +12,19 @@ ENTRY(__fstatfs64)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_fstatfs64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__getcpu.S b/libc/arch-x86/syscalls/__getcpu.S
index bb4c41fdc..fde730633 100644
--- a/libc/arch-x86/syscalls/__getcpu.S
+++ b/libc/arch-x86/syscalls/__getcpu.S
@@ -12,11 +12,19 @@ ENTRY(__getcpu)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_getcpu, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__getcwd.S b/libc/arch-x86/syscalls/__getcwd.S
index 8decd99ab..dc0bdedc9 100644
--- a/libc/arch-x86/syscalls/__getcwd.S
+++ b/libc/arch-x86/syscalls/__getcwd.S
@@ -9,10 +9,18 @@ ENTRY(__getcwd)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_getcwd, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__getdents64.S b/libc/arch-x86/syscalls/__getdents64.S
index 5190a6834..4228da276 100644
--- a/libc/arch-x86/syscalls/__getdents64.S
+++ b/libc/arch-x86/syscalls/__getdents64.S
@@ -12,11 +12,19 @@ ENTRY(__getdents64)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_getdents64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__getpid.S b/libc/arch-x86/syscalls/__getpid.S
index 197202c4d..aa5d34306 100644
--- a/libc/arch-x86/syscalls/__getpid.S
+++ b/libc/arch-x86/syscalls/__getpid.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(__getpid)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_getpid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__getpriority.S b/libc/arch-x86/syscalls/__getpriority.S
index dd5591f47..cf2fbc3f8 100644
--- a/libc/arch-x86/syscalls/__getpriority.S
+++ b/libc/arch-x86/syscalls/__getpriority.S
@@ -9,10 +9,18 @@ ENTRY(__getpriority)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_getpriority, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__gettimeofday.S b/libc/arch-x86/syscalls/__gettimeofday.S
new file mode 100644
index 000000000..4e24cdd69
--- /dev/null
+++ b/libc/arch-x86/syscalls/__gettimeofday.S
@@ -0,0 +1,34 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(__gettimeofday)
+ pushl %ebx
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset ebx, 0
+ pushl %ecx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
+ movl $__NR_gettimeofday, %eax
+ call *(%esp)
+ addl $4, %esp
+
+ cmpl $-MAX_ERRNO, %eax
+ jb 1f
+ negl %eax
+ pushl %eax
+ call __set_errno_internal
+ addl $4, %esp
+1:
+ popl %ecx
+ popl %ebx
+ ret
+END(__gettimeofday)
diff --git a/libc/arch-x86/syscalls/__ioctl.S b/libc/arch-x86/syscalls/__ioctl.S
index b6ee9f2ed..218963884 100644
--- a/libc/arch-x86/syscalls/__ioctl.S
+++ b/libc/arch-x86/syscalls/__ioctl.S
@@ -12,11 +12,19 @@ ENTRY(__ioctl)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_ioctl, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__llseek.S b/libc/arch-x86/syscalls/__llseek.S
index 5cc907aa8..9213891e0 100644
--- a/libc/arch-x86/syscalls/__llseek.S
+++ b/libc/arch-x86/syscalls/__llseek.S
@@ -18,13 +18,21 @@ ENTRY(__llseek)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR__llseek, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__mmap2.S b/libc/arch-x86/syscalls/__mmap2.S
index 08314c81b..0904a3d2d 100644
--- a/libc/arch-x86/syscalls/__mmap2.S
+++ b/libc/arch-x86/syscalls/__mmap2.S
@@ -21,14 +21,22 @@ ENTRY(__mmap2)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_mmap2, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__openat.S b/libc/arch-x86/syscalls/__openat.S
index 4c1170991..03c03bd95 100644
--- a/libc/arch-x86/syscalls/__openat.S
+++ b/libc/arch-x86/syscalls/__openat.S
@@ -15,12 +15,20 @@ ENTRY(__openat)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_openat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__ppoll.S b/libc/arch-x86/syscalls/__ppoll.S
index 2a1f76e3e..1a55b0342 100644
--- a/libc/arch-x86/syscalls/__ppoll.S
+++ b/libc/arch-x86/syscalls/__ppoll.S
@@ -18,13 +18,21 @@ ENTRY(__ppoll)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_ppoll, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__preadv64.S b/libc/arch-x86/syscalls/__preadv64.S
new file mode 100644
index 000000000..5db22a32e
--- /dev/null
+++ b/libc/arch-x86/syscalls/__preadv64.S
@@ -0,0 +1,49 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(__preadv64)
+ pushl %ebx
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset ebx, 0
+ pushl %ecx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset ecx, 0
+ pushl %edx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset edx, 0
+ pushl %esi
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset esi, 0
+ pushl %edi
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset edi, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
+ movl $__NR_preadv, %eax
+ call *(%esp)
+ addl $4, %esp
+
+ cmpl $-MAX_ERRNO, %eax
+ jb 1f
+ negl %eax
+ pushl %eax
+ call __set_errno_internal
+ addl $4, %esp
+1:
+ popl %edi
+ popl %esi
+ popl %edx
+ popl %ecx
+ popl %ebx
+ ret
+END(__preadv64)
diff --git a/libc/arch-x86/syscalls/__pselect6.S b/libc/arch-x86/syscalls/__pselect6.S
index 8ff102ad3..18327fd04 100644
--- a/libc/arch-x86/syscalls/__pselect6.S
+++ b/libc/arch-x86/syscalls/__pselect6.S
@@ -21,14 +21,22 @@ ENTRY(__pselect6)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_pselect6, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__ptrace.S b/libc/arch-x86/syscalls/__ptrace.S
index d982cec16..a522e95ee 100644
--- a/libc/arch-x86/syscalls/__ptrace.S
+++ b/libc/arch-x86/syscalls/__ptrace.S
@@ -15,12 +15,20 @@ ENTRY(__ptrace)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_ptrace, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__pwritev64.S b/libc/arch-x86/syscalls/__pwritev64.S
new file mode 100644
index 000000000..19f186566
--- /dev/null
+++ b/libc/arch-x86/syscalls/__pwritev64.S
@@ -0,0 +1,49 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(__pwritev64)
+ pushl %ebx
+ .cfi_def_cfa_offset 8
+ .cfi_rel_offset ebx, 0
+ pushl %ecx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset ecx, 0
+ pushl %edx
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset edx, 0
+ pushl %esi
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset esi, 0
+ pushl %edi
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset edi, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
+ movl $__NR_pwritev, %eax
+ call *(%esp)
+ addl $4, %esp
+
+ cmpl $-MAX_ERRNO, %eax
+ jb 1f
+ negl %eax
+ pushl %eax
+ call __set_errno_internal
+ addl $4, %esp
+1:
+ popl %edi
+ popl %esi
+ popl %edx
+ popl %ecx
+ popl %ebx
+ ret
+END(__pwritev64)
diff --git a/libc/arch-x86/syscalls/__reboot.S b/libc/arch-x86/syscalls/__reboot.S
index 3d169bf7f..711a4e6d2 100644
--- a/libc/arch-x86/syscalls/__reboot.S
+++ b/libc/arch-x86/syscalls/__reboot.S
@@ -15,12 +15,20 @@ ENTRY(__reboot)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_reboot, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__rt_sigaction.S b/libc/arch-x86/syscalls/__rt_sigaction.S
index 59c388208..ebc431d9c 100644
--- a/libc/arch-x86/syscalls/__rt_sigaction.S
+++ b/libc/arch-x86/syscalls/__rt_sigaction.S
@@ -15,12 +15,20 @@ ENTRY(__rt_sigaction)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_rt_sigaction, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__rt_sigpending.S b/libc/arch-x86/syscalls/__rt_sigpending.S
index 9c6a10649..ecf29453a 100644
--- a/libc/arch-x86/syscalls/__rt_sigpending.S
+++ b/libc/arch-x86/syscalls/__rt_sigpending.S
@@ -9,10 +9,18 @@ ENTRY(__rt_sigpending)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_rt_sigpending, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__rt_sigprocmask.S b/libc/arch-x86/syscalls/__rt_sigprocmask.S
index 9b1532f10..cdd0f1036 100644
--- a/libc/arch-x86/syscalls/__rt_sigprocmask.S
+++ b/libc/arch-x86/syscalls/__rt_sigprocmask.S
@@ -15,12 +15,20 @@ ENTRY(__rt_sigprocmask)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_rt_sigprocmask, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__rt_sigsuspend.S b/libc/arch-x86/syscalls/__rt_sigsuspend.S
index b05acd8bc..ef969493a 100644
--- a/libc/arch-x86/syscalls/__rt_sigsuspend.S
+++ b/libc/arch-x86/syscalls/__rt_sigsuspend.S
@@ -9,10 +9,18 @@ ENTRY(__rt_sigsuspend)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_rt_sigsuspend, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__rt_sigtimedwait.S b/libc/arch-x86/syscalls/__rt_sigtimedwait.S
index 14cb70f5f..820522177 100644
--- a/libc/arch-x86/syscalls/__rt_sigtimedwait.S
+++ b/libc/arch-x86/syscalls/__rt_sigtimedwait.S
@@ -15,12 +15,20 @@ ENTRY(__rt_sigtimedwait)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_rt_sigtimedwait, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__sched_getaffinity.S b/libc/arch-x86/syscalls/__sched_getaffinity.S
index 0b0a97070..ba658afaa 100644
--- a/libc/arch-x86/syscalls/__sched_getaffinity.S
+++ b/libc/arch-x86/syscalls/__sched_getaffinity.S
@@ -12,11 +12,19 @@ ENTRY(__sched_getaffinity)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_sched_getaffinity, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__set_thread_area.S b/libc/arch-x86/syscalls/__set_thread_area.S
index 8cd68804e..7fc04bd48 100644
--- a/libc/arch-x86/syscalls/__set_thread_area.S
+++ b/libc/arch-x86/syscalls/__set_thread_area.S
@@ -6,9 +6,17 @@ ENTRY(__set_thread_area)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_set_thread_area, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__set_tid_address.S b/libc/arch-x86/syscalls/__set_tid_address.S
index 08acce959..430115635 100644
--- a/libc/arch-x86/syscalls/__set_tid_address.S
+++ b/libc/arch-x86/syscalls/__set_tid_address.S
@@ -6,9 +6,17 @@ ENTRY(__set_tid_address)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_set_tid_address, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__sigaction.S b/libc/arch-x86/syscalls/__sigaction.S
index 02382479a..6b2b7f31e 100644
--- a/libc/arch-x86/syscalls/__sigaction.S
+++ b/libc/arch-x86/syscalls/__sigaction.S
@@ -12,11 +12,19 @@ ENTRY(__sigaction)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_sigaction, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__signalfd4.S b/libc/arch-x86/syscalls/__signalfd4.S
index 02ddc7333..ea817cf38 100644
--- a/libc/arch-x86/syscalls/__signalfd4.S
+++ b/libc/arch-x86/syscalls/__signalfd4.S
@@ -15,12 +15,20 @@ ENTRY(__signalfd4)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_signalfd4, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__socket.S b/libc/arch-x86/syscalls/__socket.S
index 75952eed1..06d1f1f12 100644
--- a/libc/arch-x86/syscalls/__socket.S
+++ b/libc/arch-x86/syscalls/__socket.S
@@ -9,11 +9,19 @@ ENTRY(__socket)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $1, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__statfs64.S b/libc/arch-x86/syscalls/__statfs64.S
index b9bccb02a..79e1f4bcf 100644
--- a/libc/arch-x86/syscalls/__statfs64.S
+++ b/libc/arch-x86/syscalls/__statfs64.S
@@ -12,11 +12,19 @@ ENTRY(__statfs64)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_statfs64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__timer_create.S b/libc/arch-x86/syscalls/__timer_create.S
index b22f40853..4e16b1c86 100644
--- a/libc/arch-x86/syscalls/__timer_create.S
+++ b/libc/arch-x86/syscalls/__timer_create.S
@@ -12,11 +12,19 @@ ENTRY(__timer_create)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_timer_create, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__timer_delete.S b/libc/arch-x86/syscalls/__timer_delete.S
index d77ae3e29..fea422ee7 100644
--- a/libc/arch-x86/syscalls/__timer_delete.S
+++ b/libc/arch-x86/syscalls/__timer_delete.S
@@ -6,9 +6,17 @@ ENTRY(__timer_delete)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_timer_delete, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__timer_getoverrun.S b/libc/arch-x86/syscalls/__timer_getoverrun.S
index f21b08f6c..e921073cd 100644
--- a/libc/arch-x86/syscalls/__timer_getoverrun.S
+++ b/libc/arch-x86/syscalls/__timer_getoverrun.S
@@ -6,9 +6,17 @@ ENTRY(__timer_getoverrun)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_timer_getoverrun, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__timer_gettime.S b/libc/arch-x86/syscalls/__timer_gettime.S
index 73c853958..4e20356fd 100644
--- a/libc/arch-x86/syscalls/__timer_gettime.S
+++ b/libc/arch-x86/syscalls/__timer_gettime.S
@@ -9,10 +9,18 @@ ENTRY(__timer_gettime)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_timer_gettime, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__timer_settime.S b/libc/arch-x86/syscalls/__timer_settime.S
index 1a6a8ec2c..9b8af344e 100644
--- a/libc/arch-x86/syscalls/__timer_settime.S
+++ b/libc/arch-x86/syscalls/__timer_settime.S
@@ -15,12 +15,20 @@ ENTRY(__timer_settime)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_timer_settime, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/__waitid.S b/libc/arch-x86/syscalls/__waitid.S
index 2061abc7e..f134b42b5 100644
--- a/libc/arch-x86/syscalls/__waitid.S
+++ b/libc/arch-x86/syscalls/__waitid.S
@@ -18,13 +18,21 @@ ENTRY(__waitid)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_waitid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/_exit.S b/libc/arch-x86/syscalls/_exit.S
index 9945b35db..1e89261c9 100644
--- a/libc/arch-x86/syscalls/_exit.S
+++ b/libc/arch-x86/syscalls/_exit.S
@@ -6,9 +6,17 @@ ENTRY(_exit)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_exit_group, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/acct.S b/libc/arch-x86/syscalls/acct.S
index d831771de..48c4c5cb6 100644
--- a/libc/arch-x86/syscalls/acct.S
+++ b/libc/arch-x86/syscalls/acct.S
@@ -6,9 +6,17 @@ ENTRY(acct)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_acct, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/gettimeofday.S b/libc/arch-x86/syscalls/adjtimex.S
index a508c14a4..1b0d8b164 100644
--- a/libc/arch-x86/syscalls/gettimeofday.S
+++ b/libc/arch-x86/syscalls/adjtimex.S
@@ -2,17 +2,21 @@
#include <private/bionic_asm.h>
-ENTRY(gettimeofday)
+ENTRY(adjtimex)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- pushl %ecx
+
+ call __kernel_syscall
+ pushl %eax
.cfi_adjust_cfa_offset 4
- .cfi_rel_offset ecx, 0
+ .cfi_rel_offset eax, 0
+
mov 12(%esp), %ebx
- mov 16(%esp), %ecx
- movl $__NR_gettimeofday, %eax
- int $0x80
+ movl $__NR_adjtimex, %eax
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
@@ -20,7 +24,6 @@ ENTRY(gettimeofday)
call __set_errno_internal
addl $4, %esp
1:
- popl %ecx
popl %ebx
ret
-END(gettimeofday)
+END(adjtimex)
diff --git a/libc/arch-x86/syscalls/bind.S b/libc/arch-x86/syscalls/bind.S
index 9ef817ec9..c1f84da7b 100644
--- a/libc/arch-x86/syscalls/bind.S
+++ b/libc/arch-x86/syscalls/bind.S
@@ -9,11 +9,19 @@ ENTRY(bind)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $2, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/capget.S b/libc/arch-x86/syscalls/capget.S
index 81c24e88b..fafde37cf 100644
--- a/libc/arch-x86/syscalls/capget.S
+++ b/libc/arch-x86/syscalls/capget.S
@@ -9,10 +9,18 @@ ENTRY(capget)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_capget, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/capset.S b/libc/arch-x86/syscalls/capset.S
index 4e311e961..28e533879 100644
--- a/libc/arch-x86/syscalls/capset.S
+++ b/libc/arch-x86/syscalls/capset.S
@@ -9,10 +9,18 @@ ENTRY(capset)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_capset, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/chdir.S b/libc/arch-x86/syscalls/chdir.S
index 2226a1aae..4b639eb71 100644
--- a/libc/arch-x86/syscalls/chdir.S
+++ b/libc/arch-x86/syscalls/chdir.S
@@ -6,9 +6,17 @@ ENTRY(chdir)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_chdir, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/chroot.S b/libc/arch-x86/syscalls/chroot.S
index 95ed0b5d4..8887f8626 100644
--- a/libc/arch-x86/syscalls/chroot.S
+++ b/libc/arch-x86/syscalls/chroot.S
@@ -6,9 +6,17 @@ ENTRY(chroot)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_chroot, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/flistxattr.S b/libc/arch-x86/syscalls/clock_adjtime.S
index fc81a374c..4ccf1a634 100644
--- a/libc/arch-x86/syscalls/flistxattr.S
+++ b/libc/arch-x86/syscalls/clock_adjtime.S
@@ -2,21 +2,25 @@
#include <private/bionic_asm.h>
-ENTRY(flistxattr)
+ENTRY(clock_adjtime)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- pushl %edx
+
+ call __kernel_syscall
+ pushl %eax
.cfi_adjust_cfa_offset 4
- .cfi_rel_offset edx, 0
+ .cfi_rel_offset eax, 0
+
mov 16(%esp), %ebx
mov 20(%esp), %ecx
- mov 24(%esp), %edx
- movl $__NR_flistxattr, %eax
- int $0x80
+ movl $__NR_clock_adjtime, %eax
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
@@ -24,8 +28,7 @@ ENTRY(flistxattr)
call __set_errno_internal
addl $4, %esp
1:
- popl %edx
popl %ecx
popl %ebx
ret
-END(flistxattr)
+END(clock_adjtime)
diff --git a/libc/arch-x86/syscalls/clock_getres.S b/libc/arch-x86/syscalls/clock_getres.S
index 9501799f7..9466e089b 100644
--- a/libc/arch-x86/syscalls/clock_getres.S
+++ b/libc/arch-x86/syscalls/clock_getres.S
@@ -9,10 +9,18 @@ ENTRY(clock_getres)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_clock_getres, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/clock_settime.S b/libc/arch-x86/syscalls/clock_settime.S
index 96fafed1d..62dc021f9 100644
--- a/libc/arch-x86/syscalls/clock_settime.S
+++ b/libc/arch-x86/syscalls/clock_settime.S
@@ -9,10 +9,18 @@ ENTRY(clock_settime)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_clock_settime, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/delete_module.S b/libc/arch-x86/syscalls/delete_module.S
index 58b8d6bf3..b0c8ff97b 100644
--- a/libc/arch-x86/syscalls/delete_module.S
+++ b/libc/arch-x86/syscalls/delete_module.S
@@ -9,10 +9,18 @@ ENTRY(delete_module)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_delete_module, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/dup.S b/libc/arch-x86/syscalls/dup.S
index 0fd9cceb3..637cfae0e 100644
--- a/libc/arch-x86/syscalls/dup.S
+++ b/libc/arch-x86/syscalls/dup.S
@@ -6,9 +6,17 @@ ENTRY(dup)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_dup, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/dup3.S b/libc/arch-x86/syscalls/dup3.S
index 8348660c9..4d08eab85 100644
--- a/libc/arch-x86/syscalls/dup3.S
+++ b/libc/arch-x86/syscalls/dup3.S
@@ -12,11 +12,19 @@ ENTRY(dup3)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_dup3, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/epoll_create1.S b/libc/arch-x86/syscalls/epoll_create1.S
index 0fcd09c2c..93d1c007b 100644
--- a/libc/arch-x86/syscalls/epoll_create1.S
+++ b/libc/arch-x86/syscalls/epoll_create1.S
@@ -6,9 +6,17 @@ ENTRY(epoll_create1)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_epoll_create1, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/epoll_ctl.S b/libc/arch-x86/syscalls/epoll_ctl.S
index 092c1e09a..a2d8d27bb 100644
--- a/libc/arch-x86/syscalls/epoll_ctl.S
+++ b/libc/arch-x86/syscalls/epoll_ctl.S
@@ -15,12 +15,20 @@ ENTRY(epoll_ctl)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_epoll_ctl, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/eventfd.S b/libc/arch-x86/syscalls/eventfd.S
index cc165e591..89f9442f5 100644
--- a/libc/arch-x86/syscalls/eventfd.S
+++ b/libc/arch-x86/syscalls/eventfd.S
@@ -9,10 +9,18 @@ ENTRY(eventfd)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_eventfd2, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/execve.S b/libc/arch-x86/syscalls/execve.S
index e1c025341..7695635b9 100644
--- a/libc/arch-x86/syscalls/execve.S
+++ b/libc/arch-x86/syscalls/execve.S
@@ -12,11 +12,19 @@ ENTRY(execve)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_execve, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fallocate64.S b/libc/arch-x86/syscalls/fallocate64.S
index e2a7c3eb7..eabc642e5 100644
--- a/libc/arch-x86/syscalls/fallocate64.S
+++ b/libc/arch-x86/syscalls/fallocate64.S
@@ -21,14 +21,22 @@ ENTRY(fallocate64)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_fallocate, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fchdir.S b/libc/arch-x86/syscalls/fchdir.S
index c40c2c1c8..57016449b 100644
--- a/libc/arch-x86/syscalls/fchdir.S
+++ b/libc/arch-x86/syscalls/fchdir.S
@@ -6,9 +6,17 @@ ENTRY(fchdir)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_fchdir, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fchown.S b/libc/arch-x86/syscalls/fchown.S
index 1a4f74940..0d413891c 100644
--- a/libc/arch-x86/syscalls/fchown.S
+++ b/libc/arch-x86/syscalls/fchown.S
@@ -12,11 +12,19 @@ ENTRY(fchown)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_fchown32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fchownat.S b/libc/arch-x86/syscalls/fchownat.S
index c2b358e64..56b7777ca 100644
--- a/libc/arch-x86/syscalls/fchownat.S
+++ b/libc/arch-x86/syscalls/fchownat.S
@@ -18,13 +18,21 @@ ENTRY(fchownat)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_fchownat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fdatasync.S b/libc/arch-x86/syscalls/fdatasync.S
index debd4e322..6ee9e1563 100644
--- a/libc/arch-x86/syscalls/fdatasync.S
+++ b/libc/arch-x86/syscalls/fdatasync.S
@@ -6,9 +6,17 @@ ENTRY(fdatasync)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_fdatasync, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/flock.S b/libc/arch-x86/syscalls/flock.S
index 0fc76a8fc..b65543d57 100644
--- a/libc/arch-x86/syscalls/flock.S
+++ b/libc/arch-x86/syscalls/flock.S
@@ -9,10 +9,18 @@ ENTRY(flock)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_flock, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fremovexattr.S b/libc/arch-x86/syscalls/fremovexattr.S
index 2053a9a9b..3511d5dc4 100644
--- a/libc/arch-x86/syscalls/fremovexattr.S
+++ b/libc/arch-x86/syscalls/fremovexattr.S
@@ -9,10 +9,18 @@ ENTRY(fremovexattr)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_fremovexattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fstat64.S b/libc/arch-x86/syscalls/fstat64.S
index ba385a4f9..16eca6947 100644
--- a/libc/arch-x86/syscalls/fstat64.S
+++ b/libc/arch-x86/syscalls/fstat64.S
@@ -9,10 +9,18 @@ ENTRY(fstat64)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_fstat64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fstatat64.S b/libc/arch-x86/syscalls/fstatat64.S
index 90e87b6ef..402cf6050 100644
--- a/libc/arch-x86/syscalls/fstatat64.S
+++ b/libc/arch-x86/syscalls/fstatat64.S
@@ -15,12 +15,20 @@ ENTRY(fstatat64)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_fstatat64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/fsync.S b/libc/arch-x86/syscalls/fsync.S
index b19a3abaa..53aeee6dc 100644
--- a/libc/arch-x86/syscalls/fsync.S
+++ b/libc/arch-x86/syscalls/fsync.S
@@ -6,9 +6,17 @@ ENTRY(fsync)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_fsync, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/ftruncate64.S b/libc/arch-x86/syscalls/ftruncate64.S
index 723344725..2fa792f60 100644
--- a/libc/arch-x86/syscalls/ftruncate64.S
+++ b/libc/arch-x86/syscalls/ftruncate64.S
@@ -12,11 +12,19 @@ ENTRY(ftruncate64)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_ftruncate64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getegid.S b/libc/arch-x86/syscalls/getegid.S
index 729b7ad0c..cb1921ede 100644
--- a/libc/arch-x86/syscalls/getegid.S
+++ b/libc/arch-x86/syscalls/getegid.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(getegid)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_getegid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/geteuid.S b/libc/arch-x86/syscalls/geteuid.S
index dcc76b1ff..c08d3ae3f 100644
--- a/libc/arch-x86/syscalls/geteuid.S
+++ b/libc/arch-x86/syscalls/geteuid.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(geteuid)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_geteuid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getgid.S b/libc/arch-x86/syscalls/getgid.S
index b36a2c939..9189ae9da 100644
--- a/libc/arch-x86/syscalls/getgid.S
+++ b/libc/arch-x86/syscalls/getgid.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(getgid)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_getgid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getgroups.S b/libc/arch-x86/syscalls/getgroups.S
index 0a5de355e..8737d51b6 100644
--- a/libc/arch-x86/syscalls/getgroups.S
+++ b/libc/arch-x86/syscalls/getgroups.S
@@ -9,10 +9,18 @@ ENTRY(getgroups)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_getgroups32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getitimer.S b/libc/arch-x86/syscalls/getitimer.S
index a0cb761cc..e08811491 100644
--- a/libc/arch-x86/syscalls/getitimer.S
+++ b/libc/arch-x86/syscalls/getitimer.S
@@ -9,10 +9,18 @@ ENTRY(getitimer)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_getitimer, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getpeername.S b/libc/arch-x86/syscalls/getpeername.S
index 6773e6adc..40bb814b7 100644
--- a/libc/arch-x86/syscalls/getpeername.S
+++ b/libc/arch-x86/syscalls/getpeername.S
@@ -9,11 +9,19 @@ ENTRY(getpeername)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $7, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getpgid.S b/libc/arch-x86/syscalls/getpgid.S
index f702cfdcd..9d362e873 100644
--- a/libc/arch-x86/syscalls/getpgid.S
+++ b/libc/arch-x86/syscalls/getpgid.S
@@ -6,9 +6,17 @@ ENTRY(getpgid)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_getpgid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getppid.S b/libc/arch-x86/syscalls/getppid.S
index edbe38407..afb40a1cf 100644
--- a/libc/arch-x86/syscalls/getppid.S
+++ b/libc/arch-x86/syscalls/getppid.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(getppid)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_getppid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getresgid.S b/libc/arch-x86/syscalls/getresgid.S
index 9f1a9dd41..131c101a6 100644
--- a/libc/arch-x86/syscalls/getresgid.S
+++ b/libc/arch-x86/syscalls/getresgid.S
@@ -12,11 +12,19 @@ ENTRY(getresgid)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_getresgid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getresuid.S b/libc/arch-x86/syscalls/getresuid.S
index 61e13702c..94a876788 100644
--- a/libc/arch-x86/syscalls/getresuid.S
+++ b/libc/arch-x86/syscalls/getresuid.S
@@ -12,11 +12,19 @@ ENTRY(getresuid)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_getresuid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getrlimit.S b/libc/arch-x86/syscalls/getrlimit.S
index c3acff35e..c686f7c99 100644
--- a/libc/arch-x86/syscalls/getrlimit.S
+++ b/libc/arch-x86/syscalls/getrlimit.S
@@ -9,10 +9,18 @@ ENTRY(getrlimit)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_ugetrlimit, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getrusage.S b/libc/arch-x86/syscalls/getrusage.S
index 0d715cd3c..51d1df129 100644
--- a/libc/arch-x86/syscalls/getrusage.S
+++ b/libc/arch-x86/syscalls/getrusage.S
@@ -9,10 +9,18 @@ ENTRY(getrusage)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_getrusage, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getsid.S b/libc/arch-x86/syscalls/getsid.S
index e142c0540..a4568e630 100644
--- a/libc/arch-x86/syscalls/getsid.S
+++ b/libc/arch-x86/syscalls/getsid.S
@@ -6,9 +6,17 @@ ENTRY(getsid)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_getsid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getsockname.S b/libc/arch-x86/syscalls/getsockname.S
index 6050190b5..0fd583643 100644
--- a/libc/arch-x86/syscalls/getsockname.S
+++ b/libc/arch-x86/syscalls/getsockname.S
@@ -9,11 +9,19 @@ ENTRY(getsockname)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $6, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getsockopt.S b/libc/arch-x86/syscalls/getsockopt.S
index aec40cff9..fa6fccff7 100644
--- a/libc/arch-x86/syscalls/getsockopt.S
+++ b/libc/arch-x86/syscalls/getsockopt.S
@@ -9,11 +9,19 @@ ENTRY(getsockopt)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $15, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getuid.S b/libc/arch-x86/syscalls/getuid.S
index cc6288418..11cc0c67c 100644
--- a/libc/arch-x86/syscalls/getuid.S
+++ b/libc/arch-x86/syscalls/getuid.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(getuid)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_getuid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/getxattr.S b/libc/arch-x86/syscalls/getxattr.S
index a2cf1377b..871362efa 100644
--- a/libc/arch-x86/syscalls/getxattr.S
+++ b/libc/arch-x86/syscalls/getxattr.S
@@ -15,12 +15,20 @@ ENTRY(getxattr)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_getxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/init_module.S b/libc/arch-x86/syscalls/init_module.S
index 1d0f111a5..0147eeee7 100644
--- a/libc/arch-x86/syscalls/init_module.S
+++ b/libc/arch-x86/syscalls/init_module.S
@@ -12,11 +12,19 @@ ENTRY(init_module)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_init_module, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/inotify_add_watch.S b/libc/arch-x86/syscalls/inotify_add_watch.S
index 8cadc6e99..f19644018 100644
--- a/libc/arch-x86/syscalls/inotify_add_watch.S
+++ b/libc/arch-x86/syscalls/inotify_add_watch.S
@@ -12,11 +12,19 @@ ENTRY(inotify_add_watch)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_inotify_add_watch, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/inotify_init1.S b/libc/arch-x86/syscalls/inotify_init1.S
index 23671e032..7f0dcfbdf 100644
--- a/libc/arch-x86/syscalls/inotify_init1.S
+++ b/libc/arch-x86/syscalls/inotify_init1.S
@@ -6,9 +6,17 @@ ENTRY(inotify_init1)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_inotify_init1, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/inotify_rm_watch.S b/libc/arch-x86/syscalls/inotify_rm_watch.S
index c246c0077..595e05391 100644
--- a/libc/arch-x86/syscalls/inotify_rm_watch.S
+++ b/libc/arch-x86/syscalls/inotify_rm_watch.S
@@ -9,10 +9,18 @@ ENTRY(inotify_rm_watch)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_inotify_rm_watch, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/kill.S b/libc/arch-x86/syscalls/kill.S
index edc9cdea1..4ee56e6ca 100644
--- a/libc/arch-x86/syscalls/kill.S
+++ b/libc/arch-x86/syscalls/kill.S
@@ -9,10 +9,18 @@ ENTRY(kill)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_kill, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/klogctl.S b/libc/arch-x86/syscalls/klogctl.S
index 5de9a31ec..3d0794262 100644
--- a/libc/arch-x86/syscalls/klogctl.S
+++ b/libc/arch-x86/syscalls/klogctl.S
@@ -12,11 +12,19 @@ ENTRY(klogctl)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_syslog, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/lgetxattr.S b/libc/arch-x86/syscalls/lgetxattr.S
index 55697a0b0..659b088c9 100644
--- a/libc/arch-x86/syscalls/lgetxattr.S
+++ b/libc/arch-x86/syscalls/lgetxattr.S
@@ -15,12 +15,20 @@ ENTRY(lgetxattr)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_lgetxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/linkat.S b/libc/arch-x86/syscalls/linkat.S
index 8b2646d59..644172db6 100644
--- a/libc/arch-x86/syscalls/linkat.S
+++ b/libc/arch-x86/syscalls/linkat.S
@@ -18,13 +18,21 @@ ENTRY(linkat)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_linkat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/listen.S b/libc/arch-x86/syscalls/listen.S
index 8ae41860d..ce7c3a90b 100644
--- a/libc/arch-x86/syscalls/listen.S
+++ b/libc/arch-x86/syscalls/listen.S
@@ -9,11 +9,19 @@ ENTRY(listen)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $4, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/listxattr.S b/libc/arch-x86/syscalls/listxattr.S
index a73dc1adb..2fe799e75 100644
--- a/libc/arch-x86/syscalls/listxattr.S
+++ b/libc/arch-x86/syscalls/listxattr.S
@@ -12,11 +12,19 @@ ENTRY(listxattr)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_listxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/llistxattr.S b/libc/arch-x86/syscalls/llistxattr.S
index 63d4489dc..666d87ede 100644
--- a/libc/arch-x86/syscalls/llistxattr.S
+++ b/libc/arch-x86/syscalls/llistxattr.S
@@ -12,11 +12,19 @@ ENTRY(llistxattr)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_llistxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/lremovexattr.S b/libc/arch-x86/syscalls/lremovexattr.S
index 42c7e0fd9..bda772b05 100644
--- a/libc/arch-x86/syscalls/lremovexattr.S
+++ b/libc/arch-x86/syscalls/lremovexattr.S
@@ -9,10 +9,18 @@ ENTRY(lremovexattr)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_lremovexattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/lseek.S b/libc/arch-x86/syscalls/lseek.S
index bfe9e6315..9142b5c12 100644
--- a/libc/arch-x86/syscalls/lseek.S
+++ b/libc/arch-x86/syscalls/lseek.S
@@ -12,11 +12,19 @@ ENTRY(lseek)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_lseek, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/lsetxattr.S b/libc/arch-x86/syscalls/lsetxattr.S
index f36fc6a4d..fa977b362 100644
--- a/libc/arch-x86/syscalls/lsetxattr.S
+++ b/libc/arch-x86/syscalls/lsetxattr.S
@@ -18,13 +18,21 @@ ENTRY(lsetxattr)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_lsetxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/madvise.S b/libc/arch-x86/syscalls/madvise.S
index b69f5d456..21f472e54 100644
--- a/libc/arch-x86/syscalls/madvise.S
+++ b/libc/arch-x86/syscalls/madvise.S
@@ -12,11 +12,19 @@ ENTRY(madvise)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_madvise, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mincore.S b/libc/arch-x86/syscalls/mincore.S
index 6d1df67ab..4179c9acf 100644
--- a/libc/arch-x86/syscalls/mincore.S
+++ b/libc/arch-x86/syscalls/mincore.S
@@ -12,11 +12,19 @@ ENTRY(mincore)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_mincore, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mkdirat.S b/libc/arch-x86/syscalls/mkdirat.S
index 5b6ae18cc..6a9d94cfe 100644
--- a/libc/arch-x86/syscalls/mkdirat.S
+++ b/libc/arch-x86/syscalls/mkdirat.S
@@ -12,11 +12,19 @@ ENTRY(mkdirat)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_mkdirat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mknodat.S b/libc/arch-x86/syscalls/mknodat.S
index b19d972a9..a1fae7f85 100644
--- a/libc/arch-x86/syscalls/mknodat.S
+++ b/libc/arch-x86/syscalls/mknodat.S
@@ -15,12 +15,20 @@ ENTRY(mknodat)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_mknodat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mlock.S b/libc/arch-x86/syscalls/mlock.S
index 517e5a56d..1c57ac07d 100644
--- a/libc/arch-x86/syscalls/mlock.S
+++ b/libc/arch-x86/syscalls/mlock.S
@@ -9,10 +9,18 @@ ENTRY(mlock)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_mlock, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mlockall.S b/libc/arch-x86/syscalls/mlockall.S
index 756ca1689..9f54de33d 100644
--- a/libc/arch-x86/syscalls/mlockall.S
+++ b/libc/arch-x86/syscalls/mlockall.S
@@ -6,9 +6,17 @@ ENTRY(mlockall)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_mlockall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mount.S b/libc/arch-x86/syscalls/mount.S
index 0537528a6..4a9f91a8f 100644
--- a/libc/arch-x86/syscalls/mount.S
+++ b/libc/arch-x86/syscalls/mount.S
@@ -18,13 +18,21 @@ ENTRY(mount)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_mount, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/mprotect.S b/libc/arch-x86/syscalls/mprotect.S
index 1ba186c04..5eec5501f 100644
--- a/libc/arch-x86/syscalls/mprotect.S
+++ b/libc/arch-x86/syscalls/mprotect.S
@@ -12,11 +12,19 @@ ENTRY(mprotect)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_mprotect, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/msync.S b/libc/arch-x86/syscalls/msync.S
index 81bd5982d..7754da61d 100644
--- a/libc/arch-x86/syscalls/msync.S
+++ b/libc/arch-x86/syscalls/msync.S
@@ -12,11 +12,19 @@ ENTRY(msync)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_msync, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/munlock.S b/libc/arch-x86/syscalls/munlock.S
index 67ca3fe7f..d2ae9f030 100644
--- a/libc/arch-x86/syscalls/munlock.S
+++ b/libc/arch-x86/syscalls/munlock.S
@@ -9,10 +9,18 @@ ENTRY(munlock)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_munlock, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/munlockall.S b/libc/arch-x86/syscalls/munlockall.S
index bf0bfa1fe..e709b8cb4 100644
--- a/libc/arch-x86/syscalls/munlockall.S
+++ b/libc/arch-x86/syscalls/munlockall.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(munlockall)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_munlockall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/munmap.S b/libc/arch-x86/syscalls/munmap.S
index 272cb5251..7ddc5aaae 100644
--- a/libc/arch-x86/syscalls/munmap.S
+++ b/libc/arch-x86/syscalls/munmap.S
@@ -9,10 +9,18 @@ ENTRY(munmap)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_munmap, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/nanosleep.S b/libc/arch-x86/syscalls/nanosleep.S
index 5c46a4a70..580f5e19d 100644
--- a/libc/arch-x86/syscalls/nanosleep.S
+++ b/libc/arch-x86/syscalls/nanosleep.S
@@ -9,10 +9,18 @@ ENTRY(nanosleep)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_nanosleep, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/personality.S b/libc/arch-x86/syscalls/personality.S
index d60ced1db..3e003c4e0 100644
--- a/libc/arch-x86/syscalls/personality.S
+++ b/libc/arch-x86/syscalls/personality.S
@@ -6,9 +6,17 @@ ENTRY(personality)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_personality, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/pipe2.S b/libc/arch-x86/syscalls/pipe2.S
index ee49ff84a..8a9328129 100644
--- a/libc/arch-x86/syscalls/pipe2.S
+++ b/libc/arch-x86/syscalls/pipe2.S
@@ -9,10 +9,18 @@ ENTRY(pipe2)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_pipe2, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/prctl.S b/libc/arch-x86/syscalls/prctl.S
index 496591e6a..22b4a8323 100644
--- a/libc/arch-x86/syscalls/prctl.S
+++ b/libc/arch-x86/syscalls/prctl.S
@@ -18,13 +18,21 @@ ENTRY(prctl)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_prctl, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/pread64.S b/libc/arch-x86/syscalls/pread64.S
index 42e54ec1a..9002f1761 100644
--- a/libc/arch-x86/syscalls/pread64.S
+++ b/libc/arch-x86/syscalls/pread64.S
@@ -18,13 +18,21 @@ ENTRY(pread64)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_pread64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/prlimit64.S b/libc/arch-x86/syscalls/prlimit64.S
index 07b5585c7..13f66825e 100644
--- a/libc/arch-x86/syscalls/prlimit64.S
+++ b/libc/arch-x86/syscalls/prlimit64.S
@@ -15,12 +15,20 @@ ENTRY(prlimit64)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_prlimit64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/process_vm_readv.S b/libc/arch-x86/syscalls/process_vm_readv.S
index 64965f631..e2cd044eb 100644
--- a/libc/arch-x86/syscalls/process_vm_readv.S
+++ b/libc/arch-x86/syscalls/process_vm_readv.S
@@ -21,14 +21,22 @@ ENTRY(process_vm_readv)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_process_vm_readv, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/process_vm_writev.S b/libc/arch-x86/syscalls/process_vm_writev.S
index 555c822ab..de0d218fc 100644
--- a/libc/arch-x86/syscalls/process_vm_writev.S
+++ b/libc/arch-x86/syscalls/process_vm_writev.S
@@ -21,14 +21,22 @@ ENTRY(process_vm_writev)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_process_vm_writev, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/pwrite64.S b/libc/arch-x86/syscalls/pwrite64.S
index d5c9b31a9..753272993 100644
--- a/libc/arch-x86/syscalls/pwrite64.S
+++ b/libc/arch-x86/syscalls/pwrite64.S
@@ -18,13 +18,21 @@ ENTRY(pwrite64)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_pwrite64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/read.S b/libc/arch-x86/syscalls/read.S
index c10a83bdd..d4b69b599 100644
--- a/libc/arch-x86/syscalls/read.S
+++ b/libc/arch-x86/syscalls/read.S
@@ -12,11 +12,19 @@ ENTRY(read)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_read, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/readahead.S b/libc/arch-x86/syscalls/readahead.S
index 1c0ccfc45..8ce22bb8b 100644
--- a/libc/arch-x86/syscalls/readahead.S
+++ b/libc/arch-x86/syscalls/readahead.S
@@ -15,12 +15,20 @@ ENTRY(readahead)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_readahead, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/readlinkat.S b/libc/arch-x86/syscalls/readlinkat.S
index 4a24c2cac..8b74a4e20 100644
--- a/libc/arch-x86/syscalls/readlinkat.S
+++ b/libc/arch-x86/syscalls/readlinkat.S
@@ -15,12 +15,20 @@ ENTRY(readlinkat)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_readlinkat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/readv.S b/libc/arch-x86/syscalls/readv.S
index c18c1b115..a1cb08f86 100644
--- a/libc/arch-x86/syscalls/readv.S
+++ b/libc/arch-x86/syscalls/readv.S
@@ -12,11 +12,19 @@ ENTRY(readv)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_readv, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/recvfrom.S b/libc/arch-x86/syscalls/recvfrom.S
index 88c9d0a43..cedd703e9 100644
--- a/libc/arch-x86/syscalls/recvfrom.S
+++ b/libc/arch-x86/syscalls/recvfrom.S
@@ -9,11 +9,19 @@ ENTRY(recvfrom)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $12, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/recvmmsg.S b/libc/arch-x86/syscalls/recvmmsg.S
index 09404d46a..130332ae9 100644
--- a/libc/arch-x86/syscalls/recvmmsg.S
+++ b/libc/arch-x86/syscalls/recvmmsg.S
@@ -9,11 +9,19 @@ ENTRY(recvmmsg)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $19, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/recvmsg.S b/libc/arch-x86/syscalls/recvmsg.S
index 6cfcd63f1..c8d2a08ac 100644
--- a/libc/arch-x86/syscalls/recvmsg.S
+++ b/libc/arch-x86/syscalls/recvmsg.S
@@ -9,11 +9,19 @@ ENTRY(recvmsg)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $17, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/removexattr.S b/libc/arch-x86/syscalls/removexattr.S
index b067a9f2c..ab7891eea 100644
--- a/libc/arch-x86/syscalls/removexattr.S
+++ b/libc/arch-x86/syscalls/removexattr.S
@@ -9,10 +9,18 @@ ENTRY(removexattr)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_removexattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/renameat.S b/libc/arch-x86/syscalls/renameat.S
index bb2181ee3..40caaafd3 100644
--- a/libc/arch-x86/syscalls/renameat.S
+++ b/libc/arch-x86/syscalls/renameat.S
@@ -15,12 +15,20 @@ ENTRY(renameat)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_renameat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_get_priority_max.S b/libc/arch-x86/syscalls/sched_get_priority_max.S
index be66cfb15..637c9ddf6 100644
--- a/libc/arch-x86/syscalls/sched_get_priority_max.S
+++ b/libc/arch-x86/syscalls/sched_get_priority_max.S
@@ -6,9 +6,17 @@ ENTRY(sched_get_priority_max)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_sched_get_priority_max, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_get_priority_min.S b/libc/arch-x86/syscalls/sched_get_priority_min.S
index 8dde67b4c..c38a3aaff 100644
--- a/libc/arch-x86/syscalls/sched_get_priority_min.S
+++ b/libc/arch-x86/syscalls/sched_get_priority_min.S
@@ -6,9 +6,17 @@ ENTRY(sched_get_priority_min)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_sched_get_priority_min, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_getparam.S b/libc/arch-x86/syscalls/sched_getparam.S
index d0551efb5..09901bd8e 100644
--- a/libc/arch-x86/syscalls/sched_getparam.S
+++ b/libc/arch-x86/syscalls/sched_getparam.S
@@ -9,10 +9,18 @@ ENTRY(sched_getparam)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_sched_getparam, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_getscheduler.S b/libc/arch-x86/syscalls/sched_getscheduler.S
index 5b7c8179a..adc402307 100644
--- a/libc/arch-x86/syscalls/sched_getscheduler.S
+++ b/libc/arch-x86/syscalls/sched_getscheduler.S
@@ -6,9 +6,17 @@ ENTRY(sched_getscheduler)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_sched_getscheduler, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_rr_get_interval.S b/libc/arch-x86/syscalls/sched_rr_get_interval.S
index 073f3c715..818f62e9b 100644
--- a/libc/arch-x86/syscalls/sched_rr_get_interval.S
+++ b/libc/arch-x86/syscalls/sched_rr_get_interval.S
@@ -9,10 +9,18 @@ ENTRY(sched_rr_get_interval)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_sched_rr_get_interval, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_setaffinity.S b/libc/arch-x86/syscalls/sched_setaffinity.S
index 79ec11393..b06d778e0 100644
--- a/libc/arch-x86/syscalls/sched_setaffinity.S
+++ b/libc/arch-x86/syscalls/sched_setaffinity.S
@@ -12,11 +12,19 @@ ENTRY(sched_setaffinity)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_sched_setaffinity, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_setparam.S b/libc/arch-x86/syscalls/sched_setparam.S
index 970747dea..dba5bc29e 100644
--- a/libc/arch-x86/syscalls/sched_setparam.S
+++ b/libc/arch-x86/syscalls/sched_setparam.S
@@ -9,10 +9,18 @@ ENTRY(sched_setparam)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_sched_setparam, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_setscheduler.S b/libc/arch-x86/syscalls/sched_setscheduler.S
index da50aaf01..466a42516 100644
--- a/libc/arch-x86/syscalls/sched_setscheduler.S
+++ b/libc/arch-x86/syscalls/sched_setscheduler.S
@@ -12,11 +12,19 @@ ENTRY(sched_setscheduler)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_sched_setscheduler, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sched_yield.S b/libc/arch-x86/syscalls/sched_yield.S
index e3878e33a..b17b14e3b 100644
--- a/libc/arch-x86/syscalls/sched_yield.S
+++ b/libc/arch-x86/syscalls/sched_yield.S
@@ -6,9 +6,17 @@ ENTRY(sched_yield)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_sched_yield, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sendfile.S b/libc/arch-x86/syscalls/sendfile.S
index c5f9a2d19..e091706d0 100644
--- a/libc/arch-x86/syscalls/sendfile.S
+++ b/libc/arch-x86/syscalls/sendfile.S
@@ -15,12 +15,20 @@ ENTRY(sendfile)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_sendfile, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sendfile64.S b/libc/arch-x86/syscalls/sendfile64.S
index bc5d0dd19..317c4f429 100644
--- a/libc/arch-x86/syscalls/sendfile64.S
+++ b/libc/arch-x86/syscalls/sendfile64.S
@@ -15,12 +15,20 @@ ENTRY(sendfile64)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_sendfile64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sendmmsg.S b/libc/arch-x86/syscalls/sendmmsg.S
index 784c6b603..c0097f815 100644
--- a/libc/arch-x86/syscalls/sendmmsg.S
+++ b/libc/arch-x86/syscalls/sendmmsg.S
@@ -9,11 +9,19 @@ ENTRY(sendmmsg)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $20, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sendmsg.S b/libc/arch-x86/syscalls/sendmsg.S
index bf0d1fb60..775ebeef3 100644
--- a/libc/arch-x86/syscalls/sendmsg.S
+++ b/libc/arch-x86/syscalls/sendmsg.S
@@ -9,11 +9,19 @@ ENTRY(sendmsg)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $16, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sendto.S b/libc/arch-x86/syscalls/sendto.S
index b39eaf053..2df5e4f87 100644
--- a/libc/arch-x86/syscalls/sendto.S
+++ b/libc/arch-x86/syscalls/sendto.S
@@ -9,11 +9,19 @@ ENTRY(sendto)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $11, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setfsgid.S b/libc/arch-x86/syscalls/setfsgid.S
index dc81f7227..af4ef8952 100644
--- a/libc/arch-x86/syscalls/setfsgid.S
+++ b/libc/arch-x86/syscalls/setfsgid.S
@@ -6,9 +6,17 @@ ENTRY(setfsgid)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_setfsgid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setfsuid.S b/libc/arch-x86/syscalls/setfsuid.S
index fdf785009..8001e4252 100644
--- a/libc/arch-x86/syscalls/setfsuid.S
+++ b/libc/arch-x86/syscalls/setfsuid.S
@@ -6,9 +6,17 @@ ENTRY(setfsuid)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_setfsuid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setgid.S b/libc/arch-x86/syscalls/setgid.S
index ce6ee266f..c0ddec44f 100644
--- a/libc/arch-x86/syscalls/setgid.S
+++ b/libc/arch-x86/syscalls/setgid.S
@@ -6,9 +6,17 @@ ENTRY(setgid)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_setgid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setgroups.S b/libc/arch-x86/syscalls/setgroups.S
index 7e46ad010..7bd3bfcd1 100644
--- a/libc/arch-x86/syscalls/setgroups.S
+++ b/libc/arch-x86/syscalls/setgroups.S
@@ -9,10 +9,18 @@ ENTRY(setgroups)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_setgroups32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sethostname.S b/libc/arch-x86/syscalls/sethostname.S
index bfcfd735c..26ff1e787 100644
--- a/libc/arch-x86/syscalls/sethostname.S
+++ b/libc/arch-x86/syscalls/sethostname.S
@@ -9,10 +9,18 @@ ENTRY(sethostname)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_sethostname, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setitimer.S b/libc/arch-x86/syscalls/setitimer.S
index 370ab5e8e..063847bd6 100644
--- a/libc/arch-x86/syscalls/setitimer.S
+++ b/libc/arch-x86/syscalls/setitimer.S
@@ -12,11 +12,19 @@ ENTRY(setitimer)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_setitimer, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setns.S b/libc/arch-x86/syscalls/setns.S
index 736df5912..28d838e4f 100644
--- a/libc/arch-x86/syscalls/setns.S
+++ b/libc/arch-x86/syscalls/setns.S
@@ -9,10 +9,18 @@ ENTRY(setns)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_setns, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setpgid.S b/libc/arch-x86/syscalls/setpgid.S
index 0bff10a6c..c5d0d2738 100644
--- a/libc/arch-x86/syscalls/setpgid.S
+++ b/libc/arch-x86/syscalls/setpgid.S
@@ -9,10 +9,18 @@ ENTRY(setpgid)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_setpgid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setpriority.S b/libc/arch-x86/syscalls/setpriority.S
index 4233871b6..17c81c6fd 100644
--- a/libc/arch-x86/syscalls/setpriority.S
+++ b/libc/arch-x86/syscalls/setpriority.S
@@ -12,11 +12,19 @@ ENTRY(setpriority)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_setpriority, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setregid.S b/libc/arch-x86/syscalls/setregid.S
index a56ccfd25..dd8101a02 100644
--- a/libc/arch-x86/syscalls/setregid.S
+++ b/libc/arch-x86/syscalls/setregid.S
@@ -9,10 +9,18 @@ ENTRY(setregid)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_setregid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setresgid.S b/libc/arch-x86/syscalls/setresgid.S
index 229983103..6f6de5a00 100644
--- a/libc/arch-x86/syscalls/setresgid.S
+++ b/libc/arch-x86/syscalls/setresgid.S
@@ -12,11 +12,19 @@ ENTRY(setresgid)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_setresgid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setresuid.S b/libc/arch-x86/syscalls/setresuid.S
index 8624e157c..ab0059c2e 100644
--- a/libc/arch-x86/syscalls/setresuid.S
+++ b/libc/arch-x86/syscalls/setresuid.S
@@ -12,11 +12,19 @@ ENTRY(setresuid)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_setresuid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setreuid.S b/libc/arch-x86/syscalls/setreuid.S
index 9f6e11776..7fda62e9a 100644
--- a/libc/arch-x86/syscalls/setreuid.S
+++ b/libc/arch-x86/syscalls/setreuid.S
@@ -9,10 +9,18 @@ ENTRY(setreuid)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_setreuid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setrlimit.S b/libc/arch-x86/syscalls/setrlimit.S
index 20246882c..595633eac 100644
--- a/libc/arch-x86/syscalls/setrlimit.S
+++ b/libc/arch-x86/syscalls/setrlimit.S
@@ -9,10 +9,18 @@ ENTRY(setrlimit)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_setrlimit, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setsid.S b/libc/arch-x86/syscalls/setsid.S
index dda6ad800..80ad8a98b 100644
--- a/libc/arch-x86/syscalls/setsid.S
+++ b/libc/arch-x86/syscalls/setsid.S
@@ -3,8 +3,16 @@
#include <private/bionic_asm.h>
ENTRY(setsid)
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
movl $__NR_setsid, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setsockopt.S b/libc/arch-x86/syscalls/setsockopt.S
index 29e73bbf2..bca34e188 100644
--- a/libc/arch-x86/syscalls/setsockopt.S
+++ b/libc/arch-x86/syscalls/setsockopt.S
@@ -9,11 +9,19 @@ ENTRY(setsockopt)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $14, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/settimeofday.S b/libc/arch-x86/syscalls/settimeofday.S
index 4a861ab20..31437d0d8 100644
--- a/libc/arch-x86/syscalls/settimeofday.S
+++ b/libc/arch-x86/syscalls/settimeofday.S
@@ -9,10 +9,18 @@ ENTRY(settimeofday)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_settimeofday, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setuid.S b/libc/arch-x86/syscalls/setuid.S
index 048e0c1dd..2461182ab 100644
--- a/libc/arch-x86/syscalls/setuid.S
+++ b/libc/arch-x86/syscalls/setuid.S
@@ -6,9 +6,17 @@ ENTRY(setuid)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_setuid32, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/setxattr.S b/libc/arch-x86/syscalls/setxattr.S
index 1e87bf04e..787891e78 100644
--- a/libc/arch-x86/syscalls/setxattr.S
+++ b/libc/arch-x86/syscalls/setxattr.S
@@ -18,13 +18,21 @@ ENTRY(setxattr)
pushl %edi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edi, 0
- mov 24(%esp), %ebx
- mov 28(%esp), %ecx
- mov 32(%esp), %edx
- mov 36(%esp), %esi
- mov 40(%esp), %edi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 28(%esp), %ebx
+ mov 32(%esp), %ecx
+ mov 36(%esp), %edx
+ mov 40(%esp), %esi
+ mov 44(%esp), %edi
movl $__NR_setxattr, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/shutdown.S b/libc/arch-x86/syscalls/shutdown.S
index f224fc681..46e5c1855 100644
--- a/libc/arch-x86/syscalls/shutdown.S
+++ b/libc/arch-x86/syscalls/shutdown.S
@@ -9,11 +9,19 @@ ENTRY(shutdown)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $13, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sigaltstack.S b/libc/arch-x86/syscalls/sigaltstack.S
index 875ef8c47..90eae16be 100644
--- a/libc/arch-x86/syscalls/sigaltstack.S
+++ b/libc/arch-x86/syscalls/sigaltstack.S
@@ -9,10 +9,18 @@ ENTRY(sigaltstack)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_sigaltstack, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/socketpair.S b/libc/arch-x86/syscalls/socketpair.S
index 4c5154e4d..c9c759574 100644
--- a/libc/arch-x86/syscalls/socketpair.S
+++ b/libc/arch-x86/syscalls/socketpair.S
@@ -9,11 +9,19 @@ ENTRY(socketpair)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
mov $8, %ebx
mov %esp, %ecx
- addl $12, %ecx
+ addl $16, %ecx
movl $__NR_socketcall, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/splice.S b/libc/arch-x86/syscalls/splice.S
index 1dc90373d..2d82a3d83 100644
--- a/libc/arch-x86/syscalls/splice.S
+++ b/libc/arch-x86/syscalls/splice.S
@@ -21,14 +21,22 @@ ENTRY(splice)
pushl %ebp
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ebp, 0
- mov 28(%esp), %ebx
- mov 32(%esp), %ecx
- mov 36(%esp), %edx
- mov 40(%esp), %esi
- mov 44(%esp), %edi
- mov 48(%esp), %ebp
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 32(%esp), %ebx
+ mov 36(%esp), %ecx
+ mov 40(%esp), %edx
+ mov 44(%esp), %esi
+ mov 48(%esp), %edi
+ mov 52(%esp), %ebp
movl $__NR_splice, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/swapoff.S b/libc/arch-x86/syscalls/swapoff.S
index 078852944..d10a748c6 100644
--- a/libc/arch-x86/syscalls/swapoff.S
+++ b/libc/arch-x86/syscalls/swapoff.S
@@ -6,9 +6,17 @@ ENTRY(swapoff)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_swapoff, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/swapon.S b/libc/arch-x86/syscalls/swapon.S
index 1070d8eae..dc7db646a 100644
--- a/libc/arch-x86/syscalls/swapon.S
+++ b/libc/arch-x86/syscalls/swapon.S
@@ -9,10 +9,18 @@ ENTRY(swapon)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_swapon, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/symlinkat.S b/libc/arch-x86/syscalls/symlinkat.S
index e7fe69e2e..51b1330e4 100644
--- a/libc/arch-x86/syscalls/symlinkat.S
+++ b/libc/arch-x86/syscalls/symlinkat.S
@@ -12,11 +12,19 @@ ENTRY(symlinkat)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_symlinkat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sync.S b/libc/arch-x86/syscalls/sync.S
index 252c6662b..c75e9f974 100644
--- a/libc/arch-x86/syscalls/sync.S
+++ b/libc/arch-x86/syscalls/sync.S
@@ -6,9 +6,17 @@ ENTRY(sync)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_sync, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/sysinfo.S b/libc/arch-x86/syscalls/sysinfo.S
index f59a0c36d..a40d6641a 100644
--- a/libc/arch-x86/syscalls/sysinfo.S
+++ b/libc/arch-x86/syscalls/sysinfo.S
@@ -6,9 +6,17 @@ ENTRY(sysinfo)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_sysinfo, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/tee.S b/libc/arch-x86/syscalls/tee.S
index b47c4600e..693ad1ea8 100644
--- a/libc/arch-x86/syscalls/tee.S
+++ b/libc/arch-x86/syscalls/tee.S
@@ -15,12 +15,20 @@ ENTRY(tee)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_tee, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/tgkill.S b/libc/arch-x86/syscalls/tgkill.S
index 7a43a01a8..5cce4d8ee 100644
--- a/libc/arch-x86/syscalls/tgkill.S
+++ b/libc/arch-x86/syscalls/tgkill.S
@@ -12,11 +12,19 @@ ENTRY(tgkill)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_tgkill, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/timerfd_create.S b/libc/arch-x86/syscalls/timerfd_create.S
index ad099a5dd..335b7a6d9 100644
--- a/libc/arch-x86/syscalls/timerfd_create.S
+++ b/libc/arch-x86/syscalls/timerfd_create.S
@@ -9,10 +9,18 @@ ENTRY(timerfd_create)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_timerfd_create, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/timerfd_gettime.S b/libc/arch-x86/syscalls/timerfd_gettime.S
index c679b7c53..9dc1a2fbd 100644
--- a/libc/arch-x86/syscalls/timerfd_gettime.S
+++ b/libc/arch-x86/syscalls/timerfd_gettime.S
@@ -9,10 +9,18 @@ ENTRY(timerfd_gettime)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_timerfd_gettime, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/timerfd_settime.S b/libc/arch-x86/syscalls/timerfd_settime.S
index 4e889ead7..477b5bb5f 100644
--- a/libc/arch-x86/syscalls/timerfd_settime.S
+++ b/libc/arch-x86/syscalls/timerfd_settime.S
@@ -15,12 +15,20 @@ ENTRY(timerfd_settime)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_timerfd_settime, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/times.S b/libc/arch-x86/syscalls/times.S
index 0ba0b6fab..14fe22105 100644
--- a/libc/arch-x86/syscalls/times.S
+++ b/libc/arch-x86/syscalls/times.S
@@ -6,9 +6,17 @@ ENTRY(times)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_times, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/truncate.S b/libc/arch-x86/syscalls/truncate.S
index 31fec1738..dd999421e 100644
--- a/libc/arch-x86/syscalls/truncate.S
+++ b/libc/arch-x86/syscalls/truncate.S
@@ -9,10 +9,18 @@ ENTRY(truncate)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_truncate, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/truncate64.S b/libc/arch-x86/syscalls/truncate64.S
index 45e24d043..35e4037d2 100644
--- a/libc/arch-x86/syscalls/truncate64.S
+++ b/libc/arch-x86/syscalls/truncate64.S
@@ -12,11 +12,19 @@ ENTRY(truncate64)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_truncate64, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/umask.S b/libc/arch-x86/syscalls/umask.S
index 9b4d3c7f5..3333fac20 100644
--- a/libc/arch-x86/syscalls/umask.S
+++ b/libc/arch-x86/syscalls/umask.S
@@ -6,9 +6,17 @@ ENTRY(umask)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_umask, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/umount2.S b/libc/arch-x86/syscalls/umount2.S
index 13757ab3f..48e1eb507 100644
--- a/libc/arch-x86/syscalls/umount2.S
+++ b/libc/arch-x86/syscalls/umount2.S
@@ -9,10 +9,18 @@ ENTRY(umount2)
pushl %ecx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset ecx, 0
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
movl $__NR_umount2, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/uname.S b/libc/arch-x86/syscalls/uname.S
index dab7e0d32..9eea2c1ea 100644
--- a/libc/arch-x86/syscalls/uname.S
+++ b/libc/arch-x86/syscalls/uname.S
@@ -6,9 +6,17 @@ ENTRY(uname)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_uname, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/unlinkat.S b/libc/arch-x86/syscalls/unlinkat.S
index 6faf71e7f..e039a340d 100644
--- a/libc/arch-x86/syscalls/unlinkat.S
+++ b/libc/arch-x86/syscalls/unlinkat.S
@@ -12,11 +12,19 @@ ENTRY(unlinkat)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_unlinkat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/unshare.S b/libc/arch-x86/syscalls/unshare.S
index b724798c2..ae68d7e3d 100644
--- a/libc/arch-x86/syscalls/unshare.S
+++ b/libc/arch-x86/syscalls/unshare.S
@@ -6,9 +6,17 @@ ENTRY(unshare)
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_rel_offset ebx, 0
- mov 8(%esp), %ebx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 12(%esp), %ebx
movl $__NR_unshare, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/utimensat.S b/libc/arch-x86/syscalls/utimensat.S
index 07eca45ad..43eebc76f 100644
--- a/libc/arch-x86/syscalls/utimensat.S
+++ b/libc/arch-x86/syscalls/utimensat.S
@@ -15,12 +15,20 @@ ENTRY(utimensat)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_utimensat, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/vmsplice.S b/libc/arch-x86/syscalls/vmsplice.S
index f12cc6591..195b0bfd8 100644
--- a/libc/arch-x86/syscalls/vmsplice.S
+++ b/libc/arch-x86/syscalls/vmsplice.S
@@ -15,12 +15,20 @@ ENTRY(vmsplice)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_vmsplice, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/wait4.S b/libc/arch-x86/syscalls/wait4.S
index bed7c401e..281d5f2c6 100644
--- a/libc/arch-x86/syscalls/wait4.S
+++ b/libc/arch-x86/syscalls/wait4.S
@@ -15,12 +15,20 @@ ENTRY(wait4)
pushl %esi
.cfi_adjust_cfa_offset 4
.cfi_rel_offset esi, 0
- mov 20(%esp), %ebx
- mov 24(%esp), %ecx
- mov 28(%esp), %edx
- mov 32(%esp), %esi
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 24(%esp), %ebx
+ mov 28(%esp), %ecx
+ mov 32(%esp), %edx
+ mov 36(%esp), %esi
movl $__NR_wait4, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/write.S b/libc/arch-x86/syscalls/write.S
index e14720886..e9e5f4e42 100644
--- a/libc/arch-x86/syscalls/write.S
+++ b/libc/arch-x86/syscalls/write.S
@@ -12,11 +12,19 @@ ENTRY(write)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_write, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/syscalls/writev.S b/libc/arch-x86/syscalls/writev.S
index 07ba7b55b..664990589 100644
--- a/libc/arch-x86/syscalls/writev.S
+++ b/libc/arch-x86/syscalls/writev.S
@@ -12,11 +12,19 @@ ENTRY(writev)
pushl %edx
.cfi_adjust_cfa_offset 4
.cfi_rel_offset edx, 0
- mov 16(%esp), %ebx
- mov 20(%esp), %ecx
- mov 24(%esp), %edx
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
movl $__NR_writev, %eax
- int $0x80
+ call *(%esp)
+ addl $4, %esp
+
cmpl $-MAX_ERRNO, %eax
jb 1f
negl %eax
diff --git a/libc/arch-x86/x86.mk b/libc/arch-x86/x86.mk
index e5d70a9d8..1d717aa79 100644
--- a/libc/arch-x86/x86.mk
+++ b/libc/arch-x86/x86.mk
@@ -1,17 +1,103 @@
# 32-bit x86.
#
-# Default implementations of functions that are commonly optimized.
+# Generic x86 optimizations, may be overriden by CPU variants.
#
-libc_common_src_files_x86 += \
- bionic/__memcpy_chk.cpp \
- bionic/__memset_chk.cpp \
- bionic/__strcpy_chk.cpp \
- bionic/__strcat_chk.cpp \
+libc_bionic_src_files_x86 += \
+ arch-x86/atom/string/sse2-memchr-atom.S \
+ arch-x86/atom/string/sse2-memrchr-atom.S \
+ arch-x86/atom/string/sse2-strchr-atom.S \
+ arch-x86/atom/string/sse2-strnlen-atom.S \
+ arch-x86/atom/string/sse2-strrchr-atom.S \
+ arch-x86/atom/string/sse2-wcschr-atom.S \
+ arch-x86/atom/string/sse2-wcsrchr-atom.S \
+ arch-x86/atom/string/sse2-wcslen-atom.S \
+ arch-x86/atom/string/sse2-wcscmp-atom.S \
+ arch-x86/silvermont/string/sse2-bcopy-slm.S \
+ arch-x86/silvermont/string/sse2-bzero-slm.S \
+ arch-x86/silvermont/string/sse2-memcpy-slm.S \
+ arch-x86/silvermont/string/sse2-memmove-slm.S \
+ arch-x86/silvermont/string/sse2-memset-slm.S \
+ arch-x86/silvermont/string/sse2-stpcpy-slm.S \
+ arch-x86/silvermont/string/sse2-stpncpy-slm.S \
+ arch-x86/silvermont/string/sse2-strcpy-slm.S \
+ arch-x86/silvermont/string/sse2-strlen-slm.S \
+ arch-x86/silvermont/string/sse2-strncpy-slm.S
+
+libc_bionic_src_files_x86 += \
+ arch-x86/generic/string/memcmp.S \
+ arch-x86/generic/string/strcmp.S \
+ arch-x86/generic/string/strncmp.S \
+ arch-x86/generic/string/strcat.S
-libc_freebsd_src_files_x86 += \
- upstream-freebsd/lib/libc/string/wmemmove.c \
+ifeq ($(ARCH_X86_HAVE_SSSE3),true)
+libc_bionic_src_files_x86 += \
+ arch-x86/atom/string/ssse3-strncat-atom.S \
+ arch-x86/atom/string/ssse3-strlcat-atom.S \
+ arch-x86/atom/string/ssse3-strlcpy-atom.S \
+ arch-x86/atom/string/ssse3-strcmp-atom.S \
+ arch-x86/atom/string/ssse3-strncmp-atom.S \
+ arch-x86/atom/string/ssse3-strcat-atom.S \
+ arch-x86/atom/string/ssse3-wcscat-atom.S \
+ arch-x86/atom/string/ssse3-wcscpy-atom.S
+libc_bionic_src_files_exclude_x86 += \
+ arch-x86/generic/string/strcmp.S \
+ arch-x86/generic/string/strncmp.S \
+ arch-x86/generic/string/strcat.S
+endif
+
+ifeq ($(ARCH_X86_HAVE_SSE4),true)
+libc_bionic_src_files_x86 += \
+ arch-x86/silvermont/string/sse4-memcmp-slm.S \
+ arch-x86/silvermont/string/sse4-wmemcmp-slm.S
+libc_bionic_src_files_exclude_x86 += \
+ arch-x86/generic/string/memcmp.S
+endif
+
+#
+# Remove default implementations that we have optimized versions of.
+#
+
+libc_freebsd_src_files_exclude_x86 += \
+ upstream-freebsd/lib/libc/string/wcschr.c \
+ upstream-freebsd/lib/libc/string/wcscmp.c \
+ upstream-freebsd/lib/libc/string/wcslen.c \
+ upstream-freebsd/lib/libc/string/wcsrchr.c \
+
+ifeq ($(ARCH_X86_HAVE_SSSE3),true)
+libc_freebsd_src_files_exclude_x86 += \
+ upstream-freebsd/lib/libc/string/wcscat.c \
+ upstream-freebsd/lib/libc/string/wcscpy.c
+endif
+
+ifeq ($(ARCH_X86_HAVE_SSE4),true)
+libc_freebsd_src_files_exclude_x86 += \
+ upstream-freebsd/lib/libc/string/wmemcmp.c
+endif
+
+libc_openbsd_src_files_exclude_x86 += \
+ upstream-openbsd/lib/libc/string/memchr.c \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/memrchr.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/stpncpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+ upstream-openbsd/lib/libc/string/strcpy.c \
+ upstream-openbsd/lib/libc/string/strncmp.c \
+ upstream-openbsd/lib/libc/string/strncpy.c \
+
+ifeq ($(ARCH_X86_HAVE_SSSE3),true)
+libc_openbsd_src_files_exclude_x86 += \
+ upstream-openbsd/lib/libc/string/strlcat.c \
+ upstream-openbsd/lib/libc/string/strlcpy.c \
+ upstream-openbsd/lib/libc/string/strncat.c
+endif
+
+libc_bionic_src_files_exclude_x86 += \
+ bionic/strchr.cpp \
+ bionic/strnlen.c \
+ bionic/strrchr.cpp \
#
# Inherently architecture-specific functions.
@@ -23,19 +109,20 @@ libc_bionic_src_files_x86 += \
arch-x86/bionic/libgcc_compat.c \
arch-x86/bionic/__restore.S \
arch-x86/bionic/setjmp.S \
- arch-x86/bionic/__set_tls.c \
arch-x86/bionic/syscall.S \
arch-x86/bionic/vfork.S \
## ARCH variant specific source files
arch_variant_mk := $(LOCAL_PATH)/arch-x86/$(TARGET_ARCH_VARIANT)/$(TARGET_ARCH_VARIANT).mk
ifeq ($(wildcard $(arch_variant_mk)),)
- arch_variant_mk := $(LOCAL_PATH)/arch-x86/generic/generic.mk
+ arch_variant_mk :=
endif
+ifneq ($(arch_variant_mk),)
include $(arch_variant_mk)
libc_common_additional_dependencies += $(arch_variant_mk)
arch_variant_mk :=
+endif
libc_crt_target_cflags_x86 := \
-m32 \
diff --git a/libc/arch-x86_64/bionic/setjmp.S b/libc/arch-x86_64/bionic/setjmp.S
index 5559f54c3..34b43651e 100644
--- a/libc/arch-x86_64/bionic/setjmp.S
+++ b/libc/arch-x86_64/bionic/setjmp.S
@@ -35,8 +35,22 @@
#include <private/bionic_asm.h>
-// These are only the callee-saved registers. Code calling setjmp
-// will expect the rest to be clobbered anyway.
+
+// The internal structure of a jmp_buf is totally private.
+// Current layout (changes from release to release):
+//
+// word name description
+// 0 rbx registers
+// 1 rbp
+// 2 r12
+// 3 r13
+// 4 r14
+// 5 r15
+// 6 rsp
+// 7 pc
+// 8 sigflag/cookie setjmp cookie in top 31 bits, signal mask flag in low bit
+// 9 sigmask signal mask (includes rt signals as well)
+// 10 checksum checksum of the core registers, to give better error messages.
#define _JB_RBX 0
#define _JB_RBP 1
@@ -48,7 +62,33 @@
#define _JB_PC 7
#define _JB_SIGFLAG 8
#define _JB_SIGMASK 9
-#define _JB_SIGMASK_RT 10 // sigprocmask will write here too.
+#define _JB_CHECKSUM 10
+
+#define MANGLE_REGISTERS 1
+
+.macro m_mangle_registers reg
+#if MANGLE_REGISTERS
+ xorq \reg,%rbx
+ xorq \reg,%rbp
+ xorq \reg,%r12
+ xorq \reg,%r13
+ xorq \reg,%r14
+ xorq \reg,%r15
+ xorq \reg,%rsp
+ xorq \reg,%r11
+#endif
+.endm
+
+.macro m_unmangle_registers reg
+ m_mangle_registers \reg
+.endm
+
+.macro m_calculate_checksum dst, src
+ movq $0, \dst
+ .irp i,0,1,2,3,4,5,6,7
+ xorq (\i*8)(\src), \dst
+ .endr
+.endm
ENTRY(setjmp)
movl $1,%esi
@@ -62,11 +102,17 @@ END(_setjmp)
// int sigsetjmp(sigjmp_buf env, int save_signal_mask);
ENTRY(sigsetjmp)
- // Record whether or not we're saving the signal mask.
- movl %esi,(_JB_SIGFLAG * 8)(%rdi)
+ pushq %rdi
+ movq %rsi,%rdi
+ call PIC_PLT(__bionic_setjmp_cookie_get)
+ popq %rdi
+
+ // Record setjmp cookie and whether or not we're saving the signal mask.
+ movq %rax,(_JB_SIGFLAG * 8)(%rdi)
+ pushq %rax
// Do we need to save the signal mask?
- testl %esi,%esi
+ testq $1,%rax
jz 2f
// Save current signal mask.
@@ -79,7 +125,10 @@ ENTRY(sigsetjmp)
2:
// Save the callee-save registers.
+ popq %rax
+ andq $-2,%rax
movq (%rsp),%r11
+ m_mangle_registers %rax
movq %rbx,(_JB_RBX * 8)(%rdi)
movq %rbp,(_JB_RBP * 8)(%rdi)
movq %r12,(_JB_R12 * 8)(%rdi)
@@ -88,6 +137,10 @@ ENTRY(sigsetjmp)
movq %r15,(_JB_R15 * 8)(%rdi)
movq %rsp,(_JB_RSP * 8)(%rdi)
movq %r11,(_JB_PC * 8)(%rdi)
+ m_unmangle_registers %rax
+
+ m_calculate_checksum %rax, %rdi
+ movq %rax, (_JB_CHECKSUM * 8)(%rdi)
xorl %eax,%eax
ret
@@ -98,8 +151,14 @@ ENTRY(siglongjmp)
movq %rdi,%r12
pushq %rsi // Push 'value'.
+ m_calculate_checksum %rax, %rdi
+ xorq (_JB_CHECKSUM * 8)(%rdi), %rax
+ jnz 3f
+
// Do we need to restore the signal mask?
- cmpl $0,(_JB_SIGFLAG * 8)(%rdi)
+ movq (_JB_SIGFLAG * 8)(%rdi), %rdi
+ pushq %rdi // Push cookie
+ testq $1, %rdi
jz 2f
// Restore the signal mask.
@@ -109,6 +168,10 @@ ENTRY(siglongjmp)
call PIC_PLT(sigprocmask)
2:
+ // Fetch the setjmp cookie and clear the signal flag bit.
+ popq %rcx
+ andq $-2, %rcx
+
popq %rax // Pop 'value'.
// Restore the callee-save registers.
@@ -120,13 +183,26 @@ ENTRY(siglongjmp)
movq (_JB_RSP * 8)(%r12),%rsp
movq (_JB_PC * 8)(%r12),%r11
movq (_JB_R12 * 8)(%r12),%r12
+ m_unmangle_registers %rcx
+
+ // Check the cookie.
+ pushq %rax
+ pushq %r11
+ movq %rcx, %rdi
+ call PIC_PLT(__bionic_setjmp_cookie_check)
+ popq %r11
+ popq %rax
+ // Return 1 if value is 0.
testl %eax,%eax
jnz 1f
incl %eax
1:
movq %r11,0(%rsp)
ret
+
+3:
+ call PIC_PLT(__bionic_setjmp_checksum_mismatch)
END(siglongjmp)
ALIAS_SYMBOL(longjmp, siglongjmp)
diff --git a/libc/arch-x86_64/bionic/vfork.S b/libc/arch-x86_64/bionic/vfork.S
index 129f1dbd2..3b32c6652 100644
--- a/libc/arch-x86_64/bionic/vfork.S
+++ b/libc/arch-x86_64/bionic/vfork.S
@@ -32,6 +32,12 @@
ENTRY(vfork)
popq %rdi // Grab the return address.
+
+ // __get_tls()[TLS_SLOT_THREAD_ID]->cached_pid_ = 0
+ mov %fs:0, %rax
+ mov 8(%rax), %rax
+ movl $0, 20(%rax)
+
movl $__NR_vfork, %eax
syscall
pushq %rdi // Restore the return address.
diff --git a/libc/arch-x86_64/string/sse2-memmove-slm.S b/libc/arch-x86_64/string/sse2-memmove-slm.S
index 0dbffad2c..6a5afd610 100644
--- a/libc/arch-x86_64/string/sse2-memmove-slm.S
+++ b/libc/arch-x86_64/string/sse2-memmove-slm.S
@@ -91,9 +91,6 @@ name: \
.section .text.sse2,"ax",@progbits
ENTRY (MEMMOVE)
ENTRANCE
-#ifdef USE_AS_BCOPY
- xchg %rsi, %rdi
-#endif
mov %rdi, %rax
/* Check whether we should copy backward or forward. */
diff --git a/libc/arch-x86_64/syscalls/flistxattr.S b/libc/arch-x86_64/syscalls/___flistxattr.S
index aa02db1e2..b4695cc90 100644
--- a/libc/arch-x86_64/syscalls/flistxattr.S
+++ b/libc/arch-x86_64/syscalls/___flistxattr.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(flistxattr)
+ENTRY(___flistxattr)
movl $__NR_flistxattr, %eax
syscall
cmpq $-MAX_ERRNO, %rax
@@ -12,4 +12,5 @@ ENTRY(flistxattr)
call __set_errno_internal
1:
ret
-END(flistxattr)
+END(___flistxattr)
+.hidden ___flistxattr
diff --git a/libc/arch-x86_64/syscalls/mremap.S b/libc/arch-x86_64/syscalls/___mremap.S
index a6042cb6c..cc6dee9c0 100644
--- a/libc/arch-x86_64/syscalls/mremap.S
+++ b/libc/arch-x86_64/syscalls/___mremap.S
@@ -2,7 +2,7 @@
#include <private/bionic_asm.h>
-ENTRY(mremap)
+ENTRY(___mremap)
movq %rcx, %r10
movl $__NR_mremap, %eax
syscall
@@ -13,4 +13,5 @@ ENTRY(mremap)
call __set_errno_internal
1:
ret
-END(mremap)
+END(___mremap)
+.hidden ___mremap
diff --git a/libc/arch-x86_64/syscalls/adjtimex.S b/libc/arch-x86_64/syscalls/adjtimex.S
new file mode 100644
index 000000000..292b9f36e
--- /dev/null
+++ b/libc/arch-x86_64/syscalls/adjtimex.S
@@ -0,0 +1,15 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(adjtimex)
+ movl $__NR_adjtimex, %eax
+ syscall
+ cmpq $-MAX_ERRNO, %rax
+ jb 1f
+ negl %eax
+ movl %eax, %edi
+ call __set_errno_internal
+1:
+ ret
+END(adjtimex)
diff --git a/libc/arch-x86_64/syscalls/clock_adjtime.S b/libc/arch-x86_64/syscalls/clock_adjtime.S
new file mode 100644
index 000000000..0601930a5
--- /dev/null
+++ b/libc/arch-x86_64/syscalls/clock_adjtime.S
@@ -0,0 +1,15 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(clock_adjtime)
+ movl $__NR_clock_adjtime, %eax
+ syscall
+ cmpq $-MAX_ERRNO, %rax
+ jb 1f
+ negl %eax
+ movl %eax, %edi
+ call __set_errno_internal
+1:
+ ret
+END(clock_adjtime)
diff --git a/libc/arch-x86_64/syscalls/preadv.S b/libc/arch-x86_64/syscalls/preadv.S
new file mode 100644
index 000000000..7771a4447
--- /dev/null
+++ b/libc/arch-x86_64/syscalls/preadv.S
@@ -0,0 +1,18 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(preadv)
+ movq %rcx, %r10
+ movl $__NR_preadv, %eax
+ syscall
+ cmpq $-MAX_ERRNO, %rax
+ jb 1f
+ negl %eax
+ movl %eax, %edi
+ call __set_errno_internal
+1:
+ ret
+END(preadv)
+
+ALIAS_SYMBOL(preadv64, preadv)
diff --git a/libc/arch-x86_64/syscalls/pwritev.S b/libc/arch-x86_64/syscalls/pwritev.S
new file mode 100644
index 000000000..d3bd8facb
--- /dev/null
+++ b/libc/arch-x86_64/syscalls/pwritev.S
@@ -0,0 +1,18 @@
+/* Generated by gensyscalls.py. Do not edit. */
+
+#include <private/bionic_asm.h>
+
+ENTRY(pwritev)
+ movq %rcx, %r10
+ movl $__NR_pwritev, %eax
+ syscall
+ cmpq $-MAX_ERRNO, %rax
+ jb 1f
+ negl %eax
+ movl %eax, %edi
+ call __set_errno_internal
+1:
+ ret
+END(pwritev)
+
+ALIAS_SYMBOL(pwritev64, pwritev)
diff --git a/libc/arch-x86_64/x86_64.mk b/libc/arch-x86_64/x86_64.mk
index 06d318574..ce06217be 100644
--- a/libc/arch-x86_64/x86_64.mk
+++ b/libc/arch-x86_64/x86_64.mk
@@ -1,31 +1,20 @@
# 64-bit x86.
#
-# Default implementations of functions that are commonly optimized.
+# Remove default implementations that we have optimized versions of.
#
-libc_bionic_src_files_x86_64 += \
- bionic/__memcpy_chk.cpp \
- bionic/__memset_chk.cpp \
- bionic/__strcpy_chk.cpp \
- bionic/__strcat_chk.cpp \
- bionic/strchr.cpp \
- bionic/strnlen.c \
- bionic/strrchr.cpp \
-
-libc_freebsd_src_files_x86_64 += \
- upstream-freebsd/lib/libc/string/wcscat.c \
- upstream-freebsd/lib/libc/string/wcschr.c \
- upstream-freebsd/lib/libc/string/wcscmp.c \
- upstream-freebsd/lib/libc/string/wcscpy.c \
- upstream-freebsd/lib/libc/string/wcslen.c \
- upstream-freebsd/lib/libc/string/wcsrchr.c \
- upstream-freebsd/lib/libc/string/wmemcmp.c \
- upstream-freebsd/lib/libc/string/wmemmove.c \
-
-libc_openbsd_src_files_x86_64 += \
- upstream-openbsd/lib/libc/string/memchr.c \
- upstream-openbsd/lib/libc/string/memrchr.c \
+libc_openbsd_src_files_exclude_x86_64 += \
+ upstream-openbsd/lib/libc/string/memmove.c \
+ upstream-openbsd/lib/libc/string/stpcpy.c \
+ upstream-openbsd/lib/libc/string/stpncpy.c \
+ upstream-openbsd/lib/libc/string/strcat.c \
+ upstream-openbsd/lib/libc/string/strcpy.c \
+ upstream-openbsd/lib/libc/string/strlcat.c \
+ upstream-openbsd/lib/libc/string/strlcpy.c \
+ upstream-openbsd/lib/libc/string/strncat.c \
+ upstream-openbsd/lib/libc/string/strncmp.c \
+ upstream-openbsd/lib/libc/string/strncpy.c \
#
# Inherently architecture-specific code.
@@ -36,7 +25,6 @@ libc_bionic_src_files_x86_64 += \
arch-x86_64/bionic/_exit_with_stack_teardown.S \
arch-x86_64/bionic/__restore_rt.S \
arch-x86_64/bionic/setjmp.S \
- arch-x86_64/bionic/__set_tls.c \
arch-x86_64/bionic/syscall.S \
arch-x86_64/bionic/vfork.S \
diff --git a/libc/bionic/__cxa_guard.cpp b/libc/bionic/__cxa_guard.cpp
index 5b34b584b..97284d5b0 100644
--- a/libc/bionic/__cxa_guard.cpp
+++ b/libc/bionic/__cxa_guard.cpp
@@ -109,7 +109,7 @@ extern "C" int __cxa_guard_acquire(_guard_t* gv) {
}
}
- __futex_wait_ex(&gv->state, false, CONSTRUCTION_UNDERWAY_WITH_WAITER, NULL);
+ __futex_wait_ex(&gv->state, false, CONSTRUCTION_UNDERWAY_WITH_WAITER, false, nullptr);
old_value = atomic_load_explicit(&gv->state, memory_order_relaxed);
}
}
diff --git a/libc/bionic/__cxa_thread_atexit_impl.cpp b/libc/bionic/__cxa_thread_atexit_impl.cpp
index 0e427d346..6284b1256 100644
--- a/libc/bionic/__cxa_thread_atexit_impl.cpp
+++ b/libc/bionic/__cxa_thread_atexit_impl.cpp
@@ -15,32 +15,34 @@
*/
#include <sys/cdefs.h>
-struct thread_local_dtor {
+#include "pthread_internal.h"
+
+class thread_local_dtor {
+ public:
void (*func) (void *);
void *arg;
void *dso_handle; // unused...
thread_local_dtor* next;
};
-static __thread thread_local_dtor* thread_local_dtors = nullptr;
-
extern "C" int __cxa_thread_atexit_impl(void (*func) (void *), void *arg, void *dso_handle) {
thread_local_dtor* dtor = new thread_local_dtor();
dtor->func = func;
dtor->arg = arg;
dtor->dso_handle = dso_handle;
- dtor->next = thread_local_dtors;
-
- thread_local_dtors = dtor;
+ pthread_internal_t* thread = __get_thread();
+ dtor->next = thread->thread_local_dtors;
+ thread->thread_local_dtors = dtor;
return 0;
}
extern "C" __LIBC_HIDDEN__ void __cxa_thread_finalize() {
- while (thread_local_dtors != nullptr) {
- thread_local_dtor* current = thread_local_dtors;
- thread_local_dtors = current->next;
+ pthread_internal_t* thread = __get_thread();
+ while (thread->thread_local_dtors != nullptr) {
+ thread_local_dtor* current = thread->thread_local_dtors;
+ thread->thread_local_dtors = current->next;
current->func(current->arg);
delete current;
diff --git a/libc/bionic/__fread_chk.cpp b/libc/bionic/__fread_chk.cpp
new file mode 100644
index 000000000..afc8d90ce
--- /dev/null
+++ b/libc/bionic/__fread_chk.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#undef _FORTIFY_SOURCE
+#include <stdio.h>
+#include <sys/cdefs.h>
+#include "private/libc_logging.h"
+
+extern "C" size_t __fread_chk(void * __restrict buf, size_t size, size_t count,
+ FILE * __restrict stream, size_t buf_size) {
+ size_t total;
+ if (__predict_false(__size_mul_overflow(size, count, &total))) {
+ // overflow: trigger the error path in fread
+ return fread(buf, size, count, stream);
+ }
+
+ if (__predict_false(total > buf_size)) {
+ __fortify_chk_fail("fread: prevented write past end of buffer", 0);
+ }
+
+ return fread(buf, size, count, stream);
+}
diff --git a/libc/bionic/__fwrite_chk.cpp b/libc/bionic/__fwrite_chk.cpp
new file mode 100644
index 000000000..2af13d653
--- /dev/null
+++ b/libc/bionic/__fwrite_chk.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#undef _FORTIFY_SOURCE
+#include <stdio.h>
+#include <sys/cdefs.h>
+#include "private/libc_logging.h"
+
+extern "C" size_t __fwrite_chk(const void * __restrict buf, size_t size, size_t count,
+ FILE * __restrict stream, size_t buf_size) {
+ size_t total;
+ if (__predict_false(__size_mul_overflow(size, count, &total))) {
+ // overflow: trigger the error path in fwrite
+ return fwrite(buf, size, count, stream);
+ }
+
+ if (__predict_false(total > buf_size)) {
+ __fortify_chk_fail("fwrite: prevented read past end of buffer", 0);
+ }
+
+ return fwrite(buf, size, count, stream);
+}
diff --git a/libc/bionic/__getcwd_chk.cpp b/libc/bionic/__getcwd_chk.cpp
new file mode 100644
index 000000000..b53ab5c35
--- /dev/null
+++ b/libc/bionic/__getcwd_chk.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#undef _FORTIFY_SOURCE
+
+#include <unistd.h>
+#include "private/libc_logging.h"
+
+extern char* __getcwd_chk(char* buf, size_t len, size_t buflen) {
+ if (__predict_false(len > buflen)) {
+ __fortify_chk_fail("getcwd: prevented write past end of buffer", 0);
+ }
+
+ return getcwd(buf, len);
+}
diff --git a/libc/bionic/__libc_init_main_thread.cpp b/libc/bionic/__libc_init_main_thread.cpp
new file mode 100644
index 000000000..01bb9bb70
--- /dev/null
+++ b/libc/bionic/__libc_init_main_thread.cpp
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "libc_init_common.h"
+
+#include "private/bionic_auxv.h"
+#include "private/bionic_globals.h"
+#include "private/KernelArgumentBlock.h"
+#include "pthread_internal.h"
+
+extern "C" int __set_tls(void* ptr);
+extern "C" int __set_tid_address(int* tid_address);
+
+// Setup for the main thread. For dynamic executables, this is called by the
+// linker _before_ libc is mapped in memory. This means that all writes to
+// globals from this function will apply to linker-private copies and will not
+// be visible from libc later on.
+//
+// Note: this function creates a pthread_internal_t for the initial thread and
+// stores the pointer in TLS, but does not add it to pthread's thread list. This
+// has to be done later from libc itself (see __libc_init_common).
+//
+// This is in a file by itself because it needs to be built with
+// -fno-stack-protector because it's responsible for setting up the main
+// thread's TLS (which stack protector relies on).
+
+void __libc_init_main_thread(KernelArgumentBlock& args) {
+ __libc_auxv = args.auxv;
+#if defined(__i386__)
+ __libc_init_sysinfo(args);
+#endif
+
+ static pthread_internal_t main_thread;
+
+ // The -fstack-protector implementation uses TLS, so make sure that's
+ // set up before we call any function that might get a stack check inserted.
+ __set_tls(main_thread.tls);
+
+ // Tell the kernel to clear our tid field when we exit, so we're like any other pthread.
+ // As a side-effect, this tells us our pid (which is the same as the main thread's tid).
+ main_thread.tid = __set_tid_address(&main_thread.tid);
+ main_thread.set_cached_pid(main_thread.tid);
+
+ // We don't want to free the main thread's stack even when the main thread exits
+ // because things like environment variables with global scope live on it.
+ // We also can't free the pthread_internal_t itself, since that lives on the main
+ // thread's stack rather than on the heap.
+ // The main thread has no mmap allocated space for stack or pthread_internal_t.
+ main_thread.mmap_size = 0;
+ pthread_attr_init(&main_thread.attr);
+ main_thread.attr.guard_size = 0; // The main thread has no guard page.
+ main_thread.attr.stack_size = 0; // User code should never see this; we'll compute it when asked.
+ // TODO: the main thread's sched_policy and sched_priority need to be queried.
+
+ // The TLS stack guard is set from the global, so ensure that we've initialized the global
+ // before we initialize the TLS.
+ __libc_init_global_stack_chk_guard(args);
+
+ __init_thread(&main_thread);
+ __init_tls(&main_thread);
+
+ // Store a pointer to the kernel argument block in a TLS slot to be
+ // picked up by the libc constructor.
+ main_thread.tls[TLS_SLOT_BIONIC_PREINIT] = &args;
+
+ __init_alternate_signal_stack(&main_thread);
+}
diff --git a/libc/bionic/__pwrite64_chk.cpp b/libc/bionic/__pwrite64_chk.cpp
new file mode 100644
index 000000000..e488ca174
--- /dev/null
+++ b/libc/bionic/__pwrite64_chk.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#undef _FORTIFY_SOURCE
+#include <unistd.h>
+#include "private/libc_logging.h"
+
+extern "C" ssize_t __pwrite64_chk(int fd, const void* buf, size_t count, off64_t offset,
+ size_t buf_size) {
+ if (__predict_false(count > buf_size)) {
+ __fortify_chk_fail("pwrite64: prevented read past end of buffer", 0);
+ }
+
+ if (__predict_false(count > SSIZE_MAX)) {
+ __fortify_chk_fail("pwrite64: count > SSIZE_MAX", 0);
+ }
+
+ return pwrite64(fd, buf, count, offset);
+}
diff --git a/libc/bionic/debug_mapinfo.h b/libc/bionic/__pwrite_chk.cpp
index af7d05d19..a889ef6ba 100644
--- a/libc/bionic/debug_mapinfo.h
+++ b/libc/bionic/__pwrite_chk.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,23 +26,19 @@
* SUCH DAMAGE.
*/
-#ifndef DEBUG_MAPINFO_H
-#define DEBUG_MAPINFO_H
+#undef _FORTIFY_SOURCE
+#include <unistd.h>
+#include "private/libc_logging.h"
-#include <sys/cdefs.h>
+extern "C" ssize_t __pwrite_chk(int fd, const void* buf, size_t count, off_t offset,
+ size_t buf_size) {
+ if (__predict_false(count > buf_size)) {
+ __fortify_chk_fail("pwrite: prevented read past end of buffer", 0);
+ }
-struct mapinfo_t {
- struct mapinfo_t* next;
- uintptr_t start;
- uintptr_t end;
- uintptr_t offset;
- uintptr_t load_base;
- bool load_base_read;
- char name[];
-};
+ if (__predict_false(count > SSIZE_MAX)) {
+ __fortify_chk_fail("pwrite: count > SSIZE_MAX", 0);
+ }
-__LIBC_HIDDEN__ mapinfo_t* mapinfo_create(pid_t pid);
-__LIBC_HIDDEN__ void mapinfo_destroy(mapinfo_t* mi);
-__LIBC_HIDDEN__ const mapinfo_t* mapinfo_find(mapinfo_t* mi, uintptr_t pc, uintptr_t* rel_pc);
-
-#endif /* DEBUG_MAPINFO_H */
+ return pwrite(fd, buf, count, offset);
+}
diff --git a/libc/bionic/__set_errno.cpp b/libc/bionic/__set_errno.cpp
index 30df350ea..9ef0047cc 100644
--- a/libc/bionic/__set_errno.cpp
+++ b/libc/bionic/__set_errno.cpp
@@ -36,20 +36,13 @@
// system these are the same size, but on a 64-bit system they're not.
// 'long' gives us 32-bit on 32-bit systems, 64-bit on 64-bit systems.
-// __set_errno was mistakenly exposed in <errno.h> in the 32-bit NDK.
-// We need the extra level of indirection so that the .hidden directives
-// in the system call stubs don't cause __set_errno to be hidden, breaking
-// old NDK apps.
+// Since __set_errno was mistakenly exposed in <errno.h> in the 32-bit
+// NDK, use a differently named internal function for the system call
+// stubs. This avoids having the stubs .hidden directives accidentally
+// hide __set_errno for old NDK apps.
// This one is for internal use only and used by both LP32 and LP64 assembler.
extern "C" __LIBC_HIDDEN__ long __set_errno_internal(int n) {
errno = n;
return -1;
}
-
-// This one exists for the LP32 NDK and is not present at all in LP64.
-#if !defined(__LP64__)
-extern "C" long __set_errno(int n) {
- return __set_errno_internal(n);
-}
-#endif
diff --git a/libc/bionic/__write_chk.cpp b/libc/bionic/__write_chk.cpp
new file mode 100644
index 000000000..cbd247a98
--- /dev/null
+++ b/libc/bionic/__write_chk.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#undef _FORTIFY_SOURCE
+#include <unistd.h>
+#include "private/libc_logging.h"
+
+extern "C" ssize_t __write_chk(int fd, const void* buf, size_t count, size_t buf_size) {
+ if (__predict_false(count > buf_size)) {
+ __fortify_chk_fail("write: prevented read past end of buffer", 0);
+ }
+
+ if (__predict_false(count > SSIZE_MAX)) {
+ __fortify_chk_fail("write: count > SSIZE_MAX", 0);
+ }
+
+ return write(fd, buf, count);
+}
diff --git a/libc/bionic/arpa_inet.cpp b/libc/bionic/arpa_inet.cpp
new file mode 100644
index 000000000..9d4afe321
--- /dev/null
+++ b/libc/bionic/arpa_inet.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <stdlib.h>
+
+#include "private/ErrnoRestorer.h"
+
+// The difference between inet_network(3) and inet_addr(3) is that
+// inet_network uses host order and inet_addr network order.
+in_addr_t inet_network(const char* cp) {
+ in_addr_t network_order = inet_addr(cp);
+ return ntohl(network_order);
+}
+
+in_addr_t inet_addr(const char* cp) {
+ in_addr addr;
+ return inet_aton(cp, &addr) ? addr.s_addr : INADDR_NONE;
+}
+
+int inet_aton(const char* cp, in_addr* addr) {
+ ErrnoRestorer errno_restorer;
+
+ unsigned long parts[4];
+ size_t i;
+ for (i = 0; i < 4; ++i) {
+ char* end;
+ errno = 0;
+ parts[i] = strtoul(cp, &end, 0);
+ if (errno != 0 || end == cp || (*end != '.' && *end != '\0')) return 0;
+ if (*end == '\0') break;
+ cp = end + 1;
+ }
+
+ uint32_t result = 0;
+ if (i == 0) {
+ // a (a 32-bit).
+ if (parts[0] > 0xffffffff) return 0;
+ result = parts[0];
+ } else if (i == 1) {
+ // a.b (b 24-bit).
+ if (parts[0] > 0xff || parts[1] > 0xffffff) return 0;
+ result = (parts[0] << 24) | parts[1];
+ } else if (i == 2) {
+ // a.b.c (c 16-bit).
+ if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xffff) return 0;
+ result = (parts[0] << 24) | (parts[1] << 16) | parts[2];
+ } else if (i == 3) {
+ // a.b.c.d (d 8-bit).
+ if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff || parts[3] > 0xff) return 0;
+ result = (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3];
+ } else {
+ return 0;
+ }
+
+ if (addr != nullptr) addr->s_addr = htonl(result);
+ return 1;
+}
diff --git a/libc/bionic/bionic_netlink.cpp b/libc/bionic/bionic_netlink.cpp
new file mode 100644
index 000000000..19ca88d52
--- /dev/null
+++ b/libc/bionic/bionic_netlink.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "bionic_netlink.h"
+
+#include <errno.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include "private/ErrnoRestorer.h"
+
+NetlinkConnection::NetlinkConnection() {
+ fd_ = -1;
+
+ // The kernel keeps packets under 8KiB (NLMSG_GOODSIZE),
+ // but that's a bit too large to go on the stack.
+ size_ = 8192;
+ data_ = new char[size_];
+}
+
+NetlinkConnection::~NetlinkConnection() {
+ ErrnoRestorer errno_restorer;
+ if (fd_ != -1) close(fd_);
+ delete[] data_;
+}
+
+bool NetlinkConnection::SendRequest(int type) {
+ // Rather than force all callers to check for the unlikely event of being
+ // unable to allocate 8KiB, check here.
+ if (data_ == nullptr) return false;
+
+ // Did we open a netlink socket yet?
+ if (fd_ == -1) {
+ fd_ = socket(PF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE);
+ }
+
+ // Construct and send the message.
+ struct NetlinkMessage {
+ nlmsghdr hdr;
+ rtgenmsg msg;
+ } request;
+ memset(&request, 0, sizeof(request));
+ request.hdr.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
+ request.hdr.nlmsg_type = type;
+ request.hdr.nlmsg_len = sizeof(request);
+ request.msg.rtgen_family = AF_UNSPEC; // All families.
+ return (TEMP_FAILURE_RETRY(send(fd_, &request, sizeof(request), 0)) == sizeof(request));
+}
+
+bool NetlinkConnection::ReadResponses(void callback(void*, nlmsghdr*), void* context) {
+ // Read through all the responses, handing interesting ones to the callback.
+ ssize_t bytes_read;
+ while ((bytes_read = TEMP_FAILURE_RETRY(recv(fd_, data_, size_, 0))) > 0) {
+ nlmsghdr* hdr = reinterpret_cast<nlmsghdr*>(data_);
+ for (; NLMSG_OK(hdr, static_cast<size_t>(bytes_read)); hdr = NLMSG_NEXT(hdr, bytes_read)) {
+ if (hdr->nlmsg_type == NLMSG_DONE) return true;
+ if (hdr->nlmsg_type == NLMSG_ERROR) return false;
+ callback(context, hdr);
+ }
+ }
+
+ // We only get here if recv fails before we see a NLMSG_DONE.
+ return false;
+}
diff --git a/libc/bionic/bionic_netlink.h b/libc/bionic/bionic_netlink.h
new file mode 100644
index 000000000..4b103f300
--- /dev/null
+++ b/libc/bionic/bionic_netlink.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef BIONIC_NETLINK_H
+#define BIONIC_NETLINK_H
+
+#include <sys/types.h>
+
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+
+struct nlmsghdr;
+
+class NetlinkConnection {
+ public:
+ NetlinkConnection();
+ ~NetlinkConnection();
+
+ bool SendRequest(int type);
+ bool ReadResponses(void callback(void*, nlmsghdr*), void* context);
+
+ private:
+ int fd_;
+ char* data_;
+ size_t size_;
+};
+
+#if !defined(__clang__)
+// GCC gets confused by NLMSG_DATA and doesn't realize that the old-style
+// cast is from a system header and should be ignored.
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#endif
+
+#endif
diff --git a/libc/bionic/bionic_systrace.cpp b/libc/bionic/bionic_systrace.cpp
index 103aa8f71..b522b109b 100644
--- a/libc/bionic/bionic_systrace.cpp
+++ b/libc/bionic/bionic_systrace.cpp
@@ -34,27 +34,25 @@ constexpr char SYSTRACE_PROPERTY_NAME[] = "debug.atrace.tags.enableflags";
static Lock g_lock;
static const prop_info* g_pinfo;
-static uint32_t g_serial = -1;
+static uint32_t g_property_serial = -1;
+static uint32_t g_property_area_serial = -1;
static uint64_t g_tags;
static int g_trace_marker_fd = -1;
static bool should_trace() {
bool result = false;
g_lock.lock();
- // If g_pinfo is null, this means that systrace hasn't been run and it's safe to
- // assume that no trace writing will need to take place. However, to avoid running
- // this costly find check each time, we set it to a non-tracing value so that next
- // time, it will just check the serial to see if the value has been changed.
- // this function also deals with the bootup case, during which the call to property
- // set will fail if the property server hasn't yet started.
- if (g_pinfo == NULL) {
+ // debug.atrace.tags.enableflags is set to a safe non-tracing value during property
+ // space initialization, so it should only be null in two cases, if there are
+ // insufficient permissions for this process to access the property, in which
+ // case an audit will be logged, and during boot before the property server has
+ // been started, in which case we store the global property_area serial to prevent
+ // the costly find operation until we see a changed property_area.
+ if (!g_pinfo && g_property_area_serial != __system_property_area_serial()) {
+ g_property_area_serial = __system_property_area_serial();
g_pinfo = __system_property_find(SYSTRACE_PROPERTY_NAME);
- if (g_pinfo == NULL) {
- __system_property_set(SYSTRACE_PROPERTY_NAME, "0");
- g_pinfo = __system_property_find(SYSTRACE_PROPERTY_NAME);
- }
}
- if (g_pinfo != NULL) {
+ if (g_pinfo) {
// Find out which tags have been enabled on the command line and set
// the value of tags accordingly. If the value of the property changes,
// the serial will also change, so the costly system_property_read function
@@ -62,11 +60,11 @@ static bool should_trace() {
// first. The values within pinfo may change, but its location is guaranteed
// not to move.
uint32_t cur_serial = __system_property_serial(g_pinfo);
- if (cur_serial != g_serial) {
- g_serial = cur_serial;
+ if (cur_serial != g_property_serial) {
+ g_property_serial = cur_serial;
char value[PROP_VALUE_MAX];
__system_property_read(g_pinfo, 0, value);
- g_tags = strtoull(value, NULL, 0);
+ g_tags = strtoull(value, nullptr, 0);
}
result = ((g_tags & ATRACE_TAG_BIONIC) != 0);
}
diff --git a/libc/bionic/bionic_time_conversions.cpp b/libc/bionic/bionic_time_conversions.cpp
index 75e8d4986..f3ca46a73 100644
--- a/libc/bionic/bionic_time_conversions.cpp
+++ b/libc/bionic/bionic_time_conversions.cpp
@@ -52,18 +52,12 @@ void timeval_from_timespec(timeval& tv, const timespec& ts) {
tv.tv_usec = ts.tv_nsec / 1000;
}
-// Initializes 'ts' with the difference between 'abs_ts' and the current time
-// according to 'clock'. Returns false if abstime already expired, true otherwise.
-bool timespec_from_absolute_timespec(timespec& ts, const timespec& abs_ts, clockid_t clock) {
- clock_gettime(clock, &ts);
- ts.tv_sec = abs_ts.tv_sec - ts.tv_sec;
- ts.tv_nsec = abs_ts.tv_nsec - ts.tv_nsec;
- if (ts.tv_nsec < 0) {
- ts.tv_sec--;
- ts.tv_nsec += NS_PER_S;
+void absolute_timespec_from_timespec(timespec& abs_ts, const timespec& ts, clockid_t clock) {
+ clock_gettime(clock, &abs_ts);
+ abs_ts.tv_sec += ts.tv_sec;
+ abs_ts.tv_nsec += ts.tv_nsec;
+ if (abs_ts.tv_nsec >= NS_PER_S) {
+ abs_ts.tv_nsec -= NS_PER_S;
+ abs_ts.tv_sec++;
}
- if (ts.tv_nsec < 0 || ts.tv_sec < 0) {
- return false;
- }
- return true;
}
diff --git a/libc/bionic/debug_mapinfo.cpp b/libc/bionic/debug_mapinfo.cpp
deleted file mode 100644
index de72cb291..000000000
--- a/libc/bionic/debug_mapinfo.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <ctype.h>
-#include <elf.h>
-#include <inttypes.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "debug_mapinfo.h"
-#include "malloc_debug_disable.h"
-
-#if defined(__LP64__)
-#define Elf_W(x) Elf64_##x
-#else
-#define Elf_W(x) Elf32_##x
-#endif
-
-// Format of /proc/<PID>/maps:
-// 6f000000-6f01e000 rwxp 00000000 00:0c 16389419 /system/lib/libcomposer.so
-static mapinfo_t* parse_maps_line(char* line) {
- uintptr_t start;
- uintptr_t end;
- uintptr_t offset;
- char permissions[4];
- int name_pos;
- if (sscanf(line, "%" PRIxPTR "-%" PRIxPTR " %4s %" PRIxPTR " %*x:%*x %*d%n", &start,
- &end, permissions, &offset, &name_pos) < 2) {
- return NULL;
- }
-
- while (isspace(line[name_pos])) {
- name_pos += 1;
- }
- const char* name = line + name_pos;
- size_t name_len = strlen(name);
- if (name_len && name[name_len - 1] == '\n') {
- name_len -= 1;
- }
-
- mapinfo_t* mi = reinterpret_cast<mapinfo_t*>(calloc(1, sizeof(mapinfo_t) + name_len + 1));
- if (mi) {
- mi->start = start;
- mi->end = end;
- mi->offset = offset;
- if (permissions[0] != 'r') {
- // Any unreadable map will just get a zero load base.
- mi->load_base = 0;
- mi->load_base_read = true;
- } else {
- mi->load_base_read = false;
- }
- memcpy(mi->name, name, name_len);
- mi->name[name_len] = '\0';
- }
- return mi;
-}
-
-__LIBC_HIDDEN__ mapinfo_t* mapinfo_create(pid_t pid) {
- ScopedDisableDebugCalls disable;
-
- struct mapinfo_t* milist = NULL;
- char data[1024]; // Used to read lines as well as to construct the filename.
- snprintf(data, sizeof(data), "/proc/%d/maps", pid);
- FILE* fp = fopen(data, "re");
- if (fp != NULL) {
- while (fgets(data, sizeof(data), fp) != NULL) {
- mapinfo_t* mi = parse_maps_line(data);
- if (mi) {
- mi->next = milist;
- milist = mi;
- }
- }
- fclose(fp);
- }
- return milist;
-}
-
-__LIBC_HIDDEN__ void mapinfo_destroy(mapinfo_t* mi) {
- ScopedDisableDebugCalls disable;
-
- while (mi != NULL) {
- mapinfo_t* del = mi;
- mi = mi->next;
- free(del);
- }
-}
-
-template<typename T>
-static inline bool get_val(mapinfo_t* mi, uintptr_t addr, T* store) {
- if (addr < mi->start || addr + sizeof(T) > mi->end) {
- return false;
- }
- // Make sure the address is aligned properly.
- if (addr & (sizeof(T)-1)) {
- return false;
- }
- *store = *reinterpret_cast<T*>(addr);
- return true;
-}
-
-__LIBC_HIDDEN__ void mapinfo_read_loadbase(mapinfo_t* mi) {
- mi->load_base = 0;
- mi->load_base_read = true;
- uintptr_t addr = mi->start;
- Elf_W(Ehdr) ehdr;
- if (!get_val<Elf_W(Half)>(mi, addr + offsetof(Elf_W(Ehdr), e_phnum), &ehdr.e_phnum)) {
- return;
- }
- if (!get_val<Elf_W(Off)>(mi, addr + offsetof(Elf_W(Ehdr), e_phoff), &ehdr.e_phoff)) {
- return;
- }
- addr += ehdr.e_phoff;
- for (size_t i = 0; i < ehdr.e_phnum; i++) {
- Elf_W(Phdr) phdr;
- if (!get_val<Elf_W(Word)>(mi, addr + offsetof(Elf_W(Phdr), p_type), &phdr.p_type)) {
- return;
- }
- if (!get_val<Elf_W(Off)>(mi, addr + offsetof(Elf_W(Phdr), p_offset), &phdr.p_offset)) {
- return;
- }
- if (phdr.p_type == PT_LOAD && phdr.p_offset == mi->offset) {
- if (!get_val<Elf_W(Addr)>(mi, addr + offsetof(Elf_W(Phdr), p_vaddr), &phdr.p_vaddr)) {
- return;
- }
- mi->load_base = phdr.p_vaddr;
- return;
- }
- addr += sizeof(phdr);
- }
-}
-
-// Find the containing map info for the PC.
-__LIBC_HIDDEN__ const mapinfo_t* mapinfo_find(mapinfo_t* mi, uintptr_t pc, uintptr_t* rel_pc) {
- for (; mi != NULL; mi = mi->next) {
- if ((pc >= mi->start) && (pc < mi->end)) {
- if (!mi->load_base_read) {
- mapinfo_read_loadbase(mi);
- }
- *rel_pc = pc - mi->start + mi->load_base;
- return mi;
- }
- }
- *rel_pc = pc;
- return NULL;
-}
diff --git a/libc/bionic/debug_stacktrace.cpp b/libc/bionic/debug_stacktrace.cpp
deleted file mode 100644
index 71e876b95..000000000
--- a/libc/bionic/debug_stacktrace.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "debug_stacktrace.h"
-
-#include <dlfcn.h>
-#include <inttypes.h>
-#include <malloc.h>
-#include <unistd.h>
-#include <unwind.h>
-#include <sys/types.h>
-
-#include "debug_mapinfo.h"
-#include "malloc_debug_disable.h"
-#include "private/libc_logging.h"
-
-#if defined(__LP64__)
-#define PAD_PTR "016" PRIxPTR
-#else
-#define PAD_PTR "08" PRIxPTR
-#endif
-
-typedef struct _Unwind_Context __unwind_context;
-
-extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
-
-static mapinfo_t* g_map_info = NULL;
-
-__LIBC_HIDDEN__ void backtrace_startup() {
- ScopedDisableDebugCalls disable;
-
- g_map_info = mapinfo_create(getpid());
-}
-
-__LIBC_HIDDEN__ void backtrace_shutdown() {
- ScopedDisableDebugCalls disable;
-
- mapinfo_destroy(g_map_info);
-}
-
-struct stack_crawl_state_t {
- uintptr_t* frames;
- size_t frame_count;
- size_t max_depth;
- bool have_skipped_self;
-
- stack_crawl_state_t(uintptr_t* frames, size_t max_depth)
- : frames(frames), frame_count(0), max_depth(max_depth), have_skipped_self(false) {
- }
-};
-
-static _Unwind_Reason_Code trace_function(__unwind_context* context, void* arg) {
- stack_crawl_state_t* state = static_cast<stack_crawl_state_t*>(arg);
-
- uintptr_t ip = _Unwind_GetIP(context);
-
- // The first stack frame is get_backtrace itself. Skip it.
- if (ip != 0 && !state->have_skipped_self) {
- state->have_skipped_self = true;
- return _URC_NO_REASON;
- }
-
-#if defined(__arm__)
- /*
- * The instruction pointer is pointing at the instruction after the bl(x), and
- * the _Unwind_Backtrace routine already masks the Thumb mode indicator (LSB
- * in PC). So we need to do a quick check here to find out if the previous
- * instruction is a Thumb-mode BLX(2). If so subtract 2 otherwise 4 from PC.
- */
- if (ip != 0) {
- short* ptr = reinterpret_cast<short*>(ip);
- // Thumb BLX(2)
- if ((*(ptr-1) & 0xff80) == 0x4780) {
- ip -= 2;
- } else {
- ip -= 4;
- }
- }
-#endif
-
- state->frames[state->frame_count++] = ip;
- return (state->frame_count >= state->max_depth) ? _URC_END_OF_STACK : _URC_NO_REASON;
-}
-
-__LIBC_HIDDEN__ int get_backtrace(uintptr_t* frames, size_t max_depth) {
- ScopedDisableDebugCalls disable;
-
- stack_crawl_state_t state(frames, max_depth);
- _Unwind_Backtrace(trace_function, &state);
- return state.frame_count;
-}
-
-__LIBC_HIDDEN__ void log_backtrace(uintptr_t* frames, size_t frame_count) {
- ScopedDisableDebugCalls disable;
-
- uintptr_t self_bt[16];
- if (frames == NULL) {
- frame_count = get_backtrace(self_bt, 16);
- frames = self_bt;
- }
-
- __libc_format_log(ANDROID_LOG_ERROR, "libc",
- "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n");
-
- for (size_t i = 0 ; i < frame_count; ++i) {
- uintptr_t offset = 0;
- const char* symbol = NULL;
-
- Dl_info info;
- if (dladdr((void*) frames[i], &info) != 0) {
- offset = reinterpret_cast<uintptr_t>(info.dli_saddr);
- symbol = info.dli_sname;
- }
-
- uintptr_t rel_pc = offset;
- const mapinfo_t* mi = (g_map_info != NULL) ? mapinfo_find(g_map_info, frames[i], &rel_pc) : NULL;
- const char* soname = (mi != NULL) ? mi->name : info.dli_fname;
- if (soname == NULL) {
- soname = "<unknown>";
- }
- if (symbol != NULL) {
- char* demangled_symbol = __cxa_demangle(symbol, NULL, NULL, NULL);
- const char* best_name = (demangled_symbol != NULL) ? demangled_symbol : symbol;
-
- __libc_format_log(ANDROID_LOG_ERROR, "libc",
- " #%02zd pc %" PAD_PTR " %s (%s+%" PRIuPTR ")",
- i, rel_pc, soname, best_name, frames[i] - offset);
-
- free(demangled_symbol);
- } else {
- __libc_format_log(ANDROID_LOG_ERROR, "libc",
- " #%02zd pc %" PAD_PTR " %s",
- i, rel_pc, soname);
- }
- }
-}
diff --git a/libc/bionic/dlmalloc.c b/libc/bionic/dlmalloc.c
deleted file mode 100644
index 5853e7c1b..000000000
--- a/libc/bionic/dlmalloc.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "dlmalloc.h"
-
-#include "malloc.h"
-#include "private/bionic_prctl.h"
-#include "private/libc_logging.h"
-
-// Send dlmalloc errors to the log.
-static void __bionic_heap_corruption_error(const char* function);
-static void __bionic_heap_usage_error(const char* function, void* address);
-#define PROCEED_ON_ERROR 0
-#define CORRUPTION_ERROR_ACTION(m) __bionic_heap_corruption_error(__FUNCTION__)
-#define USAGE_ERROR_ACTION(m,p) __bionic_heap_usage_error(__FUNCTION__, p)
-
-// Bionic named anonymous memory declarations.
-static void* named_anonymous_mmap(size_t length);
-#define MMAP(s) named_anonymous_mmap(s)
-#define DIRECT_MMAP(s) named_anonymous_mmap(s)
-
-// Ugly inclusion of C file so that bionic specific #defines configure dlmalloc.
-#include "../upstream-dlmalloc/malloc.c"
-
-static void __bionic_heap_corruption_error(const char* function) {
- __libc_fatal("heap corruption detected by %s", function);
-}
-
-static void __bionic_heap_usage_error(const char* function, void* address) {
- __libc_fatal_no_abort("invalid address or address of corrupt block %p passed to %s",
- address, function);
- // So that debuggerd gives us a memory dump around the specific address.
- // TODO: improve the debuggerd protocol so we can tell it to dump an address when we abort.
- *((int**) 0xdeadbaad) = (int*) address;
-}
-
-static void* named_anonymous_mmap(size_t length) {
- void* map = mmap(NULL, length, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
- if (map == MAP_FAILED) {
- return map;
- }
- prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, map, length, "libc_malloc");
- return map;
-}
-
-// Since dlmalloc isn't the default, we'll leave this unimplemented for now. If
-// we decide we need it later, we can fill it in.
-size_t __mallinfo_narenas() {
- return 0;
-}
-
-size_t __mallinfo_nbins() {
- return 0;
-}
-
-struct mallinfo __mallinfo_arena_info(size_t aidx __unused) {
- struct mallinfo mi;
- memset(&mi, 0, sizeof(mi));
- return mi;
-}
-
-struct mallinfo __mallinfo_bin_info(size_t aidx __unused, size_t bidx __unused) {
- struct mallinfo mi;
- memset(&mi, 0, sizeof(mi));
- return mi;
-}
diff --git a/libc/bionic/dlmalloc.h b/libc/bionic/dlmalloc.h
deleted file mode 100644
index 054bd4f2f..000000000
--- a/libc/bionic/dlmalloc.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef LIBC_BIONIC_DLMALLOC_H_
-#define LIBC_BIONIC_DLMALLOC_H_
-
-#include <sys/cdefs.h>
-#include <stddef.h>
-
-/* Configure dlmalloc. */
-#define HAVE_GETPAGESIZE 1
-#define MALLOC_INSPECT_ALL 1
-#define MSPACES 0
-#define REALLOC_ZERO_BYTES_FREES 1
-#define USE_DL_PREFIX 1
-#define USE_LOCKS 1
-#define LOCK_AT_FORK 1
-#define USE_RECURSIVE_LOCK 0
-#define USE_SPIN_LOCKS 0
-#define DEFAULT_MMAP_THRESHOLD (64U * 1024U)
-
-#define malloc_getpagesize getpagesize()
-
-#if !defined(__LP64__)
-/* dlmalloc_usable_size and dlmalloc were exposed in the NDK and some
- * apps actually used them. Rename these functions out of the way
- * for 32 bit architectures so that ndk_cruft.cpp can expose
- * compatibility shims with these names.
- */
-#define dlmalloc_usable_size dlmalloc_usable_size_real
-#define dlmalloc dlmalloc_real
-#endif
-
-/* These two symbols are exported on devices that use dlmalloc.
- * In order to be consistent across all devices, they will
- * be exported everywhere. Move the real symbols out of the way
- * so that ndk_cruft.cpp can export these symbols.
- */
-#define dlmalloc_inspect_all dlmalloc_inspect_all_real
-#define dlmalloc_trim dlmalloc_trim_real
-
-/* Include the proper definitions. */
-#include "../upstream-dlmalloc/malloc.h"
-
-#endif // LIBC_BIONIC_DLMALLOC_H_
diff --git a/libc/bionic/if_indextoname.c b/libc/bionic/flistxattr.cpp
index f0db512b3..05a96d24a 100644
--- a/libc/bionic/if_indextoname.c
+++ b/libc/bionic/flistxattr.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,37 +26,34 @@
* SUCH DAMAGE.
*/
-#include <string.h>
-#include <unistd.h>
-#include <linux/sockios.h>
-#include <net/if.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/xattr.h>
#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
-/*
- * Map an interface index into its name.
- * Returns NULL on error.
- */
-char*
-if_indextoname(unsigned ifindex, char *ifname)
-{
- int ctl_sock;
- struct ifreq ifr;
- char* ret = NULL;
+extern "C" ssize_t ___flistxattr(int, char*, size_t);
+
+ssize_t flistxattr(int fd, char *list, size_t size) {
+ int saved_errno = errno;
+ ssize_t result = ___flistxattr(fd, list, size);
+
+ if ((result != -1) || (errno != EBADF)) {
+ return result;
+ }
- memset(&ifr, 0, sizeof(struct ifreq));
- ifr.ifr_ifindex = ifindex;
+ // fd could be an O_PATH file descriptor, and the kernel
+ // may not directly support fgetxattr() on such a file descriptor.
+ // Use /proc/self/fd instead to emulate this support.
+ int fd_flag = fcntl(fd, F_GETFL);
+ if ((fd_flag == -1) || ((fd_flag & O_PATH) == 0)) {
+ errno = EBADF;
+ return -1;
+ }
- if ((ctl_sock = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
- if (ioctl(ctl_sock, SIOCGIFNAME, &ifr) >= 0) {
- ret = strncpy (ifname, ifr.ifr_name, IFNAMSIZ);
- } else {
- /* Posix requires ENXIO */
- if (errno == ENODEV)
- errno = ENXIO;
- }
- close(ctl_sock);
- }
- return ret;
+ char buf[40];
+ snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
+ errno = saved_errno;
+ return listxattr(buf, list, size);
}
diff --git a/libc/bionic/flockfile.cpp b/libc/bionic/flockfile.cpp
index b73907cbc..db5382859 100644
--- a/libc/bionic/flockfile.cpp
+++ b/libc/bionic/flockfile.cpp
@@ -36,23 +36,15 @@
// struct __sfileext (see fileext.h).
void flockfile(FILE* fp) {
- if (!__sdidinit) {
- __sinit();
- }
-
- if (fp != NULL) {
+ if (fp != nullptr) {
pthread_mutex_lock(&_FLOCK(fp));
}
}
int ftrylockfile(FILE* fp) {
- if (!__sdidinit) {
- __sinit();
- }
-
// The specification for ftrylockfile() says it returns 0 on success,
// or non-zero on error. So return an errno code directly on error.
- if (fp == NULL) {
+ if (fp == nullptr) {
return EINVAL;
}
@@ -60,11 +52,7 @@ int ftrylockfile(FILE* fp) {
}
void funlockfile(FILE* fp) {
- if (!__sdidinit) {
- __sinit();
- }
-
- if (fp != NULL) {
+ if (fp != nullptr) {
pthread_mutex_unlock(&_FLOCK(fp));
}
}
diff --git a/libc/bionic/getcwd.cpp b/libc/bionic/getcwd.cpp
index a8bbcf31b..bcd6a5784 100644
--- a/libc/bionic/getcwd.cpp
+++ b/libc/bionic/getcwd.cpp
@@ -26,6 +26,7 @@
* SUCH DAMAGE.
*/
+#undef _FORTIFY_SOURCE
#include <errno.h>
#include <malloc.h>
#include <string.h>
diff --git a/libc/bionic/ifaddrs.cpp b/libc/bionic/ifaddrs.cpp
new file mode 100644
index 000000000..408949c13
--- /dev/null
+++ b/libc/bionic/ifaddrs.cpp
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ifaddrs.h>
+
+#include <errno.h>
+#include <linux/if_packet.h>
+#include <net/if.h>
+#include <netinet/in.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "private/ErrnoRestorer.h"
+
+#include "bionic_netlink.h"
+
+// The public ifaddrs struct is full of pointers. Rather than track several
+// different allocations, we use a maximally-sized structure with the public
+// part at offset 0, and pointers into its hidden tail.
+struct ifaddrs_storage {
+ // Must come first, so that `ifaddrs_storage` is-a `ifaddrs`.
+ ifaddrs ifa;
+
+ // The interface index, so we can match RTM_NEWADDR messages with
+ // earlier RTM_NEWLINK messages (to copy the interface flags).
+ int interface_index;
+
+ // Storage for the pointers in `ifa`.
+ sockaddr_storage addr;
+ sockaddr_storage netmask;
+ sockaddr_storage ifa_ifu;
+ char name[IFNAMSIZ + 1];
+
+ ifaddrs_storage(ifaddrs** list) {
+ memset(this, 0, sizeof(*this));
+
+ // push_front onto `list`.
+ ifa.ifa_next = *list;
+ *list = reinterpret_cast<ifaddrs*>(this);
+ }
+
+ void SetAddress(int family, const void* data, size_t byteCount) {
+ // The kernel currently uses the order IFA_ADDRESS, IFA_LOCAL, IFA_BROADCAST
+ // in inet_fill_ifaddr, but let's not assume that will always be true...
+ if (ifa.ifa_addr == nullptr) {
+ // This is an IFA_ADDRESS and haven't seen an IFA_LOCAL yet, so assume this is the
+ // local address. SetLocalAddress will fix things if we later see an IFA_LOCAL.
+ ifa.ifa_addr = CopyAddress(family, data, byteCount, &addr);
+ } else {
+ // We already saw an IFA_LOCAL, which implies this is a destination address.
+ ifa.ifa_dstaddr = CopyAddress(family, data, byteCount, &ifa_ifu);
+ }
+ }
+
+ void SetBroadcastAddress(int family, const void* data, size_t byteCount) {
+ // ifa_broadaddr and ifa_dstaddr overlap in a union. Unfortunately, it's possible
+ // to have an interface with both. Keeping the last thing the kernel gives us seems
+ // to be glibc 2.19's behavior too, so our choice is being source compatible with
+ // badly-written code that assumes ifa_broadaddr and ifa_dstaddr are interchangeable
+ // or supporting interfaces with both addresses configured. My assumption is that
+ // bad code is more common than weird network interfaces...
+ ifa.ifa_broadaddr = CopyAddress(family, data, byteCount, &ifa_ifu);
+ }
+
+ void SetLocalAddress(int family, const void* data, size_t byteCount) {
+ // The kernel source says "for point-to-point IFA_ADDRESS is DESTINATION address,
+ // local address is supplied in IFA_LOCAL attribute".
+ // -- http://lxr.free-electrons.com/source/include/uapi/linux/if_addr.h#L17
+
+ // So copy any existing IFA_ADDRESS into ifa_dstaddr...
+ if (ifa.ifa_addr != nullptr) {
+ ifa.ifa_dstaddr = reinterpret_cast<sockaddr*>(memcpy(&ifa_ifu, &addr, sizeof(addr)));
+ }
+ // ...and then put this IFA_LOCAL into ifa_addr.
+ ifa.ifa_addr = CopyAddress(family, data, byteCount, &addr);
+ }
+
+ // Netlink gives us the prefix length as a bit count. We need to turn
+ // that into a BSD-compatible netmask represented by a sockaddr*.
+ void SetNetmask(int family, size_t prefix_length) {
+ // ...and work out the netmask from the prefix length.
+ netmask.ss_family = family;
+ uint8_t* dst = SockaddrBytes(family, &netmask);
+ memset(dst, 0xff, prefix_length / 8);
+ if ((prefix_length % 8) != 0) {
+ dst[prefix_length/8] = (0xff << (8 - (prefix_length % 8)));
+ }
+ ifa.ifa_netmask = reinterpret_cast<sockaddr*>(&netmask);
+ }
+
+ void SetPacketAttributes(int ifindex, unsigned short hatype, unsigned char halen) {
+ sockaddr_ll* sll = reinterpret_cast<sockaddr_ll*>(&addr);
+ sll->sll_ifindex = ifindex;
+ sll->sll_hatype = hatype;
+ sll->sll_halen = halen;
+ }
+
+ private:
+ sockaddr* CopyAddress(int family, const void* data, size_t byteCount, sockaddr_storage* ss) {
+ // Netlink gives us the address family in the header, and the
+ // sockaddr_in or sockaddr_in6 bytes as the payload. We need to
+ // stitch the two bits together into the sockaddr that's part of
+ // our portable interface.
+ ss->ss_family = family;
+ memcpy(SockaddrBytes(family, ss), data, byteCount);
+
+ // For IPv6 we might also have to set the scope id.
+ if (family == AF_INET6 && (IN6_IS_ADDR_LINKLOCAL(data) || IN6_IS_ADDR_MC_LINKLOCAL(data))) {
+ reinterpret_cast<sockaddr_in6*>(ss)->sin6_scope_id = interface_index;
+ }
+
+ return reinterpret_cast<sockaddr*>(ss);
+ }
+
+ // Returns a pointer to the first byte in the address data (which is
+ // stored in network byte order).
+ uint8_t* SockaddrBytes(int family, sockaddr_storage* ss) {
+ if (family == AF_INET) {
+ sockaddr_in* ss4 = reinterpret_cast<sockaddr_in*>(ss);
+ return reinterpret_cast<uint8_t*>(&ss4->sin_addr);
+ } else if (family == AF_INET6) {
+ sockaddr_in6* ss6 = reinterpret_cast<sockaddr_in6*>(ss);
+ return reinterpret_cast<uint8_t*>(&ss6->sin6_addr);
+ } else if (family == AF_PACKET) {
+ sockaddr_ll* sll = reinterpret_cast<sockaddr_ll*>(ss);
+ return reinterpret_cast<uint8_t*>(&sll->sll_addr);
+ }
+ return nullptr;
+ }
+};
+
+static void __getifaddrs_callback(void* context, nlmsghdr* hdr) {
+ ifaddrs** out = reinterpret_cast<ifaddrs**>(context);
+
+ if (hdr->nlmsg_type == RTM_NEWLINK) {
+ ifinfomsg* ifi = reinterpret_cast<ifinfomsg*>(NLMSG_DATA(hdr));
+
+ // Create a new ifaddr entry, and set the interface index and flags.
+ ifaddrs_storage* new_addr = new ifaddrs_storage(out);
+ new_addr->interface_index = ifi->ifi_index;
+ new_addr->ifa.ifa_flags = ifi->ifi_flags;
+
+ // Go through the various bits of information and find the name.
+ rtattr* rta = IFLA_RTA(ifi);
+ size_t rta_len = IFLA_PAYLOAD(hdr);
+ while (RTA_OK(rta, rta_len)) {
+ if (rta->rta_type == IFLA_ADDRESS) {
+ if (RTA_PAYLOAD(rta) < sizeof(new_addr->addr)) {
+ new_addr->SetAddress(AF_PACKET, RTA_DATA(rta), RTA_PAYLOAD(rta));
+ new_addr->SetPacketAttributes(ifi->ifi_index, ifi->ifi_type, RTA_PAYLOAD(rta));
+ }
+ } else if (rta->rta_type == IFLA_BROADCAST) {
+ if (RTA_PAYLOAD(rta) < sizeof(new_addr->ifa_ifu)) {
+ new_addr->SetBroadcastAddress(AF_PACKET, RTA_DATA(rta), RTA_PAYLOAD(rta));
+ new_addr->SetPacketAttributes(ifi->ifi_index, ifi->ifi_type, RTA_PAYLOAD(rta));
+ }
+ } else if (rta->rta_type == IFLA_IFNAME) {
+ if (RTA_PAYLOAD(rta) < sizeof(new_addr->name)) {
+ memcpy(new_addr->name, RTA_DATA(rta), RTA_PAYLOAD(rta));
+ new_addr->ifa.ifa_name = new_addr->name;
+ }
+ }
+ rta = RTA_NEXT(rta, rta_len);
+ }
+ } else if (hdr->nlmsg_type == RTM_NEWADDR) {
+ ifaddrmsg* msg = reinterpret_cast<ifaddrmsg*>(NLMSG_DATA(hdr));
+
+ // We should already know about this from an RTM_NEWLINK message.
+ const ifaddrs_storage* addr = reinterpret_cast<const ifaddrs_storage*>(*out);
+ while (addr != nullptr && addr->interface_index != static_cast<int>(msg->ifa_index)) {
+ addr = reinterpret_cast<const ifaddrs_storage*>(addr->ifa.ifa_next);
+ }
+ // If this is an unknown interface, ignore whatever we're being told about it.
+ if (addr == nullptr) return;
+
+ // Create a new ifaddr entry and copy what we already know.
+ ifaddrs_storage* new_addr = new ifaddrs_storage(out);
+ // We can just copy the name rather than look for IFA_LABEL.
+ strcpy(new_addr->name, addr->name);
+ new_addr->ifa.ifa_name = new_addr->name;
+ new_addr->ifa.ifa_flags = addr->ifa.ifa_flags;
+ new_addr->interface_index = addr->interface_index;
+
+ // Go through the various bits of information and find the address
+ // and any broadcast/destination address.
+ rtattr* rta = IFA_RTA(msg);
+ size_t rta_len = IFA_PAYLOAD(hdr);
+ while (RTA_OK(rta, rta_len)) {
+ if (rta->rta_type == IFA_ADDRESS) {
+ if (msg->ifa_family == AF_INET || msg->ifa_family == AF_INET6) {
+ new_addr->SetAddress(msg->ifa_family, RTA_DATA(rta), RTA_PAYLOAD(rta));
+ new_addr->SetNetmask(msg->ifa_family, msg->ifa_prefixlen);
+ }
+ } else if (rta->rta_type == IFA_BROADCAST) {
+ if (msg->ifa_family == AF_INET) {
+ new_addr->SetBroadcastAddress(msg->ifa_family, RTA_DATA(rta), RTA_PAYLOAD(rta));
+ }
+ } else if (rta->rta_type == IFA_LOCAL) {
+ if (msg->ifa_family == AF_INET || msg->ifa_family == AF_INET6) {
+ new_addr->SetLocalAddress(msg->ifa_family, RTA_DATA(rta), RTA_PAYLOAD(rta));
+ }
+ }
+ rta = RTA_NEXT(rta, rta_len);
+ }
+ }
+}
+
+int getifaddrs(ifaddrs** out) {
+ // We construct the result directly into `out`, so terminate the list.
+ *out = nullptr;
+
+ // Open the netlink socket and ask for all the links and addresses.
+ NetlinkConnection nc;
+ bool okay = nc.SendRequest(RTM_GETLINK) && nc.ReadResponses(__getifaddrs_callback, out) &&
+ nc.SendRequest(RTM_GETADDR) && nc.ReadResponses(__getifaddrs_callback, out);
+ if (!okay) {
+ freeifaddrs(*out);
+ // Ensure that callers crash if they forget to check for success.
+ *out = nullptr;
+ return -1;
+ }
+
+ return 0;
+}
+
+void freeifaddrs(ifaddrs* list) {
+ while (list != nullptr) {
+ ifaddrs* current = list;
+ list = list->ifa_next;
+ free(current);
+ }
+}
diff --git a/libc/bionic/ioctl.c b/libc/bionic/ioctl.cpp
index 6dd95d0a9..db851329b 100644
--- a/libc/bionic/ioctl.c
+++ b/libc/bionic/ioctl.cpp
@@ -25,19 +25,16 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-#include <stdarg.h>
-
-extern int __ioctl(int, int, void *);
-int ioctl(int fd, int request, ...)
-{
- va_list ap;
- void * arg;
+#include <sys/ioctl.h>
+#include <stdarg.h>
- va_start(ap, request);
- arg = va_arg(ap, void *);
- va_end(ap);
+extern "C" int __ioctl(int, int, void *);
- return __ioctl(fd, request, arg);
+int ioctl(int fd, int request, ...) {
+ va_list ap;
+ va_start(ap, request);
+ void* arg = va_arg(ap, void*);
+ va_end(ap);
+ return __ioctl(fd, request, arg);
}
-
diff --git a/libc/bionic/jemalloc.h b/libc/bionic/jemalloc.h
index 98ea0eedb..fceb323d3 100644
--- a/libc/bionic/jemalloc.h
+++ b/libc/bionic/jemalloc.h
@@ -26,6 +26,10 @@
__BEGIN_DECLS
struct mallinfo je_mallinfo();
+int je_iterate(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*);
+void je_malloc_disable();
+void je_malloc_enable();
+int je_mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
void* je_memalign_round_up_boundary(size_t, size_t);
void* je_pvalloc(size_t);
diff --git a/libc/bionic/legacy_32_bit_support.cpp b/libc/bionic/legacy_32_bit_support.cpp
index a10766471..f2bb37d1e 100644
--- a/libc/bionic/legacy_32_bit_support.cpp
+++ b/libc/bionic/legacy_32_bit_support.cpp
@@ -33,6 +33,7 @@
#include <stdarg.h>
#include <sys/resource.h>
#include <sys/types.h>
+#include <sys/uio.h>
#include <sys/vfs.h>
#include <unistd.h>
@@ -43,6 +44,8 @@
// System calls we need.
extern "C" int __fcntl64(int, int, void*);
extern "C" int __llseek(int, unsigned long, unsigned long, off64_t*, int);
+extern "C" int __preadv64(int, const struct iovec*, int, long, long);
+extern "C" int __pwritev64(int, const struct iovec*, int, long, long);
// For fcntl we use the fcntl64 system call to signal that we're using struct flock64.
int fcntl(int fd, int cmd, ...) {
@@ -77,6 +80,23 @@ ssize_t pwrite(int fd, const void* buf, size_t byte_count, off_t offset) {
return pwrite64(fd, buf, byte_count, static_cast<off64_t>(offset));
}
+// On LP32, there is no off_t preadv/pwritev, and even the 64-bit preadv/pwritev
+// don't use off64_t (see SYSCALLS.TXT for more). Here, this means that we need
+// to implement all four functions because the two system calls don't match any
+// of the userspace functions. Unlike llseek, the pair is split lo-hi, not hi-lo.
+ssize_t preadv(int fd, const struct iovec* ios, int count, off_t offset) {
+ return __preadv64(fd, ios, count, offset, 0);
+}
+ssize_t preadv64(int fd, const struct iovec* ios, int count, off64_t offset) {
+ return __preadv64(fd, ios, count, offset, offset >> 32);
+}
+ssize_t pwritev(int fd, const struct iovec* ios, int count, off_t offset) {
+ return __pwritev64(fd, ios, count, offset, 0);
+}
+ssize_t pwritev64(int fd, const struct iovec* ios, int count, off64_t offset) {
+ return __pwritev64(fd, ios, count, offset, offset >> 32);
+}
+
// There is no fallocate for 32-bit off_t, so we need to widen and call fallocate64.
int fallocate(int fd, int mode, off_t offset, off_t length) {
return fallocate64(fd, mode, static_cast<off64_t>(offset), static_cast<off64_t>(length));
@@ -91,3 +111,22 @@ int getrlimit64(int resource, rlimit64* limits64) {
int setrlimit64(int resource, const rlimit64* limits64) {
return prlimit64(0, resource, limits64, NULL);
}
+
+// There is no prlimit system call, so we need to use prlimit64.
+int prlimit(pid_t pid, int resource, const rlimit* n32, rlimit* o32) {
+ rlimit64 n64;
+ if (n32 != nullptr) {
+ n64.rlim_cur = (n32->rlim_cur == RLIM_INFINITY) ? RLIM64_INFINITY : n32->rlim_cur;
+ n64.rlim_max = (n32->rlim_max == RLIM_INFINITY) ? RLIM64_INFINITY : n32->rlim_max;
+ }
+
+ rlimit64 o64;
+ int result = prlimit64(pid, resource,
+ (n32 != nullptr) ? &n64 : nullptr,
+ (o32 != nullptr) ? &o64 : nullptr);
+ if (result != -1 && o32 != nullptr) {
+ o32->rlim_cur = (o64.rlim_cur == RLIM64_INFINITY) ? RLIM_INFINITY : o64.rlim_cur;
+ o32->rlim_max = (o64.rlim_max == RLIM64_INFINITY) ? RLIM_INFINITY : o64.rlim_max;
+ }
+ return result;
+}
diff --git a/libc/bionic/libc_init_common.cpp b/libc/bionic/libc_init_common.cpp
index bd716286a..4f1226dfb 100644
--- a/libc/bionic/libc_init_common.cpp
+++ b/libc/bionic/libc_init_common.cpp
@@ -42,18 +42,18 @@
#include <unistd.h>
#include "private/bionic_auxv.h"
+#include "private/bionic_globals.h"
#include "private/bionic_ssp.h"
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
#include "private/libc_logging.h"
+#include "private/WriteProtected.h"
#include "pthread_internal.h"
extern "C" abort_msg_t** __abort_message_ptr;
extern "C" int __system_properties_init(void);
-extern "C" int __set_tls(void* ptr);
-extern "C" int __set_tid_address(int* tid_address);
-__LIBC_HIDDEN__ void __libc_init_vdso();
+__LIBC_HIDDEN__ WriteProtected<libc_globals> __libc_globals;
// Not public, but well-known in the BSDs.
const char* __progname;
@@ -64,64 +64,53 @@ char** environ;
// Declared in "private/bionic_ssp.h".
uintptr_t __stack_chk_guard = 0;
-/* Init TLS for the initial thread. Called by the linker _before_ libc is mapped
- * in memory. Beware: all writes to libc globals from this function will
- * apply to linker-private copies and will not be visible from libc later on.
- *
- * Note: this function creates a pthread_internal_t for the initial thread and
- * stores the pointer in TLS, but does not add it to pthread's thread list. This
- * has to be done later from libc itself (see __libc_init_common).
- *
- * This function also stores a pointer to the kernel argument block in a TLS slot to be
- * picked up by the libc constructor.
- */
-void __libc_init_tls(KernelArgumentBlock& args) {
- __libc_auxv = args.auxv;
+void __libc_init_global_stack_chk_guard(KernelArgumentBlock& args) {
+ // AT_RANDOM is a pointer to 16 bytes of randomness on the stack.
+ // Take the first 4/8 for the -fstack-protector implementation.
+ __stack_chk_guard = *reinterpret_cast<uintptr_t*>(args.getauxval(AT_RANDOM));
+}
+
+#if defined(__i386__)
+__LIBC_HIDDEN__ void* __libc_sysinfo = nullptr;
+
+__LIBC_HIDDEN__ void __libc_init_sysinfo(KernelArgumentBlock& args) {
+ __libc_sysinfo = reinterpret_cast<void*>(args.getauxval(AT_SYSINFO));
+}
+
+// TODO: lose this function and just access __libc_sysinfo directly.
+extern "C" void* __kernel_syscall() {
+ return __libc_sysinfo;
+}
+#endif
- static pthread_internal_t main_thread;
-
- // Tell the kernel to clear our tid field when we exit, so we're like any other pthread.
- // As a side-effect, this tells us our pid (which is the same as the main thread's tid).
- main_thread.tid = __set_tid_address(&main_thread.tid);
- main_thread.set_cached_pid(main_thread.tid);
-
- // We don't want to free the main thread's stack even when the main thread exits
- // because things like environment variables with global scope live on it.
- // We also can't free the pthread_internal_t itself, since that lives on the main
- // thread's stack rather than on the heap.
- // The main thread has no mmap allocated space for stack or pthread_internal_t.
- main_thread.mmap_size = 0;
- pthread_attr_init(&main_thread.attr);
- main_thread.attr.guard_size = 0; // The main thread has no guard page.
- main_thread.attr.stack_size = 0; // User code should never see this; we'll compute it when asked.
- // TODO: the main thread's sched_policy and sched_priority need to be queried.
-
- __init_thread(&main_thread);
- __init_tls(&main_thread);
- __set_tls(main_thread.tls);
- main_thread.tls[TLS_SLOT_BIONIC_PREINIT] = &args;
-
- __init_alternate_signal_stack(&main_thread);
+void __libc_init_globals(KernelArgumentBlock& args) {
+#if defined(__i386__)
+ __libc_init_sysinfo(args);
+#endif
+ // Initialize libc globals that are needed in both the linker and in libc.
+ // In dynamic binaries, this is run at least twice for different copies of the
+ // globals, once for the linker's copy and once for the one in libc.so.
+ __libc_init_global_stack_chk_guard(args);
+ __libc_auxv = args.auxv;
+ __libc_globals.initialize();
+ __libc_globals.mutate([&args](libc_globals* globals) {
+ __libc_init_vdso(globals, args);
+ __libc_init_setjmp_cookie(globals, args);
+ });
}
void __libc_init_common(KernelArgumentBlock& args) {
// Initialize various globals.
environ = args.envp;
errno = 0;
- __libc_auxv = args.auxv;
__progname = args.argv[0] ? args.argv[0] : "<unknown>";
__abort_message_ptr = args.abort_message_ptr;
- // AT_RANDOM is a pointer to 16 bytes of randomness on the stack.
- __stack_chk_guard = *reinterpret_cast<uintptr_t*>(getauxval(AT_RANDOM));
-
// Get the main thread from TLS and add it to the thread list.
pthread_internal_t* main_thread = __get_thread();
__pthread_internal_add(main_thread);
__system_properties_init(); // Requires 'environ'.
-
- __libc_init_vdso();
}
__noreturn static void __early_abort(int line) {
@@ -234,39 +223,42 @@ static bool __is_valid_environment_variable(const char* name) {
}
static bool __is_unsafe_environment_variable(const char* name) {
- // None of these should be allowed in setuid programs.
- static const char* const UNSAFE_VARIABLE_NAMES[] = {
- "GCONV_PATH",
- "GETCONF_DIR",
- "HOSTALIASES",
- "JE_MALLOC_CONF",
- "LD_AOUT_LIBRARY_PATH",
- "LD_AOUT_PRELOAD",
- "LD_AUDIT",
- "LD_DEBUG",
- "LD_DEBUG_OUTPUT",
- "LD_DYNAMIC_WEAK",
- "LD_LIBRARY_PATH",
- "LD_ORIGIN_PATH",
- "LD_PRELOAD",
- "LD_PROFILE",
- "LD_SHOW_AUXV",
- "LD_USE_LOAD_BIAS",
- "LOCALDOMAIN",
- "LOCPATH",
- "MALLOC_CHECK_",
- "MALLOC_CONF",
- "MALLOC_TRACE",
- "NIS_PATH",
- "NLSPATH",
- "RESOLV_HOST_CONF",
- "RES_OPTIONS",
- "TMPDIR",
- "TZDIR",
- nullptr
+ // None of these should be allowed when the AT_SECURE auxv
+ // flag is set. This flag is set to inform userspace that a
+ // security transition has occurred, for example, as a result
+ // of executing a setuid program or the result of an SELinux
+ // security transition.
+ static constexpr const char* UNSAFE_VARIABLE_NAMES[] = {
+ "GCONV_PATH",
+ "GETCONF_DIR",
+ "HOSTALIASES",
+ "JE_MALLOC_CONF",
+ "LD_AOUT_LIBRARY_PATH",
+ "LD_AOUT_PRELOAD",
+ "LD_AUDIT",
+ "LD_DEBUG",
+ "LD_DEBUG_OUTPUT",
+ "LD_DYNAMIC_WEAK",
+ "LD_LIBRARY_PATH",
+ "LD_ORIGIN_PATH",
+ "LD_PRELOAD",
+ "LD_PROFILE",
+ "LD_SHOW_AUXV",
+ "LD_USE_LOAD_BIAS",
+ "LOCALDOMAIN",
+ "LOCPATH",
+ "MALLOC_CHECK_",
+ "MALLOC_CONF",
+ "MALLOC_TRACE",
+ "NIS_PATH",
+ "NLSPATH",
+ "RESOLV_HOST_CONF",
+ "RES_OPTIONS",
+ "TMPDIR",
+ "TZDIR",
};
- for (size_t i = 0; UNSAFE_VARIABLE_NAMES[i] != nullptr; ++i) {
- if (env_match(name, UNSAFE_VARIABLE_NAMES[i]) != nullptr) {
+ for (const auto& unsafe_variable_name : UNSAFE_VARIABLE_NAMES) {
+ if (env_match(name, unsafe_variable_name) != nullptr) {
return true;
}
}
@@ -319,7 +311,7 @@ void __libc_init_AT_SECURE(KernelArgumentBlock& args) {
if (getauxval(AT_SECURE)) {
// If this is a setuid/setgid program, close the security hole described in
- // ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-02:23.stdio.asc
+ // https://www.freebsd.org/security/advisories/FreeBSD-SA-02:23.stdio.asc
__nullify_closed_stdio();
__sanitize_environment_variables(args.envp);
@@ -368,13 +360,4 @@ void __libc_fini(void* array) {
dtor();
}
-
-#ifndef LIBC_STATIC
- {
- extern void __libc_postfini(void) __attribute__((weak));
- if (__libc_postfini) {
- __libc_postfini();
- }
- }
-#endif
}
diff --git a/libc/bionic/libc_init_common.h b/libc/bionic/libc_init_common.h
index 673ad5b04..50666520e 100644
--- a/libc/bionic/libc_init_common.h
+++ b/libc/bionic/libc_init_common.h
@@ -51,6 +51,9 @@ __END_DECLS
#if defined(__cplusplus)
class KernelArgumentBlock;
+
+__LIBC_HIDDEN__ void __libc_init_globals(KernelArgumentBlock& args);
+
__LIBC_HIDDEN__ void __libc_init_common(KernelArgumentBlock& args);
__LIBC_HIDDEN__ void __libc_init_AT_SECURE(KernelArgumentBlock& args);
diff --git a/libc/bionic/libc_init_dynamic.cpp b/libc/bionic/libc_init_dynamic.cpp
index 78125f968..ab48fb87f 100644
--- a/libc/bionic/libc_init_dynamic.cpp
+++ b/libc/bionic/libc_init_dynamic.cpp
@@ -25,6 +25,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
/*
* libc_init_dynamic.c
*
@@ -50,12 +51,11 @@
#include <elf.h>
#include "libc_init_common.h"
+#include "private/bionic_globals.h"
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
extern "C" {
- extern void malloc_debug_init(void);
- extern void malloc_debug_fini(void);
extern void netdClientInit(void);
extern int __cxa_atexit(void (*)(void *), void *, void *);
};
@@ -74,18 +74,14 @@ __attribute__((constructor)) static void __libc_preinit() {
// __libc_init_common() will change the TLS area so the old one won't be accessible anyway.
*args_slot = NULL;
+ __libc_init_globals(*args);
__libc_init_common(*args);
// Hooks for various libraries to let them know that we're starting up.
- malloc_debug_init();
+ __libc_globals.mutate(__libc_init_malloc);
netdClientInit();
}
-__LIBC_HIDDEN__ void __libc_postfini() {
- // A hook for the debug malloc library to let it know that we're shutting down.
- malloc_debug_fini();
-}
-
// This function is called from the executable's _start entry point
// (see arch-$ARCH/bionic/crtbegin_dynamic.S), which is itself
// called by the dynamic linker after it has loaded all shared
@@ -112,3 +108,9 @@ __noreturn void __libc_init(void* raw_args,
exit(slingshot(args.argc, args.argv, args.envp));
}
+
+extern "C" uint32_t android_get_application_target_sdk_version();
+
+uint32_t bionic_get_application_target_sdk_version() {
+ return android_get_application_target_sdk_version();
+}
diff --git a/libc/bionic/libc_init_static.cpp b/libc/bionic/libc_init_static.cpp
index 7794fbe76..d1494d7ca 100644
--- a/libc/bionic/libc_init_static.cpp
+++ b/libc/bionic/libc_init_static.cpp
@@ -25,18 +25,8 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-/*
- * libc_init_static.c
- *
- * The program startup function __libc_init() defined here is
- * used for static executables only (i.e. those that don't depend
- * on shared libraries). It is called from arch-$ARCH/bionic/crtbegin_static.S
- * which is directly invoked by the kernel when the program is launched.
- *
- * The 'structors' parameter contains pointers to various initializer
- * arrays that must be run before the program's 'main' routine is launched.
- */
+#include <android/api-level.h>
#include <elf.h>
#include <errno.h>
#include <stddef.h>
@@ -49,16 +39,10 @@
#include "libc_init_common.h"
#include "pthread_internal.h"
+#include "private/bionic_page.h"
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
-// Returns the address of the page containing address 'x'.
-#define PAGE_START(x) ((x) & PAGE_MASK)
-
-// Returns the address of the next page after address 'x', unless 'x' is
-// itself at the start of a page.
-#define PAGE_END(x) PAGE_START((x) + (PAGE_SIZE-1))
-
extern "C" int __cxa_atexit(void (*)(void *), void *, void *);
static void call_array(void(**list)()) {
@@ -85,12 +69,24 @@ static void apply_gnu_relro() {
}
}
+// The program startup function __libc_init() defined here is
+// used for static executables only (i.e. those that don't depend
+// on shared libraries). It is called from arch-$ARCH/bionic/crtbegin_static.S
+// which is directly invoked by the kernel when the program is launched.
+//
+// The 'structors' parameter contains pointers to various initializer
+// arrays that must be run before the program's 'main' routine is launched.
+
__noreturn void __libc_init(void* raw_args,
void (*onexit)(void) __unused,
int (*slingshot)(int, char**, char**),
structors_array_t const * const structors) {
KernelArgumentBlock args(raw_args);
- __libc_init_tls(args);
+ __libc_init_main_thread(args);
+
+ // Initializing the globals requires TLS to be available for errno.
+ __libc_init_globals(args);
+
__libc_init_AT_SECURE(args);
__libc_init_common(args);
@@ -111,3 +107,7 @@ __noreturn void __libc_init(void* raw_args,
exit(slingshot(args.argc, args.argv, args.envp));
}
+
+uint32_t bionic_get_application_target_sdk_version() {
+ return __ANDROID_API__;
+}
diff --git a/libc/bionic/libc_logging.cpp b/libc/bionic/libc_logging.cpp
index cb0b334b8..fffaea8e4 100644
--- a/libc/bionic/libc_logging.cpp
+++ b/libc/bionic/libc_logging.cpp
@@ -31,6 +31,7 @@
#include <android/set_abort_message.h>
#include <assert.h>
+#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
@@ -46,6 +47,9 @@
#include <time.h>
#include <unistd.h>
+#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
+#include <sys/_system_properties.h>
+
static pthread_mutex_t g_abort_msg_lock = PTHREAD_MUTEX_INITIALIZER;
__LIBC_HIDDEN__ abort_msg_t** __abort_message_ptr; // Accessible to __libc_init_common.
@@ -448,7 +452,6 @@ static int __libc_write_stderr(const char* tag, const char* msg) {
return result;
}
-#ifdef TARGET_USES_LOGD
static int __libc_open_log_socket() {
// ToDo: Ideally we want this to fail if the gid of the current
// process is AID_LOGD, but will have to wait until we have
@@ -482,14 +485,70 @@ static int __libc_open_log_socket() {
return log_fd;
}
+struct cache {
+ const prop_info* pinfo;
+ uint32_t serial;
+ char c;
+};
+
+static void refresh_cache(struct cache *cache, const char *key)
+{
+ if (!cache->pinfo) {
+ cache->pinfo = __system_property_find(key);
+ if (!cache->pinfo) {
+ return;
+ }
+ }
+ uint32_t serial = __system_property_serial(cache->pinfo);
+ if (serial == cache->serial) {
+ return;
+ }
+ cache->serial = serial;
+
+ char buf[PROP_VALUE_MAX];
+ __system_property_read(cache->pinfo, 0, buf);
+ cache->c = buf[0];
+}
+
+// Timestamp state generally remains constant, since a change is
+// rare, we can accept a trylock failure gracefully.
+static pthread_mutex_t lock_clockid = PTHREAD_MUTEX_INITIALIZER;
+
+static clockid_t __android_log_clockid()
+{
+ static struct cache r_time_cache = { NULL, static_cast<uint32_t>(-1), 0 };
+ static struct cache p_time_cache = { NULL, static_cast<uint32_t>(-1), 0 };
+ char c;
+
+ if (pthread_mutex_trylock(&lock_clockid)) {
+ // We are willing to accept some race in this context
+ if (!(c = p_time_cache.c)) {
+ c = r_time_cache.c;
+ }
+ } else {
+ static uint32_t serial;
+ uint32_t current_serial = __system_property_area_serial();
+ if (current_serial != serial) {
+ refresh_cache(&r_time_cache, "ro.logd.timestamp");
+ refresh_cache(&p_time_cache, "persist.logd.timestamp");
+ serial = current_serial;
+ }
+ if (!(c = p_time_cache.c)) {
+ c = r_time_cache.c;
+ }
+
+ pthread_mutex_unlock(&lock_clockid);
+ }
+
+ return (tolower(c) == 'm') ? CLOCK_MONOTONIC : CLOCK_REALTIME;
+}
+
struct log_time { // Wire format
uint32_t tv_sec;
uint32_t tv_nsec;
};
-#endif
-static int __libc_write_log(int priority, const char* tag, const char* msg) {
-#ifdef TARGET_USES_LOGD
+int __libc_write_log(int priority, const char* tag, const char* msg) {
int main_log_fd = __libc_open_log_socket();
if (main_log_fd == -1) {
// Try stderr instead.
@@ -504,7 +563,7 @@ static int __libc_write_log(int priority, const char* tag, const char* msg) {
vec[1].iov_base = &tid;
vec[1].iov_len = sizeof(tid);
timespec ts;
- clock_gettime(CLOCK_REALTIME, &ts);
+ clock_gettime(__android_log_clockid(), &ts);
log_time realtime_ts;
realtime_ts.tv_sec = ts.tv_sec;
realtime_ts.tv_nsec = ts.tv_nsec;
@@ -517,24 +576,6 @@ static int __libc_write_log(int priority, const char* tag, const char* msg) {
vec[4].iov_len = strlen(tag) + 1;
vec[5].iov_base = const_cast<char*>(msg);
vec[5].iov_len = strlen(msg) + 1;
-#else
- int main_log_fd = TEMP_FAILURE_RETRY(open("/dev/log/main", O_CLOEXEC | O_WRONLY));
- if (main_log_fd == -1) {
- if (errno == ENOTDIR) {
- // /dev/log isn't a directory? Maybe we're running on the host? Try stderr instead.
- return __libc_write_stderr(tag, msg);
- }
- return -1;
- }
-
- iovec vec[3];
- vec[0].iov_base = &priority;
- vec[0].iov_len = 1;
- vec[1].iov_base = const_cast<char*>(tag);
- vec[1].iov_len = strlen(tag) + 1;
- vec[2].iov_base = const_cast<char*>(msg);
- vec[2].iov_len = strlen(msg) + 1;
-#endif
int result = TEMP_FAILURE_RETRY(writev(main_log_fd, vec, sizeof(vec) / sizeof(vec[0])));
close(main_log_fd);
@@ -557,7 +598,6 @@ int __libc_format_log(int priority, const char* tag, const char* format, ...) {
}
static int __libc_android_log_event(int32_t tag, char type, const void* payload, size_t len) {
-#ifdef TARGET_USES_LOGD
iovec vec[6];
char log_id = LOG_ID_EVENTS;
vec[0].iov_base = &log_id;
@@ -566,7 +606,7 @@ static int __libc_android_log_event(int32_t tag, char type, const void* payload,
vec[1].iov_base = &tid;
vec[1].iov_len = sizeof(tid);
timespec ts;
- clock_gettime(CLOCK_REALTIME, &ts);
+ clock_gettime(__android_log_clockid(), &ts);
log_time realtime_ts;
realtime_ts.tv_sec = ts.tv_sec;
realtime_ts.tv_nsec = ts.tv_nsec;
@@ -581,17 +621,6 @@ static int __libc_android_log_event(int32_t tag, char type, const void* payload,
vec[5].iov_len = len;
int event_log_fd = __libc_open_log_socket();
-#else
- iovec vec[3];
- vec[0].iov_base = &tag;
- vec[0].iov_len = sizeof(tag);
- vec[1].iov_base = &type;
- vec[1].iov_len = sizeof(type);
- vec[2].iov_base = const_cast<void*>(payload);
- vec[2].iov_len = len;
-
- int event_log_fd = TEMP_FAILURE_RETRY(open("/dev/log/events", O_CLOEXEC | O_WRONLY));
-#endif
if (event_log_fd == -1) {
return -1;
diff --git a/libc/bionic/libgen.cpp b/libc/bionic/libgen.cpp
index 2f29d7b63..c415c0f74 100644
--- a/libc/bionic/libgen.cpp
+++ b/libc/bionic/libgen.cpp
@@ -39,7 +39,7 @@
static ThreadLocalBuffer<char, MAXPATHLEN> g_basename_tls_buffer;
static ThreadLocalBuffer<char, MAXPATHLEN> g_dirname_tls_buffer;
-__LIBC64_HIDDEN__ int basename_r(const char* path, char* buffer, size_t buffer_size) {
+static int __basename_r(const char* path, char* buffer, size_t buffer_size) {
const char* startp = NULL;
const char* endp = NULL;
int len;
@@ -91,7 +91,12 @@ __LIBC64_HIDDEN__ int basename_r(const char* path, char* buffer, size_t buffer_s
return result;
}
-__LIBC64_HIDDEN__ int dirname_r(const char* path, char* buffer, size_t buffer_size) {
+// Since this is a non-standard symbol, it might be hijacked by a basename_r in the executable.
+__LIBC32_LEGACY_PUBLIC__ int basename_r(const char* path, char* buffer, size_t buffer_size) {
+ return __basename_r(path, buffer, buffer_size);
+}
+
+static int __dirname_r(const char* path, char* buffer, size_t buffer_size) {
const char* endp = NULL;
int len;
int result;
@@ -150,14 +155,19 @@ __LIBC64_HIDDEN__ int dirname_r(const char* path, char* buffer, size_t buffer_si
return result;
}
+// Since this is a non-standard symbol, it might be hijacked by a basename_r in the executable.
+__LIBC32_LEGACY_PUBLIC__ int dirname_r(const char* path, char* buffer, size_t buffer_size) {
+ return __dirname_r(path, buffer, buffer_size);
+}
+
char* basename(const char* path) {
char* buf = g_basename_tls_buffer.get();
- int rc = basename_r(path, buf, g_basename_tls_buffer.size());
+ int rc = __basename_r(path, buf, g_basename_tls_buffer.size());
return (rc < 0) ? NULL : buf;
}
char* dirname(const char* path) {
char* buf = g_dirname_tls_buffer.get();
- int rc = dirname_r(path, buf, g_dirname_tls_buffer.size());
+ int rc = __dirname_r(path, buf, g_dirname_tls_buffer.size());
return (rc < 0) ? NULL : buf;
}
diff --git a/libc/bionic/lockf.cpp b/libc/bionic/lockf.cpp
new file mode 100644
index 000000000..804ad68bd
--- /dev/null
+++ b/libc/bionic/lockf.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <unistd.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+
+int lockf64(int fd, int cmd, off64_t length) {
+ // Translate POSIX lockf into fcntl.
+ struct flock64 fl;
+ memset(&fl, 0, sizeof(fl));
+ fl.l_whence = SEEK_CUR;
+ fl.l_start = 0;
+ fl.l_len = length;
+
+ if (cmd == F_ULOCK) {
+ fl.l_type = F_UNLCK;
+ cmd = F_SETLK64;
+ return fcntl(fd, F_SETLK64, &fl);
+ }
+
+ if (cmd == F_LOCK) {
+ fl.l_type = F_WRLCK;
+ return fcntl(fd, F_SETLKW64, &fl);
+ }
+
+ if (cmd == F_TLOCK) {
+ fl.l_type = F_WRLCK;
+ return fcntl(fd, F_SETLK64, &fl);
+ }
+
+ if (cmd == F_TEST) {
+ fl.l_type = F_RDLCK;
+ if (fcntl(fd, F_GETLK64, &fl) == -1) return -1;
+ if (fl.l_type == F_UNLCK || fl.l_pid == getpid()) return 0;
+ errno = EACCES;
+ return -1;
+ }
+
+ errno = EINVAL;
+ return -1;
+}
+
+int lockf(int fd, int cmd, off_t length) {
+ return lockf64(fd, cmd, length);
+}
diff --git a/libc/bionic/malloc_common.cpp b/libc/bionic/malloc_common.cpp
new file mode 100644
index 000000000..e05061917
--- /dev/null
+++ b/libc/bionic/malloc_common.cpp
@@ -0,0 +1,464 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+// Contains a thin layer that calls whatever real native allocator
+// has been defined. For the libc shared library, this allows the
+// implementation of a debug malloc that can intercept all of the allocation
+// calls and add special debugging code to attempt to catch allocation
+// errors. All of the debugging code is implemented in a separate shared
+// library that is only loaded when the property "libc.debug.malloc.options"
+// is set to a non-zero value. There are two functions exported to
+// allow ddms, or other external users to get information from the debug
+// allocation.
+// get_malloc_leak_info: Returns information about all of the known native
+// allocations that are currently in use.
+// free_malloc_leak_info: Frees the data allocated by the call to
+// get_malloc_leak_info.
+
+#include <pthread.h>
+
+#include <private/bionic_config.h>
+#include <private/bionic_globals.h>
+#include <private/bionic_malloc_dispatch.h>
+
+#include "jemalloc.h"
+#define Malloc(function) je_ ## function
+
+static constexpr MallocDispatch __libc_malloc_default_dispatch
+ __attribute__((unused)) = {
+ Malloc(calloc),
+ Malloc(free),
+ Malloc(mallinfo),
+ Malloc(malloc),
+ Malloc(malloc_usable_size),
+ Malloc(memalign),
+ Malloc(posix_memalign),
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+ Malloc(pvalloc),
+#endif
+ Malloc(realloc),
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+ Malloc(valloc),
+#endif
+ Malloc(iterate),
+ Malloc(malloc_disable),
+ Malloc(malloc_enable),
+ };
+
+// In a VM process, this is set to 1 after fork()ing out of zygote.
+int gMallocLeakZygoteChild = 0;
+
+// =============================================================================
+// Allocation functions
+// =============================================================================
+extern "C" void* calloc(size_t n_elements, size_t elem_size) {
+ auto _calloc = __libc_globals->malloc_dispatch.calloc;
+ if (__predict_false(_calloc != nullptr)) {
+ return _calloc(n_elements, elem_size);
+ }
+ return Malloc(calloc)(n_elements, elem_size);
+}
+
+extern "C" void free(void* mem) {
+ auto _free = __libc_globals->malloc_dispatch.free;
+ if (__predict_false(_free != nullptr)) {
+ _free(mem);
+ } else {
+ Malloc(free)(mem);
+ }
+}
+
+extern "C" struct mallinfo mallinfo() {
+ auto _mallinfo = __libc_globals->malloc_dispatch.mallinfo;
+ if (__predict_false(_mallinfo != nullptr)) {
+ return _mallinfo();
+ }
+ return Malloc(mallinfo)();
+}
+
+extern "C" void* malloc(size_t bytes) {
+ auto _malloc = __libc_globals->malloc_dispatch.malloc;
+ if (__predict_false(_malloc != nullptr)) {
+ return _malloc(bytes);
+ }
+ return Malloc(malloc)(bytes);
+}
+
+extern "C" size_t malloc_usable_size(const void* mem) {
+ auto _malloc_usable_size = __libc_globals->malloc_dispatch.malloc_usable_size;
+ if (__predict_false(_malloc_usable_size != nullptr)) {
+ return _malloc_usable_size(mem);
+ }
+ return Malloc(malloc_usable_size)(mem);
+}
+
+extern "C" void* memalign(size_t alignment, size_t bytes) {
+ auto _memalign = __libc_globals->malloc_dispatch.memalign;
+ if (__predict_false(_memalign != nullptr)) {
+ return _memalign(alignment, bytes);
+ }
+ return Malloc(memalign)(alignment, bytes);
+}
+
+extern "C" int posix_memalign(void** memptr, size_t alignment, size_t size) {
+ auto _posix_memalign = __libc_globals->malloc_dispatch.posix_memalign;
+ if (__predict_false(_posix_memalign != nullptr)) {
+ return _posix_memalign(memptr, alignment, size);
+ }
+ return Malloc(posix_memalign)(memptr, alignment, size);
+}
+
+extern "C" void* realloc(void* old_mem, size_t bytes) {
+ auto _realloc = __libc_globals->malloc_dispatch.realloc;
+ if (__predict_false(_realloc != nullptr)) {
+ return _realloc(old_mem, bytes);
+ }
+ return Malloc(realloc)(old_mem, bytes);
+}
+
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+extern "C" void* pvalloc(size_t bytes) {
+ auto _pvalloc = __libc_globals->malloc_dispatch.pvalloc;
+ if (__predict_false(_pvalloc != nullptr)) {
+ return _pvalloc(bytes);
+ }
+ return Malloc(pvalloc)(bytes);
+}
+
+extern "C" void* valloc(size_t bytes) {
+ auto _valloc = __libc_globals->malloc_dispatch.valloc;
+ if (__predict_false(_valloc != nullptr)) {
+ return _valloc(bytes);
+ }
+ return Malloc(valloc)(bytes);
+}
+#endif
+
+// We implement malloc debugging only in libc.so, so the code below
+// must be excluded if we compile this file for static libc.a
+#if !defined(LIBC_STATIC)
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <private/libc_logging.h>
+#include <sys/system_properties.h>
+
+extern "C" int __cxa_atexit(void (*func)(void *), void *arg, void *dso);
+
+static const char* DEBUG_SHARED_LIB = "libc_malloc_debug.so";
+static const char* DEBUG_MALLOC_PROPERTY_OPTIONS = "libc.debug.malloc.options";
+static const char* DEBUG_MALLOC_PROPERTY_PROGRAM = "libc.debug.malloc.program";
+static const char* DEBUG_MALLOC_PROPERTY_ENV_ENABLED = "libc.debug.malloc.env_enabled";
+static const char* DEBUG_MALLOC_ENV_ENABLE = "LIBC_DEBUG_MALLOC_ENABLE";
+
+static void* libc_malloc_impl_handle = nullptr;
+
+static void (*g_debug_finalize_func)();
+static void (*g_debug_get_malloc_leak_info_func)(uint8_t**, size_t*, size_t*, size_t*, size_t*);
+static void (*g_debug_free_malloc_leak_info_func)(uint8_t*);
+static ssize_t (*g_debug_malloc_backtrace_func)(void*, uintptr_t*, size_t);
+
+// =============================================================================
+// Log functions
+// =============================================================================
+#define error_log(format, ...) \
+ __libc_format_log(ANDROID_LOG_ERROR, "libc", (format), ##__VA_ARGS__ )
+#define info_log(format, ...) \
+ __libc_format_log(ANDROID_LOG_INFO, "libc", (format), ##__VA_ARGS__ )
+// =============================================================================
+
+// =============================================================================
+// Exported for use by ddms.
+// =============================================================================
+
+// Retrieve native heap information.
+//
+// "*info" is set to a buffer we allocate
+// "*overall_size" is set to the size of the "info" buffer
+// "*info_size" is set to the size of a single entry
+// "*total_memory" is set to the sum of all allocations we're tracking; does
+// not include heap overhead
+// "*backtrace_size" is set to the maximum number of entries in the back trace
+extern "C" void get_malloc_leak_info(uint8_t** info, size_t* overall_size,
+ size_t* info_size, size_t* total_memory, size_t* backtrace_size) {
+ if (g_debug_get_malloc_leak_info_func == nullptr) {
+ return;
+ }
+ g_debug_get_malloc_leak_info_func(info, overall_size, info_size, total_memory, backtrace_size);
+}
+
+extern "C" void free_malloc_leak_info(uint8_t* info) {
+ if (g_debug_free_malloc_leak_info_func == nullptr) {
+ return;
+ }
+ g_debug_free_malloc_leak_info_func(info);
+}
+
+// =============================================================================
+
+template<typename FunctionType>
+static bool InitMallocFunction(void* malloc_impl_handler, FunctionType* func, const char* prefix, const char* suffix) {
+ char symbol[128];
+ snprintf(symbol, sizeof(symbol), "%s_%s", prefix, suffix);
+ *func = reinterpret_cast<FunctionType>(dlsym(malloc_impl_handler, symbol));
+ if (*func == nullptr) {
+ error_log("%s: dlsym(\"%s\") failed", getprogname(), symbol);
+ return false;
+ }
+ return true;
+}
+
+static bool InitMalloc(void* malloc_impl_handler, MallocDispatch* table, const char* prefix) {
+ if (!InitMallocFunction<MallocCalloc>(malloc_impl_handler, &table->calloc,
+ prefix, "calloc")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocFree>(malloc_impl_handler, &table->free,
+ prefix, "free")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocMallinfo>(malloc_impl_handler, &table->mallinfo,
+ prefix, "mallinfo")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocMalloc>(malloc_impl_handler, &table->malloc,
+ prefix, "malloc")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocMallocUsableSize>(
+ malloc_impl_handler, &table->malloc_usable_size, prefix, "malloc_usable_size")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocMemalign>(malloc_impl_handler, &table->memalign,
+ prefix, "memalign")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocPosixMemalign>(malloc_impl_handler, &table->posix_memalign,
+ prefix, "posix_memalign")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocRealloc>(malloc_impl_handler, &table->realloc,
+ prefix, "realloc")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocIterate>(malloc_impl_handler, &table->iterate,
+ prefix, "iterate")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocMallocDisable>(malloc_impl_handler, &table->malloc_disable,
+ prefix, "malloc_disable")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocMallocEnable>(malloc_impl_handler, &table->malloc_enable,
+ prefix, "malloc_enable")) {
+ return false;
+ }
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+ if (!InitMallocFunction<MallocPvalloc>(malloc_impl_handler, &table->pvalloc,
+ prefix, "pvalloc")) {
+ return false;
+ }
+ if (!InitMallocFunction<MallocValloc>(malloc_impl_handler, &table->valloc,
+ prefix, "valloc")) {
+ return false;
+ }
+#endif
+
+ return true;
+}
+
+static void malloc_fini_impl(void*) {
+ // Our BSD stdio implementation doesn't close the standard streams,
+ // it only flushes them. Other unclosed FILE*s will show up as
+ // malloc leaks, but to avoid the standard streams showing up in
+ // leak reports, close them here.
+ fclose(stdin);
+ fclose(stdout);
+ fclose(stderr);
+
+ g_debug_finalize_func();
+}
+
+// Initializes memory allocation framework once per process.
+static void malloc_init_impl(libc_globals* globals) {
+ char value[PROP_VALUE_MAX];
+ if (__system_property_get(DEBUG_MALLOC_PROPERTY_OPTIONS, value) == 0 || value[0] == '\0') {
+ return;
+ }
+
+ // Check to see if only a specific program should have debug malloc enabled.
+ if (__system_property_get(DEBUG_MALLOC_PROPERTY_PROGRAM, value) != 0 &&
+ strstr(getprogname(), value) == nullptr) {
+ return;
+ }
+
+ // Check for the special environment variable instead.
+ if (__system_property_get(DEBUG_MALLOC_PROPERTY_ENV_ENABLED, value) != 0
+ && value[0] != '\0' && getenv(DEBUG_MALLOC_ENV_ENABLE) == nullptr) {
+ return;
+ }
+
+ // Load the debug malloc shared library.
+ void* malloc_impl_handle = dlopen(DEBUG_SHARED_LIB, RTLD_NOW | RTLD_LOCAL);
+ if (malloc_impl_handle == nullptr) {
+ error_log("%s: Unable to open debug malloc shared library %s: %s",
+ getprogname(), DEBUG_SHARED_LIB, dlerror());
+ return;
+ }
+
+ // Initialize malloc debugging in the loaded module.
+ auto init_func = reinterpret_cast<bool (*)(const MallocDispatch*, int*)>(
+ dlsym(malloc_impl_handle, "debug_initialize"));
+ if (init_func == nullptr) {
+ error_log("%s: debug_initialize routine not found in %s", getprogname(), DEBUG_SHARED_LIB);
+ dlclose(malloc_impl_handle);
+ return;
+ }
+
+ // Get the syms for the external functions.
+ void* finalize_sym = dlsym(malloc_impl_handle, "debug_finalize");
+ if (finalize_sym == nullptr) {
+ error_log("%s: debug_finalize routine not found in %s", getprogname(), DEBUG_SHARED_LIB);
+ dlclose(malloc_impl_handle);
+ return;
+ }
+
+ void* get_leak_info_sym = dlsym(malloc_impl_handle, "debug_get_malloc_leak_info");
+ if (get_leak_info_sym == nullptr) {
+ error_log("%s: debug_get_malloc_leak_info routine not found in %s", getprogname(),
+ DEBUG_SHARED_LIB);
+ dlclose(malloc_impl_handle);
+ return;
+ }
+
+ void* free_leak_info_sym = dlsym(malloc_impl_handle, "debug_free_malloc_leak_info");
+ if (free_leak_info_sym == nullptr) {
+ error_log("%s: debug_free_malloc_leak_info routine not found in %s", getprogname(),
+ DEBUG_SHARED_LIB);
+ dlclose(malloc_impl_handle);
+ return;
+ }
+
+ void* malloc_backtrace_sym = dlsym(malloc_impl_handle, "debug_malloc_backtrace");
+ if (malloc_backtrace_sym == nullptr) {
+ error_log("%s: debug_malloc_backtrace routine not found in %s", getprogname(),
+ DEBUG_SHARED_LIB);
+ dlclose(malloc_impl_handle);
+ return;
+ }
+
+ if (!init_func(&__libc_malloc_default_dispatch, &gMallocLeakZygoteChild)) {
+ dlclose(malloc_impl_handle);
+ return;
+ }
+
+ MallocDispatch malloc_dispatch_table;
+ if (!InitMalloc(malloc_impl_handle, &malloc_dispatch_table, "debug")) {
+ auto finalize_func = reinterpret_cast<void (*)()>(finalize_sym);
+ finalize_func();
+ dlclose(malloc_impl_handle);
+ return;
+ }
+
+ g_debug_finalize_func = reinterpret_cast<void (*)()>(finalize_sym);
+ g_debug_get_malloc_leak_info_func = reinterpret_cast<void (*)(
+ uint8_t**, size_t*, size_t*, size_t*, size_t*)>(get_leak_info_sym);
+ g_debug_free_malloc_leak_info_func = reinterpret_cast<void (*)(uint8_t*)>(free_leak_info_sym);
+ g_debug_malloc_backtrace_func = reinterpret_cast<ssize_t (*)(
+ void*, uintptr_t*, size_t)>(malloc_backtrace_sym);
+
+ globals->malloc_dispatch = malloc_dispatch_table;
+ libc_malloc_impl_handle = malloc_impl_handle;
+
+ info_log("%s: malloc debug enabled", getprogname());
+
+ // Use atexit to trigger the cleanup function. This avoids a problem
+ // where another atexit function is used to cleanup allocated memory,
+ // but the finalize function was already called. This particular error
+ // seems to be triggered by a zygote spawned process calling exit.
+ int ret_value = __cxa_atexit(malloc_fini_impl, nullptr, nullptr);
+ if (ret_value != 0) {
+ error_log("failed to set atexit cleanup function: %d", ret_value);
+ }
+}
+
+// Initializes memory allocation framework.
+// This routine is called from __libc_init routines in libc_init_dynamic.cpp.
+__LIBC_HIDDEN__ void __libc_init_malloc(libc_globals* globals) {
+ malloc_init_impl(globals);
+}
+#endif // !LIBC_STATIC
+
+// =============================================================================
+// Exported for use by libmemunreachable.
+// =============================================================================
+
+// Calls callback for every allocation in the anonymous heap mapping
+// [base, base+size). Must be called between malloc_disable and malloc_enable.
+extern "C" int malloc_iterate(uintptr_t base, size_t size,
+ void (*callback)(uintptr_t base, size_t size, void* arg), void* arg) {
+ auto _iterate = __libc_globals->malloc_dispatch.iterate;
+ if (__predict_false(_iterate != nullptr)) {
+ return _iterate(base, size, callback, arg);
+ }
+ return Malloc(iterate)(base, size, callback, arg);
+}
+
+// Disable calls to malloc so malloc_iterate gets a consistent view of
+// allocated memory.
+extern "C" void malloc_disable() {
+ auto _malloc_disable = __libc_globals->malloc_dispatch.malloc_disable;
+ if (__predict_false(_malloc_disable != nullptr)) {
+ return _malloc_disable();
+ }
+ return Malloc(malloc_disable)();
+}
+
+// Re-enable calls to malloc after a previous call to malloc_disable.
+extern "C" void malloc_enable() {
+ auto _malloc_enable = __libc_globals->malloc_dispatch.malloc_enable;
+ if (__predict_false(_malloc_enable != nullptr)) {
+ return _malloc_enable();
+ }
+ return Malloc(malloc_enable)();
+}
+
+#ifndef LIBC_STATIC
+extern "C" ssize_t malloc_backtrace(void* pointer, uintptr_t* frames, size_t frame_count) {
+ if (g_debug_malloc_backtrace_func == nullptr) {
+ return 0;
+ }
+ return g_debug_malloc_backtrace_func(pointer, frames, frame_count);
+}
+#else
+extern "C" ssize_t malloc_backtrace(void*, uintptr_t*, size_t) {
+ return 0;
+}
+#endif
diff --git a/libc/bionic/malloc_debug_check.cpp b/libc/bionic/malloc_debug_check.cpp
deleted file mode 100644
index dee03fae1..000000000
--- a/libc/bionic/malloc_debug_check.cpp
+++ /dev/null
@@ -1,676 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <arpa/inet.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/socket.h>
-#include <sys/system_properties.h>
-#include <sys/types.h>
-#include <time.h>
-#include <unistd.h>
-#include <unwind.h>
-
-#include "debug_mapinfo.h"
-#include "debug_stacktrace.h"
-#include "malloc_debug_backtrace.h"
-#include "malloc_debug_common.h"
-#include "malloc_debug_disable.h"
-#include "private/bionic_macros.h"
-#include "private/libc_logging.h"
-#include "private/ScopedPthreadMutexLocker.h"
-
-#define MAX_BACKTRACE_DEPTH 16
-#define ALLOCATION_TAG 0x1ee7d00d
-#define BACKLOG_TAG 0xbabecafe
-#define FREE_POISON 0xa5
-#define FRONT_GUARD 0xaa
-#define FRONT_GUARD_LEN (1<<5)
-#define REAR_GUARD 0xbb
-#define REAR_GUARD_LEN (1<<5)
-
-static void log_message(const char* format, ...) {
- va_list args;
- va_start(args, format);
- __libc_format_log_va_list(ANDROID_LOG_ERROR, "libc", format, args);
- va_end(args);
-}
-
-struct hdr_t {
- uint32_t tag;
- void* base; // Always points to the memory allocated using malloc.
- // For memory allocated in chk_memalign, this value will
- // not be the same as the location of the start of this
- // structure.
- hdr_t* prev;
- hdr_t* next;
- uintptr_t bt[MAX_BACKTRACE_DEPTH];
- int bt_depth;
- uintptr_t freed_bt[MAX_BACKTRACE_DEPTH];
- int freed_bt_depth;
- size_t size;
- uint8_t front_guard[FRONT_GUARD_LEN];
-} __attribute__((packed, aligned(MALLOC_ALIGNMENT)));
-
-struct ftr_t {
- uint8_t rear_guard[REAR_GUARD_LEN];
-} __attribute__((packed));
-
-static inline ftr_t* to_ftr(hdr_t* hdr) {
- return reinterpret_cast<ftr_t*>(reinterpret_cast<char*>(hdr + 1) + hdr->size);
-}
-
-static inline void* user(hdr_t* hdr) {
- return hdr + 1;
-}
-
-static inline hdr_t* meta(void* user) {
- return reinterpret_cast<hdr_t*>(user) - 1;
-}
-
-static inline const hdr_t* const_meta(const void* user) {
- return reinterpret_cast<const hdr_t*>(user) - 1;
-}
-
-// TODO: introduce a struct for this global state.
-// There are basically two lists here, the regular list and the backlog list.
-// We should be able to remove the duplication.
-static unsigned g_allocated_block_count;
-static hdr_t* tail;
-static hdr_t* head;
-static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
-
-static unsigned backlog_num;
-static hdr_t* backlog_tail;
-static hdr_t* backlog_head;
-static pthread_mutex_t backlog_lock = PTHREAD_MUTEX_INITIALIZER;
-
-// This variable is set to the value of property libc.debug.malloc.backlog.
-// It determines the size of the backlog we use to detect multiple frees.
-static unsigned g_malloc_debug_backlog = 100;
-
-// This variable is set to false if the property libc.debug.malloc.nobacktrace
-// is set to non-zero.
-__LIBC_HIDDEN__ bool g_backtrace_enabled = true;
-
-__LIBC_HIDDEN__ HashTable* g_hash_table;
-__LIBC_HIDDEN__ const MallocDebug* g_malloc_dispatch;
-
-static inline void init_front_guard(hdr_t* hdr) {
- memset(hdr->front_guard, FRONT_GUARD, FRONT_GUARD_LEN);
-}
-
-static inline bool is_front_guard_valid(hdr_t* hdr) {
- for (size_t i = 0; i < FRONT_GUARD_LEN; i++) {
- if (hdr->front_guard[i] != FRONT_GUARD) {
- return false;
- }
- }
- return true;
-}
-
-static inline void init_rear_guard(hdr_t* hdr) {
- ftr_t* ftr = to_ftr(hdr);
- memset(ftr->rear_guard, REAR_GUARD, REAR_GUARD_LEN);
-}
-
-static inline bool is_rear_guard_valid(hdr_t* hdr) {
- unsigned i;
- int valid = 1;
- int first_mismatch = -1;
- ftr_t* ftr = to_ftr(hdr);
- for (i = 0; i < REAR_GUARD_LEN; i++) {
- if (ftr->rear_guard[i] != REAR_GUARD) {
- if (first_mismatch < 0)
- first_mismatch = i;
- valid = 0;
- } else if (first_mismatch >= 0) {
- log_message("+++ REAR GUARD MISMATCH [%d, %d)\n", first_mismatch, i);
- first_mismatch = -1;
- }
- }
-
- if (first_mismatch >= 0)
- log_message("+++ REAR GUARD MISMATCH [%d, %d)\n", first_mismatch, i);
- return valid;
-}
-
-static inline void add_locked(hdr_t* hdr, hdr_t** tail, hdr_t** head) {
- hdr->prev = NULL;
- hdr->next = *head;
- if (*head)
- (*head)->prev = hdr;
- else
- *tail = hdr;
- *head = hdr;
-}
-
-static inline int del_locked(hdr_t* hdr, hdr_t** tail, hdr_t** head) {
- if (hdr->prev) {
- hdr->prev->next = hdr->next;
- } else {
- *head = hdr->next;
- }
- if (hdr->next) {
- hdr->next->prev = hdr->prev;
- } else {
- *tail = hdr->prev;
- }
- return 0;
-}
-
-static inline void add(hdr_t* hdr, size_t size) {
- ScopedPthreadMutexLocker locker(&lock);
- hdr->tag = ALLOCATION_TAG;
- hdr->size = size;
- init_front_guard(hdr);
- init_rear_guard(hdr);
- ++g_allocated_block_count;
- add_locked(hdr, &tail, &head);
-}
-
-static inline int del(hdr_t* hdr) {
- if (hdr->tag != ALLOCATION_TAG) {
- return -1;
- }
-
- ScopedPthreadMutexLocker locker(&lock);
- del_locked(hdr, &tail, &head);
- --g_allocated_block_count;
- return 0;
-}
-
-static inline void poison(hdr_t* hdr) {
- memset(user(hdr), FREE_POISON, hdr->size);
-}
-
-static bool was_used_after_free(hdr_t* hdr) {
- const uint8_t* data = reinterpret_cast<const uint8_t*>(user(hdr));
- for (size_t i = 0; i < hdr->size; i++) {
- if (data[i] != FREE_POISON) {
- return true;
- }
- }
- return false;
-}
-
-/* returns 1 if valid, *safe == 1 if safe to dump stack */
-static inline int check_guards(hdr_t* hdr, int* safe) {
- *safe = 1;
- if (!is_front_guard_valid(hdr)) {
- if (hdr->front_guard[0] == FRONT_GUARD) {
- log_message("+++ ALLOCATION %p SIZE %d HAS A CORRUPTED FRONT GUARD\n",
- user(hdr), hdr->size);
- } else {
- log_message("+++ ALLOCATION %p HAS A CORRUPTED FRONT GUARD "\
- "(NOT DUMPING STACKTRACE)\n", user(hdr));
- /* Allocation header is probably corrupt, do not print stack trace */
- *safe = 0;
- }
- return 0;
- }
-
- if (!is_rear_guard_valid(hdr)) {
- log_message("+++ ALLOCATION %p SIZE %d HAS A CORRUPTED REAR GUARD\n",
- user(hdr), hdr->size);
- return 0;
- }
-
- return 1;
-}
-
-/* returns 1 if valid, *safe == 1 if safe to dump stack */
-static inline int check_allocation_locked(hdr_t* hdr, int* safe) {
- int valid = 1;
- *safe = 1;
-
- if (hdr->tag != ALLOCATION_TAG && hdr->tag != BACKLOG_TAG) {
- log_message("+++ ALLOCATION %p HAS INVALID TAG %08x (NOT DUMPING STACKTRACE)\n",
- user(hdr), hdr->tag);
- // Allocation header is probably corrupt, do not dequeue or dump stack
- // trace.
- *safe = 0;
- return 0;
- }
-
- if (hdr->tag == BACKLOG_TAG && was_used_after_free(hdr)) {
- log_message("+++ ALLOCATION %p SIZE %d WAS USED AFTER BEING FREED\n",
- user(hdr), hdr->size);
- valid = 0;
- /* check the guards to see if it's safe to dump a stack trace */
- check_guards(hdr, safe);
- } else {
- valid = check_guards(hdr, safe);
- }
-
- if (!valid && *safe && g_backtrace_enabled) {
- log_message("+++ ALLOCATION %p SIZE %d ALLOCATED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(hdr->bt, hdr->bt_depth);
- if (hdr->tag == BACKLOG_TAG) {
- log_message("+++ ALLOCATION %p SIZE %d FREED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(hdr->freed_bt, hdr->freed_bt_depth);
- }
- }
-
- return valid;
-}
-
-static inline int del_and_check_locked(hdr_t* hdr,
- hdr_t** tail, hdr_t** head, unsigned* cnt,
- int* safe) {
- int valid = check_allocation_locked(hdr, safe);
- if (safe) {
- (*cnt)--;
- del_locked(hdr, tail, head);
- }
- return valid;
-}
-
-static inline void del_from_backlog_locked(hdr_t* hdr) {
- int safe;
- del_and_check_locked(hdr,
- &backlog_tail, &backlog_head, &backlog_num,
- &safe);
- hdr->tag = 0; /* clear the tag */
-}
-
-static inline void del_from_backlog(hdr_t* hdr) {
- ScopedPthreadMutexLocker locker(&backlog_lock);
- del_from_backlog_locked(hdr);
-}
-
-static inline int del_leak(hdr_t* hdr, int* safe) {
- ScopedPthreadMutexLocker locker(&lock);
- return del_and_check_locked(hdr, &tail, &head, &g_allocated_block_count, safe);
-}
-
-static inline void add_to_backlog(hdr_t* hdr) {
- ScopedPthreadMutexLocker locker(&backlog_lock);
- hdr->tag = BACKLOG_TAG;
- backlog_num++;
- add_locked(hdr, &backlog_tail, &backlog_head);
- poison(hdr);
- /* If we've exceeded the maximum backlog, clear it up */
- while (backlog_num > g_malloc_debug_backlog) {
- hdr_t* gone = backlog_tail;
- del_from_backlog_locked(gone);
- g_malloc_dispatch->free(gone->base);
- }
-}
-
-extern "C" void* chk_malloc(size_t bytes) {
-// log_message("%s: %s\n", __FILE__, __FUNCTION__);
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->malloc(bytes);
- }
-
- size_t size = sizeof(hdr_t) + bytes + sizeof(ftr_t);
- if (size < bytes) { // Overflow
- errno = ENOMEM;
- return NULL;
- }
- hdr_t* hdr = static_cast<hdr_t*>(g_malloc_dispatch->malloc(size));
- if (hdr) {
- hdr->base = hdr;
- hdr->bt_depth = GET_BACKTRACE(hdr->bt, MAX_BACKTRACE_DEPTH);
- add(hdr, bytes);
- return user(hdr);
- }
- return NULL;
-}
-
-extern "C" void* chk_memalign(size_t alignment, size_t bytes) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->memalign(alignment, bytes);
- }
-
- if (alignment <= MALLOC_ALIGNMENT) {
- return chk_malloc(bytes);
- }
-
- // Make the alignment a power of two.
- if (!powerof2(alignment)) {
- alignment = BIONIC_ROUND_UP_POWER_OF_2(alignment);
- }
-
- // here, alignment is at least MALLOC_ALIGNMENT<<1 bytes
- // we will align by at least MALLOC_ALIGNMENT bytes
- // and at most alignment-MALLOC_ALIGNMENT bytes
- size_t size = (alignment-MALLOC_ALIGNMENT) + bytes;
- if (size < bytes) { // Overflow.
- return NULL;
- }
-
- void* base = g_malloc_dispatch->malloc(sizeof(hdr_t) + size + sizeof(ftr_t));
- if (base != NULL) {
- // Check that the actual pointer that will be returned is aligned
- // properly.
- uintptr_t ptr = reinterpret_cast<uintptr_t>(user(reinterpret_cast<hdr_t*>(base)));
- if ((ptr % alignment) != 0) {
- // Align the pointer.
- ptr += ((-ptr) % alignment);
- }
-
- hdr_t* hdr = meta(reinterpret_cast<void*>(ptr));
- hdr->base = base;
- hdr->bt_depth = GET_BACKTRACE(hdr->bt, MAX_BACKTRACE_DEPTH);
- add(hdr, bytes);
- return user(hdr);
- }
- return base;
-}
-
-extern "C" void chk_free(void* ptr) {
-// log_message("%s: %s\n", __FILE__, __FUNCTION__);
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->free(ptr);
- }
-
- if (!ptr) /* ignore free(NULL) */
- return;
-
- hdr_t* hdr = meta(ptr);
-
- if (del(hdr) < 0) {
- uintptr_t bt[MAX_BACKTRACE_DEPTH];
- int depth = GET_BACKTRACE(bt, MAX_BACKTRACE_DEPTH);
- if (hdr->tag == BACKLOG_TAG) {
- log_message("+++ ALLOCATION %p SIZE %d BYTES MULTIPLY FREED!\n",
- user(hdr), hdr->size);
- if (g_backtrace_enabled) {
- log_message("+++ ALLOCATION %p SIZE %d ALLOCATED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(hdr->bt, hdr->bt_depth);
- /* hdr->freed_bt_depth should be nonzero here */
- log_message("+++ ALLOCATION %p SIZE %d FIRST FREED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(hdr->freed_bt, hdr->freed_bt_depth);
- log_message("+++ ALLOCATION %p SIZE %d NOW BEING FREED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(bt, depth);
- }
- } else {
- log_message("+++ ALLOCATION %p IS CORRUPTED OR NOT ALLOCATED VIA TRACKER!\n",
- user(hdr));
- if (g_backtrace_enabled) {
- log_backtrace(bt, depth);
- }
- }
- } else {
- hdr->freed_bt_depth = GET_BACKTRACE(hdr->freed_bt, MAX_BACKTRACE_DEPTH);
- add_to_backlog(hdr);
- }
-}
-
-extern "C" void* chk_realloc(void* ptr, size_t bytes) {
-// log_message("%s: %s\n", __FILE__, __FUNCTION__);
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->realloc(ptr, bytes);
- }
-
- if (!ptr) {
- return chk_malloc(bytes);
- }
-
-#ifdef REALLOC_ZERO_BYTES_FREE
- if (!bytes) {
- chk_free(ptr);
- return NULL;
- }
-#endif
-
- hdr_t* hdr = meta(ptr);
-
- if (del(hdr) < 0) {
- uintptr_t bt[MAX_BACKTRACE_DEPTH];
- int depth = GET_BACKTRACE(bt, MAX_BACKTRACE_DEPTH);
- if (hdr->tag == BACKLOG_TAG) {
- log_message("+++ REALLOCATION %p SIZE %d OF FREED MEMORY!\n",
- user(hdr), bytes, hdr->size);
- if (g_backtrace_enabled) {
- log_message("+++ ALLOCATION %p SIZE %d ALLOCATED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(hdr->bt, hdr->bt_depth);
- /* hdr->freed_bt_depth should be nonzero here */
- log_message("+++ ALLOCATION %p SIZE %d FIRST FREED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(hdr->freed_bt, hdr->freed_bt_depth);
- log_message("+++ ALLOCATION %p SIZE %d NOW BEING REALLOCATED HERE:\n",
- user(hdr), hdr->size);
- log_backtrace(bt, depth);
- }
-
- /* We take the memory out of the backlog and fall through so the
- * reallocation below succeeds. Since we didn't really free it, we
- * can default to this behavior.
- */
- del_from_backlog(hdr);
- } else {
- log_message("+++ REALLOCATION %p SIZE %d IS CORRUPTED OR NOT ALLOCATED VIA TRACKER!\n",
- user(hdr), bytes);
- if (g_backtrace_enabled) {
- log_backtrace(bt, depth);
- }
- // just get a whole new allocation and leak the old one
- return g_malloc_dispatch->realloc(0, bytes);
- // return realloc(user(hdr), bytes); // assuming it was allocated externally
- }
- }
-
- size_t size = sizeof(hdr_t) + bytes + sizeof(ftr_t);
- if (size < bytes) { // Overflow
- errno = ENOMEM;
- return NULL;
- }
- if (hdr->base != hdr) {
- // An allocation from memalign, so create another allocation and
- // copy the data out.
- void* newMem = g_malloc_dispatch->malloc(size);
- if (newMem == NULL) {
- return NULL;
- }
- memcpy(newMem, hdr, sizeof(hdr_t) + hdr->size);
- g_malloc_dispatch->free(hdr->base);
- hdr = static_cast<hdr_t*>(newMem);
- } else {
- hdr = static_cast<hdr_t*>(g_malloc_dispatch->realloc(hdr, size));
- }
- if (hdr) {
- hdr->base = hdr;
- hdr->bt_depth = GET_BACKTRACE(hdr->bt, MAX_BACKTRACE_DEPTH);
- add(hdr, bytes);
- return user(hdr);
- }
- return NULL;
-}
-
-extern "C" void* chk_calloc(size_t nmemb, size_t bytes) {
-// log_message("%s: %s\n", __FILE__, __FUNCTION__);
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->calloc(nmemb, bytes);
- }
-
- size_t total_bytes = nmemb * bytes;
- size_t size = sizeof(hdr_t) + total_bytes + sizeof(ftr_t);
- if (size < total_bytes || (nmemb && SIZE_MAX / nmemb < bytes)) { // Overflow
- errno = ENOMEM;
- return NULL;
- }
- hdr_t* hdr = static_cast<hdr_t*>(g_malloc_dispatch->calloc(1, size));
- if (hdr) {
- hdr->base = hdr;
- hdr->bt_depth = GET_BACKTRACE(hdr->bt, MAX_BACKTRACE_DEPTH);
- add(hdr, total_bytes);
- return user(hdr);
- }
- return NULL;
-}
-
-extern "C" size_t chk_malloc_usable_size(const void* ptr) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->malloc_usable_size(ptr);
- }
-
- // malloc_usable_size returns 0 for NULL and unknown blocks.
- if (ptr == NULL)
- return 0;
-
- const hdr_t* hdr = const_meta(ptr);
-
- // The sentinel tail is written just after the request block bytes
- // so there is no extra room we can report here.
- return hdr->size;
-}
-
-extern "C" struct mallinfo chk_mallinfo() {
- return g_malloc_dispatch->mallinfo();
-}
-
-extern "C" int chk_posix_memalign(void** memptr, size_t alignment, size_t size) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->posix_memalign(memptr, alignment, size);
- }
-
- if (!powerof2(alignment)) {
- return EINVAL;
- }
- int saved_errno = errno;
- *memptr = chk_memalign(alignment, size);
- errno = saved_errno;
- return (*memptr != NULL) ? 0 : ENOMEM;
-}
-
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
-extern "C" void* chk_pvalloc(size_t bytes) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->pvalloc(bytes);
- }
-
- size_t pagesize = getpagesize();
- size_t size = BIONIC_ALIGN(bytes, pagesize);
- if (size < bytes) { // Overflow
- return NULL;
- }
- return chk_memalign(pagesize, size);
-}
-
-extern "C" void* chk_valloc(size_t size) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->valloc(size);
- }
- return chk_memalign(getpagesize(), size);
-}
-#endif
-
-static void ReportMemoryLeaks() {
- ScopedDisableDebugCalls disable;
-
- // Use /proc/self/exe link to obtain the program name for logging
- // purposes. If it's not available, we set it to "<unknown>".
- char exe[PATH_MAX];
- int count;
- if ((count = readlink("/proc/self/exe", exe, sizeof(exe) - 1)) == -1) {
- strlcpy(exe, "<unknown>", sizeof(exe));
- } else {
- exe[count] = '\0';
- }
-
- if (g_allocated_block_count == 0) {
- log_message("+++ %s did not leak", exe);
- return;
- }
-
- size_t index = 1;
- const size_t total = g_allocated_block_count;
- while (head != NULL) {
- int safe;
- hdr_t* block = head;
- log_message("+++ %s leaked block of size %d at %p (leak %d of %d)",
- exe, block->size, user(block), index++, total);
- if (del_leak(block, &safe) && g_backtrace_enabled) {
- /* safe == 1, because the allocation is valid */
- log_backtrace(block->bt, block->bt_depth);
- }
- }
-
- while (backlog_head != NULL) {
- del_from_backlog(backlog_tail);
- }
-}
-
-pthread_key_t g_debug_calls_disabled;
-
-extern "C" bool malloc_debug_initialize(HashTable* hash_table, const MallocDebug* malloc_dispatch) {
- g_hash_table = hash_table;
- g_malloc_dispatch = malloc_dispatch;
-
- pthread_key_create(&g_debug_calls_disabled, NULL);
-
- char debug_backlog[PROP_VALUE_MAX];
- if (__system_property_get("libc.debug.malloc.backlog", debug_backlog)) {
- g_malloc_debug_backlog = atoi(debug_backlog);
- info_log("%s: setting backlog length to %d\n", getprogname(), g_malloc_debug_backlog);
- }
-
- // Check if backtracing should be disabled.
- char env[PROP_VALUE_MAX];
- if (__system_property_get("libc.debug.malloc.nobacktrace", env) && atoi(env) != 0) {
- g_backtrace_enabled = false;
- __libc_format_log(ANDROID_LOG_INFO, "libc", "not gathering backtrace information\n");
- }
-
- if (g_backtrace_enabled) {
- backtrace_startup();
- }
-
- return true;
-}
-
-extern "C" void malloc_debug_finalize(int malloc_debug_level) {
- // We only track leaks at level 10.
- if (malloc_debug_level == 10) {
- ReportMemoryLeaks();
- }
- if (g_backtrace_enabled) {
- backtrace_shutdown();
- }
-
- pthread_setspecific(g_debug_calls_disabled, NULL);
-}
diff --git a/libc/bionic/malloc_debug_common.cpp b/libc/bionic/malloc_debug_common.cpp
deleted file mode 100644
index ee796c6dc..000000000
--- a/libc/bionic/malloc_debug_common.cpp
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-// Contains definition of structures, global variables, and implementation of
-// routines that are used by malloc leak detection code and other components in
-// the system. The trick is that some components expect these data and
-// routines to be defined / implemented in libc.so, regardless whether or not
-// malloc leak detection code is going to run. To make things even more tricky,
-// malloc leak detection code, implemented in libc_malloc_debug.so also
-// requires access to these variables and routines (to fill allocation entry
-// hash table, for example). So, all relevant variables and routines are
-// defined / implemented here and exported to all, leak detection code and
-// other components via dynamic (libc.so), or static (libc.a) linking.
-
-#include "malloc_debug_common.h"
-
-#include <pthread.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "private/ScopedPthreadMutexLocker.h"
-
-#if defined(USE_JEMALLOC)
-#include "jemalloc.h"
-#define Malloc(function) je_ ## function
-#elif defined(USE_DLMALLOC)
-#include "dlmalloc.h"
-#define Malloc(function) dl ## function
-#else
-#error "Either one of USE_DLMALLOC or USE_JEMALLOC must be defined."
-#endif
-
-// In a VM process, this is set to 1 after fork()ing out of zygote.
-int gMallocLeakZygoteChild = 0;
-
-static HashTable g_hash_table;
-
-// Support for malloc debugging.
-// Table for dispatching malloc calls, initialized with default dispatchers.
-static const MallocDebug __libc_malloc_default_dispatch __attribute__((aligned(32))) = {
- Malloc(calloc),
- Malloc(free),
- Malloc(mallinfo),
- Malloc(malloc),
- Malloc(malloc_usable_size),
- Malloc(memalign),
- Malloc(posix_memalign),
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- Malloc(pvalloc),
-#endif
- Malloc(realloc),
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- Malloc(valloc),
-#endif
-};
-
-// Selector of dispatch table to use for dispatching malloc calls.
-static const MallocDebug* __libc_malloc_dispatch = &__libc_malloc_default_dispatch;
-
-// Handle to shared library where actual memory allocation is implemented.
-// This library is loaded and memory allocation calls are redirected there
-// when libc.debug.malloc environment variable contains value other than
-// zero:
-// 1 - For memory leak detections.
-// 5 - For filling allocated / freed memory with patterns defined by
-// CHK_SENTINEL_VALUE, and CHK_FILL_FREE macros.
-// 10 - For adding pre-, and post- allocation stubs in order to detect
-// buffer overruns.
-// Note that emulator's memory allocation instrumentation is not controlled by
-// libc.debug.malloc value, but rather by emulator, started with -memcheck
-// option. Note also, that if emulator has started with -memcheck option,
-// emulator's instrumented memory allocation will take over value saved in
-// libc.debug.malloc. In other words, if emulator has started with -memcheck
-// option, libc.debug.malloc value is ignored.
-// Actual functionality for debug levels 1-10 is implemented in
-// libc_malloc_debug_leak.so, while functionality for emulator's instrumented
-// allocations is implemented in libc_malloc_debug_qemu.so and can be run inside
-// the emulator only.
-#if !defined(LIBC_STATIC)
-static void* libc_malloc_impl_handle = NULL;
-#endif
-
-
-// The value of libc.debug.malloc.
-#if !defined(LIBC_STATIC)
-static int g_malloc_debug_level = 0;
-#endif
-
-// =============================================================================
-// output functions
-// =============================================================================
-
-static int hash_entry_compare(const void* arg1, const void* arg2) {
- int result;
-
- const HashEntry* e1 = *static_cast<HashEntry* const*>(arg1);
- const HashEntry* e2 = *static_cast<HashEntry* const*>(arg2);
-
- // if one or both arg pointers are null, deal gracefully
- if (e1 == NULL) {
- result = (e2 == NULL) ? 0 : 1;
- } else if (e2 == NULL) {
- result = -1;
- } else {
- size_t nbAlloc1 = e1->allocations;
- size_t nbAlloc2 = e2->allocations;
- size_t size1 = e1->size & ~SIZE_FLAG_MASK;
- size_t size2 = e2->size & ~SIZE_FLAG_MASK;
- size_t alloc1 = nbAlloc1 * size1;
- size_t alloc2 = nbAlloc2 * size2;
-
- // sort in descending order by:
- // 1) total size
- // 2) number of allocations
- //
- // This is used for sorting, not determination of equality, so we don't
- // need to compare the bit flags.
- if (alloc1 > alloc2) {
- result = -1;
- } else if (alloc1 < alloc2) {
- result = 1;
- } else {
- if (nbAlloc1 > nbAlloc2) {
- result = -1;
- } else if (nbAlloc1 < nbAlloc2) {
- result = 1;
- } else {
- result = 0;
- }
- }
- }
- return result;
-}
-
-// Retrieve native heap information.
-//
-// "*info" is set to a buffer we allocate
-// "*overallSize" is set to the size of the "info" buffer
-// "*infoSize" is set to the size of a single entry
-// "*totalMemory" is set to the sum of all allocations we're tracking; does
-// not include heap overhead
-// "*backtraceSize" is set to the maximum number of entries in the back trace
-
-// =============================================================================
-// Exported for use by ddms.
-// =============================================================================
-extern "C" void get_malloc_leak_info(uint8_t** info, size_t* overallSize,
- size_t* infoSize, size_t* totalMemory, size_t* backtraceSize) {
- // Don't do anything if we have invalid arguments.
- if (info == NULL || overallSize == NULL || infoSize == NULL ||
- totalMemory == NULL || backtraceSize == NULL) {
- return;
- }
- *totalMemory = 0;
-
- ScopedPthreadMutexLocker locker(&g_hash_table.lock);
- if (g_hash_table.count == 0) {
- *info = NULL;
- *overallSize = 0;
- *infoSize = 0;
- *backtraceSize = 0;
- return;
- }
-
- HashEntry** list = static_cast<HashEntry**>(Malloc(malloc)(sizeof(void*) * g_hash_table.count));
-
- // Get the entries into an array to be sorted.
- size_t index = 0;
- for (size_t i = 0 ; i < HASHTABLE_SIZE ; ++i) {
- HashEntry* entry = g_hash_table.slots[i];
- while (entry != NULL) {
- list[index] = entry;
- *totalMemory = *totalMemory + ((entry->size & ~SIZE_FLAG_MASK) * entry->allocations);
- index++;
- entry = entry->next;
- }
- }
-
- // XXX: the protocol doesn't allow variable size for the stack trace (yet)
- *infoSize = (sizeof(size_t) * 2) + (sizeof(uintptr_t) * BACKTRACE_SIZE);
- *overallSize = *infoSize * g_hash_table.count;
- *backtraceSize = BACKTRACE_SIZE;
-
- // now get a byte array big enough for this
- *info = static_cast<uint8_t*>(Malloc(malloc)(*overallSize));
- if (*info == NULL) {
- *overallSize = 0;
- Malloc(free)(list);
- return;
- }
-
- qsort(list, g_hash_table.count, sizeof(void*), hash_entry_compare);
-
- uint8_t* head = *info;
- const size_t count = g_hash_table.count;
- for (size_t i = 0 ; i < count ; ++i) {
- HashEntry* entry = list[i];
- size_t entrySize = (sizeof(size_t) * 2) + (sizeof(uintptr_t) * entry->numEntries);
- if (entrySize < *infoSize) {
- // We're writing less than a full entry, clear out the rest.
- memset(head + entrySize, 0, *infoSize - entrySize);
- } else {
- // Make sure the amount we're copying doesn't exceed the limit.
- entrySize = *infoSize;
- }
- memcpy(head, &(entry->size), entrySize);
- head += *infoSize;
- }
-
- Malloc(free)(list);
-}
-
-extern "C" void free_malloc_leak_info(uint8_t* info) {
- Malloc(free)(info);
-}
-
-// =============================================================================
-// Allocation functions
-// =============================================================================
-extern "C" void* calloc(size_t n_elements, size_t elem_size) {
- return __libc_malloc_dispatch->calloc(n_elements, elem_size);
-}
-
-extern "C" void free(void* mem) {
- __libc_malloc_dispatch->free(mem);
-}
-
-extern "C" struct mallinfo mallinfo() {
- return __libc_malloc_dispatch->mallinfo();
-}
-
-extern "C" void* malloc(size_t bytes) {
- return __libc_malloc_dispatch->malloc(bytes);
-}
-
-extern "C" size_t malloc_usable_size(const void* mem) {
- return __libc_malloc_dispatch->malloc_usable_size(mem);
-}
-
-extern "C" void* memalign(size_t alignment, size_t bytes) {
- return __libc_malloc_dispatch->memalign(alignment, bytes);
-}
-
-extern "C" int posix_memalign(void** memptr, size_t alignment, size_t size) {
- return __libc_malloc_dispatch->posix_memalign(memptr, alignment, size);
-}
-
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
-extern "C" void* pvalloc(size_t bytes) {
- return __libc_malloc_dispatch->pvalloc(bytes);
-}
-#endif
-
-extern "C" void* realloc(void* oldMem, size_t bytes) {
- return __libc_malloc_dispatch->realloc(oldMem, bytes);
-}
-
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
-extern "C" void* valloc(size_t bytes) {
- return __libc_malloc_dispatch->valloc(bytes);
-}
-#endif
-
-// We implement malloc debugging only in libc.so, so the code below
-// must be excluded if we compile this file for static libc.a
-#ifndef LIBC_STATIC
-#include <sys/system_properties.h>
-#include <dlfcn.h>
-#include <stdio.h>
-#include "private/libc_logging.h"
-
-template<typename FunctionType>
-static void InitMallocFunction(void* malloc_impl_handler, FunctionType* func, const char* prefix, const char* suffix) {
- char symbol[128];
- snprintf(symbol, sizeof(symbol), "%s_%s", prefix, suffix);
- *func = reinterpret_cast<FunctionType>(dlsym(malloc_impl_handler, symbol));
- if (*func == NULL) {
- error_log("%s: dlsym(\"%s\") failed", getprogname(), symbol);
- }
-}
-
-static void InitMalloc(void* malloc_impl_handler, MallocDebug* table, const char* prefix) {
- __libc_format_log(ANDROID_LOG_INFO, "libc", "%s: using libc.debug.malloc %d (%s)\n",
- getprogname(), g_malloc_debug_level, prefix);
-
- InitMallocFunction<MallocDebugCalloc>(malloc_impl_handler, &table->calloc, prefix, "calloc");
- InitMallocFunction<MallocDebugFree>(malloc_impl_handler, &table->free, prefix, "free");
- InitMallocFunction<MallocDebugMallinfo>(malloc_impl_handler, &table->mallinfo, prefix, "mallinfo");
- InitMallocFunction<MallocDebugMalloc>(malloc_impl_handler, &table->malloc, prefix, "malloc");
- InitMallocFunction<MallocDebugMallocUsableSize>(malloc_impl_handler, &table->malloc_usable_size, prefix, "malloc_usable_size");
- InitMallocFunction<MallocDebugMemalign>(malloc_impl_handler, &table->memalign, prefix, "memalign");
- InitMallocFunction<MallocDebugPosixMemalign>(malloc_impl_handler, &table->posix_memalign, prefix, "posix_memalign");
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- InitMallocFunction<MallocDebugPvalloc>(malloc_impl_handler, &table->pvalloc, prefix, "pvalloc");
-#endif
- InitMallocFunction<MallocDebugRealloc>(malloc_impl_handler, &table->realloc, prefix, "realloc");
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- InitMallocFunction<MallocDebugValloc>(malloc_impl_handler, &table->valloc, prefix, "valloc");
-#endif
-}
-
-// Initializes memory allocation framework once per process.
-static void malloc_init_impl() {
- const char* so_name = NULL;
- MallocDebugInit malloc_debug_initialize = NULL;
- unsigned int qemu_running = 0;
- unsigned int memcheck_enabled = 0;
- char env[PROP_VALUE_MAX];
- char memcheck_tracing[PROP_VALUE_MAX];
- char debug_program[PROP_VALUE_MAX];
-
- // Get custom malloc debug level. Note that emulator started with
- // memory checking option will have priority over debug level set in
- // libc.debug.malloc system property.
- if (__system_property_get("ro.kernel.qemu", env) && atoi(env)) {
- qemu_running = 1;
- if (__system_property_get("ro.kernel.memcheck", memcheck_tracing)) {
- if (memcheck_tracing[0] != '0') {
- // Emulator has started with memory tracing enabled. Enforce it.
- g_malloc_debug_level = 20;
- memcheck_enabled = 1;
- }
- }
- }
-
- // If debug level has not been set by memcheck option in the emulator,
- // lets grab it from libc.debug.malloc system property.
- if (g_malloc_debug_level == 0 && __system_property_get("libc.debug.malloc", env)) {
- g_malloc_debug_level = atoi(env);
- }
-
- // Debug level 0 means that we should use default allocation routines.
- if (g_malloc_debug_level == 0) {
- return;
- }
-
- // If libc.debug.malloc.program is set and is not a substring of progname,
- // then exit.
- if (__system_property_get("libc.debug.malloc.program", debug_program)) {
- if (!strstr(getprogname(), debug_program)) {
- return;
- }
- }
-
- // mksh is way too leaky. http://b/7291287.
- if (g_malloc_debug_level >= 10) {
- if (strcmp(getprogname(), "sh") == 0 || strcmp(getprogname(), "/system/bin/sh") == 0) {
- return;
- }
- }
-
- // Choose the appropriate .so for the requested debug level.
- switch (g_malloc_debug_level) {
- case 1:
- case 5:
- case 10:
- so_name = "libc_malloc_debug_leak.so";
- break;
- case 20:
- // Quick check: debug level 20 can only be handled in emulator.
- if (!qemu_running) {
- error_log("%s: Debug level %d can only be set in emulator\n",
- getprogname(), g_malloc_debug_level);
- return;
- }
- // Make sure that memory checking has been enabled in emulator.
- if (!memcheck_enabled) {
- error_log("%s: Memory checking is not enabled in the emulator\n", getprogname());
- return;
- }
- so_name = "libc_malloc_debug_qemu.so";
- break;
- default:
- error_log("%s: Debug level %d is unknown\n", getprogname(), g_malloc_debug_level);
- return;
- }
-
- // Load .so that implements the required malloc debugging functionality.
- void* malloc_impl_handle = dlopen(so_name, RTLD_NOW);
- if (malloc_impl_handle == NULL) {
- error_log("%s: Missing module %s required for malloc debug level %d: %s",
- getprogname(), so_name, g_malloc_debug_level, dlerror());
- return;
- }
-
- // Initialize malloc debugging in the loaded module.
- malloc_debug_initialize = reinterpret_cast<MallocDebugInit>(dlsym(malloc_impl_handle,
- "malloc_debug_initialize"));
- if (malloc_debug_initialize == NULL) {
- error_log("%s: Initialization routine is not found in %s\n", getprogname(), so_name);
- dlclose(malloc_impl_handle);
- return;
- }
- if (!malloc_debug_initialize(&g_hash_table, &__libc_malloc_default_dispatch)) {
- dlclose(malloc_impl_handle);
- return;
- }
-
- if (g_malloc_debug_level == 20) {
- // For memory checker we need to do extra initialization.
- typedef int (*MemCheckInit)(int, const char*);
- MemCheckInit memcheck_initialize =
- reinterpret_cast<MemCheckInit>(dlsym(malloc_impl_handle, "memcheck_initialize"));
- if (memcheck_initialize == NULL) {
- error_log("%s: memcheck_initialize routine is not found in %s\n",
- getprogname(), so_name);
- dlclose(malloc_impl_handle);
- return;
- }
-
- if (memcheck_initialize(MALLOC_ALIGNMENT, memcheck_tracing)) {
- dlclose(malloc_impl_handle);
- return;
- }
- }
-
- // No need to init the dispatch table because we can only get
- // here if debug level is 1, 5, 10, or 20.
- static MallocDebug malloc_dispatch_table __attribute__((aligned(32)));
- switch (g_malloc_debug_level) {
- case 1:
- InitMalloc(malloc_impl_handle, &malloc_dispatch_table, "leak");
- break;
- case 5:
- InitMalloc(malloc_impl_handle, &malloc_dispatch_table, "fill");
- break;
- case 10:
- InitMalloc(malloc_impl_handle, &malloc_dispatch_table, "chk");
- break;
- case 20:
- InitMalloc(malloc_impl_handle, &malloc_dispatch_table, "qemu_instrumented");
- break;
- default:
- break;
- }
-
- // Make sure dispatch table is initialized
- if ((malloc_dispatch_table.calloc == NULL) ||
- (malloc_dispatch_table.free == NULL) ||
- (malloc_dispatch_table.mallinfo == NULL) ||
- (malloc_dispatch_table.malloc == NULL) ||
- (malloc_dispatch_table.malloc_usable_size == NULL) ||
- (malloc_dispatch_table.memalign == NULL) ||
- (malloc_dispatch_table.posix_memalign == NULL) ||
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- (malloc_dispatch_table.pvalloc == NULL) ||
-#endif
- (malloc_dispatch_table.realloc == NULL)
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- || (malloc_dispatch_table.valloc == NULL)
-#endif
- ) {
- error_log("%s: some symbols for libc.debug.malloc level %d were not found (see above)",
- getprogname(), g_malloc_debug_level);
- dlclose(malloc_impl_handle);
- } else {
- __libc_malloc_dispatch = &malloc_dispatch_table;
- libc_malloc_impl_handle = malloc_impl_handle;
- }
-}
-
-static void malloc_fini_impl() {
- // Our BSD stdio implementation doesn't close the standard streams, it only flushes them.
- // And it doesn't do that until its atexit handler is run, and we run first!
- // It's great that other unclosed FILE*s show up as malloc leaks, but we need to manually
- // clean up the standard streams ourselves.
- fclose(stdin);
- fclose(stdout);
- fclose(stderr);
-
- if (libc_malloc_impl_handle != NULL) {
- MallocDebugFini malloc_debug_finalize =
- reinterpret_cast<MallocDebugFini>(dlsym(libc_malloc_impl_handle, "malloc_debug_finalize"));
- if (malloc_debug_finalize != NULL) {
- malloc_debug_finalize(g_malloc_debug_level);
- }
- }
-}
-
-#endif // !LIBC_STATIC
-
-// Initializes memory allocation framework.
-// This routine is called from __libc_init routines implemented
-// in libc_init_static.c and libc_init_dynamic.c files.
-extern "C" __LIBC_HIDDEN__ void malloc_debug_init() {
-#if !defined(LIBC_STATIC)
- static pthread_once_t malloc_init_once_ctl = PTHREAD_ONCE_INIT;
- if (pthread_once(&malloc_init_once_ctl, malloc_init_impl)) {
- error_log("Unable to initialize malloc_debug component.");
- }
-#endif // !LIBC_STATIC
-}
-
-extern "C" __LIBC_HIDDEN__ void malloc_debug_fini() {
-#if !defined(LIBC_STATIC)
- static pthread_once_t malloc_fini_once_ctl = PTHREAD_ONCE_INIT;
- if (pthread_once(&malloc_fini_once_ctl, malloc_fini_impl)) {
- error_log("Unable to finalize malloc_debug component.");
- }
-#endif // !LIBC_STATIC
-}
diff --git a/libc/bionic/malloc_debug_common.h b/libc/bionic/malloc_debug_common.h
deleted file mode 100644
index 5c73da31a..000000000
--- a/libc/bionic/malloc_debug_common.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Contains declarations of types and constants used by malloc leak
- * detection code in both, libc and libc_malloc_debug libraries.
- */
-#ifndef MALLOC_DEBUG_COMMON_H
-#define MALLOC_DEBUG_COMMON_H
-
-#include <pthread.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-#include "private/bionic_config.h"
-#include "private/libc_logging.h"
-
-#define HASHTABLE_SIZE 1543
-#define BACKTRACE_SIZE 32
-/* flag definitions, currently sharing storage with "size" */
-#define SIZE_FLAG_ZYGOTE_CHILD (1<<31)
-#define SIZE_FLAG_MASK (SIZE_FLAG_ZYGOTE_CHILD)
-
-// This must match the alignment used by the malloc implementation.
-#ifndef MALLOC_ALIGNMENT
-#define MALLOC_ALIGNMENT ((size_t)(2 * sizeof(void *)))
-#endif
-
-// =============================================================================
-// Structures
-// =============================================================================
-
-struct HashEntry {
- size_t slot;
- HashEntry* prev;
- HashEntry* next;
- size_t numEntries;
- // fields above "size" are NOT sent to the host
- size_t size;
- size_t allocations;
- uintptr_t backtrace[0];
-};
-
-struct HashTable {
- pthread_mutex_t lock;
- size_t count;
- HashEntry* slots[HASHTABLE_SIZE];
-};
-
-/* Entry in malloc dispatch table. */
-typedef void* (*MallocDebugCalloc)(size_t, size_t);
-typedef void (*MallocDebugFree)(void*);
-typedef struct mallinfo (*MallocDebugMallinfo)();
-typedef void* (*MallocDebugMalloc)(size_t);
-typedef size_t (*MallocDebugMallocUsableSize)(const void*);
-typedef void* (*MallocDebugMemalign)(size_t, size_t);
-typedef int (*MallocDebugPosixMemalign)(void**, size_t, size_t);
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
-typedef void* (*MallocDebugPvalloc)(size_t);
-#endif
-typedef void* (*MallocDebugRealloc)(void*, size_t);
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
-typedef void* (*MallocDebugValloc)(size_t);
-#endif
-
-struct MallocDebug {
- MallocDebugCalloc calloc;
- MallocDebugFree free;
- MallocDebugMallinfo mallinfo;
- MallocDebugMalloc malloc;
- MallocDebugMallocUsableSize malloc_usable_size;
- MallocDebugMemalign memalign;
- MallocDebugPosixMemalign posix_memalign;
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- MallocDebugPvalloc pvalloc;
-#endif
- MallocDebugRealloc realloc;
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
- MallocDebugValloc valloc;
-#endif
-};
-
-typedef bool (*MallocDebugInit)(HashTable*, const MallocDebug*);
-typedef void (*MallocDebugFini)(int);
-
-// =============================================================================
-// log functions
-// =============================================================================
-
-#define debug_log(format, ...) \
- __libc_format_log(ANDROID_LOG_DEBUG, "malloc_leak_check", (format), ##__VA_ARGS__ )
-#define error_log(format, ...) \
- __libc_format_log(ANDROID_LOG_ERROR, "malloc_leak_check", (format), ##__VA_ARGS__ )
-#define info_log(format, ...) \
- __libc_format_log(ANDROID_LOG_INFO, "malloc_leak_check", (format), ##__VA_ARGS__ )
-
-#endif // MALLOC_DEBUG_COMMON_H
diff --git a/libc/bionic/malloc_debug_leak.cpp b/libc/bionic/malloc_debug_leak.cpp
deleted file mode 100644
index 6a466677b..000000000
--- a/libc/bionic/malloc_debug_leak.cpp
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <arpa/inet.h>
-#include <dlfcn.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <pthread.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/param.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#include <sys/system_properties.h>
-#include <sys/types.h>
-#include <sys/un.h>
-#include <unistd.h>
-#include <unwind.h>
-
-#include "debug_stacktrace.h"
-#include "malloc_debug_backtrace.h"
-#include "malloc_debug_common.h"
-#include "malloc_debug_disable.h"
-
-#include "private/bionic_macros.h"
-#include "private/libc_logging.h"
-#include "private/ScopedPthreadMutexLocker.h"
-
-extern int gMallocLeakZygoteChild;
-extern HashTable* g_hash_table;
-extern const MallocDebug* g_malloc_dispatch;
-
-// =============================================================================
-// stack trace functions
-// =============================================================================
-
-#define GUARD 0x48151642
-#define DEBUG 0
-
-// =============================================================================
-// Structures
-// =============================================================================
-
-struct AllocationEntry {
- HashEntry* entry;
- uint32_t guard;
-} __attribute__((aligned(MALLOC_ALIGNMENT)));
-
-static inline AllocationEntry* to_header(void* mem) {
- return reinterpret_cast<AllocationEntry*>(mem) - 1;
-}
-
-static inline const AllocationEntry* const_to_header(const void* mem) {
- return reinterpret_cast<const AllocationEntry*>(mem) - 1;
-}
-
-// =============================================================================
-// Hash Table functions
-// =============================================================================
-
-static uint32_t get_hash(uintptr_t* backtrace, size_t numEntries) {
- if (backtrace == NULL) return 0;
-
- int hash = 0;
- size_t i;
- for (i = 0 ; i < numEntries ; i++) {
- hash = (hash * 33) + (backtrace[i] >> 2);
- }
-
- return hash;
-}
-
-static HashEntry* find_entry(HashTable* table, int slot,
- uintptr_t* backtrace, size_t numEntries, size_t size) {
- HashEntry* entry = table->slots[slot];
- while (entry != NULL) {
- //debug_log("backtrace: %p, entry: %p entry->backtrace: %p\n",
- // backtrace, entry, (entry != NULL) ? entry->backtrace : NULL);
- /*
- * See if the entry matches exactly. We compare the "size" field,
- * including the flag bits.
- */
- if (entry->size == size && entry->numEntries == numEntries &&
- !memcmp(backtrace, entry->backtrace, numEntries * sizeof(uintptr_t))) {
- return entry;
- }
-
- entry = entry->next;
- }
-
- return NULL;
-}
-
-static HashEntry* record_backtrace(uintptr_t* backtrace, size_t numEntries, size_t size) {
- size_t hash = get_hash(backtrace, numEntries);
- size_t slot = hash % HASHTABLE_SIZE;
-
- if (size & SIZE_FLAG_MASK) {
- debug_log("malloc_debug: allocation %zx exceeds bit width\n", size);
- abort();
- }
-
- if (gMallocLeakZygoteChild) {
- size |= SIZE_FLAG_ZYGOTE_CHILD;
- }
-
- // Keep the lock held for as little time as possible to prevent deadlocks.
- ScopedPthreadMutexLocker locker(&g_hash_table->lock);
- HashEntry* entry = find_entry(g_hash_table, slot, backtrace, numEntries, size);
- if (entry != NULL) {
- entry->allocations++;
- } else {
- // create a new entry
- entry = static_cast<HashEntry*>(g_malloc_dispatch->malloc(sizeof(HashEntry) + numEntries*sizeof(uintptr_t)));
- if (!entry) {
- return NULL;
- }
- entry->allocations = 1;
- entry->slot = slot;
- entry->prev = NULL;
- entry->next = g_hash_table->slots[slot];
- entry->numEntries = numEntries;
- entry->size = size;
-
- memcpy(entry->backtrace, backtrace, numEntries * sizeof(uintptr_t));
-
- g_hash_table->slots[slot] = entry;
-
- if (entry->next != NULL) {
- entry->next->prev = entry;
- }
-
- // we just added an entry, increase the size of the hashtable
- g_hash_table->count++;
- }
-
- return entry;
-}
-
-static int is_valid_entry(HashEntry* entry) {
- if (entry != NULL) {
- for (size_t i = 0; i < HASHTABLE_SIZE; ++i) {
- HashEntry* e1 = g_hash_table->slots[i];
- while (e1 != NULL) {
- if (e1 == entry) {
- return 1;
- }
- e1 = e1->next;
- }
- }
- }
- return 0;
-}
-
-static void remove_entry(HashEntry* entry) {
- HashEntry* prev = entry->prev;
- HashEntry* next = entry->next;
-
- if (prev != NULL) entry->prev->next = next;
- if (next != NULL) entry->next->prev = prev;
-
- if (prev == NULL) {
- // we are the head of the list. set the head to be next
- g_hash_table->slots[entry->slot] = entry->next;
- }
-
- // we just removed and entry, decrease the size of the hashtable
- g_hash_table->count--;
-}
-
-// =============================================================================
-// malloc fill functions
-// =============================================================================
-
-#define CHK_FILL_FREE 0xef
-#define CHK_SENTINEL_VALUE 0xeb
-
-extern "C" void* fill_calloc(size_t n_elements, size_t elem_size) {
- return g_malloc_dispatch->calloc(n_elements, elem_size);
-}
-
-extern "C" void* fill_malloc(size_t bytes) {
- void* buffer = g_malloc_dispatch->malloc(bytes);
- if (buffer) {
- memset(buffer, CHK_SENTINEL_VALUE, bytes);
- }
- return buffer;
-}
-
-extern "C" void fill_free(void* mem) {
- size_t bytes = g_malloc_dispatch->malloc_usable_size(mem);
- memset(mem, CHK_FILL_FREE, bytes);
- g_malloc_dispatch->free(mem);
-}
-
-extern "C" void* fill_realloc(void* mem, size_t bytes) {
- size_t oldSize = g_malloc_dispatch->malloc_usable_size(mem);
- void* newMem = g_malloc_dispatch->realloc(mem, bytes);
- if (newMem) {
- // If this is larger than before, fill the extra with our pattern.
- size_t newSize = g_malloc_dispatch->malloc_usable_size(newMem);
- if (newSize > oldSize) {
- memset(reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(newMem)+oldSize), CHK_FILL_FREE, newSize-oldSize);
- }
- }
- return newMem;
-}
-
-extern "C" void* fill_memalign(size_t alignment, size_t bytes) {
- void* buffer = g_malloc_dispatch->memalign(alignment, bytes);
- if (buffer) {
- memset(buffer, CHK_SENTINEL_VALUE, bytes);
- }
- return buffer;
-}
-
-extern "C" size_t fill_malloc_usable_size(const void* mem) {
- // Since we didn't allocate extra bytes before or after, we can
- // report the normal usable size here.
- return g_malloc_dispatch->malloc_usable_size(mem);
-}
-
-extern "C" struct mallinfo fill_mallinfo() {
- return g_malloc_dispatch->mallinfo();
-}
-
-extern "C" int fill_posix_memalign(void** memptr, size_t alignment, size_t size) {
- if (!powerof2(alignment)) {
- return EINVAL;
- }
- int saved_errno = errno;
- *memptr = fill_memalign(alignment, size);
- errno = saved_errno;
- return (*memptr != NULL) ? 0 : ENOMEM;
-}
-
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
-extern "C" void* fill_pvalloc(size_t bytes) {
- size_t pagesize = getpagesize();
- size_t size = BIONIC_ALIGN(bytes, pagesize);
- if (size < bytes) { // Overflow
- return NULL;
- }
- return fill_memalign(pagesize, size);
-}
-
-extern "C" void* fill_valloc(size_t size) {
- return fill_memalign(getpagesize(), size);
-}
-#endif
-
-// =============================================================================
-// malloc leak functions
-// =============================================================================
-
-static uint32_t MEMALIGN_GUARD = 0xA1A41520;
-
-extern "C" void* leak_malloc(size_t bytes) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->malloc(bytes);
- }
-
- // allocate enough space infront of the allocation to store the pointer for
- // the alloc structure. This will making free'ing the structer really fast!
-
- // 1. allocate enough memory and include our header
- // 2. set the base pointer to be right after our header
-
- size_t size = bytes + sizeof(AllocationEntry);
- if (size < bytes) { // Overflow.
- errno = ENOMEM;
- return NULL;
- }
-
- void* base = g_malloc_dispatch->malloc(size);
- if (base != NULL) {
- uintptr_t backtrace[BACKTRACE_SIZE];
- size_t numEntries = GET_BACKTRACE(backtrace, BACKTRACE_SIZE);
-
- AllocationEntry* header = reinterpret_cast<AllocationEntry*>(base);
- header->entry = record_backtrace(backtrace, numEntries, bytes);
- header->guard = GUARD;
-
- // now increment base to point to after our header.
- // this should just work since our header is 8 bytes.
- base = reinterpret_cast<AllocationEntry*>(base) + 1;
- }
-
- return base;
-}
-
-extern "C" void leak_free(void* mem) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->free(mem);
- }
-
- if (mem == NULL) {
- return;
- }
-
- // check the guard to make sure it is valid
- AllocationEntry* header = to_header(mem);
-
- if (header->guard != GUARD) {
- // could be a memaligned block
- if (header->guard == MEMALIGN_GUARD) {
- // For memaligned blocks, header->entry points to the memory
- // allocated through leak_malloc.
- header = to_header(header->entry);
- }
- }
-
- ScopedPthreadMutexLocker locker(&g_hash_table->lock);
- if (header->guard == GUARD || is_valid_entry(header->entry)) {
- // decrement the allocations
- HashEntry* entry = header->entry;
- entry->allocations--;
- if (entry->allocations <= 0) {
- remove_entry(entry);
- g_malloc_dispatch->free(entry);
- }
-
- // now free the memory!
- g_malloc_dispatch->free(header);
- } else {
- debug_log("WARNING bad header guard: '0x%x'! and invalid entry: %p\n",
- header->guard, header->entry);
- }
-}
-
-extern "C" void* leak_calloc(size_t n_elements, size_t elem_size) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->calloc(n_elements, elem_size);
- }
-
- // Fail on overflow - just to be safe even though this code runs only
- // within the debugging C library, not the production one.
- if (n_elements && SIZE_MAX / n_elements < elem_size) {
- errno = ENOMEM;
- return NULL;
- }
- size_t size = n_elements * elem_size;
- void* ptr = leak_malloc(size);
- if (ptr != NULL) {
- memset(ptr, 0, size);
- }
- return ptr;
-}
-
-extern "C" size_t leak_malloc_usable_size(const void* mem) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->malloc_usable_size(mem);
- }
-
- if (mem == NULL) {
- return 0;
- }
-
- // Check the guard to make sure it is valid.
- const AllocationEntry* header = const_to_header(mem);
-
- if (header->guard == MEMALIGN_GUARD) {
- // If this is a memalign'd pointer, then grab the header from
- // entry.
- header = const_to_header(header->entry);
- } else if (header->guard != GUARD) {
- debug_log("WARNING bad header guard: '0x%x'! and invalid entry: %p\n",
- header->guard, header->entry);
- return 0;
- }
-
- size_t ret = g_malloc_dispatch->malloc_usable_size(header);
- if (ret != 0) {
- // The usable area starts at 'mem' and stops at 'header+ret'.
- return reinterpret_cast<uintptr_t>(header) + ret - reinterpret_cast<uintptr_t>(mem);
- }
- return 0;
-}
-
-extern "C" void* leak_realloc(void* oldMem, size_t bytes) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->realloc(oldMem, bytes);
- }
-
- if (oldMem == NULL) {
- return leak_malloc(bytes);
- }
-
- void* newMem = NULL;
- AllocationEntry* header = to_header(oldMem);
- if (header->guard == MEMALIGN_GUARD) {
- // Get the real header.
- header = to_header(header->entry);
- } else if (header->guard != GUARD) {
- debug_log("WARNING bad header guard: '0x%x'! and invalid entry: %p\n",
- header->guard, header->entry);
- errno = ENOMEM;
- return NULL;
- }
-
- newMem = leak_malloc(bytes);
- if (newMem != NULL) {
- size_t oldSize = leak_malloc_usable_size(oldMem);
- size_t copySize = (oldSize <= bytes) ? oldSize : bytes;
- memcpy(newMem, oldMem, copySize);
- leak_free(oldMem);
- }
-
- return newMem;
-}
-
-extern "C" void* leak_memalign(size_t alignment, size_t bytes) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->memalign(alignment, bytes);
- }
-
- // we can just use malloc
- if (alignment <= MALLOC_ALIGNMENT) {
- return leak_malloc(bytes);
- }
-
- // need to make sure it's a power of two
- if (!powerof2(alignment)) {
- alignment = BIONIC_ROUND_UP_POWER_OF_2(alignment);
- }
-
- // here, alignment is at least MALLOC_ALIGNMENT<<1 bytes
- // we will align by at least MALLOC_ALIGNMENT bytes
- // and at most alignment-MALLOC_ALIGNMENT bytes
- size_t size = (alignment-MALLOC_ALIGNMENT) + bytes;
- if (size < bytes) { // Overflow.
- return NULL;
- }
-
- void* base = leak_malloc(size);
- if (base != NULL) {
- uintptr_t ptr = reinterpret_cast<uintptr_t>(base);
- if ((ptr % alignment) == 0) {
- return base;
- }
-
- // align the pointer
- ptr += ((-ptr) % alignment);
-
- // Already allocated enough space for the header. This assumes
- // that the malloc alignment is at least 8, otherwise, this is
- // not guaranteed to have the space for the header.
- AllocationEntry* header = to_header(reinterpret_cast<void*>(ptr));
- header->guard = MEMALIGN_GUARD;
- header->entry = reinterpret_cast<HashEntry*>(base);
-
- return reinterpret_cast<void*>(ptr);
- }
- return base;
-}
-
-extern "C" struct mallinfo leak_mallinfo() {
- return g_malloc_dispatch->mallinfo();
-}
-
-extern "C" int leak_posix_memalign(void** memptr, size_t alignment, size_t size) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->posix_memalign(memptr, alignment, size);
- }
-
- if (!powerof2(alignment)) {
- return EINVAL;
- }
- int saved_errno = errno;
- *memptr = leak_memalign(alignment, size);
- errno = saved_errno;
- return (*memptr != NULL) ? 0 : ENOMEM;
-}
-
-#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
-extern "C" void* leak_pvalloc(size_t bytes) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->pvalloc(bytes);
- }
-
- size_t pagesize = getpagesize();
- size_t size = BIONIC_ALIGN(bytes, pagesize);
- if (size < bytes) { // Overflow
- return NULL;
- }
- return leak_memalign(pagesize, size);
-}
-
-extern "C" void* leak_valloc(size_t size) {
- if (DebugCallsDisabled()) {
- return g_malloc_dispatch->valloc(size);
- }
-
- return leak_memalign(getpagesize(), size);
-}
-#endif
diff --git a/libc/bionic/malloc_debug_qemu.cpp b/libc/bionic/malloc_debug_qemu.cpp
deleted file mode 100644
index fa40b3585..000000000
--- a/libc/bionic/malloc_debug_qemu.cpp
+++ /dev/null
@@ -1,1069 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*
- * Contains implementation of memory allocation routines instrumented for
- * usage in the emulator to detect memory allocation violations, such as
- * memory leaks, buffer overruns, etc.
- * Code, implemented here is intended to run in the emulated environment only,
- * and serves simply as hooks into memory allocation routines. Main job of this
- * code is to notify the emulator about memory being allocated/deallocated,
- * providing information about each allocation. The idea is that emulator will
- * keep list of currently allocated blocks, and, knowing boundaries of each
- * block it will be able to verify that ld/st access to these blocks don't step
- * over boundaries set for the user. To enforce that, each memory block
- * allocated by this code is guarded with "prefix" and "suffix" areas, so
- * every time emulator detects access to any of these guarding areas, it can be
- * considered as access violation.
- */
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <errno.h>
-#include "malloc_debug_common.h"
-#include "private/bionic_macros.h"
-#include "private/libc_logging.h"
-
-/* This file should be included into the build only when
- * MALLOC_QEMU_INSTRUMENT macro is defined. */
-#ifndef MALLOC_QEMU_INSTRUMENT
-#error MALLOC_QEMU_INSTRUMENT is not defined.
-#endif // !MALLOC_QEMU_INSTRUMENT
-
-/* Controls access violation test performed to make sure that we catch AVs
- * all the time they occur. See test_access_violation for more info. This macro
- * is used for internal testing purposes and should always be set to zero for
- * the production builds. */
-#define TEST_ACCESS_VIOLATIONS 0
-
-// =============================================================================
-// Communication structures
-// =============================================================================
-
-/* Describes memory block allocated from the heap. This structure is passed
- * along with TRACE_DEV_REG_MALLOC event. This descriptor is used to inform
- * the emulator about new memory block being allocated from the heap. The entire
- * structure is initialized by the guest system before event is fired up. It is
- * important to remember that same structure (an exact copy, except for
- * replacing pointers with target_ulong) is also declared in the emulator's
- * sources (file memcheck/memcheck_common.h). So, every time a change is made to
- * any of these two declaration, another one must be also updated accordingly.
- */
-struct MallocDesc {
- /* Pointer to the memory block actually allocated from the heap. Note that
- * this is not the pointer that is returned to the malloc's caller. Pointer
- * returned to the caller is calculated by adding value stored in this field
- * to the value stored in prefix_size field of this structure.
- */
- void* ptr;
-
- /* Number of bytes requested by the malloc's caller. */
- uint32_t requested_bytes;
-
- /* Byte size of the prefix data. Actual pointer returned to the malloc's
- * caller is calculated by adding value stored in this field to the value
- * stored in in the ptr field of this structure.
- */
- uint32_t prefix_size;
-
- /* Byte size of the suffix data. */
- uint32_t suffix_size;
-
- /* Id of the process that initialized libc instance, in which allocation
- * has occurred. This field is used by the emulator to report errors in
- * the course of TRACE_DEV_REG_MALLOC event handling. In case of an error,
- * emulator sets this field to zero (invalid value for a process ID).
- */
- uint32_t libc_pid;
-
- /* Id of the process in context of which allocation has occurred.
- * Value in this field may differ from libc_pid value, if process that
- * is doing allocation has been forked from the process that initialized
- * libc instance.
- */
- uint32_t allocator_pid;
-
- /* Number of access violations detected on this allocation. */
- uint32_t av_count;
-};
-
-/* Describes memory block info queried from emulator. This structure is passed
- * along with TRACE_DEV_REG_QUERY_MALLOC event. When handling free and realloc
- * calls, it is required that we have information about memory blocks that were
- * actually allocated in previous calls to malloc, calloc, memalign, or realloc.
- * Since we don't keep this information directly in the allocated block, but
- * rather we keep it in the emulator, we need to query emulator for that
- * information with TRACE_DEV_REG_QUERY_MALLOC query. The entire structure is
- * initialized by the guest system before event is fired up. It is important to
- * remember that same structure (an exact copy, except for replacing pointers
- * with target_ulong) is also declared in the emulator's sources (file
- * memcheck/memecheck_common.h). So, every time a change is made to any of these
- * two declaration, another one must be also updated accordingly.
- */
-struct MallocDescQuery {
- /* Pointer, for which information is queried. Note that this pointer doesn't
- * have to be exact pointer returned to malloc's caller, but can point
- * anywhere inside an allocated block, including guarding areas. Emulator
- * will respond with information about allocated block that contains this
- * pointer.
- */
- const void* ptr;
-
- /* Id of the process that initialized libc instance, in which this query
- * is called. This field is used by the emulator to report errors in
- * the course of TRACE_DEV_REG_QUERY_MALLOC event handling. In case of an
- * error, emulator sets this field to zero (invalid value for a process ID).
- */
- uint32_t libc_pid;
-
- /* Process ID in context of which query is made. */
- uint32_t query_pid;
-
- /* Code of the allocation routine, in context of which query has been made:
- * 1 - free
- * 2 - realloc
- */
- uint32_t routine;
-
- /* Address of memory allocation descriptor for the queried pointer.
- * Descriptor, addressed by this field is initialized by the emulator in
- * response to the query.
- */
- MallocDesc* desc;
-};
-
-/* Describes memory block that is being freed back to the heap. This structure
- * is passed along with TRACE_DEV_REG_FREE_PTR event. The entire structure is
- * initialized by the guest system before event is fired up. It is important to
- * remember that same structure (an exact copy, except for replacing pointers
- * with target_ulong) is also declared in the emulator's sources (file
- * memcheck/memecheck_common.h). So, every time a change is made to any of these
- * two declaration, another one must be also updated accordingly.
- */
-struct MallocFree {
- /* Pointer to be freed. */
- void* ptr;
-
- /* Id of the process that initialized libc instance, in which this free
- * is called. This field is used by the emulator to report errors in
- * the course of TRACE_DEV_REG_FREE_PTR event handling. In case of an
- * error, emulator sets this field to zero (invalid value for a process ID).
- */
- uint32_t libc_pid;
-
- /* Process ID in context of which memory is being freed. */
- uint32_t free_pid;
-};
-
-// =============================================================================
-// Communication events
-// =============================================================================
-
-/* Notifies the emulator that libc has been initialized for a process.
- * Event's value parameter is PID for the process in context of which libc has
- * been initialized.
- */
-#define TRACE_DEV_REG_LIBC_INIT 1536
-
-/* Notifies the emulator about new memory block been allocated.
- * Event's value parameter points to MallocDesc instance that contains
- * allocated block information. Note that 'libc_pid' field of the descriptor
- * is used by emulator to report failure in handling this event. In case
- * of a failure emulator will zero that field before completing this event.
- */
-#define TRACE_DEV_REG_MALLOC 1537
-
-/* Notifies the emulator about memory block being freed.
- * Event's value parameter points to MallocFree descriptor that contains
- * information about block that's being freed. Note that 'libc_pid' field
- * of the descriptor is used by emulator to report failure in handling this
- * event. In case of a failure emulator will zero that field before completing
- * this event.
- */
-#define TRACE_DEV_REG_FREE_PTR 1538
-
-/* Queries the emulator about allocated memory block information.
- * Event's value parameter points to MallocDescQuery descriptor that contains
- * query parameters. Note that 'libc_pid' field of the descriptor is used by
- * emulator to report failure in handling this event. In case of a failure
- * emulator will zero that field before completing this event.
- */
-#define TRACE_DEV_REG_QUERY_MALLOC 1539
-
-/* Queries the emulator to print a string to its stdout.
- * Event's value parameter points to a zero-terminated string to be printed.
- */
-#define TRACE_DEV_REG_PRINT_USER_STR 1540
-
-static void notify_qemu_string(const char* str);
-static void qemu_log(int prio, const char* fmt, ...);
-static void dump_malloc_descriptor(char* str,
- size_t str_buf_size,
- const MallocDesc* desc);
-
-// =============================================================================
-// Macros
-// =============================================================================
-
-/* Defines default size of allocation prefix.
- * Note that we make prefix area quite large in order to increase chances of
- * catching buffer overflow. */
-#define DEFAULT_PREFIX_SIZE (malloc_alignment * 4)
-
-/* Defines default size of allocation suffix.
- * Note that we make suffix area quite large in order to increase chances of
- * catching buffer overflow. */
-#define DEFAULT_SUFFIX_SIZE (malloc_alignment * 4)
-
-/* Debug tracing has been enabled by the emulator. */
-#define DEBUG_TRACING_ENABLED 0x00000001
-/* Error tracing has been enabled by the emulator. */
-#define ERROR_TRACING_ENABLED 0x00000002
-/* Info tracing has been enabled by the emulator. */
-#define INFO_TRACING_ENABLED 0x00000004
-/* All tracing flags combined. */
-#define ALL_TRACING_ENABLED (DEBUG_TRACING_ENABLED | \
- ERROR_TRACING_ENABLED | \
- INFO_TRACING_ENABLED)
-
-/* Prints a string to the emulator's stdout.
- * In early stages of system loading, logging messages to logcat
- * is not available, because ADB API has not been
- * hooked up yet. So, in order to see such messages we need to print them to
- * the emulator's stdout.
- * Parameters passed to this macro are the same as parameters for printf
- * routine.
- */
-#define TR(...) \
- do { \
- char tr_str[4096]; \
- snprintf(tr_str, sizeof(tr_str), __VA_ARGS__); \
- tr_str[sizeof(tr_str) - 1] = '\0'; \
- notify_qemu_string(&tr_str[0]); \
- } while (0)
-
-// =============================================================================
-// Logging macros. Note that we simultaneously log messages to ADB and emulator.
-// =============================================================================
-
-/*
- * Helper macros for checking if particular trace level is enabled.
- */
-#define debug_LOG_ENABLED ((tracing_flags & DEBUG_TRACING_ENABLED) != 0)
-#define error_LOG_ENABLED ((tracing_flags & ERROR_TRACING_ENABLED) != 0)
-#define info_LOG_ENABLED ((tracing_flags & INFO_TRACING_ENABLED) != 0)
-#define tracing_enabled(type) (type##_LOG_ENABLED)
-
-/*
- * Logging helper macros.
- */
-#define qemu_debug_log(format, ...) \
- do { \
- __libc_format_log(ANDROID_LOG_DEBUG, "memcheck", (format), ##__VA_ARGS__); \
- if (tracing_flags & DEBUG_TRACING_ENABLED) { \
- qemu_log(ANDROID_LOG_DEBUG, (format), ##__VA_ARGS__); \
- } \
- } while (0)
-
-#define qemu_error_log(format, ...) \
- do { \
- __libc_format_log(ANDROID_LOG_ERROR, "memcheck", (format), ##__VA_ARGS__); \
- if (tracing_flags & ERROR_TRACING_ENABLED) { \
- qemu_log(ANDROID_LOG_ERROR, (format), ##__VA_ARGS__); \
- } \
- } while (0)
-
-#define qemu_info_log(format, ...) \
- do { \
- __libc_format_log(ANDROID_LOG_INFO, "memcheck", (format), ##__VA_ARGS__); \
- if (tracing_flags & INFO_TRACING_ENABLED) { \
- qemu_log(ANDROID_LOG_INFO, (format), ##__VA_ARGS__); \
- } \
- } while (0)
-
-/* Logs message dumping MallocDesc instance at the end of the message.
- * Param:
- * type - Message type: debug, error, or info
- * desc - MallocDesc instance to dump.
- * fmt + rest - Formats message preceding dumped descriptor.
-*/
-#define log_mdesc(type, desc, fmt, ...) \
- do { \
- if (tracing_enabled(type)) { \
- char log_str[4096]; \
- __libc_format_buffer(log_str, sizeof(log_str), fmt, ##__VA_ARGS__); \
- log_str[sizeof(log_str) - 1] = '\0'; \
- size_t str_len = strlen(log_str); \
- dump_malloc_descriptor(log_str + str_len, \
- sizeof(log_str) - str_len, \
- (desc)); \
- type##_log("%s", log_str); \
- } \
- } while (0)
-
-// =============================================================================
-// Static data
-// =============================================================================
-
-// The underlying malloc implementation to use to get memory.
-static const MallocDebug* g_malloc_dispatch = NULL;
-
-/* Emulator's magic page address.
- * This page (mapped on /dev/qemu_trace device) is used to fire up events
- * in the emulator. */
-static volatile void* qtrace = NULL;
-
-/* Cached PID of the process in context of which this libc instance
- * has been initialized. */
-static uint32_t malloc_pid = 0;
-
-/* Memory allocation alignment that is used in the malloc implementation.
- * This variable is updated by memcheck_initialize routine. */
-static uint32_t malloc_alignment = 8;
-
-/* Tracing flags. These flags control which types of logging messages are
- * enabled by the emulator. See XXX_TRACING_ENABLED for the values of flags
- * stored in this variable. This variable is updated by memcheck_initialize
- * routine. */
-static uint32_t tracing_flags = 0;
-
-// =============================================================================
-// Static routines
-// =============================================================================
-
-/* Gets pointer, returned to malloc caller for the given allocation decriptor.
- * Param:
- * desc - Allocation descriptor.
- * Return:
- * Pointer to the allocated memory returned to the malloc caller.
- */
-static inline void* mallocdesc_user_ptr(const MallocDesc* desc) {
- return static_cast<char*>(desc->ptr) + desc->prefix_size;
-}
-
-/* Gets size of memory block actually allocated from the heap for the given
- * allocation decriptor.
- * Param:
- * desc - Allocation descriptor.
- * Return:
- * Size of memory block actually allocated from the heap.
- */
-static inline uint32_t mallocdesc_alloc_size(const MallocDesc* desc) {
- return desc->prefix_size + desc->requested_bytes + desc->suffix_size;
-}
-
-/* Gets pointer to the end of the allocated block for the given descriptor.
- * Param:
- * desc - Descriptor for the memory block, allocated in malloc handler.
- * Return:
- * Pointer to the end of (one byte past) the allocated block.
- */
-static inline void* mallocdesc_alloc_end(const MallocDesc* desc) {
- return static_cast<char*>(desc->ptr) + mallocdesc_alloc_size(desc);
-}
-
-/* Fires up an event in the emulator.
- * Param:
- * code - Event code (one of the TRACE_DEV_XXX).
- * val - Event's value parameter.
- */
-static inline void notify_qemu(uint32_t code, uintptr_t val) {
- if (NULL != qtrace) {
- *(volatile uintptr_t*)((uintptr_t)qtrace + ((code - 1024) << 2)) = val;
- }
-}
-
-/* Prints a zero-terminated string to the emulator's stdout (fires up
- * TRACE_DEV_REG_PRINT_USER_STR event in the emulator).
- * Param:
- * str - Zero-terminated string to print.
- */
-static void notify_qemu_string(const char* str) {
- if (str != NULL) {
- notify_qemu(TRACE_DEV_REG_PRINT_USER_STR, reinterpret_cast<uintptr_t>(str));
- }
-}
-
-/* Fires up TRACE_DEV_REG_LIBC_INIT event in the emulator.
- * Param:
- * pid - ID of the process that initialized libc.
- */
-static void notify_qemu_libc_initialized(uint32_t pid) {
- notify_qemu(TRACE_DEV_REG_LIBC_INIT, pid);
-}
-
-/* Fires up TRACE_DEV_REG_MALLOC event in the emulator.
- * Param:
- * desc - Pointer to MallocDesc instance containing allocated block
- * information.
- * Return:
- * Zero on success, or -1 on failure. Note that on failure libc_pid field of
- * the desc parameter passed to this routine has been zeroed out by the
- * emulator.
- */
-static inline int notify_qemu_malloc(volatile MallocDesc* desc) {
- desc->libc_pid = malloc_pid;
- desc->allocator_pid = getpid();
- desc->av_count = 0;
- notify_qemu(TRACE_DEV_REG_MALLOC, reinterpret_cast<uintptr_t>(desc));
-
- /* Emulator reports failure by zeroing libc_pid field of the
- * descriptor. */
- return desc->libc_pid != 0 ? 0 : -1;
-}
-
-/* Fires up TRACE_DEV_REG_FREE_PTR event in the emulator.
- * Param:
- * ptr - Pointer to the memory block that's being freed.
- * Return:
- * Zero on success, or -1 on failure.
- */
-static inline int notify_qemu_free(void* ptr_to_free) {
- volatile MallocFree free_desc;
-
- free_desc.ptr = ptr_to_free;
- free_desc.libc_pid = malloc_pid;
- free_desc.free_pid = getpid();
- notify_qemu(TRACE_DEV_REG_FREE_PTR, reinterpret_cast<uintptr_t>(&free_desc));
-
- /* Emulator reports failure by zeroing libc_pid field of the
- * descriptor. */
- return free_desc.libc_pid != 0 ? 0 : -1;
-}
-
-/* Fires up TRACE_DEV_REG_QUERY_MALLOC event in the emulator.
- * Param:
- * ptr - Pointer to request allocation information for.
- * desc - Pointer to MallocDesc instance that will receive allocation
- * information.
- * routine - Code of the allocation routine, in context of which query is made:
- * 1 - free
- * 2 - realloc
- * Return:
- * Zero on success, or -1 on failure.
- */
-static inline int query_qemu_malloc_info(const void* ptr, MallocDesc* desc, uint32_t routine) {
- volatile MallocDescQuery query;
-
- query.ptr = ptr;
- query.libc_pid = malloc_pid;
- query.query_pid = getpid();
- query.routine = routine;
- query.desc = desc;
- notify_qemu(TRACE_DEV_REG_QUERY_MALLOC, reinterpret_cast<uintptr_t>(&query));
-
- /* Emulator reports failure by zeroing libc_pid field of the
- * descriptor. */
- return query.libc_pid != 0 ? 0 : -1;
-}
-
-/* Logs a message to emulator's stdout.
- * Param:
- * prio - Message priority (debug, info, or error)
- * fmt + rest - Message format and parameters.
- */
-static void qemu_log(int prio, const char* fmt, ...) {
- va_list ap;
- char buf[4096];
- const char* prefix;
-
- /* Choose message prefix depending on the priority value. */
- switch (prio) {
- case ANDROID_LOG_ERROR:
- if (!tracing_enabled(error)) {
- return;
- }
- prefix = "E";
- break;
- case ANDROID_LOG_INFO:
- if (!tracing_enabled(info)) {
- return;
- }
- prefix = "I";
- break;
- case ANDROID_LOG_DEBUG:
- default:
- if (!tracing_enabled(debug)) {
- return;
- }
- prefix = "D";
- break;
- }
-
- va_start(ap, fmt);
- vsnprintf(buf, sizeof(buf), fmt, ap);
- va_end(ap);
- buf[sizeof(buf) - 1] = '\0';
-
- TR("%s/memcheck: %s\n", prefix, buf);
-}
-
-/* Dumps content of memory allocation descriptor to a string.
- * Param:
- * str - String to dump descriptor to.
- * str_buf_size - Size of string's buffer.
- * desc - Descriptor to dump.
- */
-static void dump_malloc_descriptor(char* str, size_t str_buf_size, const MallocDesc* desc) {
- if (str_buf_size) {
- snprintf(str, str_buf_size,
- "MDesc: %p: %p <-> %p [%u + %u + %u] by pid=%03u in libc_pid=%03u",
- mallocdesc_user_ptr(desc), desc->ptr,
- mallocdesc_alloc_end(desc), desc->prefix_size,
- desc->requested_bytes, desc->suffix_size, desc->allocator_pid,
- desc->libc_pid);
- str[str_buf_size - 1] = '\0';
- }
-}
-
-#if TEST_ACCESS_VIOLATIONS
-/* Causes an access violation on allocation descriptor, and verifies that
- * violation has been detected by memory checker in the emulator.
- */
-static void test_access_violation(const MallocDesc* desc) {
- MallocDesc desc_chk;
- char ch;
- volatile char* prefix = (volatile char*)desc->ptr;
- volatile char* suffix = (volatile char*)mallocdesc_user_ptr(desc) +
- desc->requested_bytes;
- /* We're causing AV by reading from the prefix and suffix areas of the
- * allocated block. This should produce two access violations, so when we
- * get allocation descriptor from QEMU, av_counter should be bigger than
- * av_counter of the original descriptor by 2. */
- ch = *prefix;
- ch = *suffix;
- if (!query_qemu_malloc_info(mallocdesc_user_ptr(desc), &desc_chk, 2) &&
- desc_chk.av_count != (desc->av_count + 2)) {
- log_mdesc(error, &desc_chk,
- "<libc_pid=%03u, pid=%03u>: malloc: Access violation test failed:\n"
- "Expected violations count %u is not equal to the actually reported %u",
- malloc_pid, getpid(), desc->av_count + 2,
- desc_chk.av_count);
- }
-}
-#endif // TEST_ACCESS_VIOLATIONS
-
-// =============================================================================
-// API routines
-// =============================================================================
-
-extern "C" void* qemu_instrumented_calloc(size_t, size_t);
-extern "C" void qemu_instrumented_free(void*);
-extern "C" struct mallinfo qemu_instrumented_mallinfo();
-extern "C" void* qemu_instrumented_malloc(size_t);
-extern "C" size_t qemu_instrumented_malloc_usable_size(const void*);
-extern "C" void* qemu_instrumented_memalign(size_t, size_t);
-extern "C" int qemu_instrumented_posix_memalign(void**, size_t, size_t);
-extern "C" void* qemu_instrumented_pvalloc(size_t);
-extern "C" void* qemu_instrumented_realloc(void*, size_t);
-extern "C" void* qemu_instrumented_valloc(size_t);
-
-/* Initializes malloc debugging instrumentation for the emulator.
- * This routine is called from malloc_init_impl routine implemented in
- * bionic/libc/bionic/malloc_debug_common.c when malloc debugging gets
- * initialized for a process. The way malloc debugging implementation is
- * done, it is guaranteed that this routine will be called just once per
- * process.
- * Return:
- * 0 on success, or -1 on failure.
-*/
-extern "C" bool malloc_debug_initialize(HashTable*, const MallocDebug* malloc_dispatch) {
- g_malloc_dispatch = malloc_dispatch;
-
- /* We will be using emulator's magic page to report memory allocation
- * activities. In essence, what magic page does, it translates writes to
- * the memory mapped spaces into writes to an I/O port that emulator
- * "listens to" on the other end. Note that until we open and map that
- * device, logging to emulator's stdout will not be available. */
- int fd = open("/dev/qemu_trace", O_CLOEXEC | O_RDWR);
- if (fd < 0) {
- error_log("Unable to open /dev/qemu_trace");
- return false;
- } else {
- qtrace = mmap(NULL, PAGESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- close(fd);
-
- if (qtrace == MAP_FAILED) {
- qtrace = NULL;
- error_log("Unable to mmap /dev/qemu_trace");
- return false;
- }
- }
-
- /* Cache pid of the process this library has been initialized for. */
- malloc_pid = getpid();
- return true;
-}
-
-/* Completes malloc debugging instrumentation for the emulator.
- * Note that this routine is called after successful return from
- * malloc_debug_initialize, which means that connection to the emulator via
- * "magic page" has been established.
- * Param:
- * alignment - Alignment requirement set for memiry allocations.
- * memcheck_param - Emulator's -memcheck option parameters. This string
- * contains abbreviation for guest events that are enabled for tracing.
- * Return:
- * 0 on success, or -1 on failure.
-*/
-extern "C" int memcheck_initialize(int alignment, const char* memcheck_param) {
- malloc_alignment = alignment;
-
- /* Parse -memcheck parameter for the guest tracing flags. */
- while (*memcheck_param != '\0') {
- switch (*memcheck_param) {
- case 'a':
- // Enable all messages from the guest.
- tracing_flags |= ALL_TRACING_ENABLED;
- break;
- case 'd':
- // Enable debug messages from the guest.
- tracing_flags |= DEBUG_TRACING_ENABLED;
- break;
- case 'e':
- // Enable error messages from the guest.
- tracing_flags |= ERROR_TRACING_ENABLED;
- break;
- case 'i':
- // Enable info messages from the guest.
- tracing_flags |= INFO_TRACING_ENABLED;
- break;
- default:
- break;
- }
- if (tracing_flags == ALL_TRACING_ENABLED) {
- break;
- }
- memcheck_param++;
- }
-
- notify_qemu_libc_initialized(malloc_pid);
-
- qemu_debug_log("Instrumented for pid=%03u: malloc=%p, free=%p, calloc=%p, realloc=%p, memalign=%p",
- malloc_pid, qemu_instrumented_malloc, qemu_instrumented_free,
- qemu_instrumented_calloc, qemu_instrumented_realloc,
- qemu_instrumented_memalign);
-
- return 0;
-}
-
-/* This routine serves as entry point for 'malloc'.
- * Primary responsibility of this routine is to allocate requested number of
- * bytes (plus prefix, and suffix guards), and report allocation to the
- * emulator.
- */
-extern "C" void* qemu_instrumented_malloc(size_t bytes) {
- MallocDesc desc;
-
- /* Initialize block descriptor and allocate memory. Note that malloc
- * returns a valid pointer on zero allocation. Lets mimic this behavior. */
- desc.prefix_size = DEFAULT_PREFIX_SIZE;
- desc.requested_bytes = bytes;
- desc.suffix_size = DEFAULT_SUFFIX_SIZE;
- size_t size = mallocdesc_alloc_size(&desc);
- if (size < bytes) { // Overflow
- qemu_error_log("<libc_pid=%03u, pid=%03u> malloc: malloc(%zu) overflow caused failure.",
- malloc_pid, getpid(), bytes);
- errno = ENOMEM;
- return NULL;
- }
- desc.ptr = g_malloc_dispatch->malloc(size);
- if (desc.ptr == NULL) {
- qemu_error_log("<libc_pid=%03u, pid=%03u> malloc(%zu): malloc(%zu) failed.",
- malloc_pid, getpid(), bytes, size);
- return NULL;
- }
-
- // Fire up event in the emulator.
- if (notify_qemu_malloc(&desc)) {
- log_mdesc(error, &desc, "<libc_pid=%03u, pid=%03u>: malloc: notify_malloc failed for ",
- malloc_pid, getpid());
- g_malloc_dispatch->free(desc.ptr);
- errno = ENOMEM;
- return NULL;
- } else {
-#if TEST_ACCESS_VIOLATIONS
- test_access_violation(&desc);
-#endif // TEST_ACCESS_VIOLATIONS
- log_mdesc(info, &desc, "+++ <libc_pid=%03u, pid=%03u> malloc(%zu) -> ",
- malloc_pid, getpid(), bytes);
- return mallocdesc_user_ptr(&desc);
- }
-}
-
-/* This routine serves as entry point for 'malloc'.
- * Primary responsibility of this routine is to free requested memory, and
- * report free block to the emulator.
- */
-extern "C" void qemu_instrumented_free(void* mem) {
- MallocDesc desc;
-
- if (mem == NULL) {
- // Just let go NULL free
- g_malloc_dispatch->free(mem);
- return;
- }
-
- // Query emulator for the freeing block information.
- if (query_qemu_malloc_info(mem, &desc, 1)) {
- error_log("<libc_pid=%03u, pid=%03u>: free(%p) query_info failed.",
- malloc_pid, getpid(), mem);
- return;
- }
-
-#if TEST_ACCESS_VIOLATIONS
- test_access_violation(&desc);
-#endif // TEST_ACCESS_VIOLATIONS
-
- /* Make sure that pointer that's being freed matches what we expect
- * for this memory block. Note that this violation should be already
- * caught in the emulator. */
- if (mem != mallocdesc_user_ptr(&desc)) {
- log_mdesc(error, &desc, "<libc_pid=%03u, pid=%03u>: free(%p) is invalid for ",
- malloc_pid, getpid(), mem);
- return;
- }
-
- // Fire up event in the emulator and free block that was actually allocated.
- if (notify_qemu_free(mem)) {
- log_mdesc(error, &desc, "<libc_pid=%03u, pid=%03u>: free(%p) notify_free failed for ",
- malloc_pid, getpid(), mem);
- } else {
- log_mdesc(info, &desc, "--- <libc_pid=%03u, pid=%03u> free(%p) -> ",
- malloc_pid, getpid(), mem);
- g_malloc_dispatch->free(desc.ptr);
- }
-}
-
-/* This routine serves as entry point for 'calloc'.
- * This routine behaves similarly to qemu_instrumented_malloc.
- */
-extern "C" void* qemu_instrumented_calloc(size_t n_elements, size_t elem_size) {
- if (n_elements == 0 || elem_size == 0) {
- // Just let go zero bytes allocation.
- qemu_info_log("::: <libc_pid=%03u, pid=%03u>: Zero calloc redir to malloc",
- malloc_pid, getpid());
- return qemu_instrumented_malloc(0);
- }
-
- // Fail on overflow - just to be safe even though this code runs only
- // within the debugging C library, not the production one.
- if (n_elements && SIZE_MAX / n_elements < elem_size) {
- qemu_error_log("<libc_pid=%03u, pid=%03u> calloc: calloc(%zu, %zu) overflow caused failure.",
- malloc_pid, getpid(), n_elements, elem_size);
- errno = ENOMEM;
- return NULL;
- }
-
- MallocDesc desc;
-
- /* Calculating prefix size. The trick here is to make sure that
- * first element (returned to the caller) is properly aligned. */
- if (DEFAULT_PREFIX_SIZE >= elem_size) {
- /* If default alignment is bigger than element size, we will
- * set our prefix size to the default alignment size. */
- desc.prefix_size = DEFAULT_PREFIX_SIZE;
- /* For the suffix we will use whatever bytes remain from the prefix
- * allocation size, aligned to the size of an element, plus the usual
- * default suffix size. */
- desc.suffix_size = (DEFAULT_PREFIX_SIZE % elem_size) +
- DEFAULT_SUFFIX_SIZE;
- } else {
- /* Make sure that prefix, and suffix sizes is at least elem_size,
- * and first element returned to the caller is properly aligned. */
- desc.prefix_size = elem_size + DEFAULT_PREFIX_SIZE - 1;
- desc.prefix_size &= ~(malloc_alignment - 1);
- desc.suffix_size = DEFAULT_SUFFIX_SIZE;
- }
- desc.requested_bytes = n_elements * elem_size;
- size_t total_size = desc.requested_bytes + desc.prefix_size + desc.suffix_size;
- if (total_size < desc.requested_bytes) { // Overflow
- qemu_error_log("<libc_pid=%03u, pid=%03u> calloc: calloc(%zu, %zu) overflow caused failure.",
- malloc_pid, getpid(), n_elements, elem_size);
- errno = ENOMEM;
- return NULL;
- }
- size_t total_elements = total_size / elem_size;
- total_size %= elem_size;
- if (total_size != 0) {
- // Add extra to the suffix area.
- total_elements++;
- desc.suffix_size += (elem_size - total_size);
- }
- desc.ptr = g_malloc_dispatch->calloc(total_elements, elem_size);
- if (desc.ptr == NULL) {
- error_log("<libc_pid=%03u, pid=%03u> calloc: calloc(%zu(%zu), %zu) (prx=%u, sfx=%u) failed.",
- malloc_pid, getpid(), n_elements, total_elements, elem_size,
- desc.prefix_size, desc.suffix_size);
- return NULL;
- }
-
- if (notify_qemu_malloc(&desc)) {
- log_mdesc(error, &desc, "<libc_pid=%03u, pid=%03u>: calloc(%zu(%zu), %zu): notify_malloc failed for ",
- malloc_pid, getpid(), n_elements, total_elements, elem_size);
- g_malloc_dispatch->free(desc.ptr);
- errno = ENOMEM;
- return NULL;
- } else {
-#if TEST_ACCESS_VIOLATIONS
- test_access_violation(&desc);
-#endif // TEST_ACCESS_VIOLATIONS
- log_mdesc(info, &desc, "### <libc_pid=%03u, pid=%03u> calloc(%zu(%zu), %zu) -> ",
- malloc_pid, getpid(), n_elements, total_elements, elem_size);
- return mallocdesc_user_ptr(&desc);
- }
-}
-
-/* This routine serves as entry point for 'realloc'.
- * This routine behaves similarly to qemu_instrumented_free +
- * qemu_instrumented_malloc. Note that this modifies behavior of "shrinking" an
- * allocation, but overall it doesn't seem to matter, as caller of realloc
- * should not expect that pointer returned after shrinking will remain the same.
- */
-extern "C" void* qemu_instrumented_realloc(void* mem, size_t bytes) {
- if (mem == NULL) {
- // Nothing to realloc. just do regular malloc.
- qemu_info_log("::: <libc_pid=%03u, pid=%03u>: realloc(%p, %zu) redir to malloc",
- malloc_pid, getpid(), mem, bytes);
- return qemu_instrumented_malloc(bytes);
- }
-
- if (bytes == 0) {
- // This is a "free" condition.
- qemu_info_log("::: <libc_pid=%03u, pid=%03u>: realloc(%p, %zu) redir to free and malloc",
- malloc_pid, getpid(), mem, bytes);
- qemu_instrumented_free(mem);
-
- // This is what realloc does for a "free" realloc.
- return NULL;
- }
-
- // Query emulator for the reallocating block information.
- MallocDesc cur_desc;
- if (query_qemu_malloc_info(mem, &cur_desc, 2)) {
- // Note that this violation should be already caught in the emulator.
- error_log("<libc_pid=%03u, pid=%03u>: realloc(%p, %zu) query_info failed.",
- malloc_pid, getpid(), mem, bytes);
- errno = ENOMEM;
- return NULL;
- }
-
-#if TEST_ACCESS_VIOLATIONS
- test_access_violation(&cur_desc);
-#endif // TEST_ACCESS_VIOLATIONS
-
- /* Make sure that reallocating pointer value is what we would expect
- * for this memory block. Note that this violation should be already caught
- * in the emulator.*/
- if (mem != mallocdesc_user_ptr(&cur_desc)) {
- log_mdesc(error, &cur_desc, "<libc_pid=%03u, pid=%03u>: realloc(%p, %zu) is invalid for ",
- malloc_pid, getpid(), mem, bytes);
- errno = ENOMEM;
- return NULL;
- }
-
- /* TODO: We're a bit inefficient here, always allocating new block from
- * the heap. If this realloc shrinks current buffer, we can just do the
- * shrinking "in place", adjusting suffix_size in the allocation descriptor
- * for this block that is stored in the emulator. */
-
- // Initialize descriptor for the new block.
- MallocDesc new_desc;
- new_desc.prefix_size = DEFAULT_PREFIX_SIZE;
- new_desc.requested_bytes = bytes;
- new_desc.suffix_size = DEFAULT_SUFFIX_SIZE;
- size_t new_size = mallocdesc_alloc_size(&new_desc);
- if (new_size < bytes) { // Overflow
- qemu_error_log("<libc_pid=%03u, pid=%03u>: realloc(%p, %zu): malloc(%zu) failed due to overflow",
- malloc_pid, getpid(), mem, bytes, new_size);
- errno = ENOMEM;
- return NULL;
- }
- new_desc.ptr = g_malloc_dispatch->malloc(new_size);
- if (new_desc.ptr == NULL) {
- log_mdesc(error, &cur_desc, "<libc_pid=%03u, pid=%03u>: realloc(%p, %zu): malloc(%zu) failed on ",
- malloc_pid, getpid(), mem, bytes, new_size);
- return NULL;
- }
- void* new_mem = mallocdesc_user_ptr(&new_desc);
-
- // Copy user data from old block to the new one.
- size_t to_copy = bytes < cur_desc.requested_bytes ? bytes : cur_desc.requested_bytes;
- if (to_copy != 0) {
- memcpy(new_mem, mallocdesc_user_ptr(&cur_desc), to_copy);
- }
-
- // Register new block with emulator.
- if (notify_qemu_malloc(&new_desc)) {
- log_mdesc(error, &new_desc, "<libc_pid=%03u, pid=%03u>: realloc(%p, %zu) notify_malloc failed -> ",
- malloc_pid, getpid(), mem, bytes);
- log_mdesc(error, &cur_desc, " <- ");
- g_malloc_dispatch->free(new_desc.ptr);
- errno = ENOMEM;
- return NULL;
- }
-
-#if TEST_ACCESS_VIOLATIONS
- test_access_violation(&new_desc);
-#endif // TEST_ACCESS_VIOLATIONS
-
- // Free old block.
- if (notify_qemu_free(mem)) {
- log_mdesc(error, &cur_desc, "<libc_pid=%03u, pid=%03u>: realloc(%p, %zu): notify_free failed for ",
- malloc_pid, getpid(), mem, bytes);
- /* Since we registered new decriptor with the emulator, we need
- * to unregister it before freeing newly allocated block. */
- notify_qemu_free(mallocdesc_user_ptr(&new_desc));
- g_malloc_dispatch->free(new_desc.ptr);
- errno = ENOMEM;
- return NULL;
- }
- g_malloc_dispatch->free(cur_desc.ptr);
-
- log_mdesc(info, &new_desc, "=== <libc_pid=%03u, pid=%03u>: realloc(%p, %zu) -> ",
- malloc_pid, getpid(), mem, bytes);
- log_mdesc(info, &cur_desc, " <- ");
-
- return new_mem;
-}
-
-/* This routine serves as entry point for 'memalign'.
- * This routine behaves similarly to qemu_instrumented_malloc.
- */
-extern "C" void* qemu_instrumented_memalign(size_t alignment, size_t bytes) {
- MallocDesc desc;
-
- if (bytes == 0) {
- // Just let go zero bytes allocation.
- qemu_info_log("::: <libc_pid=%03u, pid=%03u>: memalign(%zx, %zu) redir to malloc",
- malloc_pid, getpid(), alignment, bytes);
- return qemu_instrumented_malloc(0);
- }
-
- // Prefix size for aligned allocation must be equal to the alignment used
- // for allocation in order to ensure proper alignment of the returned
- // pointer. in case that alignment requirement is greater than prefix
- // size.
- if (alignment < DEFAULT_PREFIX_SIZE) {
- alignment = DEFAULT_PREFIX_SIZE;
- } else if (!powerof2(alignment)) {
- alignment = BIONIC_ROUND_UP_POWER_OF_2(alignment);
- }
- desc.prefix_size = alignment;
- desc.requested_bytes = bytes;
- desc.suffix_size = DEFAULT_SUFFIX_SIZE;
- size_t size = mallocdesc_alloc_size(&desc);
- if (size < bytes) { // Overflow
- qemu_error_log("<libc_pid=%03u, pid=%03u> memalign(%zx, %zu): malloc(%zu) failed due to overflow.",
- malloc_pid, getpid(), alignment, bytes, size);
-
- return NULL;
- }
- desc.ptr = g_malloc_dispatch->memalign(desc.prefix_size, size);
- if (desc.ptr == NULL) {
- error_log("<libc_pid=%03u, pid=%03u> memalign(%zx, %zu): malloc(%zu) failed.",
- malloc_pid, getpid(), alignment, bytes, size);
- return NULL;
- }
- if (notify_qemu_malloc(&desc)) {
- log_mdesc(error, &desc, "<libc_pid=%03u, pid=%03u>: memalign(%zx, %zu): notify_malloc failed for ",
- malloc_pid, getpid(), alignment, bytes);
- g_malloc_dispatch->free(desc.ptr);
- return NULL;
- }
-
-#if TEST_ACCESS_VIOLATIONS
- test_access_violation(&desc);
-#endif // TEST_ACCESS_VIOLATIONS
-
- log_mdesc(info, &desc, "@@@ <libc_pid=%03u, pid=%03u> memalign(%zx, %zu) -> ",
- malloc_pid, getpid(), alignment, bytes);
- return mallocdesc_user_ptr(&desc);
-}
-
-extern "C" size_t qemu_instrumented_malloc_usable_size(const void* mem) {
- MallocDesc cur_desc;
-
- // Query emulator for the reallocating block information.
- if (query_qemu_malloc_info(mem, &cur_desc, 2)) {
- // Note that this violation should be already caught in the emulator.
- error_log("<libc_pid=%03u, pid=%03u>: malloc_usable_size(%p) query_info failed.",
- malloc_pid, getpid(), mem);
- return 0;
- }
-
- /* Make sure that reallocating pointer value is what we would expect
- * for this memory block. Note that this violation should be already caught
- * in the emulator.*/
- if (mem != mallocdesc_user_ptr(&cur_desc)) {
- log_mdesc(error, &cur_desc, "<libc_pid=%03u, pid=%03u>: malloc_usable_size(%p) is invalid for ",
- malloc_pid, getpid(), mem);
- return 0;
- }
-
- /* during instrumentation, we can't really report anything more than requested_bytes */
- return cur_desc.requested_bytes;
-}
-
-extern "C" struct mallinfo qemu_instrumented_mallinfo() {
- return g_malloc_dispatch->mallinfo();
-}
-
-extern "C" int qemu_instrumented_posix_memalign(void** memptr, size_t alignment, size_t size) {
- if ((alignment & (alignment - 1)) != 0) {
- qemu_error_log("<libc_pid=%03u, pid=%03u> posix_memalign(%p, %zu, %zu): invalid alignment.",
- malloc_pid, getpid(), memptr, alignment, size);
- return EINVAL;
- }
- int saved_errno = errno;
- *memptr = qemu_instrumented_memalign(alignment, size);
- errno = saved_errno;
- return (*memptr != NULL) ? 0 : ENOMEM;
-}
-
-extern "C" void* qemu_instrumented_pvalloc(size_t bytes) {
- size_t pagesize = getpagesize();
- size_t size = BIONIC_ALIGN(bytes, pagesize);
- if (size < bytes) { // Overflow
- qemu_error_log("<libc_pid=%03u, pid=%03u> pvalloc(%zu): overflow (%zu).",
- malloc_pid, getpid(), bytes, size);
- return NULL;
- }
- return qemu_instrumented_memalign(pagesize, size);
-}
-
-extern "C" void* qemu_instrumented_valloc(size_t size) {
- return qemu_instrumented_memalign(getpagesize(), size);
-}
diff --git a/libc/bionic/mmap.cpp b/libc/bionic/mmap.cpp
index 8f25a8941..57a8cdf95 100644
--- a/libc/bionic/mmap.cpp
+++ b/libc/bionic/mmap.cpp
@@ -27,9 +27,11 @@
*/
#include <errno.h>
+#include <stdint.h>
#include <sys/mman.h>
#include <unistd.h>
+#include "private/bionic_macros.h"
#include "private/ErrnoRestorer.h"
// mmap2(2) is like mmap(2), but the offset is in 4096-byte blocks, not bytes.
@@ -45,10 +47,21 @@ void* mmap64(void* addr, size_t size, int prot, int flags, int fd, off64_t offse
return MAP_FAILED;
}
- bool is_private_anonymous = (flags & (MAP_PRIVATE | MAP_ANONYMOUS)) != 0;
+ // prevent allocations large enough for `end - start` to overflow
+ size_t rounded = BIONIC_ALIGN(size, PAGE_SIZE);
+ if (rounded < size || rounded > PTRDIFF_MAX) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ bool is_private_anonymous =
+ (flags & (MAP_PRIVATE | MAP_ANONYMOUS)) == (MAP_PRIVATE | MAP_ANONYMOUS);
+ bool is_stack_or_grows_down = (flags & (MAP_STACK | MAP_GROWSDOWN)) != 0;
+
void* result = __mmap2(addr, size, prot, flags, fd, offset >> MMAP2_SHIFT);
- if (result != MAP_FAILED && kernel_has_MADV_MERGEABLE && is_private_anonymous) {
+ if (result != MAP_FAILED && kernel_has_MADV_MERGEABLE &&
+ is_private_anonymous && !is_stack_or_grows_down) {
ErrnoRestorer errno_restorer;
int rc = madvise(result, size, MADV_MERGEABLE);
if (rc == -1 && errno == EINVAL) {
diff --git a/libc/bionic/mremap.cpp b/libc/bionic/mremap.cpp
new file mode 100644
index 000000000..6653d439f
--- /dev/null
+++ b/libc/bionic/mremap.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <sys/mman.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include "private/bionic_macros.h"
+
+extern "C" void* ___mremap(void*, size_t, size_t, int, void*);
+
+void* mremap(void* old_address, size_t old_size, size_t new_size, int flags, ...) {
+ // prevent allocations large enough for `end - start` to overflow
+ size_t rounded = BIONIC_ALIGN(new_size, PAGE_SIZE);
+ if (rounded < new_size || rounded > PTRDIFF_MAX) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ void* new_address = nullptr;
+ // The optional argument is only valid if the MREMAP_FIXED flag is set,
+ // so we assume it's not present otherwise.
+ if ((flags & MREMAP_FIXED) != 0) {
+ va_list ap;
+ va_start(ap, flags);
+ new_address = va_arg(ap, void*);
+ va_end(ap);
+ }
+ return ___mremap(old_address, old_size, new_size, flags, new_address);
+}
diff --git a/libc/bionic/ndk_cruft.cpp b/libc/bionic/ndk_cruft.cpp
index b29968480..3ac88f867 100644
--- a/libc/bionic/ndk_cruft.cpp
+++ b/libc/bionic/ndk_cruft.cpp
@@ -47,34 +47,34 @@
#include "private/libc_logging.h"
-// The part is only for 32-bit targets.
-#if !defined(__LP64__)
+extern "C" {
+
+// Brillo and LP64 don't need to support any legacy cruft.
+#if !defined(__BRILLO__) && !defined(__LP64__)
// These were accidentally declared in <unistd.h> because we stupidly used to inline
// getpagesize() and __getpageshift(). Needed for backwards compatibility with old NDK apps.
-extern "C" {
- unsigned int __page_size = PAGE_SIZE;
- unsigned int __page_shift = 12;
-}
+unsigned int __page_size = PAGE_SIZE;
+unsigned int __page_shift = 12;
// TODO: remove this backward compatibility hack (for jb-mr1 strace binaries).
-extern "C" pid_t __wait4(pid_t pid, int* status, int options, struct rusage* rusage) {
+pid_t __wait4(pid_t pid, int* status, int options, struct rusage* rusage) {
return wait4(pid, status, options, rusage);
}
// TODO: does anything still need this?
-extern "C" int __open() {
+int __open() {
abort();
}
// TODO: does anything still need this?
-extern "C" void** __get_tls() {
+void** __get_tls() {
#include "private/__get_tls.h"
return __get_tls();
}
// This non-standard function was in our <string.h> for some reason.
-extern "C" void memswap(void* m1, void* m2, size_t n) {
+void memswap(void* m1, void* m2, size_t n) {
char* p = reinterpret_cast<char*>(m1);
char* p_end = p + n;
char* q = reinterpret_cast<char*>(m2);
@@ -87,13 +87,13 @@ extern "C" void memswap(void* m1, void* m2, size_t n) {
}
}
-extern "C" int pthread_attr_setstackaddr(pthread_attr_t*, void*) {
+int pthread_attr_setstackaddr(pthread_attr_t*, void*) {
// This was removed from POSIX.1-2008, and is not implemented on bionic.
// Needed for ABI compatibility with the NDK.
return ENOSYS;
}
-extern "C" int pthread_attr_getstackaddr(const pthread_attr_t* attr, void** stack_addr) {
+int pthread_attr_getstackaddr(const pthread_attr_t* attr, void** stack_addr) {
// This was removed from POSIX.1-2008.
// Needed for ABI compatibility with the NDK.
*stack_addr = (char*)attr->stack_base + attr->stack_size;
@@ -101,7 +101,7 @@ extern "C" int pthread_attr_getstackaddr(const pthread_attr_t* attr, void** stac
}
// Non-standard cruft that should only ever have been in system/core/toolbox.
-extern "C" char* strtotimeval(const char* str, struct timeval* ts) {
+char* strtotimeval(const char* str, struct timeval* ts) {
char* s;
ts->tv_sec = strtoumax(str, &s, 10);
@@ -143,7 +143,7 @@ static inline int digitval(int ch) {
}
// This non-standard function was in our <inttypes.h> for some reason.
-extern "C" uintmax_t strntoumax(const char *nptr, char **endptr, int base, size_t n) {
+uintmax_t strntoumax(const char *nptr, char **endptr, int base, size_t n) {
const unsigned char* p = (const unsigned char *)nptr;
const unsigned char* end = p + n;
int minus = 0;
@@ -191,12 +191,12 @@ extern "C" uintmax_t strntoumax(const char *nptr, char **endptr, int base, size_
}
// This non-standard function was in our <inttypes.h> for some reason.
-extern "C" intmax_t strntoimax(const char* nptr, char** endptr, int base, size_t n) {
+intmax_t strntoimax(const char* nptr, char** endptr, int base, size_t n) {
return (intmax_t) strntoumax(nptr, endptr, base, n);
}
// POSIX calls this dprintf, but LP32 Android had fdprintf instead.
-extern "C" int fdprintf(int fd, const char* fmt, ...) {
+int fdprintf(int fd, const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
int rc = vdprintf(fd, fmt, ap);
@@ -205,7 +205,7 @@ extern "C" int fdprintf(int fd, const char* fmt, ...) {
}
// POSIX calls this vdprintf, but LP32 Android had fdprintf instead.
-extern "C" int vfdprintf(int fd, const char* fmt, va_list ap) {
+int vfdprintf(int fd, const char* fmt, va_list ap) {
return vdprintf(fd, fmt, ap);
}
@@ -216,64 +216,64 @@ extern "C" int vfdprintf(int fd, const char* fmt, va_list ap) {
#undef __futex_wait
// This used to be in <sys/atomics.h>.
-extern "C" int __futex_wake(volatile void* ftx, int count) {
+int __futex_wake(volatile void* ftx, int count) {
return __real_futex_wake(ftx, count);
}
// This used to be in <sys/atomics.h>.
-extern "C" int __futex_wait(volatile void* ftx, int value, const struct timespec* timeout) {
+int __futex_wait(volatile void* ftx, int value, const struct timespec* timeout) {
return __real_futex_wait(ftx, value, timeout);
}
// Unity's libmono uses this.
-extern "C" int tkill(pid_t tid, int sig) {
+int tkill(pid_t tid, int sig) {
return syscall(__NR_tkill, tid, sig);
}
// This was removed from POSIX 2008.
-extern "C" wchar_t* wcswcs(wchar_t* haystack, wchar_t* needle) {
+wchar_t* wcswcs(wchar_t* haystack, wchar_t* needle) {
return wcsstr(haystack, needle);
}
// This was removed from POSIX 2008.
-extern "C" sighandler_t bsd_signal(int signum, sighandler_t handler) {
+sighandler_t bsd_signal(int signum, sighandler_t handler) {
return signal(signum, handler);
}
#if !defined(__i386__)
// This was removed from POSIX 2008.
#undef bcopy
-extern "C" void bcopy(const void* src, void* dst, size_t n) {
- memcpy(dst, src, n);
+void bcopy(const void* src, void* dst, size_t n) {
+ memmove(dst, src, n);
}
#else
// x86 has an assembler implementation.
#endif
// sysv_signal() was never in POSIX.
-extern sighandler_t _signal(int signum, sighandler_t handler, int flags);
-extern "C" sighandler_t sysv_signal(int signum, sighandler_t handler) {
+extern "C++" sighandler_t _signal(int signum, sighandler_t handler, int flags);
+sighandler_t sysv_signal(int signum, sighandler_t handler) {
return _signal(signum, handler, SA_RESETHAND);
}
// This is a system call that was never in POSIX. Use readdir(3) instead.
-extern "C" int __getdents64(unsigned int, dirent*, unsigned int);
-extern "C" int getdents(unsigned int fd, dirent* dirp, unsigned int count) {
+int __getdents64(unsigned int, dirent*, unsigned int);
+int getdents(unsigned int fd, dirent* dirp, unsigned int count) {
return __getdents64(fd, dirp, count);
}
// This is a BSDism that we never implemented correctly. Used by Firefox.
-extern "C" int issetugid() {
+int issetugid() {
return 0;
}
// This was removed from POSIX 2004.
-extern "C" pid_t wait3(int* status, int options, struct rusage* rusage) {
+pid_t wait3(int* status, int options, struct rusage* rusage) {
return wait4(-1, status, options, rusage);
}
// This was removed from POSIX 2004.
-extern "C" int getdtablesize() {
+int getdtablesize() {
struct rlimit r;
if (getrlimit(RLIMIT_NOFILE, &r) < 0) {
@@ -283,6 +283,10 @@ extern "C" int getdtablesize() {
return r.rlim_cur;
}
+// A leaked BSD stdio implementation detail that's now a no-op.
+void __sinit() {}
+int __sdidinit = 1;
+
// Only used by ftime, which was removed from POSIX 2008.
struct timeb {
time_t time;
@@ -292,7 +296,7 @@ struct timeb {
};
// This was removed from POSIX 2008.
-extern "C" int ftime(struct timeb* tb) {
+int ftime(struct timeb* tb) {
struct timeval tv;
struct timezone tz;
@@ -314,35 +318,35 @@ extern "C" int ftime(struct timeb* tb) {
}
// This was removed from POSIX 2008.
-extern "C" char* index(const char* str, int ch) {
+char* index(const char* str, int ch) {
return strchr(str, ch);
}
// This was removed from BSD.
-extern "C" void arc4random_stir(void) {
+void arc4random_stir(void) {
// The current implementation stirs itself as needed.
}
// This was removed from BSD.
-extern "C" void arc4random_addrandom(unsigned char*, int) {
+void arc4random_addrandom(unsigned char*, int) {
// The current implementation adds randomness as needed.
}
// Old versions of the NDK did not export malloc_usable_size, but did
// export dlmalloc_usable_size. We are moving away from dlmalloc in L
// so make this call malloc_usable_size.
-extern "C" size_t dlmalloc_usable_size(void* ptr) {
+size_t dlmalloc_usable_size(void* ptr) {
return malloc_usable_size(ptr);
}
// In L we added a public pthread_gettid_np, but some apps were using the private API.
-extern "C" pid_t __pthread_gettid(pthread_t t) {
+pid_t __pthread_gettid(pthread_t t) {
return pthread_gettid_np(t);
}
// Older versions of apportable used dlmalloc directly instead of malloc,
// so export this compatibility shim that simply calls malloc.
-extern "C" void* dlmalloc(size_t size) {
+void* dlmalloc(size_t size) {
return malloc(size);
}
@@ -350,45 +354,28 @@ extern "C" void* dlmalloc(size_t size) {
#include "pthread_internal.h"
#undef __get_thread
// Various third-party apps contain a backport of our pthread_rwlock implementation that uses this.
-extern "C" pthread_internal_t* __get_thread() {
+pthread_internal_t* __get_thread() {
return __real_get_thread();
}
-#endif // !defined(__LP64__)
-
-// This is never implemented in bionic, only needed for ABI compatibility with the NDK.
-extern "C" char* getusershell() {
- return NULL;
+// This one exists only for the LP32 NDK and is not present anywhere else.
+extern long __set_errno_internal(int);
+long __set_errno(int n) {
+ return __set_errno_internal(n);
}
-// This is never implemented in bionic, only needed for ABI compatibility with the NDK.
-extern "C" void setusershell() { }
-
-// This is never implemented in bionic, only needed for ABI compatibility with the NDK.
-extern "C" void endusershell() { }
-
-// This is never implemented in bionic, only needed for ABI compatibility with the NDK.
-extern "C" void endpwent() { }
+// This was never implemented in bionic, only needed for ABI compatibility with the NDK.
+// In the M time frame, over 1000 apps have a reference to this!
+void endpwent() { }
// Since dlmalloc_inspect_all and dlmalloc_trim are exported for systems
// that use dlmalloc, be consistent and export them everywhere.
-#if defined(USE_JEMALLOC)
-extern "C" void dlmalloc_inspect_all(void (*)(void*, void*, size_t, void*), void*) {
+void dlmalloc_inspect_all(void (*)(void*, void*, size_t, void*), void*) {
}
-#else
-extern "C" void dlmalloc_inspect_all_real(void (*)(void*, void*, size_t, void*), void*);
-extern "C" void dlmalloc_inspect_all(void (*handler)(void*, void*, size_t, void*), void* arg) {
- dlmalloc_inspect_all_real(handler, arg);
+int dlmalloc_trim(size_t) {
+ return 0;
}
-#endif
-#if defined(USE_JEMALLOC)
-extern "C" int dlmalloc_trim(size_t) {
- return 0;
-}
-#else
-extern "C" int dlmalloc_trim_real(size_t);
-extern "C" int dlmalloc_trim(size_t pad) {
- return dlmalloc_trim_real(pad);
-}
-#endif
+#endif // !defined(__BRILLO__) && !defined (__LP64__)
+
+} // extern "C"
diff --git a/libc/bionic/net_if.cpp b/libc/bionic/net_if.cpp
new file mode 100644
index 000000000..f8d73bd09
--- /dev/null
+++ b/libc/bionic/net_if.cpp
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <net/if.h>
+
+#include <errno.h>
+#include <ifaddrs.h>
+#include <linux/if_packet.h>
+#include <linux/netlink.h>
+#include <linux/rtnetlink.h>
+#include <linux/sockios.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <unistd.h>
+
+#include "private/ErrnoRestorer.h"
+
+#include "bionic_netlink.h"
+
+char* if_indextoname(unsigned ifindex, char* ifname) {
+ int s = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, 0);
+ if (s == -1) return nullptr;
+
+ struct ifreq ifr;
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_ifindex = ifindex;
+
+ int rc = ioctl(s, SIOCGIFNAME, &ifr);
+ ErrnoRestorer errno_restorer;
+ close(s);
+ return (rc == -1) ? nullptr : strncpy(ifname, ifr.ifr_name, IFNAMSIZ);
+}
+
+unsigned if_nametoindex(const char* ifname) {
+ int s = socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC, 0);
+ if (s == -1) return 0;
+
+ struct ifreq ifr;
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
+ ifr.ifr_name[IFNAMSIZ - 1] = 0;
+
+ int rc = ioctl(s, SIOCGIFINDEX, &ifr);
+ ErrnoRestorer errno_restorer;
+ close(s);
+ return (rc == -1) ? 0 : ifr.ifr_ifindex;
+}
+
+struct if_list {
+ if_list* next;
+ struct if_nameindex data;
+
+ if_list(if_list** list) {
+ // push_front onto `list`.
+ next = *list;
+ *list = this;
+ }
+
+ static void Free(if_list* list, bool names_too) {
+ while (list) {
+ if_list* it = list;
+ list = it->next;
+ if (names_too) free(it->data.if_name);
+ free(it);
+ }
+ }
+};
+
+static void __if_nameindex_callback(void* context, nlmsghdr* hdr) {
+ if_list** list = reinterpret_cast<if_list**>(context);
+ if (hdr->nlmsg_type == RTM_NEWLINK) {
+ ifinfomsg* ifi = reinterpret_cast<ifinfomsg*>(NLMSG_DATA(hdr));
+
+ // Create a new entry and set the interface index.
+ if_list* new_link = new if_list(list);
+ new_link->data.if_index = ifi->ifi_index;
+
+ // Go through the various bits of information and find the name.
+ rtattr* rta = IFLA_RTA(ifi);
+ size_t rta_len = IFLA_PAYLOAD(hdr);
+ while (RTA_OK(rta, rta_len)) {
+ if (rta->rta_type == IFLA_IFNAME) {
+ new_link->data.if_name = strndup(reinterpret_cast<char*>(RTA_DATA(rta)), RTA_PAYLOAD(rta));
+ }
+ rta = RTA_NEXT(rta, rta_len);
+ }
+ }
+}
+
+struct if_nameindex* if_nameindex() {
+ if_list* list = nullptr;
+
+ // Open the netlink socket and ask for all the links;
+ NetlinkConnection nc;
+ bool okay = nc.SendRequest(RTM_GETLINK) && nc.ReadResponses(__if_nameindex_callback, &list);
+ if (!okay) {
+ if_list::Free(list, true);
+ return nullptr;
+ }
+
+ // Count the interfaces.
+ size_t interface_count = 0;
+ for (if_list* it = list; it != nullptr; it = it->next) {
+ ++interface_count;
+ }
+
+ // Build the array POSIX requires us to return.
+ struct if_nameindex* result = new struct if_nameindex[interface_count + 1];
+ if (result) {
+ struct if_nameindex* out = result;
+ for (if_list* it = list; it != nullptr; it = it->next) {
+ out->if_index = it->data.if_index;
+ out->if_name = it->data.if_name;
+ ++out;
+ }
+ out->if_index = 0;
+ out->if_name = nullptr;
+ }
+
+ // Free temporary storage.
+ if_list::Free(list, false);
+
+ return result;
+}
+
+void if_freenameindex(struct if_nameindex* array) {
+ if (array == nullptr) return;
+
+ struct if_nameindex* ptr = array;
+ while (ptr->if_index != 0 || ptr->if_name != nullptr) {
+ free(ptr->if_name);
+ ++ptr;
+ }
+
+ delete[] array;
+}
diff --git a/libc/bionic/bindresvport.c b/libc/bionic/netinet_in.cpp
index 5d9ad2bd8..dfa5d8d69 100644
--- a/libc/bionic/bindresvport.c
+++ b/libc/bionic/netinet_in.cpp
@@ -25,48 +25,46 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
+#include <netinet/in.h>
+
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
-#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
-#define START_PORT 600
-#define END_PORT IPPORT_RESERVED
-#define NUM_PORTS (END_PORT - START_PORT)
+constexpr int START_PORT = 600;
+constexpr int END_PORT = IPPORT_RESERVED;
+constexpr int NUM_PORTS = (END_PORT - START_PORT);
-int bindresvport(int sd, struct sockaddr_in *sin)
-{
- static short port;
- struct sockaddr_in sin0;
- int nn, ret;
+int bindresvport(int sd, struct sockaddr_in* sin) {
+ sockaddr_in sin0;
+ if (sin == nullptr) {
+ memset(&sin0, 0, sizeof(sin0));
+ sin = &sin0;
+ sin->sin_family = AF_INET;
+ }
- if (sin == NULL) {
- sin = &sin0;
- memset( sin, 0, sizeof *sin );
- sin->sin_family = AF_INET;
- } else if (sin->sin_family != AF_INET) {
- errno = EPFNOSUPPORT;
- return -1;
- }
+ if (sin->sin_family != AF_INET) {
+ errno = EPFNOSUPPORT;
+ return -1;
+ }
- if (port == 0) {
- port = START_PORT + (getpid() % NUM_PORTS);
- }
+ // TODO: thread safety!
+ static short port;
+ if (port == 0) {
+ port = START_PORT + (getpid() % NUM_PORTS);
+ }
- for (nn = NUM_PORTS; nn > 0; nn--, port++)
- {
- if (port == END_PORT)
- port = START_PORT;
-
- sin->sin_port = htons(port);
- do {
- ret = bind(sd, (struct sockaddr*)sin, sizeof(*sin));
- } while (ret < 0 && errno == EINTR);
-
- if (!ret)
- break;
- }
- return ret;
+ for (size_t i = NUM_PORTS; i > 0; i--, port++) {
+ if (port == END_PORT) port = START_PORT;
+ sin->sin_port = htons(port);
+ int rc = TEMP_FAILURE_RETRY(bind(sd, reinterpret_cast<sockaddr*>(sin), sizeof(*sin)));
+ if (rc >= 0) return rc;
+ }
+ return -1;
}
+
+const in6_addr in6addr_any = IN6ADDR_ANY_INIT;
+const in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
diff --git a/libc/bionic/pthread_atfork.cpp b/libc/bionic/pthread_atfork.cpp
index 093ffd240..2200a6c36 100644
--- a/libc/bionic/pthread_atfork.cpp
+++ b/libc/bionic/pthread_atfork.cpp
@@ -45,7 +45,7 @@ struct atfork_t {
class atfork_list_t {
public:
- atfork_list_t() : first_(nullptr), last_(nullptr) {}
+ constexpr atfork_list_t() : first_(nullptr), last_(nullptr) {}
template<typename F>
void walk_forward(F f) {
diff --git a/libc/bionic/pthread_attr.cpp b/libc/bionic/pthread_attr.cpp
index 7ad34311e..cfa58fc88 100644
--- a/libc/bionic/pthread_attr.cpp
+++ b/libc/bionic/pthread_attr.cpp
@@ -114,6 +114,36 @@ int pthread_attr_setstack(pthread_attr_t* attr, void* stack_base, size_t stack_s
return 0;
}
+static uintptr_t __get_main_stack_startstack() {
+ FILE* fp = fopen("/proc/self/stat", "re");
+ if (fp == nullptr) {
+ __libc_fatal("couldn't open /proc/self/stat: %s", strerror(errno));
+ }
+
+ char line[BUFSIZ];
+ if (fgets(line, sizeof(line), fp) == nullptr) {
+ __libc_fatal("couldn't read /proc/self/stat: %s", strerror(errno));
+ }
+
+ fclose(fp);
+
+ // See man 5 proc. There's no reason comm can't contain ' ' or ')',
+ // so we search backwards for the end of it. We're looking for this field:
+ //
+ // startstack %lu (28) The address of the start (i.e., bottom) of the stack.
+ uintptr_t startstack = 0;
+ const char* end_of_comm = strrchr(line, ')');
+ if (sscanf(end_of_comm + 1, " %*c "
+ "%*d %*d %*d %*d %*d "
+ "%*u %*u %*u %*u %*u %*u %*u "
+ "%*d %*d %*d %*d %*d %*d "
+ "%*u %*u %*d %*u %*u %*u %" SCNuPTR, &startstack) != 1) {
+ __libc_fatal("couldn't parse /proc/self/stat");
+ }
+
+ return startstack;
+}
+
static int __pthread_attr_getstack_main_thread(void** stack_base, size_t* stack_size) {
ErrnoRestorer errno_restorer;
@@ -127,20 +157,19 @@ static int __pthread_attr_getstack_main_thread(void** stack_base, size_t* stack_
stack_limit.rlim_cur = 8 * 1024 * 1024;
}
- // It shouldn't matter which thread we are because we're just looking for "[stack]", but
- // valgrind seems to mess with the stack enough that the kernel will report "[stack:pid]"
- // instead if you look in /proc/self/maps, so we need to look in /proc/pid/task/pid/maps.
- char path[64];
- snprintf(path, sizeof(path), "/proc/self/task/%d/maps", getpid());
- FILE* fp = fopen(path, "re");
- if (fp == NULL) {
- return errno;
+ // Ask the kernel where our main thread's stack started.
+ uintptr_t startstack = __get_main_stack_startstack();
+
+ // Hunt for the region that contains that address.
+ FILE* fp = fopen("/proc/self/maps", "re");
+ if (fp == nullptr) {
+ __libc_fatal("couldn't open /proc/self/maps");
}
char line[BUFSIZ];
while (fgets(line, sizeof(line), fp) != NULL) {
- if (ends_with(line, " [stack]\n")) {
- uintptr_t lo, hi;
- if (sscanf(line, "%" SCNxPTR "-%" SCNxPTR, &lo, &hi) == 2) {
+ uintptr_t lo, hi;
+ if (sscanf(line, "%" SCNxPTR "-%" SCNxPTR, &lo, &hi) == 2) {
+ if (lo <= startstack && startstack <= hi) {
*stack_size = stack_limit.rlim_cur;
*stack_base = reinterpret_cast<void*>(hi - *stack_size);
fclose(fp);
@@ -148,7 +177,7 @@ static int __pthread_attr_getstack_main_thread(void** stack_base, size_t* stack_
}
}
}
- __libc_fatal("No [stack] line found in \"%s\"!", path);
+ __libc_fatal("Stack not found in /proc/self/maps");
}
int pthread_attr_getstack(const pthread_attr_t* attr, void** stack_base, size_t* stack_size) {
diff --git a/libc/bionic/pthread_barrier.cpp b/libc/bionic/pthread_barrier.cpp
new file mode 100644
index 000000000..1bcd12a14
--- /dev/null
+++ b/libc/bionic/pthread_barrier.cpp
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <pthread.h>
+#include <stdatomic.h>
+#include <stdint.h>
+
+#include "private/bionic_futex.h"
+
+int pthread_barrierattr_init(pthread_barrierattr_t* attr) {
+ *attr = 0;
+ return 0;
+}
+
+int pthread_barrierattr_destroy(pthread_barrierattr_t* attr) {
+ *attr = 0;
+ return 0;
+}
+
+int pthread_barrierattr_getpshared(pthread_barrierattr_t* attr, int* pshared) {
+ *pshared = (*attr & 1) ? PTHREAD_PROCESS_SHARED : PTHREAD_PROCESS_PRIVATE;
+ return 0;
+}
+
+int pthread_barrierattr_setpshared(pthread_barrierattr_t* attr, int pshared) {
+ if (pshared == PTHREAD_PROCESS_SHARED) {
+ *attr |= 1;
+ } else {
+ *attr &= ~1;
+ }
+ return 0;
+}
+
+enum BarrierState {
+ WAIT,
+ RELEASE,
+};
+
+struct pthread_barrier_internal_t {
+ // One barrier can be used for unlimited number of cycles. In each cycle, [init_count]
+ // threads must call pthread_barrier_wait() before any of them successfully return from
+ // the call. It is undefined behavior if there are more than [init_count] threads call
+ // pthread_barrier_wait() in one cycle.
+ uint32_t init_count;
+ // Barrier state. It is WAIT if waiting for more threads to enter the barrier in this cycle,
+ // otherwise threads are leaving the barrier.
+ _Atomic(BarrierState) state;
+ // Number of threads having entered but not left the barrier in this cycle.
+ atomic_uint wait_count;
+ // Whether the barrier is shared across processes.
+ bool pshared;
+ uint32_t __reserved[4];
+};
+
+static_assert(sizeof(pthread_barrier_t) == sizeof(pthread_barrier_internal_t),
+ "pthread_barrier_t should actually be pthread_barrier_internal_t in implementation."
+ );
+
+static_assert(alignof(pthread_barrier_t) >= 4,
+ "pthread_barrier_t should fulfill the alignment of pthread_barrier_internal_t.");
+
+static inline pthread_barrier_internal_t* __get_internal_barrier(pthread_barrier_t* barrier) {
+ return reinterpret_cast<pthread_barrier_internal_t*>(barrier);
+}
+
+int pthread_barrier_init(pthread_barrier_t* barrier_interface, const pthread_barrierattr_t* attr,
+ unsigned count) {
+ pthread_barrier_internal_t* barrier = __get_internal_barrier(barrier_interface);
+ if (count == 0) {
+ return EINVAL;
+ }
+ barrier->init_count = count;
+ atomic_init(&barrier->state, WAIT);
+ atomic_init(&barrier->wait_count, 0);
+ barrier->pshared = false;
+ if (attr != nullptr && (*attr & 1)) {
+ barrier->pshared = true;
+ }
+ return 0;
+}
+
+// According to POSIX standard, pthread_barrier_wait() synchronizes memory between participating
+// threads. It means all memory operations made by participating threads before calling
+// pthread_barrier_wait() can be seen by all participating threads after the function call.
+// We establish this by making a happens-before relation between all threads entering the barrier
+// with the last thread entering the barrier, and a happens-before relation between the last
+// thread entering the barrier with all threads leaving the barrier.
+int pthread_barrier_wait(pthread_barrier_t* barrier_interface) {
+ pthread_barrier_internal_t* barrier = __get_internal_barrier(barrier_interface);
+
+ // Wait until all threads for the previous cycle have left the barrier. This is needed
+ // as a participating thread can call pthread_barrier_wait() again before other
+ // threads have left the barrier. Use acquire operation here to synchronize with
+ // the last thread leaving the previous cycle, so we can read correct wait_count below.
+ while(atomic_load_explicit(&barrier->state, memory_order_acquire) == RELEASE) {
+ __futex_wait_ex(&barrier->state, barrier->pshared, RELEASE, false, nullptr);
+ }
+
+ uint32_t prev_wait_count = atomic_load_explicit(&barrier->wait_count, memory_order_relaxed);
+ while (true) {
+ // It happens when there are more than [init_count] threads trying to enter the barrier
+ // at one cycle. We read the POSIX standard as disallowing this, since additional arriving
+ // threads are not synchronized with respect to the barrier reset. We also don't know of
+ // any reasonable cases in which this would be intentional.
+ if (prev_wait_count >= barrier->init_count) {
+ return EINVAL;
+ }
+ // Use memory_order_acq_rel operation here to synchronize between all threads entering
+ // the barrier with the last thread entering the barrier.
+ if (atomic_compare_exchange_weak_explicit(&barrier->wait_count, &prev_wait_count,
+ prev_wait_count + 1u, memory_order_acq_rel,
+ memory_order_relaxed)) {
+ break;
+ }
+ }
+
+ int result = 0;
+ if (prev_wait_count + 1 == barrier->init_count) {
+ result = PTHREAD_BARRIER_SERIAL_THREAD;
+ if (prev_wait_count != 0) {
+ // Use release operation here to synchronize between the last thread entering the
+ // barrier with all threads leaving the barrier.
+ atomic_store_explicit(&barrier->state, RELEASE, memory_order_release);
+ __futex_wake_ex(&barrier->state, barrier->pshared, prev_wait_count);
+ }
+ } else {
+ // Use acquire operation here to synchronize between the last thread entering the
+ // barrier with all threads leaving the barrier.
+ while (atomic_load_explicit(&barrier->state, memory_order_acquire) == WAIT) {
+ __futex_wait_ex(&barrier->state, barrier->pshared, WAIT, false, nullptr);
+ }
+ }
+ // Use release operation here to make it not reordered with previous operations.
+ if (atomic_fetch_sub_explicit(&barrier->wait_count, 1, memory_order_release) == 1) {
+ // Use release operation here to synchronize with threads entering the barrier for
+ // the next cycle, or the thread calling pthread_barrier_destroy().
+ atomic_store_explicit(&barrier->state, WAIT, memory_order_release);
+ __futex_wake_ex(&barrier->state, barrier->pshared, barrier->init_count);
+ }
+ return result;
+}
+
+int pthread_barrier_destroy(pthread_barrier_t* barrier_interface) {
+ pthread_barrier_internal_t* barrier = __get_internal_barrier(barrier_interface);
+ if (barrier->init_count == 0) {
+ return EINVAL;
+ }
+ // Use acquire operation here to synchronize with the last thread leaving the barrier.
+ // So we can read correct wait_count below.
+ while (atomic_load_explicit(&barrier->state, memory_order_acquire) == RELEASE) {
+ __futex_wait_ex(&barrier->state, barrier->pshared, RELEASE, false, nullptr);
+ }
+ if (atomic_load_explicit(&barrier->wait_count, memory_order_relaxed) != 0) {
+ return EBUSY;
+ }
+ barrier->init_count = 0;
+ return 0;
+}
diff --git a/libc/bionic/pthread_cond.cpp b/libc/bionic/pthread_cond.cpp
index 4a69da558..d36426c16 100644
--- a/libc/bionic/pthread_cond.cpp
+++ b/libc/bionic/pthread_cond.cpp
@@ -111,8 +111,8 @@ struct pthread_cond_internal_t {
return COND_IS_SHARED(atomic_load_explicit(&state, memory_order_relaxed));
}
- int get_clock() {
- return COND_GET_CLOCK(atomic_load_explicit(&state, memory_order_relaxed));
+ bool use_realtime_clock() {
+ return COND_GET_CLOCK(atomic_load_explicit(&state, memory_order_relaxed)) == CLOCK_REALTIME;
}
#if defined(__LP64__)
@@ -170,12 +170,17 @@ static int __pthread_cond_pulse(pthread_cond_internal_t* cond, int thread_count)
return 0;
}
-static int __pthread_cond_timedwait_relative(pthread_cond_internal_t* cond, pthread_mutex_t* mutex,
- const timespec* rel_timeout_or_null) {
- unsigned int old_state = atomic_load_explicit(&cond->state, memory_order_relaxed);
+static int __pthread_cond_timedwait(pthread_cond_internal_t* cond, pthread_mutex_t* mutex,
+ bool use_realtime_clock, const timespec* abs_timeout_or_null) {
+ int result = check_timespec(abs_timeout_or_null, true);
+ if (result != 0) {
+ return result;
+ }
+ unsigned int old_state = atomic_load_explicit(&cond->state, memory_order_relaxed);
pthread_mutex_unlock(mutex);
- int status = __futex_wait_ex(&cond->state, cond->process_shared(), old_state, rel_timeout_or_null);
+ int status = __futex_wait_ex(&cond->state, cond->process_shared(), old_state,
+ use_realtime_clock, abs_timeout_or_null);
pthread_mutex_lock(mutex);
if (status == -ETIMEDOUT) {
@@ -184,21 +189,6 @@ static int __pthread_cond_timedwait_relative(pthread_cond_internal_t* cond, pthr
return 0;
}
-static int __pthread_cond_timedwait(pthread_cond_internal_t* cond, pthread_mutex_t* mutex,
- const timespec* abs_timeout_or_null, clockid_t clock) {
- timespec ts;
- timespec* rel_timeout = NULL;
-
- if (abs_timeout_or_null != NULL) {
- rel_timeout = &ts;
- if (!timespec_from_absolute_timespec(*rel_timeout, *abs_timeout_or_null, clock)) {
- return ETIMEDOUT;
- }
- }
-
- return __pthread_cond_timedwait_relative(cond, mutex, rel_timeout);
-}
-
int pthread_cond_broadcast(pthread_cond_t* cond_interface) {
return __pthread_cond_pulse(__get_internal_cond(cond_interface), INT_MAX);
}
@@ -209,14 +199,14 @@ int pthread_cond_signal(pthread_cond_t* cond_interface) {
int pthread_cond_wait(pthread_cond_t* cond_interface, pthread_mutex_t* mutex) {
pthread_cond_internal_t* cond = __get_internal_cond(cond_interface);
- return __pthread_cond_timedwait(cond, mutex, NULL, cond->get_clock());
+ return __pthread_cond_timedwait(cond, mutex, false, nullptr);
}
int pthread_cond_timedwait(pthread_cond_t *cond_interface, pthread_mutex_t * mutex,
const timespec *abstime) {
pthread_cond_internal_t* cond = __get_internal_cond(cond_interface);
- return __pthread_cond_timedwait(cond, mutex, abstime, cond->get_clock());
+ return __pthread_cond_timedwait(cond, mutex, cond->use_realtime_clock(), abstime);
}
#if !defined(__LP64__)
@@ -225,8 +215,7 @@ extern "C" int pthread_cond_timedwait_monotonic(pthread_cond_t* cond_interface,
pthread_mutex_t* mutex,
const timespec* abs_timeout) {
- return __pthread_cond_timedwait(__get_internal_cond(cond_interface), mutex, abs_timeout,
- CLOCK_MONOTONIC);
+ return __pthread_cond_timedwait(__get_internal_cond(cond_interface), mutex, false, abs_timeout);
}
extern "C" int pthread_cond_timedwait_monotonic_np(pthread_cond_t* cond_interface,
@@ -238,8 +227,13 @@ extern "C" int pthread_cond_timedwait_monotonic_np(pthread_cond_t* cond_interfac
extern "C" int pthread_cond_timedwait_relative_np(pthread_cond_t* cond_interface,
pthread_mutex_t* mutex,
const timespec* rel_timeout) {
-
- return __pthread_cond_timedwait_relative(__get_internal_cond(cond_interface), mutex, rel_timeout);
+ timespec ts;
+ timespec* abs_timeout = nullptr;
+ if (rel_timeout != nullptr) {
+ absolute_timespec_from_timespec(ts, *rel_timeout, CLOCK_REALTIME);
+ abs_timeout = &ts;
+ }
+ return __pthread_cond_timedwait(__get_internal_cond(cond_interface), mutex, true, abs_timeout);
}
extern "C" int pthread_cond_timeout_np(pthread_cond_t* cond_interface,
diff --git a/libc/bionic/pthread_create.cpp b/libc/bionic/pthread_create.cpp
index dbdb18058..34826dba6 100644
--- a/libc/bionic/pthread_create.cpp
+++ b/libc/bionic/pthread_create.cpp
@@ -53,13 +53,6 @@ extern "C" int __isthreaded;
// This code is used both by each new pthread and the code that initializes the main thread.
void __init_tls(pthread_internal_t* thread) {
- if (thread->mmap_size == 0) {
- // If the TLS area was not allocated by mmap(), it may not have been cleared to zero.
- // So assume the worst and zero the TLS area.
- memset(thread->tls, 0, sizeof(thread->tls));
- memset(thread->key_data, 0, sizeof(thread->key_data));
- }
-
// Slot 0 must point to itself. The x86 Linux kernel reads the TLS from %fs:0.
thread->tls[TLS_SLOT_SELF] = thread->tls;
thread->tls[TLS_SLOT_THREAD_ID] = thread;
@@ -87,6 +80,7 @@ void __init_alternate_signal_stack(pthread_internal_t* thread) {
// We can only use const static allocated string for mapped region name, as Android kernel
// uses the string pointer directly when dumping /proc/pid/maps.
prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, ss.ss_sp, ss.ss_size, "thread signal stack");
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, stack_base, PAGE_SIZE, "thread signal stack guard page");
}
}
@@ -140,6 +134,7 @@ static void* __create_thread_mapped_space(size_t mmap_size, size_t stack_guard_s
munmap(space, mmap_size);
return NULL;
}
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, space, stack_guard_size, "thread stack guard page");
return space;
}
@@ -173,6 +168,11 @@ static int __allocate_thread(pthread_attr_t* attr, pthread_internal_t** threadp,
(reinterpret_cast<uintptr_t>(stack_top) - sizeof(pthread_internal_t)) & ~0xf);
pthread_internal_t* thread = reinterpret_cast<pthread_internal_t*>(stack_top);
+ if (mmap_size == 0) {
+ // If thread was not allocated by mmap(), it may not have been cleared to zero.
+ // So assume the worst and zero it.
+ memset(thread, 0, sizeof(pthread_internal_t));
+ }
attr->stack_size = stack_top - reinterpret_cast<uint8_t*>(attr->stack_base);
thread->mmap_size = mmap_size;
@@ -191,8 +191,7 @@ static int __pthread_start(void* arg) {
// notify gdb about this thread before we start doing anything.
// This also provides the memory barrier needed to ensure that all memory
// accesses previously made by the creating thread are visible to us.
- pthread_mutex_lock(&thread->startup_handshake_mutex);
- pthread_mutex_destroy(&thread->startup_handshake_mutex);
+ thread->startup_handshake_lock.lock();
__init_alternate_signal_stack(thread);
@@ -231,14 +230,14 @@ int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr,
return result;
}
- // Create a mutex for the thread in TLS to wait on once it starts so we can keep
+ // Create a lock for the thread to wait on once it starts so we can keep
// it from doing anything until after we notify the debugger about it
//
// This also provides the memory barrier we need to ensure that all
// memory accesses previously performed by this thread are visible to
// the new thread.
- pthread_mutex_init(&thread->startup_handshake_mutex, NULL);
- pthread_mutex_lock(&thread->startup_handshake_mutex);
+ thread->startup_handshake_lock.init(false);
+ thread->startup_handshake_lock.lock();
thread->start_routine = start_routine;
thread->start_routine_arg = arg;
@@ -261,7 +260,7 @@ int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr,
// We don't have to unlock the mutex at all because clone(2) failed so there's no child waiting to
// be unblocked, but we're about to unmap the memory the mutex is stored in, so this serves as a
// reminder that you can't rewrite this function to use a ScopedPthreadMutexLocker.
- pthread_mutex_unlock(&thread->startup_handshake_mutex);
+ thread->startup_handshake_lock.unlock();
if (thread->mmap_size != 0) {
munmap(thread->attr.stack_base, thread->mmap_size);
}
@@ -276,13 +275,13 @@ int pthread_create(pthread_t* thread_out, pthread_attr_t const* attr,
atomic_store(&thread->join_state, THREAD_DETACHED);
__pthread_internal_add(thread);
thread->start_routine = __do_nothing;
- pthread_mutex_unlock(&thread->startup_handshake_mutex);
+ thread->startup_handshake_lock.unlock();
return init_errno;
}
// Publish the pthread_t and unlock the mutex to let the new thread start running.
*thread_out = __pthread_internal_add(thread);
- pthread_mutex_unlock(&thread->startup_handshake_mutex);
+ thread->startup_handshake_lock.unlock();
return 0;
}
diff --git a/libc/bionic/pthread_internal.cpp b/libc/bionic/pthread_internal.cpp
index 1967ccf8c..8946f79af 100644
--- a/libc/bionic/pthread_internal.cpp
+++ b/libc/bionic/pthread_internal.cpp
@@ -81,6 +81,12 @@ void __pthread_internal_remove_and_free(pthread_internal_t* thread) {
pthread_internal_t* __pthread_internal_find(pthread_t thread_id) {
pthread_internal_t* thread = reinterpret_cast<pthread_internal_t*>(thread_id);
+
+ // check if thread is pthread_self() before acquiring the lock
+ if (thread == __get_thread()) {
+ return thread;
+ }
+
ScopedPthreadMutexLocker locker(&g_thread_list_lock);
for (pthread_internal_t* t = g_thread_list; t != NULL; t = t->next) {
diff --git a/libc/bionic/pthread_internal.h b/libc/bionic/pthread_internal.h
index 6a39a214a..e8be4aeac 100644
--- a/libc/bionic/pthread_internal.h
+++ b/libc/bionic/pthread_internal.h
@@ -31,6 +31,7 @@
#include <pthread.h>
#include <stdatomic.h>
+#include "private/bionic_lock.h"
#include "private/bionic_tls.h"
/* Has the thread been detached by a pthread_join or pthread_detach call? */
@@ -39,7 +40,8 @@
/* Has the thread been joined by another thread? */
#define PTHREAD_ATTR_FLAG_JOINED 0x00000002
-struct pthread_key_data_t {
+class pthread_key_data_t {
+ public:
uintptr_t seq; // Use uintptr_t just for alignment, as we use pointer below.
void* data;
};
@@ -51,9 +53,12 @@ enum ThreadJoinState {
THREAD_DETACHED
};
-struct pthread_internal_t {
- struct pthread_internal_t* next;
- struct pthread_internal_t* prev;
+class thread_local_dtor;
+
+class pthread_internal_t {
+ public:
+ class pthread_internal_t* next;
+ class pthread_internal_t* prev;
pid_t tid;
@@ -89,10 +94,12 @@ struct pthread_internal_t {
void* alternate_signal_stack;
- pthread_mutex_t startup_handshake_mutex;
+ Lock startup_handshake_lock;
size_t mmap_size;
+ thread_local_dtor* thread_local_dtors;
+
void* tls[BIONIC_TLS_SLOTS];
pthread_key_data_t key_data[BIONIC_PTHREAD_KEY_COUNT];
diff --git a/libc/bionic/pthread_mutex.cpp b/libc/bionic/pthread_mutex.cpp
index 851fc3d99..7d8e8a820 100644
--- a/libc/bionic/pthread_mutex.cpp
+++ b/libc/bionic/pthread_mutex.cpp
@@ -166,11 +166,14 @@ int pthread_mutexattr_getpshared(const pthread_mutexattr_t* attr, int* pshared)
#define MUTEX_STATE_BITS_LOCKED_UNCONTENDED MUTEX_STATE_TO_BITS(MUTEX_STATE_LOCKED_UNCONTENDED)
#define MUTEX_STATE_BITS_LOCKED_CONTENDED MUTEX_STATE_TO_BITS(MUTEX_STATE_LOCKED_CONTENDED)
-/* return true iff the mutex if locked with no waiters */
-#define MUTEX_STATE_BITS_IS_LOCKED_UNCONTENDED(v) (((v) & MUTEX_STATE_MASK) == MUTEX_STATE_BITS_LOCKED_UNCONTENDED)
+// Return true iff the mutex is unlocked.
+#define MUTEX_STATE_BITS_IS_UNLOCKED(v) (((v) & MUTEX_STATE_MASK) == MUTEX_STATE_BITS_UNLOCKED)
-/* return true iff the mutex if locked with maybe waiters */
-#define MUTEX_STATE_BITS_IS_LOCKED_CONTENDED(v) (((v) & MUTEX_STATE_MASK) == MUTEX_STATE_BITS_LOCKED_CONTENDED)
+// Return true iff the mutex is locked with no waiters.
+#define MUTEX_STATE_BITS_IS_LOCKED_UNCONTENDED(v) (((v) & MUTEX_STATE_MASK) == MUTEX_STATE_BITS_LOCKED_UNCONTENDED)
+
+// return true iff the mutex is locked with maybe waiters.
+#define MUTEX_STATE_BITS_IS_LOCKED_CONTENDED(v) (((v) & MUTEX_STATE_MASK) == MUTEX_STATE_BITS_LOCKED_CONTENDED)
/* used to flip from LOCKED_UNCONTENDED to LOCKED_CONTENDED */
#define MUTEX_STATE_BITS_FLIP_CONTENTION(v) ((v) ^ (MUTEX_STATE_BITS_LOCKED_CONTENDED ^ MUTEX_STATE_BITS_LOCKED_UNCONTENDED))
@@ -296,11 +299,15 @@ static inline __always_inline int __pthread_normal_mutex_trylock(pthread_mutex_i
*/
static inline __always_inline int __pthread_normal_mutex_lock(pthread_mutex_internal_t* mutex,
uint16_t shared,
- const timespec* abs_timeout_or_null,
- clockid_t clock) {
+ bool use_realtime_clock,
+ const timespec* abs_timeout_or_null) {
if (__predict_true(__pthread_normal_mutex_trylock(mutex, shared) == 0)) {
return 0;
}
+ int result = check_timespec(abs_timeout_or_null, true);
+ if (result != 0) {
+ return result;
+ }
ScopedTrace trace("Contending for pthread mutex");
@@ -317,15 +324,8 @@ static inline __always_inline int __pthread_normal_mutex_lock(pthread_mutex_inte
// made by other threads visible to the current CPU.
while (atomic_exchange_explicit(&mutex->state, locked_contended,
memory_order_acquire) != unlocked) {
- timespec ts;
- timespec* rel_timeout = NULL;
- if (abs_timeout_or_null != NULL) {
- rel_timeout = &ts;
- if (!timespec_from_absolute_timespec(*rel_timeout, *abs_timeout_or_null, clock)) {
- return ETIMEDOUT;
- }
- }
- if (__futex_wait_ex(&mutex->state, shared, locked_contended, rel_timeout) == -ETIMEDOUT) {
+ if (__futex_wait_ex(&mutex->state, shared, locked_contended, use_realtime_clock,
+ abs_timeout_or_null) == -ETIMEDOUT) {
return ETIMEDOUT;
}
}
@@ -396,14 +396,15 @@ static inline __always_inline int __recursive_or_errorcheck_mutex_wait(
pthread_mutex_internal_t* mutex,
uint16_t shared,
uint16_t old_state,
- const timespec* rel_timeout) {
+ bool use_realtime_clock,
+ const timespec* abs_timeout) {
// __futex_wait always waits on a 32-bit value. But state is 16-bit. For a normal mutex, the owner_tid
// field in mutex is not used. On 64-bit devices, the __pad field in mutex is not used.
// But when a recursive or errorcheck mutex is used on 32-bit devices, we need to add the
// owner_tid value in the value argument for __futex_wait, otherwise we may always get EAGAIN error.
#if defined(__LP64__)
- return __futex_wait_ex(&mutex->state, shared, old_state, rel_timeout);
+ return __futex_wait_ex(&mutex->state, shared, old_state, use_realtime_clock, abs_timeout);
#else
// This implementation works only when the layout of pthread_mutex_internal_t matches below expectation.
@@ -412,19 +413,21 @@ static inline __always_inline int __recursive_or_errorcheck_mutex_wait(
static_assert(offsetof(pthread_mutex_internal_t, owner_tid) == 2, "");
uint32_t owner_tid = atomic_load_explicit(&mutex->owner_tid, memory_order_relaxed);
- return __futex_wait_ex(&mutex->state, shared, (owner_tid << 16) | old_state, rel_timeout);
+ return __futex_wait_ex(&mutex->state, shared, (owner_tid << 16) | old_state,
+ use_realtime_clock, abs_timeout);
#endif
}
static int __pthread_mutex_lock_with_timeout(pthread_mutex_internal_t* mutex,
- const timespec* abs_timeout_or_null, clockid_t clock) {
+ bool use_realtime_clock,
+ const timespec* abs_timeout_or_null) {
uint16_t old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed);
uint16_t mtype = (old_state & MUTEX_TYPE_MASK);
uint16_t shared = (old_state & MUTEX_SHARED_MASK);
// Handle common case first.
if ( __predict_true(mtype == MUTEX_TYPE_BITS_NORMAL) ) {
- return __pthread_normal_mutex_lock(mutex, shared, abs_timeout_or_null, clock);
+ return __pthread_normal_mutex_lock(mutex, shared, use_realtime_clock, abs_timeout_or_null);
}
// Do we already own this recursive or error-check mutex?
@@ -484,16 +487,13 @@ static int __pthread_mutex_lock_with_timeout(pthread_mutex_internal_t* mutex,
old_state = new_state;
}
- // We are in locked_contended state, sleep until someone wakes us up.
- timespec ts;
- timespec* rel_timeout = NULL;
- if (abs_timeout_or_null != NULL) {
- rel_timeout = &ts;
- if (!timespec_from_absolute_timespec(*rel_timeout, *abs_timeout_or_null, clock)) {
- return ETIMEDOUT;
- }
+ int result = check_timespec(abs_timeout_or_null, true);
+ if (result != 0) {
+ return result;
}
- if (__recursive_or_errorcheck_mutex_wait(mutex, shared, old_state, rel_timeout) == -ETIMEDOUT) {
+ // We are in locked_contended state, sleep until someone wakes us up.
+ if (__recursive_or_errorcheck_mutex_wait(mutex, shared, old_state, use_realtime_clock,
+ abs_timeout_or_null) == -ETIMEDOUT) {
return ETIMEDOUT;
}
old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed);
@@ -518,7 +518,7 @@ int pthread_mutex_lock(pthread_mutex_t* mutex_interface) {
return 0;
}
}
- return __pthread_mutex_lock_with_timeout(mutex, NULL, 0);
+ return __pthread_mutex_lock_with_timeout(mutex, false, nullptr);
}
int pthread_mutex_unlock(pthread_mutex_t* mutex_interface) {
@@ -613,17 +613,12 @@ int pthread_mutex_trylock(pthread_mutex_t* mutex_interface) {
#if !defined(__LP64__)
extern "C" int pthread_mutex_lock_timeout_np(pthread_mutex_t* mutex_interface, unsigned ms) {
+ timespec ts;
+ timespec_from_ms(ts, ms);
timespec abs_timeout;
- clock_gettime(CLOCK_MONOTONIC, &abs_timeout);
- abs_timeout.tv_sec += ms / 1000;
- abs_timeout.tv_nsec += (ms % 1000) * 1000000;
- if (abs_timeout.tv_nsec >= NS_PER_S) {
- abs_timeout.tv_sec++;
- abs_timeout.tv_nsec -= NS_PER_S;
- }
-
+ absolute_timespec_from_timespec(abs_timeout, ts, CLOCK_MONOTONIC);
int error = __pthread_mutex_lock_with_timeout(__get_internal_mutex(mutex_interface),
- &abs_timeout, CLOCK_MONOTONIC);
+ false, &abs_timeout);
if (error == ETIMEDOUT) {
error = EBUSY;
}
@@ -633,14 +628,18 @@ extern "C" int pthread_mutex_lock_timeout_np(pthread_mutex_t* mutex_interface, u
int pthread_mutex_timedlock(pthread_mutex_t* mutex_interface, const timespec* abs_timeout) {
return __pthread_mutex_lock_with_timeout(__get_internal_mutex(mutex_interface),
- abs_timeout, CLOCK_REALTIME);
+ true, abs_timeout);
}
int pthread_mutex_destroy(pthread_mutex_t* mutex_interface) {
- // Use trylock to ensure that the mutex is valid and not already locked.
- int error = pthread_mutex_trylock(mutex_interface);
- if (error != 0) {
- return error;
+ pthread_mutex_internal_t* mutex = __get_internal_mutex(mutex_interface);
+ uint16_t old_state = atomic_load_explicit(&mutex->state, memory_order_relaxed);
+ // Store 0xffff to make the mutex unusable. Although POSIX standard says it is undefined
+ // behavior to destroy a locked mutex, we prefer not to change mutex->state in that situation.
+ if (MUTEX_STATE_BITS_IS_UNLOCKED(old_state) &&
+ atomic_compare_exchange_strong_explicit(&mutex->state, &old_state, 0xffff,
+ memory_order_relaxed, memory_order_relaxed)) {
+ return 0;
}
- return 0;
+ return EBUSY;
}
diff --git a/libc/bionic/pthread_once.cpp b/libc/bionic/pthread_once.cpp
index 7688a23c4..f48eadcd3 100644
--- a/libc/bionic/pthread_once.cpp
+++ b/libc/bionic/pthread_once.cpp
@@ -79,7 +79,7 @@ int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)) {
}
// The initialization is underway, wait for its finish.
- __futex_wait_ex(once_control_ptr, 0, old_value, NULL);
+ __futex_wait_ex(once_control_ptr, 0, old_value, false, nullptr);
old_value = atomic_load_explicit(once_control_ptr, memory_order_acquire);
}
}
diff --git a/libc/bionic/pthread_rwlock.cpp b/libc/bionic/pthread_rwlock.cpp
index 934210eb4..a0652953d 100644
--- a/libc/bionic/pthread_rwlock.cpp
+++ b/libc/bionic/pthread_rwlock.cpp
@@ -294,9 +294,13 @@ static int __pthread_rwlock_timedrdlock(pthread_rwlock_internal_t* rwlock,
}
while (true) {
- int ret = __pthread_rwlock_tryrdlock(rwlock);
- if (ret == 0 || ret == EAGAIN) {
- return ret;
+ int result = __pthread_rwlock_tryrdlock(rwlock);
+ if (result == 0 || result == EAGAIN) {
+ return result;
+ }
+ result = check_timespec(abs_timeout_or_null, true);
+ if (result != 0) {
+ return result;
}
int old_state = atomic_load_explicit(&rwlock->state, memory_order_relaxed);
@@ -304,16 +308,6 @@ static int __pthread_rwlock_timedrdlock(pthread_rwlock_internal_t* rwlock,
continue;
}
- timespec ts;
- timespec* rel_timeout = NULL;
-
- if (abs_timeout_or_null != NULL) {
- rel_timeout = &ts;
- if (!timespec_from_absolute_timespec(*rel_timeout, *abs_timeout_or_null, CLOCK_REALTIME)) {
- return ETIMEDOUT;
- }
- }
-
rwlock->pending_lock.lock();
rwlock->pending_reader_count++;
@@ -327,10 +321,10 @@ static int __pthread_rwlock_timedrdlock(pthread_rwlock_internal_t* rwlock,
int old_serial = rwlock->pending_reader_wakeup_serial;
rwlock->pending_lock.unlock();
- int futex_ret = 0;
+ int futex_result = 0;
if (!__can_acquire_read_lock(old_state, rwlock->writer_nonrecursive_preferred)) {
- futex_ret = __futex_wait_ex(&rwlock->pending_reader_wakeup_serial, rwlock->pshared,
- old_serial, rel_timeout);
+ futex_result = __futex_wait_ex(&rwlock->pending_reader_wakeup_serial, rwlock->pshared,
+ old_serial, true, abs_timeout_or_null);
}
rwlock->pending_lock.lock();
@@ -341,7 +335,7 @@ static int __pthread_rwlock_timedrdlock(pthread_rwlock_internal_t* rwlock,
}
rwlock->pending_lock.unlock();
- if (futex_ret == -ETIMEDOUT) {
+ if (futex_result == -ETIMEDOUT) {
return ETIMEDOUT;
}
}
@@ -372,9 +366,13 @@ static int __pthread_rwlock_timedwrlock(pthread_rwlock_internal_t* rwlock,
return EDEADLK;
}
while (true) {
- int ret = __pthread_rwlock_trywrlock(rwlock);
- if (ret == 0) {
- return ret;
+ int result = __pthread_rwlock_trywrlock(rwlock);
+ if (result == 0) {
+ return result;
+ }
+ result = check_timespec(abs_timeout_or_null, true);
+ if (result != 0) {
+ return result;
}
int old_state = atomic_load_explicit(&rwlock->state, memory_order_relaxed);
@@ -382,16 +380,6 @@ static int __pthread_rwlock_timedwrlock(pthread_rwlock_internal_t* rwlock,
continue;
}
- timespec ts;
- timespec* rel_timeout = NULL;
-
- if (abs_timeout_or_null != NULL) {
- rel_timeout = &ts;
- if (!timespec_from_absolute_timespec(*rel_timeout, *abs_timeout_or_null, CLOCK_REALTIME)) {
- return ETIMEDOUT;
- }
- }
-
rwlock->pending_lock.lock();
rwlock->pending_writer_count++;
@@ -401,10 +389,10 @@ static int __pthread_rwlock_timedwrlock(pthread_rwlock_internal_t* rwlock,
int old_serial = rwlock->pending_writer_wakeup_serial;
rwlock->pending_lock.unlock();
- int futex_ret = 0;
+ int futex_result = 0;
if (!__can_acquire_write_lock(old_state)) {
- futex_ret = __futex_wait_ex(&rwlock->pending_writer_wakeup_serial, rwlock->pshared,
- old_serial, rel_timeout);
+ futex_result = __futex_wait_ex(&rwlock->pending_writer_wakeup_serial, rwlock->pshared,
+ old_serial, true, abs_timeout_or_null);
}
rwlock->pending_lock.lock();
@@ -415,7 +403,7 @@ static int __pthread_rwlock_timedwrlock(pthread_rwlock_internal_t* rwlock,
}
rwlock->pending_lock.unlock();
- if (futex_ret == -ETIMEDOUT) {
+ if (futex_result == -ETIMEDOUT) {
return ETIMEDOUT;
}
}
@@ -427,7 +415,7 @@ int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock_interface) {
if (__predict_true(__pthread_rwlock_tryrdlock(rwlock) == 0)) {
return 0;
}
- return __pthread_rwlock_timedrdlock(rwlock, NULL);
+ return __pthread_rwlock_timedrdlock(rwlock, nullptr);
}
int pthread_rwlock_timedrdlock(pthread_rwlock_t* rwlock_interface, const timespec* abs_timeout) {
@@ -446,7 +434,7 @@ int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock_interface) {
if (__predict_true(__pthread_rwlock_trywrlock(rwlock) == 0)) {
return 0;
}
- return __pthread_rwlock_timedwrlock(rwlock, NULL);
+ return __pthread_rwlock_timedwrlock(rwlock, nullptr);
}
int pthread_rwlock_timedwrlock(pthread_rwlock_t* rwlock_interface, const timespec* abs_timeout) {
diff --git a/libc/bionic/pthread_spinlock.cpp b/libc/bionic/pthread_spinlock.cpp
new file mode 100644
index 000000000..f26f28303
--- /dev/null
+++ b/libc/bionic/pthread_spinlock.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#include <pthread.h>
+
+#include "private/bionic_lock.h"
+
+// User-level spinlocks can be hazardous to battery life on Android.
+// We implement a simple compromise that behaves mostly like a spinlock,
+// but prevents excessively long spinning.
+
+struct pthread_spinlock_internal_t {
+ Lock lock;
+};
+
+static_assert(sizeof(pthread_spinlock_t) == sizeof(pthread_spinlock_internal_t),
+ "pthread_spinlock_t should actually be pthread_spinlock_internal_t.");
+
+static_assert(alignof(pthread_spinlock_t) >= 4,
+ "pthread_spinlock_t should fulfill the alignment of pthread_spinlock_internal_t.");
+
+static inline pthread_spinlock_internal_t* __get_internal_spinlock(pthread_spinlock_t* lock) {
+ return reinterpret_cast<pthread_spinlock_internal_t*>(lock);
+}
+
+int pthread_spin_init(pthread_spinlock_t* lock_interface, int pshared) {
+ pthread_spinlock_internal_t* lock = __get_internal_spinlock(lock_interface);
+ lock->lock.init(pshared);
+ return 0;
+}
+
+int pthread_spin_destroy(pthread_spinlock_t* lock_interface) {
+ pthread_spinlock_internal_t* lock = __get_internal_spinlock(lock_interface);
+ return lock->lock.trylock() ? 0 : EBUSY;
+}
+
+int pthread_spin_trylock(pthread_spinlock_t* lock_interface) {
+ pthread_spinlock_internal_t* lock = __get_internal_spinlock(lock_interface);
+ return lock->lock.trylock() ? 0 : EBUSY;
+}
+
+int pthread_spin_lock(pthread_spinlock_t* lock_interface) {
+ pthread_spinlock_internal_t* lock = __get_internal_spinlock(lock_interface);
+ for (int i = 0; i < 10000; ++i) {
+ if (lock->lock.trylock()) {
+ return 0;
+ }
+ }
+ lock->lock.lock();
+ return 0;
+}
+
+int pthread_spin_unlock(pthread_spinlock_t* lock_interface) {
+ pthread_spinlock_internal_t* lock = __get_internal_spinlock(lock_interface);
+ lock->lock.unlock();
+ return 0;
+}
diff --git a/libc/bionic/pty.cpp b/libc/bionic/pty.cpp
index 1a3784753..d699ff550 100644
--- a/libc/bionic/pty.cpp
+++ b/libc/bionic/pty.cpp
@@ -151,22 +151,24 @@ int openpty(int* master, int* slave, char* name, const termios* t, const winsize
return 0;
}
-int forkpty(int* master, char* name, const termios* t, const winsize* ws) {
+int forkpty(int* amaster, char* name, const termios* t, const winsize* ws) {
+ int master;
int slave;
- if (openpty(master, &slave, name, t, ws) == -1) {
+ if (openpty(&master, &slave, name, t, ws) == -1) {
return -1;
}
pid_t pid = fork();
if (pid == -1) {
- close(*master);
+ close(master);
close(slave);
return -1;
}
if (pid == 0) {
// Child.
- close(*master);
+ *amaster = -1;
+ close(master);
if (login_tty(slave) == -1) {
_exit(1);
}
@@ -174,6 +176,7 @@ int forkpty(int* master, char* name, const termios* t, const winsize* ws) {
}
// Parent.
+ *amaster = master;
close(slave);
return pid;
}
diff --git a/libc/bionic/scandir.cpp b/libc/bionic/scandir.cpp
index ee62feee4..e55be4209 100644
--- a/libc/bionic/scandir.cpp
+++ b/libc/bionic/scandir.cpp
@@ -16,9 +16,11 @@
#include <dirent.h>
+#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
#include "private/bionic_macros.h"
#include "private/ScopedReaddir.h"
@@ -26,7 +28,7 @@
// A smart pointer to the scandir dirent**.
class ScandirResult {
public:
- ScandirResult() : names_(NULL), size_(0), capacity_(0) {
+ ScandirResult() : names_(nullptr), size_(0), capacity_(0) {
}
~ScandirResult() {
@@ -42,7 +44,7 @@ class ScandirResult {
dirent** release() {
dirent** result = names_;
- names_ = NULL;
+ names_ = nullptr;
size_ = capacity_ = 0;
return result;
}
@@ -52,7 +54,7 @@ class ScandirResult {
size_t new_capacity = capacity_ + 32;
dirent** new_names =
reinterpret_cast<dirent**>(realloc(names_, new_capacity * sizeof(dirent*)));
- if (new_names == NULL) {
+ if (new_names == nullptr) {
return false;
}
names_ = new_names;
@@ -60,7 +62,7 @@ class ScandirResult {
}
dirent* copy = CopyDirent(entry);
- if (copy == NULL) {
+ if (copy == nullptr) {
return false;
}
names_[size_++] = copy;
@@ -69,7 +71,7 @@ class ScandirResult {
void Sort(int (*comparator)(const dirent**, const dirent**)) {
// If we have entries and a comparator, sort them.
- if (size_ > 0 && comparator != NULL) {
+ if (size_ > 0 && comparator != nullptr) {
qsort(names_, size_, sizeof(dirent*),
reinterpret_cast<int (*)(const void*, const void*)>(comparator));
}
@@ -91,19 +93,29 @@ class ScandirResult {
DISALLOW_COPY_AND_ASSIGN(ScandirResult);
};
-int scandir(const char* dirname, dirent*** name_list,
- int (*filter)(const dirent*),
- int (*comparator)(const dirent**, const dirent**)) {
- ScopedReaddir reader(dirname);
+int scandirat(int parent_fd, const char* dir_name, dirent*** name_list,
+ int (*filter)(const dirent*),
+ int (*comparator)(const dirent**, const dirent**)) {
+ DIR* dir = nullptr;
+ if (parent_fd == AT_FDCWD) {
+ dir = opendir(dir_name);
+ } else {
+ int dir_fd = openat(parent_fd, dir_name, O_CLOEXEC | O_DIRECTORY | O_RDONLY);
+ if (dir_fd != -1) {
+ dir = fdopendir(dir_fd);
+ }
+ }
+
+ ScopedReaddir reader(dir);
if (reader.IsBad()) {
return -1;
}
ScandirResult names;
dirent* entry;
- while ((entry = reader.ReadEntry()) != NULL) {
+ while ((entry = reader.ReadEntry()) != nullptr) {
// If we have a filter, skip names that don't match.
- if (filter != NULL && !(*filter)(entry)) {
+ if (filter != nullptr && !(*filter)(entry)) {
continue;
}
names.Add(entry);
@@ -115,4 +127,11 @@ int scandir(const char* dirname, dirent*** name_list,
*name_list = names.release();
return size;
}
+__strong_alias(scandirat64, scandirat);
+
+int scandir(const char* dir_path, dirent*** name_list,
+ int (*filter)(const dirent*),
+ int (*comparator)(const dirent**, const dirent**)) {
+ return scandirat(AT_FDCWD, dir_path, name_list, filter, comparator);
+}
__strong_alias(scandir64, scandir);
diff --git a/libc/bionic/semaphore.cpp b/libc/bionic/semaphore.cpp
index 0b046509d..19816470f 100644
--- a/libc/bionic/semaphore.cpp
+++ b/libc/bionic/semaphore.cpp
@@ -41,6 +41,7 @@
#include "private/bionic_constants.h"
#include "private/bionic_futex.h"
+#include "private/bionic_sdk_version.h"
#include "private/bionic_time_conversions.h"
// In this implementation, a semaphore contains a
@@ -80,7 +81,7 @@ static inline int SEMCOUNT_TO_VALUE(unsigned int sval) {
#define SEMCOUNT_ONE SEMCOUNT_FROM_VALUE(1)
// The value -1 as a sem->count bit-pattern.
-#define SEMCOUNT_MINUS_ONE SEMCOUNT_FROM_VALUE(-1)
+#define SEMCOUNT_MINUS_ONE SEMCOUNT_FROM_VALUE(~0U)
#define SEMCOUNT_DECREMENT(sval) (((sval) - (1U << SEMCOUNT_VALUE_SHIFT)) & SEMCOUNT_VALUE_MASK)
#define SEMCOUNT_INCREMENT(sval) (((sval) + (1U << SEMCOUNT_VALUE_SHIFT)) & SEMCOUNT_VALUE_MASK)
@@ -220,7 +221,13 @@ int sem_wait(sem_t* sem) {
return 0;
}
- __futex_wait_ex(sem_count_ptr, shared, shared | SEMCOUNT_MINUS_ONE, NULL);
+ int result = __futex_wait_ex(sem_count_ptr, shared, shared | SEMCOUNT_MINUS_ONE, false, nullptr);
+ if (bionic_get_application_target_sdk_version() > 23) {
+ if (result ==-EINTR) {
+ errno = EINTR;
+ return -1;
+ }
+ }
}
}
@@ -235,36 +242,29 @@ int sem_timedwait(sem_t* sem, const timespec* abs_timeout) {
}
// Check it as per POSIX.
- if (abs_timeout == NULL || abs_timeout->tv_sec < 0 || abs_timeout->tv_nsec < 0 || abs_timeout->tv_nsec >= NS_PER_S) {
- errno = EINVAL;
+ int result = check_timespec(abs_timeout, false);
+ if (result != 0) {
+ errno = result;
return -1;
}
unsigned int shared = SEM_GET_SHARED(sem_count_ptr);
while (true) {
- // POSIX mandates CLOCK_REALTIME here.
- timespec ts;
- if (!timespec_from_absolute_timespec(ts, *abs_timeout, CLOCK_REALTIME)) {
- errno = ETIMEDOUT;
- return -1;
- }
-
// Try to grab the semaphore. If the value was 0, this will also change it to -1.
if (__sem_dec(sem_count_ptr) > 0) {
- break;
+ return 0;
}
// Contention detected. Wait for a wakeup event.
- int ret = __futex_wait_ex(sem_count_ptr, shared, shared | SEMCOUNT_MINUS_ONE, &ts);
+ int result = __futex_wait_ex(sem_count_ptr, shared, shared | SEMCOUNT_MINUS_ONE, true, abs_timeout);
// Return in case of timeout or interrupt.
- if (ret == -ETIMEDOUT || ret == -EINTR) {
- errno = -ret;
+ if (result == -ETIMEDOUT || result == -EINTR) {
+ errno = -result;
return -1;
}
}
- return 0;
}
int sem_post(sem_t* sem) {
diff --git a/libc/bionic/setjmp_cookie.cpp b/libc/bionic/setjmp_cookie.cpp
new file mode 100644
index 000000000..3be675aab
--- /dev/null
+++ b/libc/bionic/setjmp_cookie.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/auxv.h>
+#include <sys/cdefs.h>
+
+#include "private/bionic_globals.h"
+#include "private/libc_logging.h"
+#include "private/KernelArgumentBlock.h"
+
+void __libc_init_setjmp_cookie(libc_globals* globals,
+ KernelArgumentBlock& args) {
+ char* random_data = reinterpret_cast<char*>(args.getauxval(AT_RANDOM));
+ long value = *reinterpret_cast<long*>(random_data + 8);
+
+ // Mask off the last bit to store the signal flag.
+ globals->setjmp_cookie = value & ~1;
+}
+
+extern "C" __LIBC_HIDDEN__ long __bionic_setjmp_cookie_get(long sigflag) {
+ if (sigflag & ~1) {
+ __libc_fatal("unexpected sigflag value: %ld", sigflag);
+ }
+
+ return __libc_globals->setjmp_cookie | sigflag;
+}
+
+// Aborts if cookie doesn't match, returns the signal flag otherwise.
+extern "C" __LIBC_HIDDEN__ long __bionic_setjmp_cookie_check(long cookie) {
+ if (__libc_globals->setjmp_cookie != (cookie & ~1)) {
+ __libc_fatal("setjmp cookie mismatch");
+ }
+
+ return cookie & 1;
+}
+
+extern "C" __LIBC_HIDDEN__ long __bionic_setjmp_checksum_mismatch() {
+ __libc_fatal("setjmp checksum mismatch");
+}
diff --git a/libc/bionic/signal.cpp b/libc/bionic/signal.cpp
index 74a2f6577..13d188257 100644
--- a/libc/bionic/signal.cpp
+++ b/libc/bionic/signal.cpp
@@ -28,12 +28,7 @@
#include <signal.h>
-#ifdef __LP64__
-static
-#else
-__LIBC_HIDDEN__
-#endif
-sighandler_t _signal(int signum, sighandler_t handler, int flags) {
+__LIBC_HIDDEN__ sighandler_t _signal(int signum, sighandler_t handler, int flags) {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_handler = handler;
diff --git a/libc/bionic/strchrnul.cpp b/libc/bionic/strchrnul.cpp
new file mode 100644
index 000000000..55422e06d
--- /dev/null
+++ b/libc/bionic/strchrnul.cpp
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+extern "C" const char* strchrnul(const char* s, int ch) {
+ while (*s && *s != ch) {
+ ++s;
+ }
+ return s;
+}
diff --git a/libc/bionic/stubs.cpp b/libc/bionic/stubs.cpp
index b57aedab4..374d01501 100644
--- a/libc/bionic/stubs.cpp
+++ b/libc/bionic/stubs.cpp
@@ -39,6 +39,7 @@
#include <unistd.h>
#include "private/android_filesystem_config.h"
+#include "private/bionic_macros.h"
#include "private/ErrnoRestorer.h"
#include "private/libc_logging.h"
#include "private/ThreadLocalBuffer.h"
@@ -66,11 +67,15 @@ struct passwd_state_t {
static ThreadLocalBuffer<group_state_t> g_group_tls_buffer;
static ThreadLocalBuffer<passwd_state_t> g_passwd_tls_buffer;
+static void init_group_state(group_state_t* state) {
+ memset(state, 0, sizeof(group_state_t));
+ state->group_.gr_mem = state->group_members_;
+}
+
static group_state_t* __group_state() {
group_state_t* result = g_group_tls_buffer.get();
if (result != nullptr) {
- memset(result, 0, sizeof(group_state_t));
- result->group_.gr_mem = result->group_members_;
+ init_group_state(result);
}
return result;
}
@@ -111,6 +116,7 @@ static int do_getpw_r(int by_name, const char* name, uid_t uid,
snprintf(buf, byte_count, "%s%c%s%c%s", src->pw_name, 0, src->pw_dir, 0, src->pw_shell);
// pw_passwd and pw_gecos are non-POSIX and unused (always NULL) in bionic.
+ // Note: On LP32, we define pw_gecos to pw_passwd since they're both NULL.
dst->pw_passwd = NULL;
#if defined(__LP64__)
dst->pw_gecos = NULL;
@@ -201,7 +207,7 @@ static group* android_name_to_group(group_state_t* state, const char* name) {
// u0_a1234 -> 0 * AID_USER + AID_APP + 1234
// u2_i1000 -> 2 * AID_USER + AID_ISOLATED_START + 1000
// u1_system -> 1 * AID_USER + android_ids['system']
-// returns 0 and sets errno to ENOENT in case of error
+// returns 0 and sets errno to ENOENT in case of error.
static id_t app_id_from_name(const char* name, bool is_group) {
char* end;
unsigned long userid;
@@ -307,6 +313,54 @@ static void print_app_name_from_gid(const gid_t gid, char* buffer, const int buf
}
}
+// Translate an OEM name to the corresponding user/group id.
+// oem_XXX -> AID_OEM_RESERVED_2_START + XXX, iff XXX is within range.
+static id_t oem_id_from_name(const char* name) {
+ unsigned int id;
+ if (sscanf(name, "oem_%u", &id) != 1) {
+ return 0;
+ }
+ // Check OEM id is within range.
+ if (id > (AID_OEM_RESERVED_2_END - AID_OEM_RESERVED_2_START)) {
+ return 0;
+ }
+ return AID_OEM_RESERVED_2_START + static_cast<id_t>(id);
+}
+
+static passwd* oem_id_to_passwd(uid_t uid, passwd_state_t* state) {
+ if (uid < AID_OEM_RESERVED_2_START || uid > AID_OEM_RESERVED_2_END) {
+ return NULL;
+ }
+
+ snprintf(state->name_buffer_, sizeof(state->name_buffer_), "oem_%u",
+ uid - AID_OEM_RESERVED_2_START);
+ snprintf(state->dir_buffer_, sizeof(state->dir_buffer_), "/");
+ snprintf(state->sh_buffer_, sizeof(state->sh_buffer_), "/system/bin/sh");
+
+ passwd* pw = &state->passwd_;
+ pw->pw_name = state->name_buffer_;
+ pw->pw_dir = state->dir_buffer_;
+ pw->pw_shell = state->sh_buffer_;
+ pw->pw_uid = uid;
+ pw->pw_gid = uid;
+ return pw;
+}
+
+static group* oem_id_to_group(gid_t gid, group_state_t* state) {
+ if (gid < AID_OEM_RESERVED_2_START || gid > AID_OEM_RESERVED_2_END) {
+ return NULL;
+ }
+
+ snprintf(state->group_name_buffer_, sizeof(state->group_name_buffer_),
+ "oem_%u", gid - AID_OEM_RESERVED_2_START);
+
+ group* gr = &state->group_;
+ gr->gr_name = state->group_name_buffer_;
+ gr->gr_gid = gid;
+ gr->gr_mem[0] = gr->gr_name;
+ return gr;
+}
+
// Translate a uid into the corresponding name.
// 0 to AID_APP-1 -> "system", "radio", etc.
// AID_APP to AID_ISOLATED_START-1 -> u0_a1234
@@ -366,6 +420,11 @@ passwd* getpwuid(uid_t uid) { // NOLINT: implementing bad function.
if (pw != NULL) {
return pw;
}
+ // Handle OEM range.
+ pw = oem_id_to_passwd(uid, state);
+ if (pw != NULL) {
+ return pw;
+ }
return app_id_to_passwd(uid, state);
}
@@ -379,6 +438,11 @@ passwd* getpwnam(const char* login) { // NOLINT: implementing bad function.
if (pw != NULL) {
return pw;
}
+ // Handle OEM range.
+ pw = oem_id_to_passwd(oem_id_from_name(login), state);
+ if (pw != NULL) {
+ return pw;
+ }
return app_id_to_passwd(app_id_from_name(login, false), state);
}
@@ -397,17 +461,38 @@ char* getlogin() { // NOLINT: implementing bad function.
return (pw != NULL) ? pw->pw_name : NULL;
}
+static group* getgrgid_internal(gid_t gid, group_state_t* state) {
+ group* grp = android_id_to_group(state, gid);
+ if (grp != NULL) {
+ return grp;
+ }
+ // Handle OEM range.
+ grp = oem_id_to_group(gid, state);
+ if (grp != NULL) {
+ return grp;
+ }
+ return app_id_to_group(gid, state);
+}
+
group* getgrgid(gid_t gid) { // NOLINT: implementing bad function.
group_state_t* state = __group_state();
if (state == NULL) {
return NULL;
}
+ return getgrgid_internal(gid, state);
+}
- group* gr = android_id_to_group(state, gid);
- if (gr != NULL) {
- return gr;
+static group* getgrnam_internal(const char* name, group_state_t* state) {
+ group* grp = android_name_to_group(state, name);
+ if (grp != NULL) {
+ return grp;
}
- return app_id_to_group(gid, state);
+ // Handle OEM range.
+ grp = oem_id_to_group(oem_id_from_name(name), state);
+ if (grp != NULL) {
+ return grp;
+ }
+ return app_id_to_group(app_id_from_name(name, true), state);
}
group* getgrnam(const char* name) { // NOLINT: implementing bad function.
@@ -415,11 +500,36 @@ group* getgrnam(const char* name) { // NOLINT: implementing bad function.
if (state == NULL) {
return NULL;
}
+ return getgrnam_internal(name, state);
+}
- if (android_name_to_group(state, name) != 0) {
- return &state->group_;
+static int getgroup_r(bool by_name, const char* name, gid_t gid, struct group* grp, char* buf,
+ size_t buflen, struct group** result) {
+ ErrnoRestorer errno_restorer;
+ *result = NULL;
+ char* p = reinterpret_cast<char*>(
+ BIONIC_ALIGN(reinterpret_cast<uintptr_t>(buf), sizeof(uintptr_t)));
+ if (p + sizeof(group_state_t) > buf + buflen) {
+ return ERANGE;
}
- return app_id_to_group(app_id_from_name(name, true), state);
+ group_state_t* state = reinterpret_cast<group_state_t*>(p);
+ init_group_state(state);
+ group* retval = (by_name ? getgrnam_internal(name, state) : getgrgid_internal(gid, state));
+ if (retval != NULL) {
+ *grp = *retval;
+ *result = grp;
+ return 0;
+ }
+ return errno;
+}
+
+int getgrgid_r(gid_t gid, struct group* grp, char* buf, size_t buflen, struct group** result) {
+ return getgroup_r(false, NULL, gid, grp, buf, buflen, result);
+}
+
+int getgrnam_r(const char* name, struct group* grp, char* buf, size_t buflen,
+ struct group **result) {
+ return getgroup_r(true, name, 0, grp, buf, buflen, result);
}
// We don't have an /etc/networks, so all inputs return NULL.
diff --git a/libc/bionic/sysconf.cpp b/libc/bionic/sysconf.cpp
index c301b27b3..125b3c92f 100644
--- a/libc/bionic/sysconf.cpp
+++ b/libc/bionic/sysconf.cpp
@@ -41,16 +41,6 @@
#include "private/bionic_tls.h"
-static int __sysconf_monotonic_clock() {
- timespec t;
- int rc = clock_getres(CLOCK_MONOTONIC, &t);
- return (rc == -1) ? -1 : _POSIX_VERSION;
-}
-
-static bool __sysconf_has_clock(clockid_t clock_id) {
- return clock_getres(clock_id, NULL) == 0;
-}
-
static long __sysconf_rlimit(int resource) {
rlimit rl;
getrlimit(resource, &rl);
@@ -97,8 +87,11 @@ long sysconf(int name) {
case _SC_ATEXIT_MAX: return LONG_MAX; // Unlimited.
case _SC_IOV_MAX: return UIO_MAXIOV;
- case _SC_PAGESIZE: // Fall through, PAGESIZE and PAGE_SIZE always hold the same value.
- case _SC_PAGE_SIZE: return PAGE_SIZE;
+ // _SC_PAGESIZE and _SC_PAGE_SIZE are distinct, but return the same value.
+ case _SC_PAGESIZE:
+ case _SC_PAGE_SIZE:
+ return static_cast<long>(getauxval(AT_PAGESZ));
+
case _SC_XOPEN_UNIX: return _XOPEN_UNIX;
case _SC_AIO_LISTIO_MAX: return _POSIX_AIO_LISTIO_MAX; // Minimum requirement.
case _SC_AIO_MAX: return _POSIX_AIO_MAX; // Minimum requirement.
@@ -144,7 +137,7 @@ long sysconf(int name) {
case _SC_NPROCESSORS_ONLN: return get_nprocs();
case _SC_PHYS_PAGES: return get_phys_pages();
case _SC_AVPHYS_PAGES: return get_avphys_pages();
- case _SC_MONOTONIC_CLOCK: return __sysconf_monotonic_clock();
+ case _SC_MONOTONIC_CLOCK: return _POSIX_VERSION;
case _SC_2_PBS: return -1; // Obsolescent in POSIX.1-2008.
case _SC_2_PBS_ACCOUNTING: return -1; // Obsolescent in POSIX.1-2008.
@@ -155,8 +148,7 @@ long sysconf(int name) {
case _SC_ADVISORY_INFO: return _POSIX_ADVISORY_INFO;
case _SC_BARRIERS: return _POSIX_BARRIERS;
case _SC_CLOCK_SELECTION: return _POSIX_CLOCK_SELECTION;
- case _SC_CPUTIME:
- return __sysconf_has_clock(CLOCK_PROCESS_CPUTIME_ID) ?_POSIX_VERSION : -1;
+ case _SC_CPUTIME: return _POSIX_VERSION;
case _SC_HOST_NAME_MAX: return _POSIX_HOST_NAME_MAX; // Minimum requirement.
case _SC_IPV6: return _POSIX_IPV6;
@@ -169,8 +161,7 @@ long sysconf(int name) {
case _SC_SPORADIC_SERVER: return _POSIX_SPORADIC_SERVER;
case _SC_SS_REPL_MAX: return -1;
case _SC_SYMLOOP_MAX: return _POSIX_SYMLOOP_MAX; // Minimum requirement.
- case _SC_THREAD_CPUTIME:
- return __sysconf_has_clock(CLOCK_THREAD_CPUTIME_ID) ? _POSIX_VERSION : -1;
+ case _SC_THREAD_CPUTIME: return _POSIX_VERSION;
case _SC_THREAD_PROCESS_SHARED: return _POSIX_THREAD_PROCESS_SHARED;
case _SC_THREAD_ROBUST_PRIO_INHERIT: return _POSIX_THREAD_ROBUST_PRIO_INHERIT;
diff --git a/libc/bionic/sysinfo.cpp b/libc/bionic/sysinfo.cpp
index 82cb76a84..1cb5c79ea 100644
--- a/libc/bionic/sysinfo.cpp
+++ b/libc/bionic/sysinfo.cpp
@@ -29,10 +29,11 @@
#include <sys/sysinfo.h>
#include <dirent.h>
-#include <limits.h>
#include <stdio.h>
#include <string.h>
+#include <unistd.h>
+#include "private/get_cpu_count_from_string.h"
#include "private/ScopedReaddir.h"
static bool __matches_cpuN(const char* s) {
@@ -61,26 +62,18 @@ int get_nprocs_conf() {
}
int get_nprocs() {
- FILE* fp = fopen("/proc/stat", "re");
- if (fp == NULL) {
- return 1;
- }
-
- int result = 0;
- char buf[256];
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- // Extract just the first word from the line.
- // 'cpu0 7976751 1364388 3116842 469770388 8629405 0 49047 0 0 0'
- char* p = strchr(buf, ' ');
- if (p != NULL) {
- *p = 0;
- }
- if (__matches_cpuN(buf)) {
- ++result;
+ int cpu_count = 1;
+ FILE* fp = fopen("/sys/devices/system/cpu/online", "re");
+ if (fp != nullptr) {
+ char* line = nullptr;
+ size_t len = 0;
+ if (getline(&line, &len, fp) != -1) {
+ cpu_count = GetCpuCountFromString(line);
+ free(line);
}
+ fclose(fp);
}
- fclose(fp);
- return result;
+ return cpu_count;
}
static int __get_meminfo_page_count(const char* pattern) {
@@ -94,7 +87,7 @@ static int __get_meminfo_page_count(const char* pattern) {
while (fgets(buf, sizeof(buf), fp) != NULL) {
long total;
if (sscanf(buf, pattern, &total) == 1) {
- page_count = static_cast<int>(total / (PAGE_SIZE / 1024));
+ page_count = static_cast<int>(total / (sysconf(_SC_PAGE_SIZE) / 1024));
break;
}
}
diff --git a/libc/bionic/system_properties.cpp b/libc/bionic/system_properties.cpp
index c436a16c6..9c992da52 100644
--- a/libc/bionic/system_properties.cpp
+++ b/libc/bionic/system_properties.cpp
@@ -25,34 +25,38 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
-#include <new>
-#include <stdatomic.h>
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stddef.h>
+#include <ctype.h>
#include <errno.h>
-#include <poll.h>
#include <fcntl.h>
+#include <poll.h>
+#include <stdatomic.h>
#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
+#include <new>
+#include <linux/xattr.h>
+#include <netinet/in.h>
#include <sys/mman.h>
-
-#include <sys/socket.h>
-#include <sys/un.h>
#include <sys/select.h>
+#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
-#include <netinet/in.h>
+#include <sys/un.h>
+#include <sys/xattr.h>
#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
#include <sys/_system_properties.h>
#include <sys/system_properties.h>
#include "private/bionic_futex.h"
+#include "private/bionic_lock.h"
#include "private/bionic_macros.h"
+#include "private/libc_logging.h"
static const char property_service_socket[] = "/dev/socket/" PROP_SERVICE_NAME;
@@ -112,23 +116,57 @@ private:
DISALLOW_COPY_AND_ASSIGN(prop_bt);
};
-struct prop_area {
- uint32_t bytes_used;
- atomic_uint_least32_t serial;
- uint32_t magic;
- uint32_t version;
- uint32_t reserved[28];
- char data[0];
+class prop_area {
+public:
prop_area(const uint32_t magic, const uint32_t version) :
- magic(magic), version(version) {
- atomic_init(&serial, 0);
- memset(reserved, 0, sizeof(reserved));
+ magic_(magic), version_(version) {
+ atomic_init(&serial_, 0);
+ memset(reserved_, 0, sizeof(reserved_));
// Allocate enough space for the root node.
- bytes_used = sizeof(prop_bt);
+ bytes_used_ = sizeof(prop_bt);
}
+ const prop_info *find(const char *name);
+ bool add(const char *name, unsigned int namelen,
+ const char *value, unsigned int valuelen);
+
+ bool foreach(void (*propfn)(const prop_info *pi, void *cookie), void *cookie);
+
+ atomic_uint_least32_t *serial() { return &serial_; }
+ uint32_t magic() const { return magic_; }
+ uint32_t version() const { return version_; }
+
private:
+ void *allocate_obj(const size_t size, uint_least32_t *const off);
+ prop_bt *new_prop_bt(const char *name, uint8_t namelen, uint_least32_t *const off);
+ prop_info *new_prop_info(const char *name, uint8_t namelen,
+ const char *value, uint8_t valuelen,
+ uint_least32_t *const off);
+ void *to_prop_obj(uint_least32_t off);
+ prop_bt *to_prop_bt(atomic_uint_least32_t *off_p);
+ prop_info *to_prop_info(atomic_uint_least32_t *off_p);
+
+ prop_bt *root_node();
+
+ prop_bt *find_prop_bt(prop_bt *const bt, const char *name,
+ uint8_t namelen, bool alloc_if_needed);
+
+ const prop_info *find_property(prop_bt *const trie, const char *name,
+ uint8_t namelen, const char *value,
+ uint8_t valuelen, bool alloc_if_needed);
+
+ bool foreach_property(prop_bt *const trie,
+ void (*propfn)(const prop_info *pi, void *cookie),
+ void *cookie);
+
+ uint32_t bytes_used_;
+ atomic_uint_least32_t serial_;
+ uint32_t magic_;
+ uint32_t version_;
+ uint32_t reserved_[28];
+ char data_[0];
+
DISALLOW_COPY_AND_ASSIGN(prop_area);
};
@@ -158,10 +196,11 @@ struct find_nth_cookie {
}
};
-static char property_filename[PATH_MAX] = PROP_FILENAME;
+static char property_filename[PROP_FILENAME_MAX] = PROP_FILENAME;
static bool compat_mode = false;
static size_t pa_data_size;
static size_t pa_size;
+static bool initialized = false;
// NOTE: This isn't static because system_properties_compat.c
// requires it.
@@ -182,13 +221,12 @@ static int get_fd_from_env(void)
return atoi(env);
}
-static int map_prop_area_rw()
-{
+static prop_area* map_prop_area_rw(const char* filename, const char* context,
+ bool* fsetxattr_failed) {
/* dev is a tmpfs that we can use to carve a shared workspace
* out of, so let's do that...
*/
- const int fd = open(property_filename,
- O_RDWR | O_CREAT | O_NOFOLLOW | O_CLOEXEC | O_EXCL, 0444);
+ const int fd = open(filename, O_RDWR | O_CREAT | O_NOFOLLOW | O_CLOEXEC | O_EXCL, 0444);
if (fd < 0) {
if (errno == EACCES) {
@@ -197,12 +235,31 @@ static int map_prop_area_rw()
*/
abort();
}
- return -1;
+ return nullptr;
+ }
+
+ if (context) {
+ if (fsetxattr(fd, XATTR_NAME_SELINUX, context, strlen(context) + 1, 0) != 0) {
+ __libc_format_log(ANDROID_LOG_ERROR, "libc",
+ "fsetxattr failed to set context (%s) for \"%s\"", context, filename);
+ /*
+ * fsetxattr() will fail during system properties tests due to selinux policy.
+ * We do not want to create a custom policy for the tester, so we will continue in
+ * this function but set a flag that an error has occurred.
+ * Init, which is the only daemon that should ever call this function will abort
+ * when this error occurs.
+ * Otherwise, the tester will ignore it and continue, albeit without any selinux
+ * property separation.
+ */
+ if (fsetxattr_failed) {
+ *fsetxattr_failed = true;
+ }
+ }
}
if (ftruncate(fd, PA_SIZE) < 0) {
close(fd);
- return -1;
+ return nullptr;
}
pa_size = PA_SIZE;
@@ -212,29 +269,26 @@ static int map_prop_area_rw()
void *const memory_area = mmap(NULL, pa_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (memory_area == MAP_FAILED) {
close(fd);
- return -1;
+ return nullptr;
}
prop_area *pa = new(memory_area) prop_area(PROP_AREA_MAGIC, PROP_AREA_VERSION);
- /* plug into the lib property services */
- __system_property_area__ = pa;
-
close(fd);
- return 0;
+ return pa;
}
-static int map_fd_ro(const int fd) {
+static prop_area* map_fd_ro(const int fd) {
struct stat fd_stat;
if (fstat(fd, &fd_stat) < 0) {
- return -1;
+ return nullptr;
}
if ((fd_stat.st_uid != 0)
|| (fd_stat.st_gid != 0)
|| ((fd_stat.st_mode & (S_IWGRP | S_IWOTH)) != 0)
|| (fd_stat.st_size < static_cast<off_t>(sizeof(prop_area))) ) {
- return -1;
+ return nullptr;
}
pa_size = fd_stat.st_size;
@@ -242,29 +296,28 @@ static int map_fd_ro(const int fd) {
void* const map_result = mmap(NULL, pa_size, PROT_READ, MAP_SHARED, fd, 0);
if (map_result == MAP_FAILED) {
- return -1;
+ return nullptr;
}
prop_area* pa = reinterpret_cast<prop_area*>(map_result);
- if ((pa->magic != PROP_AREA_MAGIC) || (pa->version != PROP_AREA_VERSION &&
- pa->version != PROP_AREA_VERSION_COMPAT)) {
+ if ((pa->magic() != PROP_AREA_MAGIC) ||
+ (pa->version() != PROP_AREA_VERSION &&
+ pa->version() != PROP_AREA_VERSION_COMPAT)) {
munmap(pa, pa_size);
- return -1;
+ return nullptr;
}
- if (pa->version == PROP_AREA_VERSION_COMPAT) {
+ if (pa->version() == PROP_AREA_VERSION_COMPAT) {
compat_mode = true;
}
- __system_property_area__ = pa;
- return 0;
+ return pa;
}
-static int map_prop_area()
-{
- int fd = open(property_filename, O_CLOEXEC | O_NOFOLLOW | O_RDONLY);
+static prop_area* map_prop_area(const char* filename, bool is_legacy) {
+ int fd = open(filename, O_CLOEXEC | O_NOFOLLOW | O_RDONLY);
bool close_fd = true;
- if (fd == -1 && errno == ENOENT) {
+ if (fd == -1 && errno == ENOENT && is_legacy) {
/*
* For backwards compatibility, if the file doesn't
* exist, we use the environment to get the file descriptor.
@@ -273,16 +326,18 @@ static int map_prop_area()
* returns other errors such as ENOMEM or ENFILE, since it
* might be possible for an external program to trigger this
* condition.
+ * Only do this for the legacy prop file, secured prop files
+ * do not have a backup
*/
fd = get_fd_from_env();
close_fd = false;
}
if (fd < 0) {
- return -1;
+ return nullptr;
}
- const int map_result = map_fd_ro(fd);
+ prop_area* map_result = map_fd_ro(fd);
if (close_fd) {
close(fd);
}
@@ -290,20 +345,19 @@ static int map_prop_area()
return map_result;
}
-static void *allocate_obj(const size_t size, uint_least32_t *const off)
+void *prop_area::allocate_obj(const size_t size, uint_least32_t *const off)
{
- prop_area *pa = __system_property_area__;
const size_t aligned = BIONIC_ALIGN(size, sizeof(uint_least32_t));
- if (pa->bytes_used + aligned > pa_data_size) {
+ if (bytes_used_ + aligned > pa_data_size) {
return NULL;
}
- *off = pa->bytes_used;
- pa->bytes_used += aligned;
- return pa->data + *off;
+ *off = bytes_used_;
+ bytes_used_ += aligned;
+ return data_ + *off;
}
-static prop_bt *new_prop_bt(const char *name, uint8_t namelen, uint_least32_t *const off)
+prop_bt *prop_area::new_prop_bt(const char *name, uint8_t namelen, uint_least32_t *const off)
{
uint_least32_t new_offset;
void *const p = allocate_obj(sizeof(prop_bt) + namelen + 1, &new_offset);
@@ -316,7 +370,7 @@ static prop_bt *new_prop_bt(const char *name, uint8_t namelen, uint_least32_t *c
return NULL;
}
-static prop_info *new_prop_info(const char *name, uint8_t namelen,
+prop_info *prop_area::new_prop_info(const char *name, uint8_t namelen,
const char *value, uint8_t valuelen, uint_least32_t *const off)
{
uint_least32_t new_offset;
@@ -330,27 +384,25 @@ static prop_info *new_prop_info(const char *name, uint8_t namelen,
return NULL;
}
-static void *to_prop_obj(uint_least32_t off)
+void *prop_area::to_prop_obj(uint_least32_t off)
{
if (off > pa_data_size)
return NULL;
- if (!__system_property_area__)
- return NULL;
- return (__system_property_area__->data + off);
+ return (data_ + off);
}
-static inline prop_bt *to_prop_bt(atomic_uint_least32_t* off_p) {
+inline prop_bt *prop_area::to_prop_bt(atomic_uint_least32_t* off_p) {
uint_least32_t off = atomic_load_explicit(off_p, memory_order_consume);
return reinterpret_cast<prop_bt*>(to_prop_obj(off));
}
-static inline prop_info *to_prop_info(atomic_uint_least32_t* off_p) {
+inline prop_info *prop_area::to_prop_info(atomic_uint_least32_t* off_p) {
uint_least32_t off = atomic_load_explicit(off_p, memory_order_consume);
return reinterpret_cast<prop_info*>(to_prop_obj(off));
}
-static inline prop_bt *root_node()
+inline prop_bt *prop_area::root_node()
{
return reinterpret_cast<prop_bt*>(to_prop_obj(0));
}
@@ -366,8 +418,8 @@ static int cmp_prop_name(const char *one, uint8_t one_len, const char *two,
return strncmp(one, two, one_len);
}
-static prop_bt *find_prop_bt(prop_bt *const bt, const char *name,
- uint8_t namelen, bool alloc_if_needed)
+prop_bt *prop_area::find_prop_bt(prop_bt *const bt, const char *name,
+ uint8_t namelen, bool alloc_if_needed)
{
prop_bt* current = bt;
@@ -417,7 +469,7 @@ static prop_bt *find_prop_bt(prop_bt *const bt, const char *name,
}
}
-static const prop_info *find_property(prop_bt *const trie, const char *name,
+const prop_info *prop_area::find_property(prop_bt *const trie, const char *name,
uint8_t namelen, const char *value, uint8_t valuelen,
bool alloc_if_needed)
{
@@ -543,44 +595,442 @@ static void find_nth_fn(const prop_info *pi, void *ptr)
cookie->count++;
}
-static int foreach_property(prop_bt *const trie,
+bool prop_area::foreach_property(prop_bt *const trie,
void (*propfn)(const prop_info *pi, void *cookie), void *cookie)
{
if (!trie)
- return -1;
+ return false;
uint_least32_t left_offset = atomic_load_explicit(&trie->left, memory_order_relaxed);
if (left_offset != 0) {
const int err = foreach_property(to_prop_bt(&trie->left), propfn, cookie);
if (err < 0)
- return -1;
+ return false;
}
uint_least32_t prop_offset = atomic_load_explicit(&trie->prop, memory_order_relaxed);
if (prop_offset != 0) {
prop_info *info = to_prop_info(&trie->prop);
if (!info)
- return -1;
+ return false;
propfn(info, cookie);
}
uint_least32_t children_offset = atomic_load_explicit(&trie->children, memory_order_relaxed);
if (children_offset != 0) {
const int err = foreach_property(to_prop_bt(&trie->children), propfn, cookie);
if (err < 0)
- return -1;
+ return false;
}
uint_least32_t right_offset = atomic_load_explicit(&trie->right, memory_order_relaxed);
if (right_offset != 0) {
const int err = foreach_property(to_prop_bt(&trie->right), propfn, cookie);
if (err < 0)
+ return false;
+ }
+
+ return true;
+}
+
+const prop_info *prop_area::find(const char *name) {
+ return find_property(root_node(), name, strlen(name), nullptr, 0, false);
+}
+
+bool prop_area::add(const char *name, unsigned int namelen,
+ const char *value, unsigned int valuelen) {
+ return find_property(root_node(), name, namelen, value, valuelen, true);
+}
+
+bool prop_area::foreach(void (*propfn)(const prop_info* pi, void* cookie), void* cookie) {
+ return foreach_property(root_node(), propfn, cookie);
+}
+
+class context_node {
+public:
+ context_node(context_node* next, const char* context, prop_area* pa)
+ : next(next), context_(strdup(context)), pa_(pa), no_access_(false) {
+ lock_.init(false);
+ }
+ ~context_node() {
+ unmap();
+ free(context_);
+ }
+ bool open(bool access_rw, bool* fsetxattr_failed);
+ bool check_access_and_open();
+ void reset_access();
+
+ const char* context() const { return context_; }
+ prop_area* pa() { return pa_; }
+
+ context_node* next;
+
+private:
+ bool check_access();
+ void unmap();
+
+ Lock lock_;
+ char* context_;
+ prop_area* pa_;
+ bool no_access_;
+};
+
+struct prefix_node {
+ prefix_node(struct prefix_node* next, const char* prefix, context_node* context)
+ : prefix(strdup(prefix)), prefix_len(strlen(prefix)), context(context), next(next) {
+ }
+ ~prefix_node() {
+ free(prefix);
+ }
+ char* prefix;
+ const size_t prefix_len;
+ context_node* context;
+ struct prefix_node* next;
+};
+
+template <typename List, typename... Args>
+static inline void list_add(List** list, Args... args) {
+ *list = new List(*list, args...);
+}
+
+static void list_add_after_len(prefix_node** list, const char* prefix, context_node* context) {
+ size_t prefix_len = strlen(prefix);
+
+ auto next_list = list;
+
+ while (*next_list) {
+ if ((*next_list)->prefix_len < prefix_len || (*next_list)->prefix[0] == '*') {
+ list_add(next_list, prefix, context);
+ return;
+ }
+ next_list = &(*next_list)->next;
+ }
+ list_add(next_list, prefix, context);
+}
+
+template <typename List, typename Func>
+static void list_foreach(List* list, Func func) {
+ while (list) {
+ func(list);
+ list = list->next;
+ }
+}
+
+template <typename List, typename Func>
+static List* list_find(List* list, Func func) {
+ while (list) {
+ if (func(list)) {
+ return list;
+ }
+ list = list->next;
+ }
+ return nullptr;
+}
+
+template <typename List>
+static void list_free(List** list) {
+ while (*list) {
+ auto old_list = *list;
+ *list = old_list->next;
+ delete old_list;
+ }
+}
+
+static prefix_node* prefixes = nullptr;
+static context_node* contexts = nullptr;
+
+/*
+ * pthread_mutex_lock() calls into system_properties in the case of contention.
+ * This creates a risk of dead lock if any system_properties functions
+ * use pthread locks after system_property initialization.
+ *
+ * For this reason, the below three functions use a bionic Lock and static
+ * allocation of memory for each filename.
+ */
+
+bool context_node::open(bool access_rw, bool* fsetxattr_failed) {
+ lock_.lock();
+ if (pa_) {
+ lock_.unlock();
+ return true;
+ }
+
+ char filename[PROP_FILENAME_MAX];
+ int len = __libc_format_buffer(filename, sizeof(filename), "%s/%s",
+ property_filename, context_);
+ if (len < 0 || len > PROP_FILENAME_MAX) {
+ lock_.unlock();
+ return false;
+ }
+
+ if (access_rw) {
+ pa_ = map_prop_area_rw(filename, context_, fsetxattr_failed);
+ } else {
+ pa_ = map_prop_area(filename, false);
+ }
+ lock_.unlock();
+ return pa_;
+}
+
+bool context_node::check_access_and_open() {
+ if (!pa_ && !no_access_) {
+ if (!check_access() || !open(false, nullptr)) {
+ no_access_ = true;
+ }
+ }
+ return pa_;
+}
+
+void context_node::reset_access() {
+ if (!check_access()) {
+ unmap();
+ no_access_ = true;
+ } else {
+ no_access_ = false;
+ }
+}
+
+bool context_node::check_access() {
+ char filename[PROP_FILENAME_MAX];
+ int len = __libc_format_buffer(filename, sizeof(filename), "%s/%s",
+ property_filename, context_);
+ if (len < 0 || len > PROP_FILENAME_MAX) {
+ return false;
+ }
+
+ return access(filename, R_OK) == 0;
+}
+
+void context_node::unmap() {
+ if (!pa_) {
+ return;
+ }
+
+ munmap(pa_, pa_size);
+ if (pa_ == __system_property_area__) {
+ __system_property_area__ = nullptr;
+ }
+ pa_ = nullptr;
+}
+
+static bool map_system_property_area(bool access_rw, bool* fsetxattr_failed) {
+ char filename[PROP_FILENAME_MAX];
+ int len = __libc_format_buffer(filename, sizeof(filename),
+ "%s/properties_serial", property_filename);
+ if (len < 0 || len > PROP_FILENAME_MAX) {
+ __system_property_area__ = nullptr;
+ return false;
+ }
+
+ if (access_rw) {
+ __system_property_area__ =
+ map_prop_area_rw(filename, "u:object_r:properties_serial:s0", fsetxattr_failed);
+ } else {
+ __system_property_area__ = map_prop_area(filename, false);
+ }
+ return __system_property_area__;
+}
+
+static prop_area* get_prop_area_for_name(const char* name) {
+ auto entry = list_find(prefixes, [name](prefix_node* l) {
+ return l->prefix[0] == '*' || !strncmp(l->prefix, name, l->prefix_len);
+ });
+ if (!entry) {
+ return nullptr;
+ }
+
+ auto cnode = entry->context;
+ if (!cnode->pa()) {
+ /*
+ * We explicitly do not check no_access_ in this case because unlike the
+ * case of foreach(), we want to generate an selinux audit for each
+ * non-permitted property access in this function.
+ */
+ cnode->open(false, nullptr);
+ }
+ return cnode->pa();
+}
+
+/*
+ * The below two functions are duplicated from label_support.c in libselinux.
+ * TODO: Find a location suitable for these functions such that both libc and
+ * libselinux can share a common source file.
+ */
+
+/*
+ * The read_spec_entries and read_spec_entry functions may be used to
+ * replace sscanf to read entries from spec files. The file and
+ * property services now use these.
+ */
+
+/* Read an entry from a spec file (e.g. file_contexts) */
+static inline int read_spec_entry(char **entry, char **ptr, int *len)
+{
+ *entry = NULL;
+ char *tmp_buf = NULL;
+
+ while (isspace(**ptr) && **ptr != '\0')
+ (*ptr)++;
+
+ tmp_buf = *ptr;
+ *len = 0;
+
+ while (!isspace(**ptr) && **ptr != '\0') {
+ (*ptr)++;
+ (*len)++;
+ }
+
+ if (*len) {
+ *entry = strndup(tmp_buf, *len);
+ if (!*entry)
return -1;
}
return 0;
}
+/*
+ * line_buf - Buffer containing the spec entries .
+ * num_args - The number of spec parameter entries to process.
+ * ... - A 'char **spec_entry' for each parameter.
+ * returns - The number of items processed.
+ *
+ * This function calls read_spec_entry() to do the actual string processing.
+ */
+static int read_spec_entries(char *line_buf, int num_args, ...)
+{
+ char **spec_entry, *buf_p;
+ int len, rc, items, entry_len = 0;
+ va_list ap;
+
+ len = strlen(line_buf);
+ if (line_buf[len - 1] == '\n')
+ line_buf[len - 1] = '\0';
+ else
+ /* Handle case if line not \n terminated by bumping
+ * the len for the check below (as the line is NUL
+ * terminated by getline(3)) */
+ len++;
+
+ buf_p = line_buf;
+ while (isspace(*buf_p))
+ buf_p++;
+
+ /* Skip comment lines and empty lines. */
+ if (*buf_p == '#' || *buf_p == '\0')
+ return 0;
+
+ /* Process the spec file entries */
+ va_start(ap, num_args);
+
+ items = 0;
+ while (items < num_args) {
+ spec_entry = va_arg(ap, char **);
+
+ if (len - 1 == buf_p - line_buf) {
+ va_end(ap);
+ return items;
+ }
+
+ rc = read_spec_entry(spec_entry, &buf_p, &entry_len);
+ if (rc < 0) {
+ va_end(ap);
+ return rc;
+ }
+ if (entry_len)
+ items++;
+ }
+ va_end(ap);
+ return items;
+}
+
+static bool initialize_properties() {
+ FILE* file = fopen("/property_contexts", "re");
+
+ if (!file) {
+ return false;
+ }
+
+ char* buffer = nullptr;
+ size_t line_len;
+ char* prop_prefix = nullptr;
+ char* context = nullptr;
+
+ while (getline(&buffer, &line_len, file) > 0) {
+ int items = read_spec_entries(buffer, 2, &prop_prefix, &context);
+ if (items <= 0) {
+ continue;
+ }
+ if (items == 1) {
+ free(prop_prefix);
+ continue;
+ }
+ /*
+ * init uses ctl.* properties as an IPC mechanism and does not write them
+ * to a property file, therefore we do not need to create property files
+ * to store them.
+ */
+ if (!strncmp(prop_prefix, "ctl.", 4)) {
+ free(prop_prefix);
+ free(context);
+ continue;
+ }
+
+ auto old_context = list_find(
+ contexts, [context](context_node* l) { return !strcmp(l->context(), context); });
+ if (old_context) {
+ list_add_after_len(&prefixes, prop_prefix, old_context);
+ } else {
+ list_add(&contexts, context, nullptr);
+ list_add_after_len(&prefixes, prop_prefix, contexts);
+ }
+ free(prop_prefix);
+ free(context);
+ }
+
+ free(buffer);
+ fclose(file);
+ return true;
+}
+
+static bool is_dir(const char* pathname) {
+ struct stat info;
+ if (stat(pathname, &info) == -1) {
+ return false;
+ }
+ return S_ISDIR(info.st_mode);
+}
+
+static void free_and_unmap_contexts() {
+ list_free(&prefixes);
+ list_free(&contexts);
+ if (__system_property_area__) {
+ munmap(__system_property_area__, pa_size);
+ __system_property_area__ = nullptr;
+ }
+}
+
int __system_properties_init()
{
- return map_prop_area();
+ if (initialized) {
+ list_foreach(contexts, [](context_node* l) { l->reset_access(); });
+ return 0;
+ }
+ if (is_dir(property_filename)) {
+ if (!initialize_properties()) {
+ return -1;
+ }
+ if (!map_system_property_area(false, nullptr)) {
+ free_and_unmap_contexts();
+ return -1;
+ }
+ } else {
+ __system_property_area__ = map_prop_area(property_filename, true);
+ if (!__system_property_area__) {
+ return -1;
+ }
+ list_add(&contexts, "legacy_system_prop_area", __system_property_area__);
+ list_add_after_len(&prefixes, "*", contexts);
+ }
+ initialized = true;
+ return 0;
}
int __system_property_set_filename(const char *filename)
@@ -595,7 +1045,24 @@ int __system_property_set_filename(const char *filename)
int __system_property_area_init()
{
- return map_prop_area_rw();
+ free_and_unmap_contexts();
+ mkdir(property_filename, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ if (!initialize_properties()) {
+ return -1;
+ }
+ bool open_failed = false;
+ bool fsetxattr_failed = false;
+ list_foreach(contexts, [&fsetxattr_failed, &open_failed](context_node* l) {
+ if (!l->open(true, &fsetxattr_failed)) {
+ open_failed = true;
+ }
+ });
+ if (open_failed || !map_system_property_area(true, &fsetxattr_failed)) {
+ free_and_unmap_contexts();
+ return -1;
+ }
+ initialized = true;
+ return fsetxattr_failed ? -2 : 0;
}
unsigned int __system_property_area_serial()
@@ -605,15 +1072,26 @@ unsigned int __system_property_area_serial()
return -1;
}
// Make sure this read fulfilled before __system_property_serial
- return atomic_load_explicit(&(pa->serial), memory_order_acquire);
+ return atomic_load_explicit(pa->serial(), memory_order_acquire);
}
const prop_info *__system_property_find(const char *name)
{
+ if (!__system_property_area__) {
+ return nullptr;
+ }
+
if (__predict_false(compat_mode)) {
return __system_property_find_compat(name);
}
- return find_property(root_node(), name, strlen(name), NULL, 0, false);
+
+ prop_area* pa = get_prop_area_for_name(name);
+ if (!pa) {
+ __libc_format_log(ANDROID_LOG_ERROR, "libc", "Access denied finding property \"%s\"", name);
+ return nullptr;
+ }
+
+ return pa->find(name);
}
// The C11 standard doesn't allow atomic loads from const fields,
@@ -688,11 +1166,15 @@ int __system_property_set(const char *key, const char *value)
int __system_property_update(prop_info *pi, const char *value, unsigned int len)
{
- prop_area *pa = __system_property_area__;
-
if (len >= PROP_VALUE_MAX)
return -1;
+ prop_area* pa = __system_property_area__;
+
+ if (!pa) {
+ return -1;
+ }
+
uint32_t serial = atomic_load_explicit(&pi->serial, memory_order_relaxed);
serial |= 1;
atomic_store_explicit(&pi->serial, serial, memory_order_relaxed);
@@ -708,10 +1190,10 @@ int __system_property_update(prop_info *pi, const char *value, unsigned int len)
__futex_wake(&pi->serial, INT32_MAX);
atomic_store_explicit(
- &pa->serial,
- atomic_load_explicit(&pa->serial, memory_order_relaxed) + 1,
+ pa->serial(),
+ atomic_load_explicit(pa->serial(), memory_order_relaxed) + 1,
memory_order_release);
- __futex_wake(&pa->serial, INT32_MAX);
+ __futex_wake(pa->serial(), INT32_MAX);
return 0;
}
@@ -719,9 +1201,6 @@ int __system_property_update(prop_info *pi, const char *value, unsigned int len)
int __system_property_add(const char *name, unsigned int namelen,
const char *value, unsigned int valuelen)
{
- prop_area *pa = __system_property_area__;
- const prop_info *pi;
-
if (namelen >= PROP_NAME_MAX)
return -1;
if (valuelen >= PROP_VALUE_MAX)
@@ -729,17 +1208,28 @@ int __system_property_add(const char *name, unsigned int namelen,
if (namelen < 1)
return -1;
- pi = find_property(root_node(), name, namelen, value, valuelen, true);
- if (!pi)
+ if (!__system_property_area__) {
+ return -1;
+ }
+
+ prop_area* pa = get_prop_area_for_name(name);
+
+ if (!pa) {
+ __libc_format_log(ANDROID_LOG_ERROR, "libc", "Access denied adding property \"%s\"", name);
+ return -1;
+ }
+
+ bool ret = pa->add(name, namelen, value, valuelen);
+ if (!ret)
return -1;
// There is only a single mutator, but we want to make sure that
// updates are visible to a reader waiting for the update.
atomic_store_explicit(
- &pa->serial,
- atomic_load_explicit(&pa->serial, memory_order_relaxed) + 1,
+ __system_property_area__->serial(),
+ atomic_load_explicit(__system_property_area__->serial(), memory_order_relaxed) + 1,
memory_order_release);
- __futex_wake(&pa->serial, INT32_MAX);
+ __futex_wake(__system_property_area__->serial(), INT32_MAX);
return 0;
}
@@ -761,9 +1251,13 @@ unsigned int __system_property_wait_any(unsigned int serial)
prop_area *pa = __system_property_area__;
uint32_t my_serial;
+ if (!pa) {
+ return 0;
+ }
+
do {
- __futex_wait(&pa->serial, serial, NULL);
- my_serial = atomic_load_explicit(&pa->serial, memory_order_acquire);
+ __futex_wait(pa->serial(), serial, NULL);
+ my_serial = atomic_load_explicit(pa->serial(), memory_order_acquire);
} while (my_serial == serial);
return my_serial;
@@ -784,9 +1278,18 @@ const prop_info *__system_property_find_nth(unsigned n)
int __system_property_foreach(void (*propfn)(const prop_info *pi, void *cookie),
void *cookie)
{
+ if (!__system_property_area__) {
+ return -1;
+ }
+
if (__predict_false(compat_mode)) {
return __system_property_foreach_compat(propfn, cookie);
}
- return foreach_property(root_node(), propfn, cookie);
+ list_foreach(contexts, [propfn, cookie](context_node* l) {
+ if (l->check_access_and_open()) {
+ l->pa()->foreach(propfn, cookie);
+ }
+ });
+ return 0;
}
diff --git a/libc/bionic/tmpfile.cpp b/libc/bionic/tmpfile.cpp
index 602d40752..dc142a94e 100644
--- a/libc/bionic/tmpfile.cpp
+++ b/libc/bionic/tmpfile.cpp
@@ -112,3 +112,4 @@ FILE* tmpfile() {
}
return fp;
}
+__strong_alias(tmpfile64, tmpfile);
diff --git a/libc/bionic/vdso.cpp b/libc/bionic/vdso.cpp
index a2406634d..029c1481c 100644
--- a/libc/bionic/vdso.cpp
+++ b/libc/bionic/vdso.cpp
@@ -14,60 +14,49 @@
* limitations under the License.
*/
-#include <link.h>
-#include <string.h>
-#include <sys/auxv.h>
-#include <unistd.h>
-
-// x86 has a vdso, but there's nothing useful to us in it.
-#if defined(__aarch64__) || defined(__x86_64__)
+#include "private/bionic_globals.h"
+#include "private/bionic_vdso.h"
-#if defined(__aarch64__)
-#define VDSO_CLOCK_GETTIME_SYMBOL "__kernel_clock_gettime"
-#define VDSO_GETTIMEOFDAY_SYMBOL "__kernel_gettimeofday"
-#elif defined(__x86_64__)
-#define VDSO_CLOCK_GETTIME_SYMBOL "__vdso_clock_gettime"
-#define VDSO_GETTIMEOFDAY_SYMBOL "__vdso_gettimeofday"
-#endif
+#if defined(__aarch64__) || defined(__x86_64__) || defined (__i386__)
+#include <limits.h>
+#include <link.h>
+#include <string.h>
+#include <sys/cdefs.h>
+#include <sys/time.h>
#include <time.h>
-
-extern "C" int __clock_gettime(int, timespec*);
-extern "C" int __gettimeofday(timeval*, struct timezone*);
-
-struct vdso_entry {
- const char* name;
- void* fn;
-};
-
-enum {
- VDSO_CLOCK_GETTIME = 0,
- VDSO_GETTIMEOFDAY,
- VDSO_END
-};
-
-static vdso_entry vdso_entries[] = {
- [VDSO_CLOCK_GETTIME] = { VDSO_CLOCK_GETTIME_SYMBOL, reinterpret_cast<void*>(__clock_gettime) },
- [VDSO_GETTIMEOFDAY] = { VDSO_GETTIMEOFDAY_SYMBOL, reinterpret_cast<void*>(__gettimeofday) },
-};
+#include <unistd.h>
+#include "private/KernelArgumentBlock.h"
int clock_gettime(int clock_id, timespec* tp) {
- static int (*vdso_clock_gettime)(int, timespec*) =
- reinterpret_cast<int (*)(int, timespec*)>(vdso_entries[VDSO_CLOCK_GETTIME].fn);
- return vdso_clock_gettime(clock_id, tp);
+ auto vdso_clock_gettime = reinterpret_cast<decltype(&clock_gettime)>(
+ __libc_globals->vdso[VDSO_CLOCK_GETTIME].fn);
+ if (__predict_true(vdso_clock_gettime)) {
+ return vdso_clock_gettime(clock_id, tp);
+ }
+ return __clock_gettime(clock_id, tp);
}
int gettimeofday(timeval* tv, struct timezone* tz) {
- static int (*vdso_gettimeofday)(timeval*, struct timezone*) =
- reinterpret_cast<int (*)(timeval*, struct timezone*)>(vdso_entries[VDSO_GETTIMEOFDAY].fn);
- return vdso_gettimeofday(tv, tz);
+ auto vdso_gettimeofday = reinterpret_cast<decltype(&gettimeofday)>(
+ __libc_globals->vdso[VDSO_GETTIMEOFDAY].fn);
+ if (__predict_true(vdso_gettimeofday)) {
+ return vdso_gettimeofday(tv, tz);
+ }
+ return __gettimeofday(tv, tz);
}
-void __libc_init_vdso() {
+void __libc_init_vdso(libc_globals* globals, KernelArgumentBlock& args) {
+ auto&& vdso = globals->vdso;
+ vdso[VDSO_CLOCK_GETTIME] = { VDSO_CLOCK_GETTIME_SYMBOL,
+ reinterpret_cast<void*>(__clock_gettime) };
+ vdso[VDSO_GETTIMEOFDAY] = { VDSO_GETTIMEOFDAY_SYMBOL,
+ reinterpret_cast<void*>(__gettimeofday) };
+
// Do we have a vdso?
- uintptr_t vdso_ehdr_addr = getauxval(AT_SYSINFO_EHDR);
+ uintptr_t vdso_ehdr_addr = args.getauxval(AT_SYSINFO_EHDR);
ElfW(Ehdr)* vdso_ehdr = reinterpret_cast<ElfW(Ehdr)*>(vdso_ehdr_addr);
- if (vdso_ehdr == NULL) {
+ if (vdso_ehdr == nullptr) {
return;
}
@@ -85,7 +74,7 @@ void __libc_init_vdso() {
// Where's the dynamic table?
ElfW(Addr) vdso_addr = 0;
- ElfW(Dyn)* vdso_dyn = NULL;
+ ElfW(Dyn)* vdso_dyn = nullptr;
ElfW(Phdr)* vdso_phdr = reinterpret_cast<ElfW(Phdr)*>(vdso_ehdr_addr + vdso_ehdr->e_phoff);
for (size_t i = 0; i < vdso_ehdr->e_phnum; ++i) {
if (vdso_phdr[i].p_type == PT_DYNAMIC) {
@@ -94,13 +83,13 @@ void __libc_init_vdso() {
vdso_addr = vdso_ehdr_addr + vdso_phdr[i].p_offset - vdso_phdr[i].p_vaddr;
}
}
- if (vdso_addr == 0 || vdso_dyn == NULL) {
+ if (vdso_addr == 0 || vdso_dyn == nullptr) {
return;
}
// Where are the string and symbol tables?
- const char* strtab = NULL;
- ElfW(Sym)* symtab = NULL;
+ const char* strtab = nullptr;
+ ElfW(Sym)* symtab = nullptr;
for (ElfW(Dyn)* d = vdso_dyn; d->d_tag != DT_NULL; ++d) {
if (d->d_tag == DT_STRTAB) {
strtab = reinterpret_cast<const char*>(vdso_addr + d->d_un.d_ptr);
@@ -108,15 +97,15 @@ void __libc_init_vdso() {
symtab = reinterpret_cast<ElfW(Sym)*>(vdso_addr + d->d_un.d_ptr);
}
}
- if (strtab == NULL || symtab == NULL) {
+ if (strtab == nullptr || symtab == nullptr) {
return;
}
// Are there any symbols we want?
for (size_t i = 0; i < symbol_count; ++i) {
for (size_t j = 0; j < VDSO_END; ++j) {
- if (strcmp(vdso_entries[j].name, strtab + symtab[i].st_name) == 0) {
- vdso_entries[j].fn = reinterpret_cast<void*>(vdso_addr + symtab[i].st_value);
+ if (strcmp(vdso[j].name, strtab + symtab[i].st_name) == 0) {
+ vdso[j].fn = reinterpret_cast<void*>(vdso_addr + symtab[i].st_value);
}
}
}
@@ -124,7 +113,7 @@ void __libc_init_vdso() {
#else
-void __libc_init_vdso() {
+void __libc_init_vdso(libc_globals*, KernelArgumentBlock&) {
}
#endif
diff --git a/libc/crt.mk b/libc/crt.mk
index 63653322e..7b96bf2e6 100644
--- a/libc/crt.mk
+++ b/libc/crt.mk
@@ -40,7 +40,7 @@ $(GEN): $(LOCAL_PATH)/arch-common/bionic/crtbrand.S
$(hide) $(PRIVATE_CC) $(PRIVATE_CFLAGS) \
-MD -MF $(@:%.o=%.d) -o $@ -c $<
$(transform-d-to-p)
--include $(GEN:%.o=%.P)
+$(call include-depfile,$(GEN:%.o=%.P),$(GEN))
# crtbegin_so.c -> crtbegin_so1.o
GEN := $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so1.o
@@ -51,7 +51,7 @@ $(GEN): $(my_libc_crt_target_crtbegin_so_file)
$(hide) $(PRIVATE_CC) $(PRIVATE_CFLAGS) \
-MD -MF $(@:%.o=%.d) -o $@ -c $<
$(transform-d-to-p)
--include $(GEN:%.o=%.P)
+$(call include-depfile,$(GEN:%.o=%.P),$(GEN))
# crtbegin_so1.o + crtbrand.o -> crtbegin_so.o
GEN := $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_so.o
@@ -71,7 +71,7 @@ $(GEN): $(LOCAL_PATH)/arch-common/bionic/crtend_so.S
$(hide) $(PRIVATE_CC) $(PRIVATE_CFLAGS) \
-MD -MF $(@:%.o=%.d) -o $@ -c $<
$(transform-d-to-p)
--include $(GEN:%.o=%.P)
+$(call include-depfile,$(GEN:%.o=%.P),$(GEN))
# crtbegin_so.o and crtend_so.o are installed to device
GEN := $($(my_2nd_arch_prefix)TARGET_OUT_SHARED_LIBRARIES)/crtbegin_so.o
@@ -93,7 +93,7 @@ $(GEN): $(my_libc_crt_target_crtbegin_file)
$(hide) $(PRIVATE_CC) $(PRIVATE_CFLAGS) \
-MD -MF $(@:%.o=%.d) -o $@ -c $<
$(transform-d-to-p)
--include $(GEN:%.o=%.P)
+$(call include-depfile,$(GEN:%.o=%.P),$(GEN))
# crtbegin_static1.o + crtbrand.o -> crtbegin_static.o
GEN := $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_static.o
@@ -113,7 +113,7 @@ $(GEN): $(my_libc_crt_target_crtbegin_file)
$(hide) $(PRIVATE_CC) $(PRIVATE_CFLAGS) \
-MD -MF $(@:%.o=%.d) -o $@ -c $<
$(transform-d-to-p)
--include $(GEN:%.o=%.P)
+$(call include-depfile,$(GEN:%.o=%.P),$(GEN))
# crtbegin_dynamic1.o + crtbrand.o -> crtbegin_dynamic.o
GEN := $($(my_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/crtbegin_dynamic.o
@@ -135,7 +135,7 @@ $(GEN): $(LOCAL_PATH)/arch-common/bionic/crtend.S
$(hide) $(PRIVATE_CC) $(PRIVATE_CFLAGS) \
-MD -MF $(@:%.o=%.d) -o $@ -c $<
$(transform-d-to-p)
--include $(GEN:%.o=%.P)
+$(call include-depfile,$(GEN:%.o=%.P),$(GEN))
# Clear temp vars
my_libc_crt_target_ldflags :=
diff --git a/libc/dns/include/resolv_netid.h b/libc/dns/include/resolv_netid.h
index d36464564..266193a24 100644
--- a/libc/dns/include/resolv_netid.h
+++ b/libc/dns/include/resolv_netid.h
@@ -49,6 +49,7 @@
__BEGIN_DECLS
+struct __res_params;
struct addrinfo;
#define __used_in_netd __attribute__((visibility ("default")))
@@ -86,8 +87,8 @@ int android_getaddrinfofornetcontext(const char *, const char *, const struct ad
const struct android_net_context *, struct addrinfo **) __used_in_netd;
/* set name servers for a network */
-extern void _resolv_set_nameservers_for_net(unsigned netid,
- const char** servers, int numservers, const char *domains) __used_in_netd;
+extern int _resolv_set_nameservers_for_net(unsigned netid, const char** servers,
+ unsigned numservers, const char *domains, const struct __res_params* params) __used_in_netd;
/* flush the cache associated with a certain network */
extern void _resolv_flush_cache_for_net(unsigned netid) __used_in_netd;
diff --git a/libc/dns/include/resolv_params.h b/libc/dns/include/resolv_params.h
new file mode 100644
index 000000000..5ee265f92
--- /dev/null
+++ b/libc/dns/include/resolv_params.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _RESOLV_PARAMS_H
+#define _RESOLV_PARAMS_H
+
+#include <stdint.h>
+
+/* Hard-coded defines */
+#define MAXNS 4 /* max # name servers we'll track */
+#define MAXDNSRCH 6 /* max # domains in search path */
+#define MAXDNSRCHPATH 256 /* max length of domain search paths */
+#define MAXNSSAMPLES 64 /* max # samples to store per server */
+
+/* Defaults used for initializing __res_params */
+#define SUCCESS_THRESHOLD 75 /* if successes * 100 / total_samples is less than
+ * this value, the server is considered failing
+ */
+#define NSSAMPLE_VALIDITY 1800 /* Sample validity in seconds.
+ * Set to -1 to disable skipping failing
+ * servers.
+ */
+
+/* per-netid configuration parameters passed from netd to the resolver */
+struct __res_params {
+ uint16_t sample_validity; // sample lifetime in s
+ // threshold of success / total samples below which a server is considered broken
+ uint8_t success_threshold; // 0: disable, value / 100 otherwise
+ uint8_t min_samples; // min # samples needed for statistics to be considered meaningful
+ uint8_t max_samples; // max # samples taken into account for statistics
+} __attribute__((__packed__));
+
+#endif // _RESOLV_PARAMS_H
diff --git a/libc/dns/include/resolv_private.h b/libc/dns/include/resolv_private.h
index 0dab3d836..3ab8ea621 100644
--- a/libc/dns/include/resolv_private.h
+++ b/libc/dns/include/resolv_private.h
@@ -58,7 +58,10 @@
#include <resolv.h>
#include "resolv_static.h"
+#include "resolv_params.h"
+#include "resolv_stats.h"
#include <net/if.h>
+#include <time.h>
/* Despite this file's name, it's part of libresolv. On Android, that means it's part of libc :-( */
#pragma GCC visibility push(default)
@@ -136,9 +139,7 @@ struct res_sym {
/*
* Global defines and variables for resolver stub.
*/
-#define MAXNS 3 /* max # name servers we'll track */
#define MAXDFLSRCH 3 /* # default domain levels to try */
-#define MAXDNSRCH 6 /* max # domains in search path */
#define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */
#define RES_TIMEOUT 5 /* min. seconds between retries */
@@ -205,6 +206,24 @@ struct __res_state {
typedef struct __res_state *res_state;
+/* Retrieve a local copy of the stats for the given netid. The buffer must have space for
+ * MAXNS __resolver_stats. Returns the revision id of the resolvers used.
+ */
+__LIBC_HIDDEN__
+extern int
+_resolv_cache_get_resolver_stats( unsigned netid, struct __res_params* params,
+ struct __res_stats stats[MAXNS]);
+
+/* Add a sample to the shared struct for the given netid and server, provided that the
+ * revision_id of the stored servers has not changed.
+ */
+__LIBC_HIDDEN__
+extern void
+_resolv_cache_add_resolver_stats_sample( unsigned netid, int revision_id, int ns,
+ const struct __res_sample* sample, int max_samples);
+
+/* End of stats related definitions */
+
union res_sockaddr_union {
struct sockaddr_in sin;
#ifdef IN6ADDR_ANY_INIT
@@ -398,7 +417,6 @@ __LIBC_HIDDEN__ extern const struct res_sym __p_rcode_syms[];
#define res_nisourserver __res_nisourserver
#define res_ownok __res_ownok
#define res_queriesmatch __res_queriesmatch
-#define res_randomid __res_randomid
#define sym_ntop __sym_ntop
#define sym_ntos __sym_ntos
#define sym_ston __sym_ston
@@ -454,7 +472,6 @@ const u_char * p_fqname(const u_char *, const u_char *, FILE *);
const char * p_option(u_long);
char * p_secstodate(u_long);
int dn_count_labels(const char *);
-u_int res_randomid(void);
int res_nameinquery(const char *, int, int, const u_char *,
const u_char *);
int res_queriesmatch(const u_char *, const u_char *,
@@ -503,7 +520,11 @@ __LIBC_HIDDEN__ int res_getservers(res_state,
__LIBC_HIDDEN__ void res_setnetid(res_state, unsigned);
__LIBC_HIDDEN__ void res_setmark(res_state, unsigned);
-u_int res_randomid(void);
+
+// We use the OpenBSD __res_randomid...
+u_int __res_randomid(void);
+// ...but NetBSD calls it res_randomid.
+#define res_randomid __res_randomid
#ifdef __i386__
# define __socketcall extern __attribute__((__cdecl__))
diff --git a/libc/dns/include/resolv_stats.h b/libc/dns/include/resolv_stats.h
new file mode 100644
index 000000000..c7901d7c6
--- /dev/null
+++ b/libc/dns/include/resolv_stats.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _RES_STATS_H
+#define _RES_STATS_H
+
+#include <sys/socket.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <time.h>
+
+#include "resolv_params.h"
+
+#define RCODE_INTERNAL_ERROR 254
+#define RCODE_TIMEOUT 255
+
+/*
+ * Resolver reachability statistics and run-time parameters.
+ */
+
+struct __res_sample {
+ time_t at; // time in s at which the sample was recorded
+ uint16_t rtt; // round-trip time in ms
+ uint8_t rcode; // the DNS rcode or RCODE_XXX defined above
+};
+
+struct __res_stats {
+ // Stats of the last <sample_count> queries.
+ struct __res_sample samples[MAXNSSAMPLES];
+ // The number of samples stored.
+ uint8_t sample_count;
+ // The next sample to modify.
+ uint8_t sample_next;
+};
+
+/* Calculate the round-trip-time from start time t0 and end time t1. */
+extern int
+_res_stats_calculate_rtt(const struct timespec* t1, const struct timespec* t0);
+
+/* Initialize a sample for calculating server reachability statistics. */
+extern void
+_res_stats_set_sample(struct __res_sample* sample, time_t now, int rcode, int rtt);
+
+/* Returns true if the server is considered unusable, i.e. if the success rate is not lower than the
+ * threshold for the stored stored samples. If not enough samples are stored, the server is
+ * considered usable.
+ */
+extern bool
+_res_stats_usable_server(const struct __res_params* params, struct __res_stats* stats);
+
+__BEGIN_DECLS
+/* Aggregates the reachability statistics for the given server based on on the stored samples. */
+extern void
+android_net_res_stats_aggregate(struct __res_stats* stats, int* successes, int* errors,
+ int* timeouts, int* internal_errors, int* rtt_avg, time_t* last_sample_time)
+ __attribute__((visibility ("default")));
+
+extern int
+android_net_res_stats_get_info_for_net(unsigned netid, int* nscount,
+ struct sockaddr_storage servers[MAXNS], int* dcount, char domains[MAXDNSRCH][MAXDNSRCHPATH],
+ struct __res_params* params, struct __res_stats stats[MAXNS])
+ __attribute__((visibility ("default")));
+
+/* Returns an array of bools indicating which servers are considered good */
+extern void
+android_net_res_stats_get_usable_servers(const struct __res_params* params,
+ struct __res_stats stats[], int nscount, bool valid_servers[])
+ __attribute__((visibility ("default")));
+__END_DECLS
+
+#endif // _RES_STATS_H
diff --git a/libc/dns/resolv/res_cache.c b/libc/dns/resolv/res_cache.c
index 5a78450f1..ad2c5c01d 100644
--- a/libc/dns/resolv/res_cache.c
+++ b/libc/dns/resolv/res_cache.c
@@ -27,6 +27,7 @@
*/
#include "resolv_cache.h"
+
#include <resolv.h>
#include <stdarg.h>
#include <stdio.h>
@@ -1232,9 +1233,13 @@ struct resolv_cache_info {
unsigned netid;
Cache* cache;
struct resolv_cache_info* next;
- char* nameservers[MAXNS +1];
- struct addrinfo* nsaddrinfo[MAXNS + 1];
- char defdname[256];
+ int nscount;
+ char* nameservers[MAXNS];
+ struct addrinfo* nsaddrinfo[MAXNS];
+ int revision_id; // # times the nameservers have been replaced
+ struct __res_params params;
+ struct __res_stats nsstats[MAXNS];
+ char defdname[MAXDNSRCHPATH];
int dnsrch_offset[MAXDNSRCH+1]; // offsets into defdname
};
@@ -1361,6 +1366,8 @@ _resolv_cache_query_failed( unsigned netid,
pthread_mutex_unlock(&_res_cache_list_lock);
}
+static struct resolv_cache_info* _find_cache_info_locked(unsigned netid);
+
static void
_cache_flush_locked( Cache* cache )
{
@@ -1801,6 +1808,8 @@ static void _free_nameservers_locked(struct resolv_cache_info* cache_info);
* currently attached to the provided cache_info */
static int _resolv_is_nameservers_equal_locked(struct resolv_cache_info* cache_info,
const char** servers, int numservers);
+/* clears the stats samples contained withing the given cache_info */
+static void _res_cache_clear_stats_locked(struct resolv_cache_info* cache_info);
static void
_res_cache_init(void)
@@ -1854,6 +1863,10 @@ _flush_cache_for_net_locked(unsigned netid)
if (cache) {
_cache_flush_locked(cache);
}
+
+ // Also clear the NS statistics.
+ struct resolv_cache_info* cache_info = _find_cache_info_locked(netid);
+ _res_cache_clear_stats_locked(cache_info);
}
void _resolv_delete_cache_for_net(unsigned netid)
@@ -1928,14 +1941,47 @@ _find_cache_info_locked(unsigned netid)
}
void
-_resolv_set_nameservers_for_net(unsigned netid, const char** servers, int numservers,
- const char *domains)
+_resolv_set_default_params(struct __res_params* params) {
+ params->sample_validity = NSSAMPLE_VALIDITY;
+ params->success_threshold = SUCCESS_THRESHOLD;
+ params->min_samples = 0;
+ params->max_samples = 0;
+}
+
+int
+_resolv_set_nameservers_for_net(unsigned netid, const char** servers, unsigned numservers,
+ const char *domains, const struct __res_params* params)
{
- int i, rt, index;
- struct addrinfo hints;
char sbuf[NI_MAXSERV];
register char *cp;
int *offset;
+ struct addrinfo* nsaddrinfo[MAXNS];
+
+ if (numservers > MAXNS) {
+ XLOG("%s: numservers=%u, MAXNS=%u", __FUNCTION__, numservers, MAXNS);
+ return E2BIG;
+ }
+
+ // Parse the addresses before actually locking or changing any state, in case there is an error.
+ // As a side effect this also reduces the time the lock is kept.
+ struct addrinfo hints = {
+ .ai_family = AF_UNSPEC,
+ .ai_socktype = SOCK_DGRAM,
+ .ai_flags = AI_NUMERICHOST
+ };
+ snprintf(sbuf, sizeof(sbuf), "%u", NAMESERVER_PORT);
+ for (unsigned i = 0; i < numservers; i++) {
+ // The addrinfo structures allocated here are freed in _free_nameservers_locked().
+ int rt = getaddrinfo(servers[i], sbuf, &hints, &nsaddrinfo[i]);
+ if (rt != 0) {
+ for (unsigned j = 0 ; j < i ; j++) {
+ freeaddrinfo(nsaddrinfo[j]);
+ nsaddrinfo[j] = NULL;
+ }
+ XLOG("%s: getaddrinfo(%s)=%s", __FUNCTION__, servers[i], gai_strerror(rt));
+ return EINVAL;
+ }
+ }
pthread_once(&_res_cache_once, _res_cache_init);
pthread_mutex_lock(&_res_cache_list_lock);
@@ -1945,33 +1991,52 @@ _resolv_set_nameservers_for_net(unsigned netid, const char** servers, int numser
struct resolv_cache_info* cache_info = _find_cache_info_locked(netid);
- if (cache_info != NULL &&
- !_resolv_is_nameservers_equal_locked(cache_info, servers, numservers)) {
- // free current before adding new
- _free_nameservers_locked(cache_info);
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = PF_UNSPEC;
- hints.ai_socktype = SOCK_DGRAM; /*dummy*/
- hints.ai_flags = AI_NUMERICHOST;
- snprintf(sbuf, sizeof(sbuf), "%u", NAMESERVER_PORT);
-
- index = 0;
- for (i = 0; i < numservers && i < MAXNS; i++) {
- rt = getaddrinfo(servers[i], sbuf, &hints, &cache_info->nsaddrinfo[index]);
- if (rt == 0) {
- cache_info->nameservers[index] = strdup(servers[i]);
- index++;
+ if (cache_info != NULL) {
+ uint8_t old_max_samples = cache_info->params.max_samples;
+ if (params != NULL) {
+ cache_info->params = *params;
+ } else {
+ _resolv_set_default_params(&cache_info->params);
+ }
+
+ if (!_resolv_is_nameservers_equal_locked(cache_info, servers, numservers)) {
+ // free current before adding new
+ _free_nameservers_locked(cache_info);
+ unsigned i;
+ for (i = 0; i < numservers; i++) {
+ cache_info->nsaddrinfo[i] = nsaddrinfo[i];
+ cache_info->nameservers[i] = strdup(servers[i]);
XLOG("%s: netid = %u, addr = %s\n", __FUNCTION__, netid, servers[i]);
- } else {
- cache_info->nsaddrinfo[index] = NULL;
}
+ cache_info->nscount = numservers;
+
+ // Flush the cache and reset the stats.
+ _flush_cache_for_net_locked(netid);
+
+ // increment the revision id to ensure that sample state is not written back if the
+ // servers change; in theory it would suffice to do so only if the servers or
+ // max_samples actually change, in practice the overhead of checking is higher than the
+ // cost, and overflows are unlikely
+ ++cache_info->revision_id;
+ } else if (cache_info->params.max_samples != old_max_samples) {
+ // If the maximum number of samples changes, the overhead of keeping the most recent
+ // samples around is not considered worth the effort, so they are cleared instead. All
+ // other parameters do not affect shared state: Changing these parameters does not
+ // invalidate the samples, as they only affect aggregation and the conditions under
+ // which servers are considered usable.
+ _res_cache_clear_stats_locked(cache_info);
+ ++cache_info->revision_id;
}
+ // Always update the search paths, since determining whether they actually changed is
+ // complex due to the zero-padding, and probably not worth the effort. Cache-flushing
+ // however is not // necessary, since the stored cache entries do contain the domain, not
+ // just the host name.
// code moved from res_init.c, load_domain_search_list
strlcpy(cache_info->defdname, domains, sizeof(cache_info->defdname));
if ((cp = strchr(cache_info->defdname, '\n')) != NULL)
*cp = '\0';
+
cp = cache_info->defdname;
offset = cache_info->dnsrch_offset;
while (offset < cache_info->dnsrch_offset + MAXDNSRCH) {
@@ -1989,33 +2054,19 @@ _resolv_set_nameservers_for_net(unsigned netid, const char** servers, int numser
}
}
*offset = -1; /* cache_info->dnsrch_offset has MAXDNSRCH+1 items */
-
- // flush cache since new settings
- _flush_cache_for_net_locked(netid);
-
}
pthread_mutex_unlock(&_res_cache_list_lock);
+ return 0;
}
static int
_resolv_is_nameservers_equal_locked(struct resolv_cache_info* cache_info,
const char** servers, int numservers)
{
- int i;
- char** ns;
- int currentservers;
- int equal = 1;
-
- if (numservers > MAXNS) numservers = MAXNS;
-
- // Find out how many nameservers we had before.
- currentservers = 0;
- for (ns = cache_info->nameservers; *ns; ns++)
- currentservers++;
-
- if (currentservers != numservers)
+ if (cache_info->nscount != numservers) {
return 0;
+ }
// Compare each name server against current name servers.
// TODO: this is incorrect if the list of current or previous nameservers
@@ -2023,33 +2074,37 @@ _resolv_is_nameservers_equal_locked(struct resolv_cache_info* cache_info,
// filters out duplicates, but we should probably fix it. It's also
// insensitive to the order of the nameservers; we should probably fix that
// too.
- for (i = 0; i < numservers && equal; i++) {
- ns = cache_info->nameservers;
- equal = 0;
- while(*ns) {
- if (strcmp(*ns, servers[i]) == 0) {
- equal = 1;
+ for (int i = 0; i < numservers; i++) {
+ for (int j = 0 ; ; j++) {
+ if (j >= numservers) {
+ return 0;
+ }
+ if (strcmp(cache_info->nameservers[i], servers[j]) == 0) {
break;
}
- ns++;
}
}
- return equal;
+ return 1;
}
static void
_free_nameservers_locked(struct resolv_cache_info* cache_info)
{
int i;
- for (i = 0; i <= MAXNS; i++) {
+ for (i = 0; i < cache_info->nscount; i++) {
free(cache_info->nameservers[i]);
cache_info->nameservers[i] = NULL;
if (cache_info->nsaddrinfo[i] != NULL) {
freeaddrinfo(cache_info->nsaddrinfo[i]);
cache_info->nsaddrinfo[i] = NULL;
}
+ cache_info->nsstats[i].sample_count =
+ cache_info->nsstats[i].sample_next = 0;
}
+ cache_info->nscount = 0;
+ _res_cache_clear_stats_locked(cache_info);
+ ++cache_info->revision_id;
}
void
@@ -2093,7 +2148,8 @@ _resolv_populate_res_for_net(res_state statp)
statp->nscount = nserv;
// now do search domains. Note that we cache the offsets as this code runs alot
// but the setting/offset-computer only runs when set/changed
- strlcpy(statp->defdname, info->defdname, sizeof(statp->defdname));
+ // WARNING: Don't use str*cpy() here, this string contains zeroes.
+ memcpy(statp->defdname, info->defdname, sizeof(statp->defdname));
register char **pp = statp->dnsrch;
register int *p = info->dnsrch_offset;
while (pp < statp->dnsrch + MAXDNSRCH && *p != -1) {
@@ -2102,3 +2158,132 @@ _resolv_populate_res_for_net(res_state statp)
}
pthread_mutex_unlock(&_res_cache_list_lock);
}
+
+/* Resolver reachability statistics. */
+
+static void
+_res_cache_add_stats_sample_locked(struct __res_stats* stats, const struct __res_sample* sample,
+ int max_samples) {
+ // Note: This function expects max_samples > 0, otherwise a (harmless) modification of the
+ // allocated but supposedly unused memory for samples[0] will happen
+ XLOG("%s: adding sample to stats, next = %d, count = %d", __FUNCTION__,
+ stats->sample_next, stats->sample_count);
+ stats->samples[stats->sample_next] = *sample;
+ if (stats->sample_count < max_samples) {
+ ++stats->sample_count;
+ }
+ if (++stats->sample_next >= max_samples) {
+ stats->sample_next = 0;
+ }
+}
+
+static void
+_res_cache_clear_stats_locked(struct resolv_cache_info* cache_info) {
+ if (cache_info) {
+ for (int i = 0 ; i < MAXNS ; ++i) {
+ cache_info->nsstats->sample_count = cache_info->nsstats->sample_next = 0;
+ }
+ }
+}
+
+int
+android_net_res_stats_get_info_for_net(unsigned netid, int* nscount,
+ struct sockaddr_storage servers[MAXNS], int* dcount, char domains[MAXDNSRCH][MAXDNSRCHPATH],
+ struct __res_params* params, struct __res_stats stats[MAXNS]) {
+ int revision_id = -1;
+ pthread_mutex_lock(&_res_cache_list_lock);
+
+ struct resolv_cache_info* info = _find_cache_info_locked(netid);
+ if (info) {
+ if (info->nscount > MAXNS) {
+ pthread_mutex_unlock(&_res_cache_list_lock);
+ XLOG("%s: nscount %d > MAXNS %d", __FUNCTION__, info->nscount, MAXNS);
+ errno = EFAULT;
+ return -1;
+ }
+ int i;
+ for (i = 0; i < info->nscount; i++) {
+ // Verify that the following assumptions are held, failure indicates corruption:
+ // - getaddrinfo() may never return a sockaddr > sockaddr_storage
+ // - all addresses are valid
+ // - there is only one address per addrinfo thanks to numeric resolution
+ int addrlen = info->nsaddrinfo[i]->ai_addrlen;
+ if (addrlen < (int) sizeof(struct sockaddr) ||
+ addrlen > (int) sizeof(servers[0])) {
+ pthread_mutex_unlock(&_res_cache_list_lock);
+ XLOG("%s: nsaddrinfo[%d].ai_addrlen == %d", __FUNCTION__, i, addrlen);
+ errno = EMSGSIZE;
+ return -1;
+ }
+ if (info->nsaddrinfo[i]->ai_addr == NULL) {
+ pthread_mutex_unlock(&_res_cache_list_lock);
+ XLOG("%s: nsaddrinfo[%d].ai_addr == NULL", __FUNCTION__, i);
+ errno = ENOENT;
+ return -1;
+ }
+ if (info->nsaddrinfo[i]->ai_next != NULL) {
+ pthread_mutex_unlock(&_res_cache_list_lock);
+ XLOG("%s: nsaddrinfo[%d].ai_next != NULL", __FUNCTION__, i);
+ errno = ENOTUNIQ;
+ return -1;
+ }
+ }
+ *nscount = info->nscount;
+ for (i = 0; i < info->nscount; i++) {
+ memcpy(&servers[i], info->nsaddrinfo[i]->ai_addr, info->nsaddrinfo[i]->ai_addrlen);
+ stats[i] = info->nsstats[i];
+ }
+ for (i = 0; i < MAXDNSRCH; i++) {
+ const char* cur_domain = info->defdname + info->dnsrch_offset[i];
+ // dnsrch_offset[i] can either be -1 or point to an empty string to indicate the end
+ // of the search offsets. Checking for < 0 is not strictly necessary, but safer.
+ // TODO: Pass in a search domain array instead of a string to
+ // _resolv_set_nameservers_for_net() and make this double check unnecessary.
+ if (info->dnsrch_offset[i] < 0 ||
+ ((size_t)info->dnsrch_offset[i]) >= sizeof(info->defdname) || !cur_domain[0]) {
+ break;
+ }
+ strlcpy(domains[i], cur_domain, MAXDNSRCHPATH);
+ }
+ *dcount = i;
+ *params = info->params;
+ revision_id = info->revision_id;
+ }
+
+ pthread_mutex_unlock(&_res_cache_list_lock);
+ return revision_id;
+}
+
+int
+_resolv_cache_get_resolver_stats( unsigned netid, struct __res_params* params,
+ struct __res_stats stats[MAXNS]) {
+ int revision_id = -1;
+ pthread_mutex_lock(&_res_cache_list_lock);
+
+ struct resolv_cache_info* info = _find_cache_info_locked(netid);
+ if (info) {
+ memcpy(stats, info->nsstats, sizeof(info->nsstats));
+ *params = info->params;
+ revision_id = info->revision_id;
+ }
+
+ pthread_mutex_unlock(&_res_cache_list_lock);
+ return revision_id;
+}
+
+void
+_resolv_cache_add_resolver_stats_sample( unsigned netid, int revision_id, int ns,
+ const struct __res_sample* sample, int max_samples) {
+ if (max_samples <= 0) return;
+
+ pthread_mutex_lock(&_res_cache_list_lock);
+
+ struct resolv_cache_info* info = _find_cache_info_locked(netid);
+
+ if (info && info->revision_id == revision_id) {
+ _res_cache_add_stats_sample_locked(&info->nsstats[ns], sample, max_samples);
+ }
+
+ pthread_mutex_unlock(&_res_cache_list_lock);
+}
+
diff --git a/libc/dns/resolv/res_send.c b/libc/dns/resolv/res_send.c
index a8da3ac75..1ae675b91 100644
--- a/libc/dns/resolv/res_send.c
+++ b/libc/dns/resolv/res_send.c
@@ -81,9 +81,6 @@ __RCSID("$NetBSD: res_send.c,v 1.9 2006/01/24 17:41:25 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
-/* set to 1 to use our small/simple/limited DNS cache */
-#define USE_RESOLV_CACHE 1
-
/*
* Send query to name server and wait for reply.
*/
@@ -116,9 +113,7 @@ __RCSID("$NetBSD: res_send.c,v 1.9 2006/01/24 17:41:25 christos Exp $");
#include <isc/eventlib.h>
-#if USE_RESOLV_CACHE
-# include <resolv_cache.h>
-#endif
+#include <resolv_cache.h>
#include "private/libc_logging.h"
@@ -133,6 +128,7 @@ __RCSID("$NetBSD: res_send.c,v 1.9 2006/01/24 17:41:25 christos Exp $");
#endif
#include "res_debug.h"
#include "res_private.h"
+#include "resolv_stats.h"
#define EXT(res) ((res)->_u._ext)
#define DBG 0
@@ -144,10 +140,12 @@ static const int highestFD = FD_SETSIZE - 1;
static int get_salen __P((const struct sockaddr *));
static struct sockaddr * get_nsaddr __P((res_state, size_t));
static int send_vc(res_state, const u_char *, int,
- u_char *, int, int *, int);
+ u_char *, int, int *, int,
+ time_t *, int *, int *);
static int send_dg(res_state, const u_char *, int,
u_char *, int, int *, int,
- int *, int *);
+ int *, int *,
+ time_t *, int *, int *);
static void Aerror(const res_state, FILE *, const char *, int,
const struct sockaddr *, int);
static void Perror(const res_state, FILE *, const char *, int);
@@ -359,23 +357,13 @@ res_queriesmatch(const u_char *buf1, const u_char *eom1,
return (1);
}
-
int
res_nsend(res_state statp,
const u_char *buf, int buflen, u_char *ans, int anssiz)
{
int gotsomewhere, terrno, try, v_circuit, resplen, ns, n;
char abuf[NI_MAXHOST];
-#if USE_RESOLV_CACHE
- ResolvCacheStatus cache_status = RESOLV_CACHE_UNSUPPORTED;
-#endif
-
-#if !USE_RESOLV_CACHE
- if (statp->nscount == 0) {
- errno = ESRCH;
- return (-1);
- }
-#endif
+ ResolvCacheStatus cache_status = RESOLV_CACHE_UNSUPPORTED;
if (anssiz < HFIXEDSZ) {
errno = EINVAL;
@@ -387,7 +375,6 @@ res_nsend(res_state statp,
gotsomewhere = 0;
terrno = ETIMEDOUT;
-#if USE_RESOLV_CACHE
int anslen = 0;
cache_status = _resolv_cache_lookup(
statp->netid, buf, buflen,
@@ -400,7 +387,6 @@ res_nsend(res_state statp,
// data so the normal resolve path can do its thing
_resolv_populate_res_for_net(statp);
}
-
if (statp->nscount == 0) {
// We have no nameservers configured, so there's no point trying.
// Tell the cache the query failed, or any retries and anyone else asking the same
@@ -409,7 +395,6 @@ res_nsend(res_state statp,
errno = ESRCH;
return (-1);
}
-#endif
/*
* If the ns_addr_list in the resolver context has changed, then
@@ -420,9 +405,9 @@ res_nsend(res_state statp,
struct sockaddr_storage peer;
socklen_t peerlen;
- if (EXT(statp).nscount != statp->nscount)
+ if (EXT(statp).nscount != statp->nscount) {
needclose++;
- else
+ } else {
for (ns = 0; ns < statp->nscount; ns++) {
if (statp->nsaddr_list[ns].sin_family &&
!sock_eq((struct sockaddr *)(void *)&statp->nsaddr_list[ns],
@@ -445,6 +430,7 @@ res_nsend(res_state statp,
break;
}
}
+ }
if (needclose) {
res_nclose(statp);
EXT(statp).nscount = 0;
@@ -485,7 +471,7 @@ res_nsend(res_state statp,
nstime = EXT(statp).nstimes[0];
for (ns = 0; ns < lastns; ns++) {
if (EXT(statp).ext != NULL)
- EXT(statp).ext->nsaddrs[ns] =
+ EXT(statp).ext->nsaddrs[ns] =
EXT(statp).ext->nsaddrs[ns + 1];
statp->nsaddr_list[ns] = statp->nsaddr_list[ns + 1];
EXT(statp).nssocks[ns] = EXT(statp).nssocks[ns + 1];
@@ -502,13 +488,25 @@ res_nsend(res_state statp,
* Send request, RETRY times, or until successful.
*/
for (try = 0; try < statp->retry; try++) {
+ struct __res_stats stats[MAXNS];
+ struct __res_params params;
+ int revision_id = _resolv_cache_get_resolver_stats(statp->netid, &params, stats);
+ bool usable_servers[MAXNS];
+ android_net_res_stats_get_usable_servers(&params, stats, statp->nscount,
+ usable_servers);
+
for (ns = 0; ns < statp->nscount; ns++) {
+ if (!usable_servers[ns]) continue;
struct sockaddr *nsap;
int nsaplen;
+ time_t now = 0;
+ int rcode = RCODE_INTERNAL_ERROR;
+ int delay = 0;
nsap = get_nsaddr(statp, (size_t)ns);
nsaplen = get_salen(nsap);
statp->_flags &= ~RES_F_LASTMASK;
statp->_flags |= (ns << RES_F_LASTSHIFT);
+
same_ns:
if (statp->qhook) {
int done = 0, loops = 0;
@@ -552,7 +550,19 @@ res_nsend(res_state statp,
try = statp->retry;
n = send_vc(statp, buf, buflen, ans, anssiz, &terrno,
- ns);
+ ns, &now, &rcode, &delay);
+
+ /*
+ * Only record stats the first time we try a query. This ensures that
+ * queries that deterministically fail (e.g., a name that always returns
+ * SERVFAIL or times out) do not unduly affect the stats.
+ */
+ if (try == 0) {
+ struct __res_sample sample;
+ _res_stats_set_sample(&sample, now, rcode, delay);
+ _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id,
+ ns, &sample, params.max_samples);
+ }
if (DBG) {
__libc_format_log(ANDROID_LOG_DEBUG, "libc",
@@ -571,7 +581,16 @@ res_nsend(res_state statp,
}
n = send_dg(statp, buf, buflen, ans, anssiz, &terrno,
- ns, &v_circuit, &gotsomewhere);
+ ns, &v_circuit, &gotsomewhere, &now, &rcode, &delay);
+
+ /* Only record stats the first time we try a query. See above. */
+ if (try == 0) {
+ struct __res_sample sample;
+ _res_stats_set_sample(&sample, now, rcode, delay);
+ _resolv_cache_add_resolver_stats_sample(statp->netid, revision_id,
+ ns, &sample, params.max_samples);
+ }
+
if (DBG) {
__libc_format_log(ANDROID_LOG_DEBUG, "libc", "used send_dg %d\n",n);
}
@@ -582,7 +601,7 @@ res_nsend(res_state statp,
goto next_ns;
if (DBG) {
__libc_format_log(ANDROID_LOG_DEBUG, "libc", "time=%ld\n",
- time(NULL));
+ time(NULL));
}
if (v_circuit)
goto same_ns;
@@ -599,12 +618,10 @@ res_nsend(res_state statp,
(stdout, "%s", ""),
ans, (resplen > anssiz) ? anssiz : resplen);
-#if USE_RESOLV_CACHE
- if (cache_status == RESOLV_CACHE_NOTFOUND) {
- _resolv_cache_add(statp->netid, buf, buflen,
- ans, resplen);
- }
-#endif
+ if (cache_status == RESOLV_CACHE_NOTFOUND) {
+ _resolv_cache_add(statp->netid, buf, buflen,
+ ans, resplen);
+ }
/*
* If we have temporarily opened a virtual circuit,
* or if we haven't been asked to keep a socket open,
@@ -656,15 +673,12 @@ res_nsend(res_state statp,
} else
errno = terrno;
-#if USE_RESOLV_CACHE
- _resolv_cache_query_failed(statp->netid, buf, buflen);
-#endif
+ _resolv_cache_query_failed(statp->netid, buf, buflen);
return (-1);
fail:
-#if USE_RESOLV_CACHE
+
_resolv_cache_query_failed(statp->netid, buf, buflen);
-#endif
res_nclose(statp);
return (-1);
}
@@ -735,8 +749,11 @@ static int get_timeout(const res_state statp, const int ns)
static int
send_vc(res_state statp,
const u_char *buf, int buflen, u_char *ans, int anssiz,
- int *terrno, int ns)
+ int *terrno, int ns, time_t* at, int* rcode, int* delay)
{
+ *at = time(NULL);
+ *rcode = RCODE_INTERNAL_ERROR;
+ *delay = 0;
const HEADER *hp = (const HEADER *)(const void *)buf;
HEADER *anhp = (HEADER *)(void *)ans;
struct sockaddr *nsap;
@@ -758,6 +775,8 @@ send_vc(res_state statp,
same_ns:
truncating = 0;
+ struct timespec now = evNowTime();
+
/* Are we still talking to whom we want to talk to? */
if (statp->_vcsock >= 0 && (statp->_flags & RES_F_VC) != 0) {
struct sockaddr_storage peer;
@@ -800,7 +819,7 @@ send_vc(res_state statp,
}
if (statp->_mark != MARK_UNSET) {
if (setsockopt(statp->_vcsock, SOL_SOCKET,
- SO_MARK, &statp->_mark, sizeof(statp->_mark)) < 0) {
+ SO_MARK, &statp->_mark, sizeof(statp->_mark)) < 0) {
*terrno = errno;
Perror(statp, stderr, "setsockopt", errno);
return -1;
@@ -820,6 +839,15 @@ send_vc(res_state statp,
Aerror(statp, stderr, "connect/vc", errno, nsap,
nsaplen);
res_nclose(statp);
+ /*
+ * The way connect_with_timeout() is implemented prevents us from reliably
+ * determining whether this was really a timeout or e.g. ECONNREFUSED. Since
+ * currently both cases are handled in the same way, there is no need to
+ * change this (yet). If we ever need to reliably distinguish between these
+ * cases, both connect_with_timeout() and retrying_select() need to be
+ * modified, though.
+ */
+ *rcode = RCODE_TIMEOUT;
return (0);
}
statp->_flags |= RES_F_VC;
@@ -900,6 +928,7 @@ send_vc(res_state statp,
res_nclose(statp);
return (0);
}
+
if (truncating) {
/*
* Flush rest of answer so connection stays in synch.
@@ -936,6 +965,11 @@ send_vc(res_state statp,
* All is well, or the error is fatal. Signal that the
* next nameserver ought not be tried.
*/
+ if (resplen > 0) {
+ struct timespec done = evNowTime();
+ *delay = _res_stats_calculate_rtt(&done, &now);
+ *rcode = anhp->rcode;
+ }
return (resplen);
}
@@ -952,8 +986,8 @@ connect_with_timeout(int sock, const struct sockaddr *nsap, socklen_t salen, int
res = __connect(sock, nsap, salen);
if (res < 0 && errno != EINPROGRESS) {
- res = -1;
- goto done;
+ res = -1;
+ goto done;
}
if (res != 0) {
now = evNowTime();
@@ -965,7 +999,7 @@ connect_with_timeout(int sock, const struct sockaddr *nsap, socklen_t salen, int
res = retrying_select(sock, &rset, &wset, &finish);
if (res <= 0) {
- res = -1;
+ res = -1;
}
}
done:
@@ -987,7 +1021,7 @@ retrying_select(const int sock, fd_set *readset, fd_set *writeset, const struct
retry:
if (DBG) {
- __libc_format_log(ANDROID_LOG_DEBUG, "libc", " %d retying_select\n", sock);
+ __libc_format_log(ANDROID_LOG_DEBUG, "libc", " %d retrying_select\n", sock);
}
now = evNowTime();
@@ -1042,17 +1076,20 @@ retry:
return n;
}
-
static int
send_dg(res_state statp,
const u_char *buf, int buflen, u_char *ans, int anssiz,
- int *terrno, int ns, int *v_circuit, int *gotsomewhere)
+ int *terrno, int ns, int *v_circuit, int *gotsomewhere,
+ time_t *at, int *rcode, int* delay)
{
+ *at = time(NULL);
+ *rcode = RCODE_INTERNAL_ERROR;
+ *delay = 0;
const HEADER *hp = (const HEADER *)(const void *)buf;
HEADER *anhp = (HEADER *)(void *)ans;
const struct sockaddr *nsap;
int nsaplen;
- struct timespec now, timeout, finish;
+ struct timespec now, timeout, finish, done;
fd_set dsmask;
struct sockaddr_storage from;
socklen_t fromlen;
@@ -1145,6 +1182,7 @@ retry:
n = retrying_select(s, &dsmask, NULL, &finish);
if (n == 0) {
+ *rcode = RCODE_TIMEOUT;
Dprint(statp->options & RES_DEBUG, (stdout, ";; timeout\n"));
*gotsomewhere = 1;
return (0);
@@ -1239,6 +1277,8 @@ retry:
ans, (resplen > anssiz) ? anssiz : resplen);
goto retry;;
}
+ done = evNowTime();
+ *delay = _res_stats_calculate_rtt(&done, &now);
if (anhp->rcode == SERVFAIL ||
anhp->rcode == NOTIMP ||
anhp->rcode == REFUSED) {
@@ -1247,8 +1287,10 @@ retry:
ans, (resplen > anssiz) ? anssiz : resplen);
res_nclose(statp);
/* don't retry if called from dig */
- if (!statp->pfcode)
+ if (!statp->pfcode) {
+ *rcode = anhp->rcode;
return (0);
+ }
}
if (!(statp->options & RES_IGNTC) && anhp->tc) {
/*
@@ -1265,6 +1307,9 @@ retry:
* All is well, or the error is fatal. Signal that the
* next nameserver ought not be tried.
*/
+ if (resplen > 0) {
+ *rcode = anhp->rcode;
+ }
return (resplen);
}
diff --git a/libc/dns/resolv/res_state.c b/libc/dns/resolv/res_state.c
index afccd9979..0e02a8fb1 100644
--- a/libc/dns/resolv/res_state.c
+++ b/libc/dns/resolv/res_state.c
@@ -128,7 +128,7 @@ _res_thread_get(void)
rt->_pi = (struct prop_info*) __system_property_find("net.change");
if (rt->_pi == NULL) {
/* Still nothing, return current state */
- D("%s: exiting for tid=%d rt=%d since system property not found",
+ D("%s: exiting for tid=%d rt=%p since system property not found",
__FUNCTION__, gettid(), rt);
return rt;
}
diff --git a/libc/dns/resolv/res_stats.c b/libc/dns/resolv/res_stats.c
new file mode 100644
index 000000000..99c79e465
--- /dev/null
+++ b/libc/dns/resolv/res_stats.c
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdbool.h>
+#include <arpa/nameser.h>
+#include <string.h>
+
+#include "resolv_stats.h"
+#include "private/libc_logging.h"
+#include "isc/eventlib.h"
+
+#define DBG 0
+
+/* Calculate the round-trip-time from start time t0 and end time t1. */
+int
+_res_stats_calculate_rtt(const struct timespec* t1, const struct timespec* t0) {
+ // Divide ns by one million to get ms, multiply s by thousand to get ms (obvious)
+ long ms0 = t0->tv_sec * 1000 + t0->tv_nsec / 1000000;
+ long ms1 = t1->tv_sec * 1000 + t1->tv_nsec / 1000000;
+ return (int) (ms1 - ms0);
+}
+
+/* Create a sample for calculating server reachability statistics. */
+void
+_res_stats_set_sample(struct __res_sample* sample, time_t now, int rcode, int rtt)
+{
+ if (DBG) {
+ __libc_format_log(ANDROID_LOG_INFO, "libc", "rcode = %d, sec = %d", rcode, rtt);
+ }
+ sample->at = now;
+ sample->rcode = rcode;
+ sample->rtt = rtt;
+}
+
+/* Clears all stored samples for the given server. */
+void
+_res_stats_clear_samples(struct __res_stats* stats)
+{
+ stats->sample_count = stats->sample_next = 0;
+}
+
+/* Aggregates the reachability statistics for the given server based on on the stored samples. */
+void
+android_net_res_stats_aggregate(struct __res_stats* stats, int* successes, int* errors,
+ int* timeouts, int* internal_errors, int* rtt_avg, time_t* last_sample_time)
+{
+ int s = 0; // successes
+ int e = 0; // errors
+ int t = 0; // timouts
+ int ie = 0; // internal errors
+ long rtt_sum = 0;
+ time_t last = 0;
+ int rtt_count = 0;
+ for (int i = 0 ; i < stats->sample_count ; ++i) {
+ // Treat everything as an error that the code in send_dg() already considers a
+ // rejection by the server, i.e. SERVFAIL, NOTIMP and REFUSED. Assume that NXDOMAIN
+ // and NOTAUTH can actually occur for user queries. NOERROR with empty answer section
+ // is not treated as an error here either. FORMERR seems to sometimes be returned by
+ // some versions of BIND in response to DNSSEC or EDNS0. Whether to treat such responses
+ // as an indication of a broken server is unclear, though. For now treat such responses,
+ // as well as unknown codes as errors.
+ switch (stats->samples[i].rcode) {
+ case NOERROR:
+ case NOTAUTH:
+ case NXDOMAIN:
+ ++s;
+ rtt_sum += stats->samples[i].rtt;
+ ++rtt_count;
+ break;
+ case RCODE_TIMEOUT:
+ ++t;
+ break;
+ case RCODE_INTERNAL_ERROR:
+ ++ie;
+ break;
+ case SERVFAIL:
+ case NOTIMP:
+ case REFUSED:
+ default:
+ ++e;
+ break;
+ }
+ }
+ *successes = s;
+ *errors = e;
+ *timeouts = t;
+ *internal_errors = ie;
+ /* If there was at least one successful sample, calculate average RTT. */
+ if (rtt_count) {
+ *rtt_avg = rtt_sum / rtt_count;
+ } else {
+ *rtt_avg = -1;
+ }
+ /* If we had at least one sample, populate last sample time. */
+ if (stats->sample_count > 0) {
+ if (stats->sample_next > 0) {
+ last = stats->samples[stats->sample_next - 1].at;
+ } else {
+ last = stats->samples[stats->sample_count - 1].at;
+ }
+ }
+ *last_sample_time = last;
+}
+
+bool
+_res_stats_usable_server(const struct __res_params* params, struct __res_stats* stats) {
+ int successes = -1;
+ int errors = -1;
+ int timeouts = -1;
+ int internal_errors = -1;
+ int rtt_avg = -1;
+ time_t last_sample_time = 0;
+ android_net_res_stats_aggregate(stats, &successes, &errors, &timeouts, &internal_errors,
+ &rtt_avg, &last_sample_time);
+ if (successes >= 0 && errors >= 0 && timeouts >= 0) {
+ int total = successes + errors + timeouts;
+ if (DBG) {
+ __libc_format_log(ANDROID_LOG_DEBUG, "libc", "NS stats: S %d + E %d + T %d + I %d "
+ "= %d, rtt = %d, min_samples = %d\n", successes, errors, timeouts, internal_errors,
+ total, rtt_avg, params->min_samples);
+ }
+ if (total >= params->min_samples && (errors > 0 || timeouts > 0)) {
+ int success_rate = successes * 100 / total;
+ if (DBG) {
+ __libc_format_log(ANDROID_LOG_DEBUG, "libc", "success rate %d%%\n", success_rate);
+ }
+ if (success_rate < params->success_threshold) {
+ // evNowTime() is used here instead of time() to stay consistent with the rest of
+ // the code base
+ time_t now = evNowTime().tv_sec;
+ if (now - last_sample_time > params->sample_validity) {
+ // Note: It might be worth considering to expire old servers after their expiry
+ // date has been reached, however the code for returning the ring buffer to its
+ // previous non-circular state would induce additional complexity.
+ if (DBG) {
+ __libc_format_log(ANDROID_LOG_INFO, "libc",
+ "samples stale, retrying server\n");
+ }
+ _res_stats_clear_samples(stats);
+ } else {
+ if (DBG) {
+ __libc_format_log(ANDROID_LOG_INFO, "libc",
+ "too many resolution errors, ignoring server\n");
+ }
+ return 0;
+ }
+ }
+ }
+ }
+ return 1;
+}
+
+void
+android_net_res_stats_get_usable_servers(const struct __res_params* params,
+ struct __res_stats stats[], int nscount, bool usable_servers[]) {
+ unsigned usable_servers_found = 0;
+ for (int ns = 0; ns < nscount; ns++) {
+ bool usable = _res_stats_usable_server(params, &stats[ns]);
+ if (usable) {
+ ++usable_servers_found;
+ }
+ usable_servers[ns] = usable;
+ }
+ // If there are no usable servers, consider all of them usable.
+ // TODO: Explore other possibilities, such as enabling only the best N servers, etc.
+ if (usable_servers_found == 0) {
+ for (int ns = 0; ns < nscount; ns++) {
+ usable_servers[ns] = true;
+ }
+ }
+}
diff --git a/libc/include/android/dlext.h b/libc/include/android/dlext.h
index 40f610f29..aa36f1ecb 100644
--- a/libc/include/android/dlext.h
+++ b/libc/include/android/dlext.h
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2014 The Android Open Source Project
-
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
@@ -80,6 +80,29 @@ enum {
*/
ANDROID_DLEXT_FORCE_FIXED_VADDR = 0x80,
+ /* Instructs dlopen to load the library at the address specified by reserved_addr.
+ *
+ * The difference between ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS and ANDROID_DLEXT_RESERVED_ADDRESS
+ * is that for ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS the linker reserves memory at reserved_addr
+ * whereas for ANDROID_DLEXT_RESERVED_ADDRESS the linker relies on the caller to reserve the memory.
+ *
+ * This flag can be used with ANDROID_DLEXT_FORCE_FIXED_VADDR; when ANDROID_DLEXT_FORCE_FIXED_VADDR
+ * is set and load_bias is not 0 (load_bias is min(p_vaddr) of PT_LOAD segments) this flag is ignored.
+ * This is implemented this way because the linker has to pick one address over the other and this
+ * way is more convenient for art. Note that ANDROID_DLEXT_FORCE_FIXED_VADDR does not generate
+ * an error when min(p_vaddr) is 0.
+ *
+ * Cannot be used with ANDROID_DLEXT_RESERVED_ADDRESS or ANDROID_DLEXT_RESERVED_ADDRESS_HINT.
+ *
+ * This flag is for ART internal use only.
+ */
+ ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS = 0x100,
+
+ /* This flag used to load library in a different namespace. The namespace is
+ * specified in library_namespace.
+ */
+ ANDROID_DLEXT_USE_NAMESPACE = 0x200,
+
/* Mask of valid bits */
ANDROID_DLEXT_VALID_FLAG_BITS = ANDROID_DLEXT_RESERVED_ADDRESS |
ANDROID_DLEXT_RESERVED_ADDRESS_HINT |
@@ -88,9 +111,13 @@ enum {
ANDROID_DLEXT_USE_LIBRARY_FD |
ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET |
ANDROID_DLEXT_FORCE_LOAD |
- ANDROID_DLEXT_FORCE_FIXED_VADDR,
+ ANDROID_DLEXT_FORCE_FIXED_VADDR |
+ ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS |
+ ANDROID_DLEXT_USE_NAMESPACE,
};
+struct android_namespace_t;
+
typedef struct {
uint64_t flags;
void* reserved_addr;
@@ -98,6 +125,7 @@ typedef struct {
int relro_fd;
int library_fd;
off64_t library_fd_offset;
+ struct android_namespace_t* library_namespace;
} android_dlextinfo;
extern void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo);
diff --git a/libc/include/bits/lockf.h b/libc/include/bits/lockf.h
new file mode 100644
index 000000000..d81480716
--- /dev/null
+++ b/libc/include/bits/lockf.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _BITS_LOCKF_H_
+#define _BITS_LOCKF_H_
+
+#include <sys/cdefs.h>
+
+#define F_ULOCK 0
+#define F_LOCK 1
+#define F_TLOCK 2
+#define F_TEST 3
+
+__BEGIN_DECLS
+
+#if defined(__USE_FILE_OFFSET64)
+int lockf(int, int, off_t) __RENAME(lockf64);
+#else
+int lockf(int, int, off_t);
+#endif
+int lockf64(int, int, off64_t);
+
+__END_DECLS
+
+#endif
diff --git a/libc/include/machine/posix_limits.h b/libc/include/bits/posix_limits.h
index 787af5c21..31016a807 100644
--- a/libc/include/machine/posix_limits.h
+++ b/libc/include/bits/posix_limits.h
@@ -26,8 +26,8 @@
* SUCH DAMAGE.
*/
-#ifndef _POSIX_LIMITS_H_
-#define _POSIX_LIMITS_H_
+#ifndef _BITS_POSIX_LIMITS_H_
+#define _BITS_POSIX_LIMITS_H_
/* Any constant values here other than -1 or 200809L are explicitly specified by POSIX.1-2008. */
@@ -154,4 +154,4 @@
#define _XOPEN_SHM -1
#define _XOPEN_UNIX 1
-#endif /* _POSIX_LIMITS_H_ */
+#endif
diff --git a/libc/include/machine/pthread_types.h b/libc/include/bits/pthread_types.h
index 900541c15..6ac1c68f3 100644
--- a/libc/include/machine/pthread_types.h
+++ b/libc/include/bits/pthread_types.h
@@ -26,8 +26,8 @@
* SUCH DAMAGE.
*/
-#ifndef _MACHINE_PTHREAD_TYPES_H_
-#define _MACHINE_PTHREAD_TYPES_H_
+#ifndef _BITS_PTHREAD_TYPES_H_
+#define _BITS_PTHREAD_TYPES_H_
#include <sys/types.h>
@@ -45,4 +45,4 @@ typedef struct {
#endif
} pthread_attr_t;
-#endif /* _MACHINE_PTHREAD_TYPES_H_ */
+#endif
diff --git a/libc/include/machine/timespec.h b/libc/include/bits/timespec.h
index 11779ae43..046d89809 100644
--- a/libc/include/machine/timespec.h
+++ b/libc/include/bits/timespec.h
@@ -26,8 +26,8 @@
* SUCH DAMAGE.
*/
-#ifndef _MACHINE_TIMESPEC_H_
-#define _MACHINE_TIMESPEC_H_
+#ifndef _BITS_TIMESPEC_H_
+#define _BITS_TIMESPEC_H_
#include <sys/types.h>
@@ -43,4 +43,4 @@ struct timespec {
};
#endif
-#endif /* _MACHINE_TIMESPEC_H_ */
+#endif
diff --git a/libc/include/machine/wchar_limits.h b/libc/include/bits/wchar_limits.h
index 94cbd7ec5..f779c1aaa 100644
--- a/libc/include/machine/wchar_limits.h
+++ b/libc/include/bits/wchar_limits.h
@@ -26,8 +26,8 @@
* SUCH DAMAGE.
*/
-#ifndef _MACHINE_WCHAR_LIMITS_H_
-#define _MACHINE_WCHAR_LIMITS_H_
+#ifndef _BITS_WCHAR_LIMITS_H_
+#define _BITS_WCHAR_LIMITS_H_
/* Both GCC and clang define __WCHAR_MAX__. */
#define WCHAR_MAX __WCHAR_MAX__
@@ -39,4 +39,4 @@
# define WCHAR_MIN (-(WCHAR_MAX) - 1)
#endif
-#endif /* _MACHINE_WCHAR_LIMITS_H_ */
+#endif
diff --git a/libc/include/byteswap.h b/libc/include/byteswap.h
index 74b0e9180..628fb7f3e 100644
--- a/libc/include/byteswap.h
+++ b/libc/include/byteswap.h
@@ -28,11 +28,10 @@
#ifndef _BYTESWAP_H_
#define _BYTESWAP_H_
-/* endian.h rather than sys/endian.h so we get the machine-specific file. */
-#include <endian.h>
+#include <sys/endian.h>
-#define bswap_16(x) swap16(x)
-#define bswap_32(x) swap32(x)
-#define bswap_64(x) swap64(x)
+#define bswap_16(x) __swap16(x)
+#define bswap_32(x) __swap32(x)
+#define bswap_64(x) __swap64(x)
#endif /* _BYTESWAP_H_ */
diff --git a/libc/include/dirent.h b/libc/include/dirent.h
index 63716a4b7..3cdfa68e7 100644
--- a/libc/include/dirent.h
+++ b/libc/include/dirent.h
@@ -81,8 +81,13 @@ extern long telldir(DIR*);
extern int dirfd(DIR*);
extern int alphasort(const struct dirent**, const struct dirent**);
extern int alphasort64(const struct dirent64**, const struct dirent64**);
-extern int scandir(const char*, struct dirent***, int (*)(const struct dirent*), int (*)(const struct dirent**, const struct dirent**));
extern int scandir64(const char*, struct dirent64***, int (*)(const struct dirent64*), int (*)(const struct dirent64**, const struct dirent64**));
+extern int scandir(const char*, struct dirent***, int (*)(const struct dirent*), int (*)(const struct dirent**, const struct dirent**));
+
+#if defined(__USE_GNU)
+int scandirat64(int, const char*, struct dirent64***, int (*)(const struct dirent64*), int (*)(const struct dirent64**, const struct dirent64**));
+int scandirat(int, const char*, struct dirent***, int (*)(const struct dirent*), int (*)(const struct dirent**, const struct dirent**));
+#endif
__END_DECLS
diff --git a/libc/include/dlfcn.h b/libc/include/dlfcn.h
index afa76878f..c2e89802e 100644
--- a/libc/include/dlfcn.h
+++ b/libc/include/dlfcn.h
@@ -43,11 +43,12 @@ typedef struct {
in dli_sname */
} Dl_info;
-extern void* dlopen(const char* filename, int flag);
-extern int dlclose(void* handle);
-extern const char* dlerror(void);
-extern void* dlsym(void* handle, const char* symbol);
-extern int dladdr(const void* addr, Dl_info *info);
+extern void* dlopen(const char* filename, int flag);
+extern int dlclose(void* handle);
+extern const char* dlerror(void);
+extern void* dlsym(void* handle, const char* symbol) __nonnull((2));
+extern void* dlvsym(void* handle, const char* symbol, const char* version) __nonnull((2, 3));
+extern int dladdr(const void* addr, Dl_info *info);
enum {
#if defined(__LP64__)
diff --git a/libc/include/fcntl.h b/libc/include/fcntl.h
index 0f016d718..6e2ad5165 100644
--- a/libc/include/fcntl.h
+++ b/libc/include/fcntl.h
@@ -36,6 +36,10 @@
#include <linux/stat.h>
#include <linux/uio.h>
+#if defined(__USE_GNU) || defined(__USE_BSD)
+#include <bits/lockf.h>
+#endif
+
__BEGIN_DECLS
#ifdef __LP64__
diff --git a/libc/include/ifaddrs.h b/libc/include/ifaddrs.h
new file mode 100644
index 000000000..54a5a2c59
--- /dev/null
+++ b/libc/include/ifaddrs.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _IFADDRS_H_
+#define _IFADDRS_H_
+
+#include <sys/cdefs.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+__BEGIN_DECLS
+
+struct ifaddrs {
+ struct ifaddrs* ifa_next;
+ char* ifa_name;
+ unsigned int ifa_flags;
+ struct sockaddr* ifa_addr;
+ struct sockaddr* ifa_netmask;
+ union {
+ struct sockaddr* ifu_broadaddr;
+ struct sockaddr* ifu_dstaddr;
+ } ifa_ifu;
+ void* ifa_data;
+};
+
+#define ifa_broadaddr ifa_ifu.ifu_broadaddr
+#define ifa_dstaddr ifa_ifu.ifu_dstaddr
+
+void freeifaddrs(struct ifaddrs*);
+int getifaddrs(struct ifaddrs**);
+
+__END_DECLS
+
+#endif
diff --git a/libc/include/libgen.h b/libc/include/libgen.h
index e89328e9f..4d22d15d1 100644
--- a/libc/include/libgen.h
+++ b/libc/include/libgen.h
@@ -32,18 +32,19 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+
__BEGIN_DECLS
-#if !defined(__bionic_using_gnu_basename)
/*
- * <string.h> gets you the GNU basename.
- * <libgen.h> the POSIX one.
- * Note that our "POSIX" one has the wrong argument cv-qualifiers, but doesn't
- * modify its input and uses thread-local storage for the result if necessary.
+ * Including <string.h> will get you the GNU basename, unless <libgen.h> is
+ * included, either before or after including <string.h>.
+ *
+ * Note that this has the wrong argument cv-qualifiers, but doesn't modify its
+ * input and uses thread-local storage for the result if necessary.
*/
-extern char* basename(const char*);
-#define __bionic_using_posix_basename
-#endif
+extern char* __posix_basename(const char*) __RENAME(basename);
+
+#define basename __posix_basename
/* This has the wrong argument cv-qualifiers, but doesn't modify its input and uses thread-local storage for the result if necessary. */
extern char* dirname(const char*);
diff --git a/libc/include/limits.h b/libc/include/limits.h
index 6ae629be7..342217b8e 100644
--- a/libc/include/limits.h
+++ b/libc/include/limits.h
@@ -81,21 +81,10 @@
#define MB_LEN_MAX 4
-/* New code should use sysconf(_SC_PAGE_SIZE) instead. */
-#ifndef PAGE_SIZE
-#define PAGE_SIZE 4096
-#endif
-#ifndef PAGESIZE
-#define PAGESIZE PAGE_SIZE
-#endif
-
-/* glibc's PAGE_MASK is the bitwise negation of BSD's! TODO: remove? */
-#define PAGE_MASK (~(PAGE_SIZE - 1))
-
#define SEM_VALUE_MAX 0x3fffffff
/* POSIX says these belong in <unistd.h> but BSD has some in <limits.h>. */
-#include <machine/posix_limits.h>
+#include <bits/posix_limits.h>
#define HOST_NAME_MAX _POSIX_HOST_NAME_MAX
#endif /* !_LIMITS_H_ */
diff --git a/libc/include/malloc.h b/libc/include/malloc.h
index cb1dd3bcf..87555a96b 100644
--- a/libc/include/malloc.h
+++ b/libc/include/malloc.h
@@ -17,11 +17,6 @@
#ifndef LIBC_INCLUDE_MALLOC_H_
#define LIBC_INCLUDE_MALLOC_H_
-/*
- * Declaration of malloc routines. Bionic uses dlmalloc (see
- * upstream-dlmalloc) but doesn't directly include it here to keep the
- * defined malloc.h interface small.
- */
#include <sys/cdefs.h>
#include <stddef.h>
#include <stdio.h>
diff --git a/libc/include/net/if.h b/libc/include/net/if.h
index 0efbf7fc7..aa4c19eed 100644
--- a/libc/include/net/if.h
+++ b/libc/include/net/if.h
@@ -39,11 +39,15 @@
__BEGIN_DECLS
-/*
- * Map an interface name into its corresponding index.
- */
-extern unsigned int if_nametoindex(const char *);
-extern char* if_indextoname(unsigned ifindex, char *ifname);
+struct if_nameindex {
+ unsigned if_index;
+ char* if_name;
+};
+
+char* if_indextoname(unsigned, char*);
+unsigned if_nametoindex(const char*);
+struct if_nameindex* if_nameindex(void);
+void if_freenameindex(struct if_nameindex*);
__END_DECLS
diff --git a/libc/include/netinet/in.h b/libc/include/netinet/in.h
index 44c7fc1a6..5f3d11f72 100644
--- a/libc/include/netinet/in.h
+++ b/libc/include/netinet/in.h
@@ -47,10 +47,10 @@ __BEGIN_DECLS
typedef uint16_t in_port_t;
typedef uint32_t in_addr_t;
-extern int bindresvport (int sd, struct sockaddr_in *sin);
+int bindresvport(int, struct sockaddr_in*);
-static const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
-static const struct in6_addr in6addr_loopback = IN6ADDR_LOOPBACK_INIT;
+extern const struct in6_addr in6addr_any;
+extern const struct in6_addr in6addr_loopback;
__END_DECLS
diff --git a/libc/include/netinet/in6.h b/libc/include/netinet/in6.h
index 7f3286ae9..879ac7536 100644
--- a/libc/include/netinet/in6.h
+++ b/libc/include/netinet/in6.h
@@ -25,48 +25,47 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
#ifndef _NETINET_IN6_H
#define _NETINET_IN6_H
#include <linux/in6.h>
-#define IN6_IS_ADDR_UNSPECIFIED(a) \
- ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) == 0))
+#define IN6_IS_ADDR_UNSPECIFIED(a) \
+ ((*(const uint32_t*)(&(a)->s6_addr[0]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[4]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[8]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[12]) == 0))
-#define IN6_IS_ADDR_LOOPBACK(a) \
- ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1)))
+#define IN6_IS_ADDR_LOOPBACK(a) \
+ ((*(const uint32_t*)(&(a)->s6_addr[0]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[4]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[8]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[12]) == ntohl(1)))
-#define IN6_IS_ADDR_V4COMPAT(a) \
- ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) != 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[12]) != ntohl(1)))
+#define IN6_IS_ADDR_V4COMPAT(a) \
+ ((*(const uint32_t*)(&(a)->s6_addr[0]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[4]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[8]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[12]) != 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[12]) != ntohl(1)))
-#define IN6_IS_ADDR_V4MAPPED(a) \
- ((*(const uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
- (*(const uint32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
+#define IN6_IS_ADDR_V4MAPPED(a) \
+ ((*(const uint32_t*)(&(a)->s6_addr[0]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[4]) == 0) && \
+ (*(const uint32_t*)(&(a)->s6_addr[8]) == ntohl(0x0000ffff)))
-#define IN6_IS_ADDR_LINKLOCAL(a) \
- (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
+#define __bionic_s6_addr(a) ((const uint8_t*)(a))
-#define IN6_IS_ADDR_SITELOCAL(a) \
- (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
+#define IN6_IS_ADDR_LINKLOCAL(a) \
+ ((__bionic_s6_addr(a)[0] == 0xfe) && ((__bionic_s6_addr(a)[1] & 0xc0) == 0x80))
-/* RFC 4193. */
-#define IN6_IS_ADDR_ULA(a) \
- (((a)->s6_addr[0] & 0xfe) == 0xfc)
+#define IN6_IS_ADDR_SITELOCAL(a) \
+ ((__bionic_s6_addr(a)[0] == 0xfe) && ((__bionic_s6_addr(a)[1] & 0xc0) == 0xc0))
-#define IN6_IS_ADDR_MULTICAST(a) \
- (((__const uint8_t *) (a))[0] == 0xff)
+#define IN6_IS_ADDR_MULTICAST(a) (__bionic_s6_addr(a)[0] == 0xff)
+#define IN6_IS_ADDR_ULA(a) ((__bionic_s6_addr(a)[0] & 0xfe) == 0xfc)
#define IPV6_ADDR_SCOPE_NODELOCAL 0x01
#define IPV6_ADDR_SCOPE_INTFACELOCAL 0x01
@@ -75,27 +74,21 @@
#define IPV6_ADDR_SCOPE_ORGLOCAL 0x08
#define IPV6_ADDR_SCOPE_GLOBAL 0x0e
-#define IPV6_ADDR_MC_SCOPE(a) \
- ((a)->s6_addr[1] & 0x0f)
-
-#define IN6_IS_ADDR_MC_NODELOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
-#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
-#define IN6_IS_ADDR_MC_SITELOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
-#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
-#define IN6_IS_ADDR_MC_GLOBAL(a) \
- (IN6_IS_ADDR_MULTICAST(a) && \
- (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
-
-#define IN6_ARE_ADDR_EQUAL(a, b) \
- (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
+#define IPV6_ADDR_MC_SCOPE(a) (__bionic_s6_addr(a)[1] & 0x0f)
+
+#define IN6_IS_ADDR_MC_NODELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_NODELOCAL))
+#define IN6_IS_ADDR_MC_LINKLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_LINKLOCAL))
+#define IN6_IS_ADDR_MC_SITELOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_SITELOCAL))
+#define IN6_IS_ADDR_MC_ORGLOCAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_ORGLOCAL))
+#define IN6_IS_ADDR_MC_GLOBAL(a) \
+ (IN6_IS_ADDR_MULTICAST(a) && (IPV6_ADDR_MC_SCOPE(a) == IPV6_ADDR_SCOPE_GLOBAL))
+
+#define IN6_ARE_ADDR_EQUAL(a, b) \
+ (memcmp(&(a)->s6_addr[0], &(b)->s6_addr[0], sizeof(struct in6_addr)) == 0)
#define INET6_ADDRSTRLEN 46
@@ -107,5 +100,4 @@
#define ipv6mr_interface ipv6mr_ifindex
-
#endif /* _NETINET_IN6_H */
diff --git a/libc/include/netinet/udp.h b/libc/include/netinet/udp.h
index 25e0dfca9..d4eb36806 100644
--- a/libc/include/netinet/udp.h
+++ b/libc/include/netinet/udp.h
@@ -25,31 +25,29 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
#ifndef _NETINET_UDP_H
#define _NETINET_UDP_H
-/*
- * We would include linux/udp.h, but it brings in too much other stuff
- */
-
-#ifdef __FAVOR_BSD
+#include <sys/types.h>
-struct udphdr {
- u_int16_t uh_sport; /* source port */
- u_int16_t uh_dport; /* destination port */
- u_int16_t uh_ulen; /* udp length */
- u_int16_t uh_sum; /* udp checksum */
-};
-
-#else
+#include <linux/udp.h>
struct udphdr {
- __u16 source;
- __u16 dest;
- __u16 len;
- __u16 check;
+ __extension__ union {
+ struct /* BSD names */ {
+ u_int16_t uh_sport;
+ u_int16_t uh_dport;
+ u_int16_t uh_ulen;
+ u_int16_t uh_sum;
+ };
+ struct /* Linux names */ {
+ u_int16_t source;
+ u_int16_t dest;
+ u_int16_t len;
+ u_int16_t check;
+ };
+ };
};
-#endif /* __FAVOR_BSD */
-
#endif /* _NETINET_UDP_H */
diff --git a/libc/include/pthread.h b/libc/include/pthread.h
index 260ae5b87..50f202457 100644
--- a/libc/include/pthread.h
+++ b/libc/include/pthread.h
@@ -30,7 +30,7 @@
#define _PTHREAD_H_
#include <limits.h>
-#include <machine/pthread_types.h>
+#include <bits/pthread_types.h>
#include <sched.h>
#include <sys/cdefs.h>
#include <sys/types.h>
@@ -96,6 +96,26 @@ typedef int pthread_once_t;
#define PTHREAD_ONCE_INIT 0
+typedef struct {
+#if defined(__LP64__)
+ int64_t __private[4];
+#else
+ int32_t __private[8];
+#endif
+} pthread_barrier_t;
+
+typedef int pthread_barrierattr_t;
+
+#define PTHREAD_BARRIER_SERIAL_THREAD -1
+
+typedef struct {
+#if defined(__LP64__)
+ int64_t __private;
+#else
+ int32_t __private[2];
+#endif
+} pthread_spinlock_t;
+
#if defined(__LP64__)
#define PTHREAD_STACK_MIN (4 * PAGE_SIZE)
#else
@@ -130,7 +150,7 @@ int pthread_attr_setschedparam(pthread_attr_t*, const struct sched_param*) __non
int pthread_attr_setschedpolicy(pthread_attr_t*, int) __nonnull((1));
int pthread_attr_setscope(pthread_attr_t*, int) __nonnull((1));
int pthread_attr_setstack(pthread_attr_t*, void*, size_t) __nonnull((1));
-int pthread_attr_setstacksize(pthread_attr_t*, size_t stack_size) __nonnull((1));
+int pthread_attr_setstacksize(pthread_attr_t*, size_t) __nonnull((1));
int pthread_condattr_destroy(pthread_condattr_t*) __nonnull((1));
int pthread_condattr_getclock(const pthread_condattr_t*, clockid_t*) __nonnull((1, 2));
@@ -205,9 +225,24 @@ int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const struct timespec*) __nonn
int pthread_rwlock_timedwrlock(pthread_rwlock_t*, const struct timespec*) __nonnull((1, 2));
int pthread_rwlock_tryrdlock(pthread_rwlock_t*) __nonnull((1));
int pthread_rwlock_trywrlock(pthread_rwlock_t*) __nonnull((1));
-int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) __nonnull((1));
+int pthread_rwlock_unlock(pthread_rwlock_t *) __nonnull((1));
int pthread_rwlock_wrlock(pthread_rwlock_t*) __nonnull((1));
+int pthread_barrierattr_init(pthread_barrierattr_t* attr) __nonnull((1));
+int pthread_barrierattr_destroy(pthread_barrierattr_t* attr) __nonnull((1));
+int pthread_barrierattr_getpshared(pthread_barrierattr_t* attr, int* pshared) __nonnull((1, 2));
+int pthread_barrierattr_setpshared(pthread_barrierattr_t* attr, int pshared) __nonnull((1));
+
+int pthread_barrier_init(pthread_barrier_t*, const pthread_barrierattr_t*, unsigned) __nonnull((1));
+int pthread_barrier_destroy(pthread_barrier_t*) __nonnull((1));
+int pthread_barrier_wait(pthread_barrier_t*) __nonnull((1));
+
+int pthread_spin_destroy(pthread_spinlock_t*) __nonnull((1));
+int pthread_spin_init(pthread_spinlock_t*, int) __nonnull((1));
+int pthread_spin_lock(pthread_spinlock_t*) __nonnull((1));
+int pthread_spin_trylock(pthread_spinlock_t*) __nonnull((1));
+int pthread_spin_unlock(pthread_spinlock_t*) __nonnull((1));
+
pthread_t pthread_self(void) __pure2;
int pthread_setname_np(pthread_t, const char*) __nonnull((2));
diff --git a/libc/include/pwd.h b/libc/include/pwd.h
index 6012b9658..905bc756c 100644
--- a/libc/include/pwd.h
+++ b/libc/include/pwd.h
@@ -106,6 +106,9 @@ struct passwd
gid_t pw_gid;
#ifdef __LP64__
char* pw_gecos;
+#else
+ // Note: On LP32, we define pw_gecos to pw_passwd since they're both NULL.
+# define pw_gecos pw_passwd
#endif
char* pw_dir;
char* pw_shell;
diff --git a/libc/include/regex.h b/libc/include/regex.h
index aec38e334..b06a515b4 100644
--- a/libc/include/regex.h
+++ b/libc/include/regex.h
@@ -42,8 +42,9 @@
#include <sys/cdefs.h>
#include <sys/types.h>
-/* types */
-typedef off_t regoff_t;
+/* POSIX says regoff_t is at least as large as the larger of ptrdiff_t and
+ * ssize_t. BSD uses off_t, but that interacts badly with _FILE_OFFSET_BITS. */
+typedef ssize_t regoff_t;
typedef struct {
int re_magic;
diff --git a/libc/include/sched.h b/libc/include/sched.h
index 930dd7c85..0b9235b56 100644
--- a/libc/include/sched.h
+++ b/libc/include/sched.h
@@ -28,8 +28,8 @@
#ifndef _SCHED_H_
#define _SCHED_H_
+#include <bits/timespec.h>
#include <linux/sched.h>
-#include <machine/timespec.h>
#include <sys/cdefs.h>
__BEGIN_DECLS
diff --git a/libc/include/signal.h b/libc/include/signal.h
index 554e0ac71..85c46c017 100644
--- a/libc/include/signal.h
+++ b/libc/include/signal.h
@@ -30,9 +30,9 @@
#define _SIGNAL_H_
#include <asm/sigcontext.h>
+#include <bits/pthread_types.h>
+#include <bits/timespec.h>
#include <limits.h>
-#include <machine/pthread_types.h>
-#include <machine/timespec.h>
#include <sys/cdefs.h>
#include <sys/types.h>
@@ -105,15 +105,15 @@ struct sigaction {
extern int sigaction(int, const struct sigaction*, struct sigaction*);
-_BIONIC_NOT_BEFORE_21(extern sighandler_t signal(int, sighandler_t);)
+extern sighandler_t signal(int, sighandler_t) __INTRODUCED_IN(21);
extern int siginterrupt(int, int);
-_BIONIC_NOT_BEFORE_21(extern int sigaddset(sigset_t*, int);)
-_BIONIC_NOT_BEFORE_21(extern int sigdelset(sigset_t*, int);)
-_BIONIC_NOT_BEFORE_21(extern int sigemptyset(sigset_t*);)
-_BIONIC_NOT_BEFORE_21(extern int sigfillset(sigset_t*);)
-_BIONIC_NOT_BEFORE_21(extern int sigismember(const sigset_t*, int);)
+extern int sigaddset(sigset_t*, int) __INTRODUCED_IN(21);
+extern int sigdelset(sigset_t*, int) __INTRODUCED_IN(21);
+extern int sigemptyset(sigset_t*) __INTRODUCED_IN(21);
+extern int sigfillset(sigset_t*) __INTRODUCED_IN(21);
+extern int sigismember(const sigset_t*, int) __INTRODUCED_IN(21);
extern int sigpending(sigset_t*) __nonnull((1));
extern int sigprocmask(int, const sigset_t*, sigset_t*);
diff --git a/libc/include/stdint.h b/libc/include/stdint.h
index a6f8505f4..a66e21ef1 100644
--- a/libc/include/stdint.h
+++ b/libc/include/stdint.h
@@ -29,8 +29,8 @@
#ifndef _STDINT_H
#define _STDINT_H
+#include <bits/wchar_limits.h>
#include <stddef.h>
-#include <machine/wchar_limits.h>
typedef __signed char __int8_t;
typedef unsigned char __uint8_t;
diff --git a/libc/include/stdio.h b/libc/include/stdio.h
index f5ed65278..623995b29 100644
--- a/libc/include/stdio.h
+++ b/libc/include/stdio.h
@@ -38,14 +38,6 @@
#ifndef _STDIO_H_
#define _STDIO_H_
-/*
- * This file must contain a reference to __gnuc_va_list so that GCC's
- * fixincludes knows that that's what's being used for va_list, and so
- * to leave our <stdio.h> alone. (fixincludes gets in the way of pointing
- * one toolchain at various different sets of platform headers.)
- * If you alter this comment, be sure to keep "__gnuc_va_list" in it!
- */
-
#include <sys/cdefs.h>
#include <sys/types.h>
@@ -57,96 +49,12 @@
__BEGIN_DECLS
-typedef off_t fpos_t; /* stdio file position type */
+typedef off_t fpos_t;
+typedef off64_t fpos64_t;
-/*
- * NB: to fit things in six character monocase externals, the stdio
- * code uses the prefix `__s' for stdio objects, typically followed
- * by a three-character attempt at a mnemonic.
- */
-
-/* stdio buffers */
-#if defined(__LP64__)
-struct __sbuf {
- unsigned char* _base;
- size_t _size;
-};
-#else
-struct __sbuf {
- unsigned char *_base;
- int _size;
-};
-#endif
+struct __sFILE;
+typedef struct __sFILE FILE;
-/*
- * stdio state variables.
- *
- * The following always hold:
- *
- * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
- * _lbfsize is -_bf._size, else _lbfsize is 0
- * if _flags&__SRD, _w is 0
- * if _flags&__SWR, _r is 0
- *
- * This ensures that the getc and putc macros (or inline functions) never
- * try to write or read from a file that is in `read' or `write' mode.
- * (Moreover, they can, and do, automatically switch from read mode to
- * write mode, and back, on "r+" and "w+" files.)
- *
- * _lbfsize is used only to make the inline line-buffered output stream
- * code as compact as possible.
- *
- * _ub, _up, and _ur are used when ungetc() pushes back more characters
- * than fit in the current _bf, or when ungetc() pushes back a character
- * that does not match the previous one in _bf. When this happens,
- * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
- * _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
- *
- * NOTE: if you change this structure, you also need to update the
- * std() initializer in findfp.c.
- */
-typedef struct __sFILE {
- unsigned char *_p; /* current position in (some) buffer */
- int _r; /* read space left for getc() */
- int _w; /* write space left for putc() */
-#if defined(__LP64__)
- int _flags; /* flags, below; this FILE is free if 0 */
- int _file; /* fileno, if Unix descriptor, else -1 */
-#else
- short _flags; /* flags, below; this FILE is free if 0 */
- short _file; /* fileno, if Unix descriptor, else -1 */
-#endif
- struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
- int _lbfsize; /* 0 or -_bf._size, for inline putc */
-
- /* operations */
- void *_cookie; /* cookie passed to io functions */
- int (*_close)(void *);
- int (*_read)(void *, char *, int);
- fpos_t (*_seek)(void *, fpos_t, int);
- int (*_write)(void *, const char *, int);
-
- /* extension data, to avoid further ABI breakage */
- struct __sbuf _ext;
- /* data for long sequences of ungetc() */
- unsigned char *_up; /* saved _p when _p is doing ungetc data */
- int _ur; /* saved _r when _r is counting ungetc data */
-
- /* tricks to meet minimum requirements even when malloc() fails */
- unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */
- unsigned char _nbuf[1]; /* guarantee a getc() buffer */
-
- /* separate buffer for fgetln() when line crosses buffer boundary */
- struct __sbuf _lb; /* buffer for fgetln() */
-
- /* Unix stdio files get aligned to block boundaries on fseek() */
- int _blksize; /* stat.st_blksize (may be != _bf._size) */
- fpos_t _offset; /* current lseek offset */
-} FILE;
-
-/* Legacy BSD implementation of stdin/stdout/stderr. */
-extern FILE __sF[];
-/* More obvious implementation. */
extern FILE* stdin;
extern FILE* stdout;
extern FILE* stderr;
@@ -155,24 +63,6 @@ extern FILE* stderr;
#define stdout stdout
#define stderr stderr
-#define __SLBF 0x0001 /* line buffered */
-#define __SNBF 0x0002 /* unbuffered */
-#define __SRD 0x0004 /* OK to read */
-#define __SWR 0x0008 /* OK to write */
- /* RD and WR are never simultaneously asserted */
-#define __SRW 0x0010 /* open for reading & writing */
-#define __SEOF 0x0020 /* found EOF */
-#define __SERR 0x0040 /* found error */
-#define __SMBF 0x0080 /* _buf is from malloc */
-#define __SAPP 0x0100 /* fdopen()ed in append mode */
-#define __SSTR 0x0200 /* this is an sprintf/snprintf string */
-#define __SOPT 0x0400 /* do fseek() optimization */
-#define __SNPT 0x0800 /* do not do fseek() optimization */
-#define __SOFF 0x1000 /* set iff _offset is in fact correct */
-#define __SMOD 0x2000 /* true => fgetln modified _p text */
-#define __SALC 0x4000 /* allocate string space dynamically */
-#define __SIGN 0x8000 /* ignore this file in _fwalk */
-
/*
* The following three definitions are for ANSI C, which took them
* from System V, which brilliantly took internal interface macros and
@@ -219,18 +109,13 @@ int ferror(FILE *);
int fflush(FILE *);
int fgetc(FILE *);
char *fgets(char * __restrict, int, FILE * __restrict);
-FILE *fopen(const char * __restrict , const char * __restrict);
int fprintf(FILE * __restrict , const char * __restrict, ...)
__printflike(2, 3);
int fputc(int, FILE *);
int fputs(const char * __restrict, FILE * __restrict);
size_t fread(void * __restrict, size_t, size_t, FILE * __restrict);
-FILE *freopen(const char * __restrict, const char * __restrict,
- FILE * __restrict);
int fscanf(FILE * __restrict, const char * __restrict, ...)
__scanflike(2, 3);
-int fseek(FILE *, long, int);
-long ftell(FILE *);
size_t fwrite(const void * __restrict, size_t, size_t, FILE * __restrict);
int getc(FILE *);
int getchar(void);
@@ -252,7 +137,6 @@ void setbuf(FILE * __restrict, char * __restrict);
int setvbuf(FILE * __restrict, char * __restrict, int, size_t);
int sscanf(const char * __restrict, const char * __restrict, ...)
__scanflike(2, 3);
-FILE *tmpfile(void);
int ungetc(int, FILE *);
int vfprintf(FILE * __restrict, const char * __restrict, __va_list)
__printflike(2, 0);
@@ -277,25 +161,55 @@ char* tempnam(const char*, const char*)
#endif
#endif
-extern int rename(const char*, const char*);
-extern int renameat(int, const char*, int, const char*);
+int rename(const char*, const char*);
+int renameat(int, const char*, int, const char*);
+
+int fseek(FILE*, long, int);
+long ftell(FILE*);
#if defined(__USE_FILE_OFFSET64)
-/* Not possible. */
-int fgetpos(FILE * __restrict, fpos_t * __restrict)
- __attribute__((__error__("not available with _FILE_OFFSET_BITS=64")));
-int fsetpos(FILE *, const fpos_t *)
- __attribute__((__error__("not available with _FILE_OFFSET_BITS=64")));
-int fseeko(FILE *, off_t, int)
- __attribute__((__error__("not available with _FILE_OFFSET_BITS=64")));
-off_t ftello(FILE *)
- __attribute__((__error__("not available with _FILE_OFFSET_BITS=64")));
+int fgetpos(FILE*, fpos_t*) __RENAME(fgetpos64);
+int fsetpos(FILE*, const fpos_t*) __RENAME(fsetpos64);
+int fseeko(FILE*, off_t, int) __RENAME(fseeko64);
+off_t ftello(FILE*) __RENAME(ftello64);
+# if defined(__USE_BSD)
+FILE* funopen(const void*,
+ int (*)(void*, char*, int),
+ int (*)(void*, const char*, int),
+ fpos_t (*)(void*, fpos_t, int),
+ int (*)(void*)) __RENAME(funopen64);
+# endif
#else
-int fgetpos(FILE * __restrict, fpos_t * __restrict);
-int fsetpos(FILE *, const fpos_t *);
-int fseeko(FILE *, off_t, int);
-off_t ftello(FILE *);
+int fgetpos(FILE*, fpos_t*);
+int fsetpos(FILE*, const fpos_t*);
+int fseeko(FILE*, off_t, int);
+off_t ftello(FILE*);
+# if defined(__USE_BSD)
+FILE* funopen(const void*,
+ int (*)(void*, char*, int),
+ int (*)(void*, const char*, int),
+ fpos_t (*)(void*, fpos_t, int),
+ int (*)(void*));
+# endif
#endif
+int fgetpos64(FILE*, fpos64_t*);
+int fsetpos64(FILE*, const fpos64_t*);
+int fseeko64(FILE*, off64_t, int);
+off64_t ftello64(FILE*);
+#if defined(__USE_BSD)
+FILE* funopen64(const void*,
+ int (*)(void*, char*, int),
+ int (*)(void*, const char*, int),
+ fpos64_t (*)(void*, fpos64_t, int),
+ int (*)(void*));
+#endif
+
+FILE* fopen(const char* __restrict, const char* __restrict);
+FILE* fopen64(const char* __restrict, const char* __restrict);
+FILE* freopen(const char* __restrict, const char* __restrict, FILE* __restrict);
+FILE* freopen64(const char* __restrict, const char* __restrict, FILE* __restrict);
+FILE* tmpfile(void);
+FILE* tmpfile64(void);
#if __ISO_C_VISIBLE >= 1999 || __BSD_VISIBLE
int snprintf(char * __restrict, size_t, const char * __restrict, ...)
@@ -363,18 +277,10 @@ int vasprintf(char ** __restrict, const char * __restrict,
void clearerr_unlocked(FILE*);
int feof_unlocked(FILE*);
int ferror_unlocked(FILE*);
+int fileno_unlocked(FILE*);
-/*
- * Stdio function-access interface.
- */
-FILE *funopen(const void *,
- int (*)(void *, char *, int),
- int (*)(void *, const char *, int),
- fpos_t (*)(void *, fpos_t, int),
- int (*)(void *));
-
-#define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
-#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
+#define fropen(cookie, fn) funopen(cookie, fn, 0, 0, 0)
+#define fwopen(cookie, fn) funopen(cookie, 0, fn, 0, 0)
#endif /* __BSD_VISIBLE */
extern char* __fgets_chk(char*, int, FILE*, size_t);
@@ -382,6 +288,16 @@ extern char* __fgets_real(char*, int, FILE*) __RENAME(fgets);
__errordecl(__fgets_too_big_error, "fgets called with size bigger than buffer");
__errordecl(__fgets_too_small_error, "fgets called with size less than zero");
+extern size_t __fread_chk(void * __restrict, size_t, size_t, FILE * __restrict, size_t);
+extern size_t __fread_real(void * __restrict, size_t, size_t, FILE * __restrict) __RENAME(fread);
+__errordecl(__fread_too_big_error, "fread called with size * count bigger than buffer");
+__errordecl(__fread_overflow, "fread called with overflowing size * count");
+
+extern size_t __fwrite_chk(const void * __restrict, size_t, size_t, FILE * __restrict, size_t);
+extern size_t __fwrite_real(const void * __restrict, size_t, size_t, FILE * __restrict) __RENAME(fwrite);
+__errordecl(__fwrite_too_big_error, "fwrite called with size * count bigger than buffer");
+__errordecl(__fwrite_overflow, "fwrite called with overflowing size * count");
+
#if defined(__BIONIC_FORTIFY)
__BIONIC_FORTIFY_INLINE
@@ -428,6 +344,58 @@ int sprintf(char *dest, const char *format, ...)
}
#endif
+__BIONIC_FORTIFY_INLINE
+size_t fread(void * __restrict buf, size_t size, size_t count, FILE * __restrict stream) {
+ size_t bos = __bos0(buf);
+
+#if !defined(__clang__)
+ if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
+ return __fread_real(buf, size, count, stream);
+ }
+
+ if (__builtin_constant_p(size) && __builtin_constant_p(count)) {
+ size_t total;
+ if (__size_mul_overflow(size, count, &total)) {
+ __fread_overflow();
+ }
+
+ if (total > bos) {
+ __fread_too_big_error();
+ }
+
+ return __fread_real(buf, size, count, stream);
+ }
+#endif
+
+ return __fread_chk(buf, size, count, stream, bos);
+}
+
+__BIONIC_FORTIFY_INLINE
+size_t fwrite(const void * __restrict buf, size_t size, size_t count, FILE * __restrict stream) {
+ size_t bos = __bos0(buf);
+
+#if !defined(__clang__)
+ if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
+ return __fwrite_real(buf, size, count, stream);
+ }
+
+ if (__builtin_constant_p(size) && __builtin_constant_p(count)) {
+ size_t total;
+ if (__size_mul_overflow(size, count, &total)) {
+ __fwrite_overflow();
+ }
+
+ if (total > bos) {
+ __fwrite_too_big_error();
+ }
+
+ return __fwrite_real(buf, size, count, stream);
+ }
+#endif
+
+ return __fwrite_chk(buf, size, count, stream, bos);
+}
+
#if !defined(__clang__)
__BIONIC_FORTIFY_INLINE
diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h
index efca5774a..d9d277a7f 100644
--- a/libc/include/stdlib.h
+++ b/libc/include/stdlib.h
@@ -76,10 +76,10 @@ extern unsigned long long strtoull(const char *, char **, int);
extern int posix_memalign(void **memptr, size_t alignment, size_t size);
-_BIONIC_NOT_BEFORE_21(extern double atof(const char*);)
+extern double atof(const char*) __INTRODUCED_IN(21);
extern double strtod(const char*, char**) __LIBC_ABI_PUBLIC__;
-_BIONIC_NOT_BEFORE_21(extern float strtof(const char*, char**) __LIBC_ABI_PUBLIC__;)
+extern float strtof(const char*, char**) __LIBC_ABI_PUBLIC__ __INTRODUCED_IN(21);
extern long double strtold(const char*, char**) __LIBC_ABI_PUBLIC__;
extern long double strtold_l(const char *, char **, locale_t) __LIBC_ABI_PUBLIC__;
@@ -90,9 +90,9 @@ extern int atoi(const char*) __purefunc;
extern long atol(const char*) __purefunc;
extern long long atoll(const char*) __purefunc;
-_BIONIC_NOT_BEFORE_21(extern int abs(int) __pure2;)
-_BIONIC_NOT_BEFORE_21(extern long labs(long) __pure2;)
-_BIONIC_NOT_BEFORE_21(extern long long llabs(long long) __pure2;)
+extern int abs(int) __pure2 __INTRODUCED_IN(21);
+extern long labs(long) __pure2 __INTRODUCED_IN(21);
+extern long long llabs(long long) __pure2 __INTRODUCED_IN(21);
extern char * realpath(const char *path, char *resolved);
extern int system(const char *string);
@@ -109,9 +109,9 @@ void arc4random_buf(void*, size_t);
#define RAND_MAX 0x7fffffff
-_BIONIC_NOT_BEFORE_21(int rand(void);)
+int rand(void) __INTRODUCED_IN(21);
int rand_r(unsigned int*);
-_BIONIC_NOT_BEFORE_21(void srand(unsigned int);)
+void srand(unsigned int) __INTRODUCED_IN(21);
double drand48(void);
double erand48(unsigned short[3]);
@@ -124,12 +124,12 @@ unsigned short* seed48(unsigned short[3]);
void srand48(long);
char* initstate(unsigned int, char*, size_t);
-_BIONIC_NOT_BEFORE_21(long random(void);)
+long random(void) __INTRODUCED_IN(21);
char* setstate(char*);
-_BIONIC_NOT_BEFORE_21(void srandom(unsigned int);)
+void srandom(unsigned int) __INTRODUCED_IN(21);
int getpt(void);
-_BIONIC_NOT_BEFORE_21(int grantpt(int);)
+int grantpt(int) __INTRODUCED_IN(21);
int posix_openpt(int);
char* ptsname(int);
int ptsname_r(int, char*, size_t);
diff --git a/libc/include/string.h b/libc/include/string.h
index d32c16458..32d4a1806 100644
--- a/libc/include/string.h
+++ b/libc/include/string.h
@@ -53,6 +53,14 @@ extern void* memmem(const void *, size_t, const void *, size_t) __purefunc;
extern char* strchr(const char *, int) __purefunc;
extern char* __strchr_chk(const char *, int, size_t);
+#if defined(__USE_GNU)
+#if defined(__cplusplus)
+extern "C++" char* strchrnul(char*, int) __RENAME(strchrnul) __purefunc;
+extern "C++" const char* strchrnul(const char*, int) __RENAME(strchrnul) __purefunc;
+#else
+char* strchrnul(const char*, int) __purefunc;
+#endif
+#endif
extern char* strrchr(const char *, int) __purefunc;
extern char* __strrchr_chk(const char *, int, size_t);
@@ -107,18 +115,18 @@ extern size_t strxfrm(char* __restrict, const char* __restrict, size_t);
extern int strcoll_l(const char *, const char *, locale_t) __purefunc;
extern size_t strxfrm_l(char* __restrict, const char* __restrict, size_t, locale_t);
-#if defined(__USE_GNU) && !defined(__bionic_using_posix_basename)
+#if defined(__USE_GNU) && !defined(basename)
/*
* glibc has a basename in <string.h> that's different to the POSIX one in <libgen.h>.
* It doesn't modify its argument, and in C++ it's const-correct.
*/
+
#if defined(__cplusplus)
extern "C++" char* basename(char*) __RENAME(__gnu_basename) __nonnull((1));
extern "C++" const char* basename(const char*) __RENAME(__gnu_basename) __nonnull((1));
#else
extern char* basename(const char*) __RENAME(__gnu_basename) __nonnull((1));
#endif
-#define __bionic_using_gnu_basename
#endif
extern void* __memchr_chk(const void*, int, size_t, size_t);
diff --git a/libc/include/sys/_system_properties.h b/libc/include/sys/_system_properties.h
index a0315b567..3b1f7d0a8 100644
--- a/libc/include/sys/_system_properties.h
+++ b/libc/include/sys/_system_properties.h
@@ -41,6 +41,7 @@ typedef struct prop_msg prop_msg;
#define PROP_AREA_VERSION_COMPAT 0x45434f76
#define PROP_SERVICE_NAME "property_service"
+#define PROP_FILENAME_MAX 1024
#define PROP_FILENAME "/dev/__properties__"
#define PA_SIZE (128 * 1024)
diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h
index 04613f42f..f51942b78 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -130,30 +130,9 @@
#define __volatile
#endif /* !__GNUC__ */
-/*
- * In non-ANSI C environments, new programs will want ANSI-only C keywords
- * deleted from the program and old programs will want them left alone.
- * Programs using the ANSI C keywords const, inline etc. as normal
- * identifiers should define -DNO_ANSI_KEYWORDS.
- */
-#ifndef NO_ANSI_KEYWORDS
-#define const __const /* convert ANSI C keywords */
-#define inline __inline
-#define signed __signed
-#define volatile __volatile
-#endif /* !NO_ANSI_KEYWORDS */
#endif /* !(__STDC__ || __cplusplus) */
/*
- * Used for internal auditing of the NetBSD source tree.
- */
-#ifdef __AUDIT__
-#define __aconst __const
-#else
-#define __aconst
-#endif
-
-/*
* The following macro is used to remove const cast-away warnings
* from gcc -Wcast-qual; it should be used with caution because it
* can hide valid errors; in particular most valid uses are in
@@ -164,75 +143,19 @@
*/
#define __UNCONST(a) ((void *)(unsigned long)(const void *)(a))
-/*
- * GCC2 provides __extension__ to suppress warnings for various GNU C
- * language extensions under "-ansi -pedantic".
- */
-#if !__GNUC_PREREQ(2, 0)
-#define __extension__ /* delete __extension__ if non-gcc or gcc1 */
-#endif
-
-/*
- * GCC1 and some versions of GCC2 declare dead (non-returning) and
- * pure (no side effects) functions using "volatile" and "const";
- * unfortunately, these then cause warnings under "-ansi -pedantic".
- * GCC2 uses a new, peculiar __attribute__((attrs)) style. All of
- * these work for GNU C++ (modulo a slight glitch in the C++ grammar
- * in the distribution version of 2.5.5).
- */
-#if !__GNUC_PREREQ(2, 5)
-#define __attribute__(x) /* delete __attribute__ if non-gcc or gcc1 */
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-#define __dead __volatile
-#define __pure __const
-#endif
-#endif
-
-/* Delete pseudo-keywords wherever they are not available or needed. */
-#ifndef __dead
-#define __dead
-#define __pure
-#endif
+#define __dead __attribute__((__noreturn__))
+#define __pure __attribute__((__const__))
+#define __pure2 __attribute__((__const__)) /* Android-added: used by FreeBSD libm */
-#if __GNUC_PREREQ(2, 7)
#define __unused __attribute__((__unused__))
-#else
-#define __unused /* delete */
-#endif
-#define __pure2 __attribute__((__const__)) /* Android-added: used by FreeBSD libm */
-
-#if __GNUC_PREREQ(3, 1)
#define __used __attribute__((__used__))
-#else
-#define __used /* delete */
-#endif
-#if __GNUC_PREREQ(2, 7)
#define __packed __attribute__((__packed__))
#define __aligned(x) __attribute__((__aligned__(x)))
#define __section(x) __attribute__((__section__(x)))
-#elif defined(__lint__)
-#define __packed /* delete */
-#define __aligned(x) /* delete */
-#define __section(x) /* delete */
-#else
-#define __packed error: no __packed for this compiler
-#define __aligned(x) error: no __aligned for this compiler
-#define __section(x) error: no __section for this compiler
-#endif
-
-#if !__GNUC_PREREQ(2, 8)
-#define __extension__
-#endif
-#if __GNUC_PREREQ(2, 8)
#define __statement(x) __extension__(x)
-#elif defined(lint)
-#define __statement(x) (0)
-#else
-#define __statement(x) (x)
-#endif
#define __nonnull(args) __attribute__((__nonnull__ args))
@@ -240,43 +163,20 @@
#define __scanflike(x, y) __attribute__((__format__(scanf, x, y))) __nonnull((x))
/*
- * C99 defines the restrict type qualifier keyword, which was made available
- * in GCC 2.92.
+ * C99 defines the restrict type qualifier keyword.
*/
#if defined(__STDC__VERSION__) && __STDC_VERSION__ >= 199901L
#define __restrict restrict
-#else
-#if !__GNUC_PREREQ(2, 92)
-#define __restrict /* delete __restrict when not supported */
-#endif
#endif
/*
- * C99 defines __func__ predefined identifier, which was made available
- * in GCC 2.95.
+ * C99 defines __func__ predefined identifier.
*/
#if !defined(__STDC_VERSION__) || !(__STDC_VERSION__ >= 199901L)
-#if __GNUC_PREREQ(2, 6)
#define __func__ __PRETTY_FUNCTION__
-#elif __GNUC_PREREQ(2, 4)
-#define __func__ __FUNCTION__
-#else
-#define __func__ ""
-#endif
#endif /* !(__STDC_VERSION__ >= 199901L) */
/*
- * A barrier to stop the optimizer from moving code or assume live
- * register values. This is gcc specific, the version is more or less
- * arbitrary, might work with older compilers.
- */
-#if __GNUC_PREREQ(2, 95)
-#define __insn_barrier() __asm __volatile("":::"memory")
-#else
-#define __insn_barrier() /* */
-#endif
-
-/*
* GNU C version 2.96 adds explicit branch prediction so that
* the CPU back-end can hint the processor and also so that
* code blocks can be reordered such that the predicted path
@@ -304,43 +204,19 @@
* basic block reordering that this affects can often generate
* larger code.
*/
-#if __GNUC_PREREQ(2, 96)
#define __predict_true(exp) __builtin_expect((exp) != 0, 1)
#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
-#else
-#define __predict_true(exp) (exp)
-#define __predict_false(exp) (exp)
-#endif
-#if __GNUC_PREREQ(2, 96)
#define __noreturn __attribute__((__noreturn__))
#define __mallocfunc __attribute__((malloc))
#define __purefunc __attribute__((pure))
-#else
-#define __noreturn
-#define __mallocfunc
-#define __purefunc
-#endif
-#if __GNUC_PREREQ(3, 1)
#define __always_inline __attribute__((__always_inline__))
-#else
-#define __always_inline
-#endif
-#if __GNUC_PREREQ(3, 4)
#define __wur __attribute__((__warn_unused_result__))
-#else
-#define __wur
-#endif
-#if __GNUC_PREREQ(4, 3)
#define __errorattr(msg) __attribute__((__error__(msg)))
#define __warnattr(msg) __attribute__((__warning__(msg)))
-#else
-#define __errorattr(msg)
-#define __warnattr(msg)
-#endif
#define __errordecl(name, msg) extern void name(void) __errorattr(msg)
@@ -520,6 +396,11 @@
#include <android/api-level.h>
/* glibc compatibility. */
+#if __POSIX_VISIBLE >= 200809
+#define __USE_ISOC99 1
+#define __USE_XOPEN2K 1
+#define __USE_XOPEN2K8 1
+#endif
#if __LP64__
#define __WORDSIZE 64
#else
@@ -535,19 +416,14 @@
* http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html for details.
*/
#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0
-#define __BIONIC_FORTIFY 1
-#if _FORTIFY_SOURCE == 2
-#define __bos(s) __builtin_object_size((s), 1)
-#else
-#define __bos(s) __builtin_object_size((s), 0)
-#endif
-#define __bos0(s) __builtin_object_size((s), 0)
-
-#if __GNUC_PREREQ(4,3) || __has_attribute(__artificial__)
-#define __BIONIC_FORTIFY_INLINE extern __inline__ __always_inline __attribute__((gnu_inline)) __attribute__((__artificial__))
-#else
-#define __BIONIC_FORTIFY_INLINE extern __inline__ __always_inline __attribute__((gnu_inline))
-#endif
+# define __BIONIC_FORTIFY 1
+# if _FORTIFY_SOURCE == 2
+# define __bos(s) __builtin_object_size((s), 1)
+# else
+# define __bos(s) __builtin_object_size((s), 0)
+# endif
+# define __bos0(s) __builtin_object_size((s), 0)
+# define __BIONIC_FORTIFY_INLINE extern __inline__ __always_inline __attribute__((gnu_inline)) __attribute__((__artificial__))
#endif
#define __BIONIC_FORTIFY_UNKNOWN_SIZE ((size_t) -1)
@@ -556,9 +432,9 @@
/* Like __LIBC_HIDDEN__, but preserves binary compatibility for LP32. */
#ifdef __LP64__
-#define __LIBC64_HIDDEN__ __LIBC_HIDDEN__
+#define __LIBC32_LEGACY_PUBLIC__ __LIBC_HIDDEN__
#else
-#define __LIBC64_HIDDEN__ __LIBC_ABI_PUBLIC__
+#define __LIBC32_LEGACY_PUBLIC__ __LIBC_ABI_PUBLIC__
#endif
/* Used to tag non-static symbols that are public and exposed by the shared library. */
@@ -567,10 +443,31 @@
/* Used to rename functions so that the compiler emits a call to 'x' rather than the function this was applied to. */
#define __RENAME(x) __asm__(#x)
-#if __ANDROID_API__ >= 21
-#define _BIONIC_NOT_BEFORE_21(x) x
+#ifdef __clang__
+#define __AVAILABILITY(...) __attribute__((availability(android,__VA_ARGS__)))
+#define __INTRODUCED_IN(api_level) __AVAILABILITY(introduced=api_level)
+#define __DEPRECATED_IN(api_level) __AVAILABILITY(deprecated=api_level)
+#define __REMOVED_IN(api_level) __AVAILABILITY(obsoleted=api_level)
+#else
+#define __AVAILABILITY(...)
+#define __INTRODUCED_IN(api_level)
+#define __DEPRECATED_IN(api_level)
+#define __REMOVED_IN(api_level)
+#endif // __clang__
+
+#if __has_builtin(__builtin_umul_overflow) || __GNUC__ >= 5
+#if __LP64__
+#define __size_mul_overflow(a, b, result) __builtin_umull_overflow(a, b, result)
#else
-#define _BIONIC_NOT_BEFORE_21(x)
-#endif /* __ANDROID_API__ >= 21 */
+#define __size_mul_overflow(a, b, result) __builtin_umul_overflow(a, b, result)
+#endif
+#else
+extern __inline__ __always_inline __attribute__((gnu_inline))
+int __size_mul_overflow(__SIZE_TYPE__ a, __SIZE_TYPE__ b, __SIZE_TYPE__ *result) {
+ *result = a * b;
+ static const __SIZE_TYPE__ mul_no_overflow = 1UL << (sizeof(__SIZE_TYPE__) * 4);
+ return (a >= mul_no_overflow || b >= mul_no_overflow) && a > 0 && (__SIZE_TYPE__)-1 / a < b;
+}
+#endif
#endif /* !_SYS_CDEFS_H_ */
diff --git a/libc/include/sys/endian.h b/libc/include/sys/endian.h
index 2fd480dc2..60cc0304c 100644
--- a/libc/include/sys/endian.h
+++ b/libc/include/sys/endian.h
@@ -75,10 +75,6 @@ __END_DECLS
#define HTONL(x) (x) = htonl((u_int32_t)(x))
#define HTONS(x) (x) = htons((u_int16_t)(x))
-#define swap16 __swap16
-#define swap32 __swap32
-#define swap64 __swap64
-
#define htobe16 __swap16
#define htobe32 __swap32
#define htobe64 __swap64
diff --git a/libc/include/sys/fcntl.h b/libc/include/sys/fcntl.h
new file mode 100644
index 000000000..cd304557e
--- /dev/null
+++ b/libc/include/sys/fcntl.h
@@ -0,0 +1 @@
+#include <fcntl.h>
diff --git a/libc/include/sys/glibc-syscalls.h b/libc/include/sys/glibc-syscalls.h
index 926209b3d..26887b174 100644
--- a/libc/include/sys/glibc-syscalls.h
+++ b/libc/include/sys/glibc-syscalls.h
@@ -41,6 +41,7 @@
#define SYS_eventfd __NR_eventfd
#define SYS_eventfd2 __NR_eventfd2
#define SYS_execve __NR_execve
+#define SYS_execveat __NR_execveat
#define SYS_exit __NR_exit
#define SYS_exit_group __NR_exit_group
#define SYS_faccessat __NR_faccessat
@@ -136,6 +137,7 @@
#define SYS_lstat64 __NR_lstat64
#define SYS_madvise __NR_madvise
#define SYS_mbind __NR_mbind
+#define SYS_membarrier __NR_membarrier
#define SYS_memfd_create __NR_memfd_create
#define SYS_migrate_pages __NR_migrate_pages
#define SYS_mincore __NR_mincore
@@ -144,6 +146,7 @@
#define SYS_mknod __NR_mknod
#define SYS_mknodat __NR_mknodat
#define SYS_mlock __NR_mlock
+#define SYS_mlock2 __NR_mlock2
#define SYS_mlockall __NR_mlockall
#define SYS_mmap __NR_mmap
#define SYS_mmap2 __NR_mmap2
@@ -314,6 +317,7 @@
#define SYS_unlinkat __NR_unlinkat
#define SYS_unshare __NR_unshare
#define SYS_uselib __NR_uselib
+#define SYS_userfaultfd __NR_userfaultfd
#define SYS_ustat __NR_ustat
#define SYS_utime __NR_utime
#define SYS_utimensat __NR_utimensat
@@ -367,6 +371,7 @@
#define SYS_eventfd __NR_eventfd
#define SYS_eventfd2 __NR_eventfd2
#define SYS_execve __NR_execve
+#define SYS_execveat __NR_execveat
#define SYS_exit __NR_exit
#define SYS_exit_group __NR_exit_group
#define SYS_faccessat __NR_faccessat
@@ -469,6 +474,7 @@
#define SYS_lstat64 __NR_lstat64
#define SYS_madvise __NR_madvise
#define SYS_mbind __NR_mbind
+#define SYS_membarrier __NR_membarrier
#define SYS_memfd_create __NR_memfd_create
#define SYS_mincore __NR_mincore
#define SYS_mkdir __NR_mkdir
@@ -476,6 +482,7 @@
#define SYS_mknod __NR_mknod
#define SYS_mknodat __NR_mknodat
#define SYS_mlock __NR_mlock
+#define SYS_mlock2 __NR_mlock2
#define SYS_mlockall __NR_mlockall
#define SYS_mmap __NR_mmap
#define SYS_mmap2 __NR_mmap2
@@ -666,6 +673,7 @@
#define SYS_unlinkat __NR_unlinkat
#define SYS_unshare __NR_unshare
#define SYS_uselib __NR_uselib
+#define SYS_userfaultfd __NR_userfaultfd
#define SYS_ustat __NR_ustat
#define SYS_utime __NR_utime
#define SYS_utimensat __NR_utimensat
@@ -722,6 +730,7 @@
#define SYS_eventfd __NR_eventfd
#define SYS_eventfd2 __NR_eventfd2
#define SYS_execve __NR_execve
+#define SYS_execveat __NR_execveat
#define SYS_exit __NR_exit
#define SYS_exit_group __NR_exit_group
#define SYS_faccessat __NR_faccessat
@@ -824,6 +833,7 @@
#define SYS_lstat64 __NR_lstat64
#define SYS_madvise __NR_madvise
#define SYS_mbind __NR_mbind
+#define SYS_membarrier __NR_membarrier
#define SYS_memfd_create __NR_memfd_create
#define SYS_migrate_pages __NR_migrate_pages
#define SYS_mincore __NR_mincore
@@ -832,6 +842,7 @@
#define SYS_mknod __NR_mknod
#define SYS_mknodat __NR_mknodat
#define SYS_mlock __NR_mlock
+#define SYS_mlock2 __NR_mlock2
#define SYS_mlockall __NR_mlockall
#define SYS_mmap __NR_mmap
#define SYS_mmap2 __NR_mmap2
@@ -1033,6 +1044,7 @@
#define SYS_unused59 __NR_unused59
#define SYS_unused84 __NR_unused84
#define SYS_uselib __NR_uselib
+#define SYS_userfaultfd __NR_userfaultfd
#define SYS_ustat __NR_ustat
#define SYS_utime __NR_utime
#define SYS_utimensat __NR_utimensat
@@ -1047,6 +1059,7 @@
#define SYS_write __NR_write
#define SYS_writev __NR_writev
#elif defined(__i386__)
+#define SYS_accept4 __NR_accept4
#define SYS_access __NR_access
#define SYS_acct __NR_acct
#define SYS_add_key __NR_add_key
@@ -1054,6 +1067,7 @@
#define SYS_afs_syscall __NR_afs_syscall
#define SYS_alarm __NR_alarm
#define SYS_bdflush __NR_bdflush
+#define SYS_bind __NR_bind
#define SYS_bpf __NR_bpf
#define SYS_break __NR_break
#define SYS_brk __NR_brk
@@ -1071,6 +1085,7 @@
#define SYS_clock_settime __NR_clock_settime
#define SYS_clone __NR_clone
#define SYS_close __NR_close
+#define SYS_connect __NR_connect
#define SYS_creat __NR_creat
#define SYS_create_module __NR_create_module
#define SYS_delete_module __NR_delete_module
@@ -1085,6 +1100,7 @@
#define SYS_eventfd __NR_eventfd
#define SYS_eventfd2 __NR_eventfd2
#define SYS_execve __NR_execve
+#define SYS_execveat __NR_execveat
#define SYS_exit __NR_exit
#define SYS_exit_group __NR_exit_group
#define SYS_faccessat __NR_faccessat
@@ -1137,6 +1153,7 @@
#define SYS_getgroups __NR_getgroups
#define SYS_getgroups32 __NR_getgroups32
#define SYS_getitimer __NR_getitimer
+#define SYS_getpeername __NR_getpeername
#define SYS_getpgid __NR_getpgid
#define SYS_getpgrp __NR_getpgrp
#define SYS_getpid __NR_getpid
@@ -1151,6 +1168,8 @@
#define SYS_getrlimit __NR_getrlimit
#define SYS_getrusage __NR_getrusage
#define SYS_getsid __NR_getsid
+#define SYS_getsockname __NR_getsockname
+#define SYS_getsockopt __NR_getsockopt
#define SYS_gettid __NR_gettid
#define SYS_gettimeofday __NR_gettimeofday
#define SYS_getuid __NR_getuid
@@ -1183,6 +1202,7 @@
#define SYS_lgetxattr __NR_lgetxattr
#define SYS_link __NR_link
#define SYS_linkat __NR_linkat
+#define SYS_listen __NR_listen
#define SYS_listxattr __NR_listxattr
#define SYS_llistxattr __NR_llistxattr
#define SYS_lock __NR_lock
@@ -1194,6 +1214,7 @@
#define SYS_lstat64 __NR_lstat64
#define SYS_madvise __NR_madvise
#define SYS_mbind __NR_mbind
+#define SYS_membarrier __NR_membarrier
#define SYS_memfd_create __NR_memfd_create
#define SYS_migrate_pages __NR_migrate_pages
#define SYS_mincore __NR_mincore
@@ -1202,6 +1223,7 @@
#define SYS_mknod __NR_mknod
#define SYS_mknodat __NR_mknodat
#define SYS_mlock __NR_mlock
+#define SYS_mlock2 __NR_mlock2
#define SYS_mlockall __NR_mlockall
#define SYS_mmap __NR_mmap
#define SYS_mmap2 __NR_mmap2
@@ -1263,7 +1285,9 @@
#define SYS_readlinkat __NR_readlinkat
#define SYS_readv __NR_readv
#define SYS_reboot __NR_reboot
+#define SYS_recvfrom __NR_recvfrom
#define SYS_recvmmsg __NR_recvmmsg
+#define SYS_recvmsg __NR_recvmsg
#define SYS_remap_file_pages __NR_remap_file_pages
#define SYS_removexattr __NR_removexattr
#define SYS_rename __NR_rename
@@ -1297,6 +1321,8 @@
#define SYS_sendfile __NR_sendfile
#define SYS_sendfile64 __NR_sendfile64
#define SYS_sendmmsg __NR_sendmmsg
+#define SYS_sendmsg __NR_sendmsg
+#define SYS_sendto __NR_sendto
#define SYS_set_mempolicy __NR_set_mempolicy
#define SYS_set_robust_list __NR_set_robust_list
#define SYS_set_thread_area __NR_set_thread_area
@@ -1325,11 +1351,13 @@
#define SYS_setreuid32 __NR_setreuid32
#define SYS_setrlimit __NR_setrlimit
#define SYS_setsid __NR_setsid
+#define SYS_setsockopt __NR_setsockopt
#define SYS_settimeofday __NR_settimeofday
#define SYS_setuid __NR_setuid
#define SYS_setuid32 __NR_setuid32
#define SYS_setxattr __NR_setxattr
#define SYS_sgetmask __NR_sgetmask
+#define SYS_shutdown __NR_shutdown
#define SYS_sigaction __NR_sigaction
#define SYS_sigaltstack __NR_sigaltstack
#define SYS_signal __NR_signal
@@ -1339,7 +1367,9 @@
#define SYS_sigprocmask __NR_sigprocmask
#define SYS_sigreturn __NR_sigreturn
#define SYS_sigsuspend __NR_sigsuspend
+#define SYS_socket __NR_socket
#define SYS_socketcall __NR_socketcall
+#define SYS_socketpair __NR_socketpair
#define SYS_splice __NR_splice
#define SYS_ssetmask __NR_ssetmask
#define SYS_stat __NR_stat
@@ -1383,6 +1413,7 @@
#define SYS_unlinkat __NR_unlinkat
#define SYS_unshare __NR_unshare
#define SYS_uselib __NR_uselib
+#define SYS_userfaultfd __NR_userfaultfd
#define SYS_ustat __NR_ustat
#define SYS_utime __NR_utime
#define SYS_utimensat __NR_utimensat
@@ -1441,6 +1472,7 @@
#define SYS_eventfd __NR_eventfd
#define SYS_eventfd2 __NR_eventfd2
#define SYS_execve __NR_execve
+#define SYS_execveat __NR_execveat
#define SYS_exit __NR_exit
#define SYS_exit_group __NR_exit_group
#define SYS_faccessat __NR_faccessat
@@ -1534,6 +1566,7 @@
#define SYS_lstat __NR_lstat
#define SYS_madvise __NR_madvise
#define SYS_mbind __NR_mbind
+#define SYS_membarrier __NR_membarrier
#define SYS_memfd_create __NR_memfd_create
#define SYS_migrate_pages __NR_migrate_pages
#define SYS_mincore __NR_mincore
@@ -1542,6 +1575,7 @@
#define SYS_mknod __NR_mknod
#define SYS_mknodat __NR_mknodat
#define SYS_mlock __NR_mlock
+#define SYS_mlock2 __NR_mlock2
#define SYS_mlockall __NR_mlockall
#define SYS_mmap __NR_mmap
#define SYS_modify_ldt __NR_modify_ldt
@@ -1708,6 +1742,7 @@
#define SYS_unlinkat __NR_unlinkat
#define SYS_unshare __NR_unshare
#define SYS_uselib __NR_uselib
+#define SYS_userfaultfd __NR_userfaultfd
#define SYS_ustat __NR_ustat
#define SYS_utime __NR_utime
#define SYS_utimensat __NR_utimensat
diff --git a/libc/include/sys/mman.h b/libc/include/sys/mman.h
index 6857f60fa..a19ceb58b 100644
--- a/libc/include/sys/mman.h
+++ b/libc/include/sys/mman.h
@@ -59,7 +59,7 @@ extern void* mmap64(void*, size_t, int, int, int, off64_t);
extern int munmap(void*, size_t);
extern int msync(const void*, size_t, int);
extern int mprotect(const void*, size_t, int);
-extern void* mremap(void*, size_t, size_t, unsigned long);
+extern void* mremap(void*, size_t, size_t, int, ...);
extern int mlockall(int);
extern int munlockall(void);
diff --git a/libc/include/sys/procfs.h b/libc/include/sys/procfs.h
index b5b1a4667..7ef5023ab 100644
--- a/libc/include/sys/procfs.h
+++ b/libc/include/sys/procfs.h
@@ -39,6 +39,10 @@ typedef elf_greg_t elf_gregset_t[NGREG];
typedef fpregset_t elf_fpregset_t;
+#if defined(__i386__)
+typedef struct user_fpxregs_struct elf_fpxregset_t;
+#endif
+
typedef elf_gregset_t prgregset_t;
typedef elf_fpregset_t prfpregset_t;
diff --git a/libc/include/sys/resource.h b/libc/include/sys/resource.h
index 3f8dd4571..8209dfb72 100644
--- a/libc/include/sys/resource.h
+++ b/libc/include/sys/resource.h
@@ -53,10 +53,7 @@ extern int setpriority(int, int, int);
extern int getrusage(int, struct rusage*);
-#if __LP64__
-/* Implementing prlimit for 32-bit isn't worth the effort. */
extern int prlimit(pid_t, int, const struct rlimit*, struct rlimit*);
-#endif
extern int prlimit64(pid_t, int, const struct rlimit64*, struct rlimit64*);
__END_DECLS
diff --git a/libc/include/sys/socket.h b/libc/include/sys/socket.h
index 43d15865f..c7e9acc38 100644
--- a/libc/include/sys/socket.h
+++ b/libc/include/sys/socket.h
@@ -50,19 +50,15 @@ struct timespec;
#ifdef __mips__
#define SOCK_DGRAM 1
#define SOCK_STREAM 2
+#else
+#define SOCK_STREAM 1
+#define SOCK_DGRAM 2
+#endif
#define SOCK_RAW 3
#define SOCK_RDM 4
#define SOCK_SEQPACKET 5
#define SOCK_DCCP 6
#define SOCK_PACKET 10
-#else
-#define SOCK_STREAM 1
-#define SOCK_DGRAM 2
-#define SOCK_RAW 3
-#define SOCK_RDM 4
-#define SOCK_SEQPACKET 5
-#define SOCK_PACKET 10
-#endif
#define SOCK_CLOEXEC O_CLOEXEC
#define SOCK_NONBLOCK O_NONBLOCK
@@ -109,7 +105,7 @@ struct cmsghdr {
#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr((mhdr), (cmsg))
#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )
-#define CMSG_DATA(cmsg) ((void*)((char*)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))
+#define CMSG_DATA(cmsg) (((unsigned char*)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))
#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))
#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))
#define CMSG_FIRSTHDR(msg) \
@@ -168,7 +164,9 @@ struct ucred {
#define AF_IEEE802154 36
#define AF_CAIF 37
#define AF_ALG 38
-#define AF_MAX 39
+#define AF_NFC 39
+#define AF_VSOCK 40
+#define AF_MAX 41
#define PF_UNSPEC AF_UNSPEC
#define PF_UNIX AF_UNIX
@@ -209,6 +207,8 @@ struct ucred {
#define PF_IEEE802154 AF_IEEE802154
#define PF_CAIF AF_CAIF
#define PF_ALG AF_ALG
+#define PF_NFC AF_NFC
+#define PF_VSOCK AF_VSOCK
#define PF_MAX AF_MAX
#define SOMAXCONN 128
diff --git a/libc/include/sys/stat.h b/libc/include/sys/stat.h
index c22516fe0..257ded06d 100644
--- a/libc/include/sys/stat.h
+++ b/libc/include/sys/stat.h
@@ -29,8 +29,8 @@
#ifndef _SYS_STAT_H_
#define _SYS_STAT_H_
+#include <bits/timespec.h>
#include <linux/stat.h>
-#include <machine/timespec.h>
#include <sys/cdefs.h>
#include <sys/types.h>
@@ -171,7 +171,7 @@ mode_t umask(mode_t mode) {
}
#endif /* defined(__BIONIC_FORTIFY) */
-_BIONIC_NOT_BEFORE_21(extern int mkfifo(const char*, mode_t);)
+extern int mkfifo(const char*, mode_t) __INTRODUCED_IN(21);
extern int mkfifoat(int, const char*, mode_t);
extern int fchmodat(int, const char*, mode_t, int);
diff --git a/libc/include/sys/syslog.h b/libc/include/sys/syslog.h
new file mode 100644
index 000000000..7761eceeb
--- /dev/null
+++ b/libc/include/sys/syslog.h
@@ -0,0 +1 @@
+#include <syslog.h>
diff --git a/libc/include/sys/sysmacros.h b/libc/include/sys/sysmacros.h
index 6f053a838..54e43dd15 100644
--- a/libc/include/sys/sysmacros.h
+++ b/libc/include/sys/sysmacros.h
@@ -25,28 +25,20 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
#ifndef _SYS_SYSMACROS_H_
#define _SYS_SYSMACROS_H_
-/* some rogue code includes this file directly :-( */
-#ifndef _SYS_TYPES_H_
-# include <sys/types.h>
-#endif
-
-static __inline__ int major(dev_t _dev)
-{
- return (_dev >> 8) & 0xfff;
-}
+#define makedev(__major, __minor) \
+ ( \
+ (((__major) & 0xfffff000ULL) << 32) | (((__major) & 0xfffULL) << 8) | \
+ (((__minor) & 0xffffff00ULL) << 12) | (((__minor) & 0xffULL)) \
+ )
-static __inline__ int minor(dev_t _dev)
-{
- return (_dev & 0xff) | ((_dev >> 12) & 0xfff00);
-}
+#define major(__dev) \
+ ((unsigned) ((((unsigned long long) (__dev) >> 32) & 0xfffff000) | (((__dev) >> 8) & 0xfff)))
-static __inline__ dev_t makedev(int __ma, int __mi)
-{
- return ((__ma & 0xfff) << 8) | (__mi & 0xff) | ((__mi & 0xfff00) << 12);
-}
+#define minor(__dev) \
+ ((unsigned) ((((__dev) >> 12) & 0xffffff00) | ((__dev) & 0xff)))
#endif /* _SYS_SYSMACROS_H_ */
-
diff --git a/libc/include/sys/time.h b/libc/include/sys/time.h
index 1f010d45e..f60c905e8 100644
--- a/libc/include/sys/time.h
+++ b/libc/include/sys/time.h
@@ -25,6 +25,7 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+
#ifndef _SYS_TIME_H_
#define _SYS_TIME_H_
@@ -32,6 +33,9 @@
#include <sys/types.h>
#include <linux/time.h>
+/* POSIX says <sys/time.h> gets you most of <sys/select.h> and may get you all of it. */
+#include <sys/select.h>
+
__BEGIN_DECLS
extern int gettimeofday(struct timeval *, struct timezone *);
@@ -73,6 +77,15 @@ extern int utimes(const char *, const struct timeval *);
} \
} while (0)
+#define TIMEVAL_TO_TIMESPEC(tv, ts) { \
+ (ts)->tv_sec = (tv)->tv_sec; \
+ (ts)->tv_nsec = (tv)->tv_usec * 1000; \
+}
+#define TIMESPEC_TO_TIMEVAL(tv, ts) { \
+ (tv)->tv_sec = (ts)->tv_sec; \
+ (tv)->tv_usec = (ts)->tv_nsec / 1000; \
+}
+
__END_DECLS
#endif /* _SYS_TIME_H_ */
diff --git a/libc/include/sys/timex.h b/libc/include/sys/timex.h
index 4096e7d57..fade5c375 100644
--- a/libc/include/sys/timex.h
+++ b/libc/include/sys/timex.h
@@ -29,6 +29,15 @@
#ifndef _SYS_TIMEX_H_
#define _SYS_TIMEX_H_
+#include <sys/cdefs.h>
+#include <sys/types.h>
#include <linux/timex.h>
+__BEGIN_DECLS
+
+int adjtimex(struct timex*);
+int clock_adjtime(clockid_t, struct timex*);
+
+__END_DECLS
+
#endif /* _SYS_TIMEX_H_ */
diff --git a/libc/include/sys/types.h b/libc/include/sys/types.h
index a6b0fd87f..217fd603b 100644
--- a/libc/include/sys/types.h
+++ b/libc/include/sys/types.h
@@ -139,19 +139,18 @@ typedef __kernel_ssize_t ssize_t;
typedef unsigned int uint_t;
typedef unsigned int uint;
-/* for some applications */
+#ifdef __BSD_VISIBLE
#include <sys/sysmacros.h>
-#ifdef __BSD_VISIBLE
-typedef unsigned char u_char;
-typedef unsigned short u_short;
-typedef unsigned int u_int;
-typedef unsigned long u_long;
-
-typedef uint32_t u_int32_t;
-typedef uint16_t u_int16_t;
-typedef uint8_t u_int8_t;
-typedef uint64_t u_int64_t;
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+typedef unsigned long u_long;
+
+typedef uint32_t u_int32_t;
+typedef uint16_t u_int16_t;
+typedef uint8_t u_int8_t;
+typedef uint64_t u_int64_t;
#endif
#endif
diff --git a/libc/include/sys/ucontext.h b/libc/include/sys/ucontext.h
index 399458ebe..9e3c6530d 100644
--- a/libc/include/sys/ucontext.h
+++ b/libc/include/sys/ucontext.h
@@ -82,12 +82,6 @@ typedef struct ucontext {
#define NGREG 34 /* x0..x30 + sp + pc + pstate */
typedef unsigned long greg_t;
typedef greg_t gregset_t[NGREG];
-
-struct user_fpsimd_struct {
- long double vregs[32];
- uint32_t fpsr;
- uint32_t fpcr;
-};
typedef struct user_fpsimd_struct fpregset_t;
#include <asm/sigcontext.h>
diff --git a/libc/include/sys/uio.h b/libc/include/sys/uio.h
index 187ec22a4..72675d127 100644
--- a/libc/include/sys/uio.h
+++ b/libc/include/sys/uio.h
@@ -38,6 +38,18 @@ int readv(int, const struct iovec*, int);
int writev(int, const struct iovec*, int);
#if defined(__USE_GNU)
+#if defined(__USE_FILE_OFFSET64)
+ssize_t preadv(int, const struct iovec*, int, off_t) __RENAME(preadv64);
+ssize_t pwritev(int, const struct iovec*, int, off_t) __RENAME(pwritev64);
+#else
+ssize_t preadv(int, const struct iovec*, int, off_t);
+ssize_t pwritev(int, const struct iovec*, int, off_t);
+#endif
+ssize_t preadv64(int, const struct iovec*, int, off64_t);
+ssize_t pwritev64(int, const struct iovec*, int, off64_t);
+#endif
+
+#if defined(__USE_GNU)
ssize_t process_vm_readv(pid_t, const struct iovec*, unsigned long, const struct iovec*, unsigned long, unsigned long);
ssize_t process_vm_writev(pid_t, const struct iovec*, unsigned long, const struct iovec*, unsigned long, unsigned long);
#endif
diff --git a/libc/include/sys/unistd.h b/libc/include/sys/unistd.h
new file mode 100644
index 000000000..1e823fbd5
--- /dev/null
+++ b/libc/include/sys/unistd.h
@@ -0,0 +1 @@
+#include <unistd.h>
diff --git a/libc/include/sys/user.h b/libc/include/sys/user.h
index b370add7f..3312981d3 100644
--- a/libc/include/sys/user.h
+++ b/libc/include/sys/user.h
@@ -30,11 +30,13 @@
#define _SYS_USER_H_
#include <sys/cdefs.h>
-#include <limits.h> /* For PAGE_SIZE. */
#include <stddef.h> /* For size_t. */
__BEGIN_DECLS
+#define PAGE_SIZE 4096
+#define PAGE_MASK (~(PAGE_SIZE - 1))
+
#if __i386__
struct user_fpregs_struct {
@@ -47,7 +49,7 @@ struct user_fpregs_struct {
long fos;
long st_space[20];
};
-struct user_fxsr_struct {
+struct user_fpxregs_struct {
unsigned short cwd;
unsigned short swd;
unsigned short twd;
@@ -230,7 +232,17 @@ struct user {
#elif defined(__aarch64__)
-// There are no user structures for 64 bit arm.
+struct user_regs_struct {
+ uint64_t regs[31];
+ uint64_t sp;
+ uint64_t pc;
+ uint64_t pstate;
+};
+struct user_fpsimd_struct {
+ __uint128_t vregs[32];
+ uint32_t fpsr;
+ uint32_t fpcr;
+};
#else
diff --git a/libc/include/sys/vt.h b/libc/include/sys/vt.h
index b37a86903..834abfbc8 100644
--- a/libc/include/sys/vt.h
+++ b/libc/include/sys/vt.h
@@ -1,28 +1 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
#include <linux/vt.h>
diff --git a/libc/include/sys/wait.h b/libc/include/sys/wait.h
index 12b73082c..2317b024f 100644
--- a/libc/include/sys/wait.h
+++ b/libc/include/sys/wait.h
@@ -44,6 +44,7 @@ __BEGIN_DECLS
#define WIFEXITED(s) (WTERMSIG(s) == 0)
#define WIFSTOPPED(s) (WTERMSIG(s) == 0x7f)
#define WIFSIGNALED(s) (WTERMSIG((s)+1) >= 2)
+#define WIFCONTINUED(s) ((s) == 0xffff)
#define W_EXITCODE(ret, sig) ((ret) << 8 | (sig))
#define W_STOPCODE(sig) ((sig) << 8 | 0x7f)
diff --git a/libc/include/syscall.h b/libc/include/syscall.h
new file mode 100644
index 000000000..4c3057844
--- /dev/null
+++ b/libc/include/syscall.h
@@ -0,0 +1 @@
+#include <sys/syscall.h>
diff --git a/libc/include/sysexits.h b/libc/include/sysexits.h
new file mode 100644
index 000000000..e24483687
--- /dev/null
+++ b/libc/include/sysexits.h
@@ -0,0 +1,119 @@
+/* $OpenBSD: sysexits.h,v 1.5 2003/06/02 19:34:12 millert Exp $ */
+/* $NetBSD: sysexits.h,v 1.4 1994/10/26 00:56:33 cgd Exp $ */
+
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)sysexits.h 4.8 (Berkeley) 4/3/91
+ */
+
+#ifndef _SYSEXITS_H_
+#define _SYSEXITS_H_
+
+/*
+ * SYSEXITS.H -- Exit status codes for system programs.
+ *
+ * This include file attempts to categorize possible error
+ * exit statuses for system programs, notably delivermail
+ * and the Berkeley network.
+ *
+ * Error numbers begin at EX__BASE to reduce the possibility of
+ * clashing with other exit statuses that random programs may
+ * already return. The meaning of the codes is approximately
+ * as follows:
+ *
+ * EX_USAGE -- The command was used incorrectly, e.g., with
+ * the wrong number of arguments, a bad flag, a bad
+ * syntax in a parameter, or whatever.
+ * EX_DATAERR -- The input data was incorrect in some way.
+ * This should only be used for user's data & not
+ * system files.
+ * EX_NOINPUT -- An input file (not a system file) did not
+ * exist or was not readable. This could also include
+ * errors like "No message" to a mailer (if it cared
+ * to catch it).
+ * EX_NOUSER -- The user specified did not exist. This might
+ * be used for mail addresses or remote logins.
+ * EX_NOHOST -- The host specified did not exist. This is used
+ * in mail addresses or network requests.
+ * EX_UNAVAILABLE -- A service is unavailable. This can occur
+ * if a support program or file does not exist. This
+ * can also be used as a catchall message when something
+ * you wanted to do doesn't work, but you don't know
+ * why.
+ * EX_SOFTWARE -- An internal software error has been detected.
+ * This should be limited to non-operating system related
+ * errors as possible.
+ * EX_OSERR -- An operating system error has been detected.
+ * This is intended to be used for such things as "cannot
+ * fork", "cannot create pipe", or the like. It includes
+ * things like getuid returning a user that does not
+ * exist in the passwd file.
+ * EX_OSFILE -- Some system file (e.g., /etc/passwd, /var/run/utmp,
+ * etc.) does not exist, cannot be opened, or has some
+ * sort of error (e.g., syntax error).
+ * EX_CANTCREAT -- A (user specified) output file cannot be
+ * created.
+ * EX_IOERR -- An error occurred while doing I/O on some file.
+ * EX_TEMPFAIL -- temporary failure, indicating something that
+ * is not really an error. In sendmail, this means
+ * that a mailer (e.g.) could not create a connection,
+ * and the request should be reattempted later.
+ * EX_PROTOCOL -- the remote system returned something that
+ * was "not possible" during a protocol exchange.
+ * EX_NOPERM -- You did not have sufficient permission to
+ * perform the operation. This is not intended for
+ * file system problems, which should use EX_NOINPUT or
+ * EX_CANTCREAT, but rather for higher level permissions.
+ * EX_CONFIG -- Something was found in an unconfigured or
+ * misconfigured state.
+ */
+
+#define EX_OK 0 /* successful termination */
+
+#define EX__BASE 64 /* base value for error messages */
+
+#define EX_USAGE 64 /* command line usage error */
+#define EX_DATAERR 65 /* data format error */
+#define EX_NOINPUT 66 /* cannot open input */
+#define EX_NOUSER 67 /* addressee unknown */
+#define EX_NOHOST 68 /* host name unknown */
+#define EX_UNAVAILABLE 69 /* service unavailable */
+#define EX_SOFTWARE 70 /* internal software error */
+#define EX_OSERR 71 /* system error (e.g., can't fork) */
+#define EX_OSFILE 72 /* critical OS file missing */
+#define EX_CANTCREAT 73 /* can't create (user) output file */
+#define EX_IOERR 74 /* input/output error */
+#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */
+#define EX_PROTOCOL 76 /* remote error in protocol */
+#define EX_NOPERM 77 /* permission denied */
+#define EX_CONFIG 78 /* configuration error */
+
+#define EX__MAX 78 /* maximum listed value */
+
+#endif /* !_SYSEXITS_H_ */
diff --git a/libc/include/uchar.h b/libc/include/uchar.h
index e1fcb5c65..a5e72eade 100644
--- a/libc/include/uchar.h
+++ b/libc/include/uchar.h
@@ -34,6 +34,11 @@
__BEGIN_DECLS
+#if __STDC_VERSION__ >= 201112L && !defined(__cplusplus)
+typedef __CHAR16_TYPE__ char16_t;
+typedef __CHAR32_TYPE__ char32_t;
+#endif
+
#define __STD_UTF_16__ 1
#define __STD_UTF_32__ 1
diff --git a/libc/include/unistd.h b/libc/include/unistd.h
index f0de29e2a..5045267a2 100644
--- a/libc/include/unistd.h
+++ b/libc/include/unistd.h
@@ -35,7 +35,8 @@
#include <sys/select.h>
#include <sys/sysconf.h>
-#include <machine/posix_limits.h>
+#include <bits/lockf.h>
+#include <bits/posix_limits.h>
__BEGIN_DECLS
@@ -75,146 +76,168 @@ __BEGIN_DECLS
extern char** environ;
-extern __noreturn void _exit(int);
+extern __noreturn void _exit(int __status);
extern pid_t fork(void);
extern pid_t vfork(void);
extern pid_t getpid(void);
extern pid_t gettid(void) __pure2;
-extern pid_t getpgid(pid_t);
-extern int setpgid(pid_t, pid_t);
+extern pid_t getpgid(pid_t __pid);
+extern int setpgid(pid_t __pid, pid_t __pgid);
extern pid_t getppid(void);
extern pid_t getpgrp(void);
extern int setpgrp(void);
-extern pid_t getsid(pid_t);
+extern pid_t getsid(pid_t __pid) __INTRODUCED_IN(21);
extern pid_t setsid(void);
-extern int execv(const char *, char * const *);
-extern int execvp(const char *, char * const *);
-extern int execvpe(const char *, char * const *, char * const *);
-extern int execve(const char *, char * const *, char * const *);
-extern int execl(const char *, const char *, ...);
-extern int execlp(const char *, const char *, ...);
-extern int execle(const char *, const char *, ...);
+extern int execv(const char* __path, char* const* __argv);
+extern int execvp(const char* __file, char* const* __argv);
+extern int execvpe(const char* __file, char* const* __argv, char* const* __envp)
+ __INTRODUCED_IN(21);
+extern int execve(const char* __file, char* const* __argv, char* const* __envp);
+extern int execl(const char* __path, const char* __arg0, ...);
+extern int execlp(const char* __file, const char* __arg0, ...);
+extern int execle(const char* __path, const char* __arg0, ...);
-extern int nice(int);
+extern int nice(int __incr);
-extern int setuid(uid_t);
+extern int setuid(uid_t __uid);
extern uid_t getuid(void);
-extern int seteuid(uid_t);
+extern int seteuid(uid_t __uid);
extern uid_t geteuid(void);
-extern int setgid(gid_t);
+extern int setgid(gid_t __gid);
extern gid_t getgid(void);
-extern int setegid(gid_t);
+extern int setegid(gid_t __gid);
extern gid_t getegid(void);
-extern int getgroups(int, gid_t *);
-extern int setgroups(size_t, const gid_t *);
-extern int setreuid(uid_t, uid_t);
-extern int setregid(gid_t, gid_t);
-extern int setresuid(uid_t, uid_t, uid_t);
-extern int setresgid(gid_t, gid_t, gid_t);
-extern int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
-extern int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
+extern int getgroups(int __size, gid_t* __list);
+extern int setgroups(size_t __size, const gid_t* __list);
+extern int setreuid(uid_t __ruid, uid_t __euid);
+extern int setregid(gid_t __rgid, gid_t __egid);
+extern int setresuid(uid_t __ruid, uid_t __euid, uid_t __suid);
+extern int setresgid(gid_t __rgid, gid_t __egid, gid_t __sgid);
+extern int getresuid(uid_t* __ruid, uid_t* __euid, uid_t* __suid);
+extern int getresgid(gid_t* __rgid, gid_t* __egid, gid_t* __sgid);
extern char* getlogin(void);
-extern long fpathconf(int, int);
-extern long pathconf(const char*, int);
-
-extern int access(const char*, int);
-extern int faccessat(int, const char*, int, int);
-extern int link(const char*, const char*);
-extern int linkat(int, const char*, int, const char*, int);
-extern int unlink(const char*);
-extern int unlinkat(int, const char*, int);
-extern int chdir(const char *);
-extern int fchdir(int);
-extern int rmdir(const char *);
-extern int pipe(int *);
+extern long fpathconf(int __fd, int __name);
+extern long pathconf(const char* __path, int __name);
+
+extern int access(const char* __path, int __mode);
+extern int faccessat(int __dirfd, const char* __path, int __mode, int __flags)
+ __INTRODUCED_IN(21);
+extern int link(const char* __oldpath, const char* __newpath);
+extern int linkat(int __olddirfd, const char* __oldpath, int __newdirfd,
+ const char* __newpath, int __flags) __INTRODUCED_IN(21);
+extern int unlink(const char* __path);
+extern int unlinkat(int __dirfd, const char* __path, int __flags);
+extern int chdir(const char* __path);
+extern int fchdir(int __fd);
+extern int rmdir(const char* __path);
+extern int pipe(int* __pipefd);
#if defined(__USE_GNU)
-extern int pipe2(int *, int);
+extern int pipe2(int* __pipefd, int __flags) __INTRODUCED_IN(9);
#endif
-extern int chroot(const char *);
-extern int symlink(const char*, const char*);
-extern int symlinkat(const char*, int, const char*);
-extern ssize_t readlink(const char*, char*, size_t);
-extern ssize_t readlinkat(int, const char*, char*, size_t);
-extern int chown(const char *, uid_t, gid_t);
-extern int fchown(int, uid_t, gid_t);
-extern int fchownat(int, const char*, uid_t, gid_t, int);
-extern int lchown(const char *, uid_t, gid_t);
-extern char *getcwd(char *, size_t);
+extern int chroot(const char* __path);
+extern int symlink(const char* __oldpath, const char* __newpath);
+extern int symlinkat(const char* __oldpath, int __newdirfd,
+ const char* __newpath) __INTRODUCED_IN(21);
+extern ssize_t readlink(const char* __path, char* __buf, size_t __bufsiz);
+extern ssize_t readlinkat(int __dirfd, const char* __path, char* __buf,
+ size_t __bufsiz) __INTRODUCED_IN(21);
+extern int chown(const char* __path, uid_t __owner, gid_t __group);
+extern int fchown(int __fd, uid_t __owner, gid_t __group);
+extern int fchownat(int __dirfd, const char* __path, uid_t __owner,
+ gid_t __group, int __flags);
+extern int lchown(const char* __path, uid_t __owner, gid_t __group);
+extern char* getcwd(char* __buf, size_t __size);
extern int sync(void);
-extern int close(int);
+extern int close(int __fd);
-extern ssize_t read(int, void *, size_t);
-extern ssize_t write(int, const void *, size_t);
+extern ssize_t read(int __fd, void* __buf, size_t __count);
+extern ssize_t write(int __fd, const void* __buf, size_t __count);
-extern int dup(int);
-extern int dup2(int, int);
-extern int dup3(int, int, int);
-extern int fcntl(int, int, ...);
-extern int ioctl(int, int, ...);
-extern int fsync(int);
-extern int fdatasync(int);
+extern int dup(int __oldfd);
+extern int dup2(int __oldfd, int __newfd);
+extern int dup3(int __oldfd, int __newfd, int __flags) __INTRODUCED_IN(21);
+extern int fcntl(int __fd, int __cmd, ...);
+extern int ioctl(int __fd, int __request, ...);
+extern int fsync(int __fd);
+extern int fdatasync(int __fd) __INTRODUCED_IN(9);
#if defined(__USE_FILE_OFFSET64)
-extern int truncate(const char *, off_t) __RENAME(truncate64);
-extern off_t lseek(int, off_t, int) __RENAME(lseek64);
-extern ssize_t pread(int, void *, size_t, off_t) __RENAME(pread64);
-extern ssize_t pwrite(int, const void *, size_t, off_t) __RENAME(pwrite64);
-extern int ftruncate(int, off_t) __RENAME(ftruncate64);
+extern off_t lseek(int __fd, off_t __offset, int __whence) __RENAME(lseek64);
#else
-extern int truncate(const char *, off_t);
-extern off_t lseek(int, off_t, int);
-extern ssize_t pread(int, void *, size_t, off_t);
-extern ssize_t pwrite(int, const void *, size_t, off_t);
-extern int ftruncate(int, off_t);
+extern off_t lseek(int __fd, off_t __offset, int __whence);
#endif
-extern int truncate64(const char *, off64_t);
-extern off64_t lseek64(int, off64_t, int);
-extern ssize_t pread64(int, void *, size_t, off64_t);
-extern ssize_t pwrite64(int, const void *, size_t, off64_t);
-extern int ftruncate64(int, off64_t);
+
+extern off64_t lseek64(int __fd, off64_t __offset, int __whence);
+
+#if defined(__USE_FILE_OFFSET64) && __ANDROID_API__ >= 21
+extern int truncate(const char* __path, off_t __length) __RENAME(truncate64);
+extern ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset)
+ __RENAME(pread64);
+extern ssize_t pwrite(int __fd, const void* __buf, size_t __count,
+ off_t __offset) __RENAME(pwrite64);
+extern int ftruncate(int __fd, off_t __length) __RENAME(ftruncate64);
+#else
+extern int truncate(const char* __path, off_t __length);
+extern ssize_t pread(int __fd, void* __buf, size_t __count, off_t __offset);
+extern ssize_t pwrite(int __fd, const void* __buf, size_t __count,
+ off_t __offset);
+extern int ftruncate(int __fd, off_t __length);
+#endif
+
+extern int truncate64(const char* __path, off64_t __length) __INTRODUCED_IN(21);
+extern ssize_t pread64(int __fd, void* __buf, size_t __count, off64_t __offset) __INTRODUCED_IN(21);
+extern ssize_t pwrite64(int __fd, const void* __buf, size_t __count,
+ off64_t __offset) __INTRODUCED_IN(21);
+extern int ftruncate64(int __fd, off64_t __length) __INTRODUCED_IN(21);
extern int pause(void);
-extern unsigned int alarm(unsigned int);
-extern unsigned int sleep(unsigned int);
-extern int usleep(useconds_t);
+extern unsigned int alarm(unsigned int __seconds);
+extern unsigned int sleep(unsigned int __seconds);
+extern int usleep(useconds_t __usec);
-int gethostname(char*, size_t);
-int sethostname(const char*, size_t);
+int gethostname(char* __name, size_t __len);
+int sethostname(const char* __name, size_t __len);
-extern void *__brk(void *);
-extern int brk(void *);
-extern void *sbrk(ptrdiff_t);
+extern void* __brk(void* __addr);
+extern int brk(void* __addr);
+extern void* sbrk(ptrdiff_t __increment);
-extern int getopt(int, char * const *, const char *);
-extern char *optarg;
+extern int getopt(int __argc, char* const* __argv, const char* __argstring);
+extern char* optarg;
extern int optind, opterr, optopt;
-extern int isatty(int);
-extern char* ttyname(int);
-extern int ttyname_r(int, char*, size_t);
+extern int isatty(int __fd);
+extern char* ttyname(int __fd);
+extern int ttyname_r(int __fd, char* __buf, size_t __buflen) __INTRODUCED_IN(8);
-extern int acct(const char* filepath);
+extern int acct(const char* __filepath);
-int getpagesize(void);
+long sysconf(int __name);
-long sysconf(int);
+#if __ANDROID_API__ >= 21
+int getpagesize(void);
+#else
+__inline__ int getpagesize(void) {
+ return sysconf(_SC_PAGESIZE);
+}
+#endif
-long syscall(long number, ...);
+long syscall(long __number, ...);
-extern int daemon(int, int);
+extern int daemon(int __nochdir, int __noclose);
#if defined(__arm__) || (defined(__mips__) && !defined(__LP64__))
-extern int cacheflush(long, long, long);
+extern int cacheflush(long __addr, long __nbytes, long __cache);
/* __attribute__((deprecated("use __builtin___clear_cache instead"))); */
#endif
-extern pid_t tcgetpgrp(int fd);
-extern int tcsetpgrp(int fd, pid_t _pid);
+extern pid_t tcgetpgrp(int __fd);
+extern int tcsetpgrp(int __fd, pid_t __pid);
/* Used to retry syscalls that can return EINTR. */
#define TEMP_FAILURE_RETRY(exp) ({ \
@@ -224,6 +247,11 @@ extern int tcsetpgrp(int fd, pid_t _pid);
} while (_rc == -1 && errno == EINTR); \
_rc; })
+/* TODO(unified-headers): Factor out all the FORTIFY features. */
+extern char* __getcwd_chk(char*, size_t, size_t);
+__errordecl(__getcwd_dest_size_error, "getcwd called with size bigger than destination");
+extern char* __getcwd_real(char*, size_t) __RENAME(getcwd);
+
extern ssize_t __pread_chk(int, void*, size_t, off_t, size_t);
__errordecl(__pread_dest_size_error, "pread called with size bigger than destination");
__errordecl(__pread_count_toobig_error, "pread called with count > SSIZE_MAX");
@@ -234,11 +262,26 @@ __errordecl(__pread64_dest_size_error, "pread64 called with size bigger than des
__errordecl(__pread64_count_toobig_error, "pread64 called with count > SSIZE_MAX");
extern ssize_t __pread64_real(int, void*, size_t, off64_t) __RENAME(pread64);
+extern ssize_t __pwrite_chk(int, const void*, size_t, off_t, size_t);
+__errordecl(__pwrite_dest_size_error, "pwrite called with size bigger than destination");
+__errordecl(__pwrite_count_toobig_error, "pwrite called with count > SSIZE_MAX");
+extern ssize_t __pwrite_real(int, const void*, size_t, off_t) __RENAME(pwrite);
+
+extern ssize_t __pwrite64_chk(int, const void*, size_t, off64_t, size_t);
+__errordecl(__pwrite64_dest_size_error, "pwrite64 called with size bigger than destination");
+__errordecl(__pwrite64_count_toobig_error, "pwrite64 called with count > SSIZE_MAX");
+extern ssize_t __pwrite64_real(int, const void*, size_t, off64_t) __RENAME(pwrite64);
+
extern ssize_t __read_chk(int, void*, size_t, size_t);
__errordecl(__read_dest_size_error, "read called with size bigger than destination");
__errordecl(__read_count_toobig_error, "read called with count > SSIZE_MAX");
extern ssize_t __read_real(int, void*, size_t) __RENAME(read);
+extern ssize_t __write_chk(int, const void*, size_t, size_t);
+__errordecl(__write_dest_size_error, "write called with size bigger than destination");
+__errordecl(__write_count_toobig_error, "write called with count > SSIZE_MAX");
+extern ssize_t __write_real(int, const void*, size_t) __RENAME(write);
+
extern ssize_t __readlink_chk(const char*, char*, size_t, size_t);
__errordecl(__readlink_dest_size_error, "readlink called with size bigger than destination");
__errordecl(__readlink_size_toobig_error, "readlink called with size > SSIZE_MAX");
@@ -251,6 +294,37 @@ extern ssize_t __readlinkat_real(int dirfd, const char*, char*, size_t) __RENAME
#if defined(__BIONIC_FORTIFY)
+__BIONIC_FORTIFY_INLINE
+char* getcwd(char* buf, size_t size) {
+ size_t bos = __bos(buf);
+
+#if defined(__clang__)
+ /*
+ * Work around LLVM's incorrect __builtin_object_size implementation here
+ * to avoid needing the workaround in the __getcwd_chk ABI forever.
+ *
+ * https://llvm.org/bugs/show_bug.cgi?id=23277
+ */
+ if (buf == NULL) {
+ bos = __BIONIC_FORTIFY_UNKNOWN_SIZE;
+ }
+#else
+ if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
+ return __getcwd_real(buf, size);
+ }
+
+ if (__builtin_constant_p(size) && (size > bos)) {
+ __getcwd_dest_size_error();
+ }
+
+ if (__builtin_constant_p(size) && (size <= bos)) {
+ return __getcwd_real(buf, size);
+ }
+#endif
+
+ return __getcwd_chk(buf, size, bos);
+}
+
#if defined(__USE_FILE_OFFSET64)
#define __PREAD_PREFIX(x) __pread64_ ## x
#else
@@ -307,6 +381,62 @@ ssize_t pread64(int fd, void* buf, size_t count, off64_t offset) {
return __pread64_chk(fd, buf, count, offset, bos);
}
+#if defined(__USE_FILE_OFFSET64)
+#define __PWRITE_PREFIX(x) __pwrite64_ ## x
+#else
+#define __PWRITE_PREFIX(x) __pwrite_ ## x
+#endif
+
+__BIONIC_FORTIFY_INLINE
+ssize_t pwrite(int fd, const void* buf, size_t count, off_t offset) {
+ size_t bos = __bos0(buf);
+
+#if !defined(__clang__)
+ if (__builtin_constant_p(count) && (count > SSIZE_MAX)) {
+ __PWRITE_PREFIX(count_toobig_error)();
+ }
+
+ if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
+ return __PWRITE_PREFIX(real)(fd, buf, count, offset);
+ }
+
+ if (__builtin_constant_p(count) && (count > bos)) {
+ __PWRITE_PREFIX(dest_size_error)();
+ }
+
+ if (__builtin_constant_p(count) && (count <= bos)) {
+ return __PWRITE_PREFIX(real)(fd, buf, count, offset);
+ }
+#endif
+
+ return __PWRITE_PREFIX(chk)(fd, buf, count, offset, bos);
+}
+
+__BIONIC_FORTIFY_INLINE
+ssize_t pwrite64(int fd, const void* buf, size_t count, off64_t offset) {
+ size_t bos = __bos0(buf);
+
+#if !defined(__clang__)
+ if (__builtin_constant_p(count) && (count > SSIZE_MAX)) {
+ __pwrite64_count_toobig_error();
+ }
+
+ if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
+ return __pwrite64_real(fd, buf, count, offset);
+ }
+
+ if (__builtin_constant_p(count) && (count > bos)) {
+ __pwrite64_dest_size_error();
+ }
+
+ if (__builtin_constant_p(count) && (count <= bos)) {
+ return __pwrite64_real(fd, buf, count, offset);
+ }
+#endif
+
+ return __pwrite64_chk(fd, buf, count, offset, bos);
+}
+
__BIONIC_FORTIFY_INLINE
ssize_t read(int fd, void* buf, size_t count) {
size_t bos = __bos0(buf);
@@ -333,6 +463,33 @@ ssize_t read(int fd, void* buf, size_t count) {
}
__BIONIC_FORTIFY_INLINE
+ssize_t write(int fd, const void* buf, size_t count) {
+ size_t bos = __bos0(buf);
+
+#if !defined(__clang__)
+#if 0 /* work around a false positive due to a missed optimization */
+ if (__builtin_constant_p(count) && (count > SSIZE_MAX)) {
+ __write_count_toobig_error();
+ }
+#endif
+
+ if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) {
+ return __write_real(fd, buf, count);
+ }
+
+ if (__builtin_constant_p(count) && (count > bos)) {
+ __write_dest_size_error();
+ }
+
+ if (__builtin_constant_p(count) && (count <= bos)) {
+ return __write_real(fd, buf, count);
+ }
+#endif
+
+ return __write_chk(fd, buf, count, bos);
+}
+
+__BIONIC_FORTIFY_INLINE
ssize_t readlink(const char* path, char* buf, size_t size) {
size_t bos = __bos(buf);
diff --git a/libc/include/utmp.h b/libc/include/utmp.h
index ebf23726a..c6f22a550 100644
--- a/libc/include/utmp.h
+++ b/libc/include/utmp.h
@@ -46,7 +46,16 @@
#define UT_HOSTSIZE 16
#endif
-#define USER_PROCESS 7
+#define EMPTY 0
+#define RUN_LVL 1
+#define BOOT_TIME 2
+#define NEW_TIME 3
+#define OLD_TIME 4
+#define INIT_PROCESS 5
+#define LOGIN_PROCESS 6
+#define USER_PROCESS 7
+#define DEAD_PROCESS 8
+#define ACCOUNTING 9
struct lastlog
{
@@ -88,8 +97,9 @@ struct utmp
__BEGIN_DECLS
int utmpname(const char*);
-void setutent();
-struct utmp* getutent();
+void setutent(void);
+struct utmp* getutent(void);
+void endutent(void);
int login_tty(int);
diff --git a/libc/include/wait.h b/libc/include/wait.h
new file mode 100644
index 000000000..d01b81125
--- /dev/null
+++ b/libc/include/wait.h
@@ -0,0 +1 @@
+#include <sys/wait.h>
diff --git a/libc/include/wchar.h b/libc/include/wchar.h
index ea6aca03c..0a94cee3f 100644
--- a/libc/include/wchar.h
+++ b/libc/include/wchar.h
@@ -36,7 +36,7 @@
#include <time.h>
#include <xlocale.h>
-#include <machine/wchar_limits.h>
+#include <bits/wchar_limits.h>
__BEGIN_DECLS
diff --git a/libc/kernel/common/scsi/scsi.h b/libc/kernel/common/scsi/scsi.h
new file mode 100644
index 000000000..9e5edd700
--- /dev/null
+++ b/libc/kernel/common/scsi/scsi.h
@@ -0,0 +1,261 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _SCSI_SCSI_H
+#define _SCSI_SCSI_H
+#include <linux/types.h>
+#define TEST_UNIT_READY 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define REZERO_UNIT 0x01
+#define REQUEST_SENSE 0x03
+#define FORMAT_UNIT 0x04
+#define READ_BLOCK_LIMITS 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define REASSIGN_BLOCKS 0x07
+#define INITIALIZE_ELEMENT_STATUS 0x07
+#define READ_6 0x08
+#define WRITE_6 0x0a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SEEK_6 0x0b
+#define READ_REVERSE 0x0f
+#define WRITE_FILEMARKS 0x10
+#define SPACE 0x11
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define INQUIRY 0x12
+#define RECOVER_BUFFERED_DATA 0x14
+#define MODE_SELECT 0x15
+#define RESERVE 0x16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RELEASE 0x17
+#define COPY 0x18
+#define ERASE 0x19
+#define MODE_SENSE 0x1a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define START_STOP 0x1b
+#define RECEIVE_DIAGNOSTIC 0x1c
+#define SEND_DIAGNOSTIC 0x1d
+#define ALLOW_MEDIUM_REMOVAL 0x1e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define READ_FORMAT_CAPACITIES 0x23
+#define SET_WINDOW 0x24
+#define READ_CAPACITY 0x25
+#define READ_10 0x28
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define WRITE_10 0x2a
+#define SEEK_10 0x2b
+#define POSITION_TO_ELEMENT 0x2b
+#define WRITE_VERIFY 0x2e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VERIFY 0x2f
+#define SEARCH_HIGH 0x30
+#define SEARCH_EQUAL 0x31
+#define SEARCH_LOW 0x32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SET_LIMITS 0x33
+#define PRE_FETCH 0x34
+#define READ_POSITION 0x34
+#define SYNCHRONIZE_CACHE 0x35
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LOCK_UNLOCK_CACHE 0x36
+#define READ_DEFECT_DATA 0x37
+#define MEDIUM_SCAN 0x38
+#define COMPARE 0x39
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define COPY_VERIFY 0x3a
+#define WRITE_BUFFER 0x3b
+#define READ_BUFFER 0x3c
+#define UPDATE_BLOCK 0x3d
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define READ_LONG 0x3e
+#define WRITE_LONG 0x3f
+#define CHANGE_DEFINITION 0x40
+#define WRITE_SAME 0x41
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define UNMAP 0x42
+#define READ_TOC 0x43
+#define READ_HEADER 0x44
+#define GET_EVENT_STATUS_NOTIFICATION 0x4a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LOG_SELECT 0x4c
+#define LOG_SENSE 0x4d
+#define XDWRITEREAD_10 0x53
+#define MODE_SELECT_10 0x55
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RESERVE_10 0x56
+#define RELEASE_10 0x57
+#define MODE_SENSE_10 0x5a
+#define PERSISTENT_RESERVE_IN 0x5e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PERSISTENT_RESERVE_OUT 0x5f
+#define VARIABLE_LENGTH_CMD 0x7f
+#define REPORT_LUNS 0xa0
+#define SECURITY_PROTOCOL_IN 0xa2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MAINTENANCE_IN 0xa3
+#define MAINTENANCE_OUT 0xa4
+#define MOVE_MEDIUM 0xa5
+#define EXCHANGE_MEDIUM 0xa6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define READ_12 0xa8
+#define WRITE_12 0xaa
+#define READ_MEDIA_SERIAL_NUMBER 0xab
+#define WRITE_VERIFY_12 0xae
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VERIFY_12 0xaf
+#define SEARCH_HIGH_12 0xb0
+#define SEARCH_EQUAL_12 0xb1
+#define SEARCH_LOW_12 0xb2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SECURITY_PROTOCOL_OUT 0xb5
+#define READ_ELEMENT_STATUS 0xb8
+#define SEND_VOLUME_TAG 0xb6
+#define WRITE_LONG_2 0xea
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EXTENDED_COPY 0x83
+#define RECEIVE_COPY_RESULTS 0x84
+#define ACCESS_CONTROL_IN 0x86
+#define ACCESS_CONTROL_OUT 0x87
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define READ_16 0x88
+#define COMPARE_AND_WRITE 0x89
+#define WRITE_16 0x8a
+#define READ_ATTRIBUTE 0x8c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define WRITE_ATTRIBUTE 0x8d
+#define VERIFY_16 0x8f
+#define SYNCHRONIZE_CACHE_16 0x91
+#define WRITE_SAME_16 0x93
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SERVICE_ACTION_IN 0x9e
+#define GOOD 0x00
+#define CHECK_CONDITION 0x01
+#define CONDITION_GOOD 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BUSY 0x04
+#define INTERMEDIATE_GOOD 0x08
+#define INTERMEDIATE_C_GOOD 0x0a
+#define RESERVATION_CONFLICT 0x0c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define COMMAND_TERMINATED 0x11
+#define QUEUE_FULL 0x14
+#define ACA_ACTIVE 0x18
+#define TASK_ABORTED 0x20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define STATUS_MASK 0xfe
+#define NO_SENSE 0x00
+#define RECOVERED_ERROR 0x01
+#define NOT_READY 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIUM_ERROR 0x03
+#define HARDWARE_ERROR 0x04
+#define ILLEGAL_REQUEST 0x05
+#define UNIT_ATTENTION 0x06
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DATA_PROTECT 0x07
+#define BLANK_CHECK 0x08
+#define COPY_ABORTED 0x0a
+#define ABORTED_COMMAND 0x0b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VOLUME_OVERFLOW 0x0d
+#define MISCOMPARE 0x0e
+#define TYPE_DISK 0x00
+#define TYPE_TAPE 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TYPE_PRINTER 0x02
+#define TYPE_PROCESSOR 0x03
+#define TYPE_WORM 0x04
+#define TYPE_ROM 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TYPE_SCANNER 0x06
+#define TYPE_MOD 0x07
+#define TYPE_MEDIUM_CHANGER 0x08
+#define TYPE_COMM 0x09
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TYPE_RAID 0x0c
+#define TYPE_ENCLOSURE 0x0d
+#define TYPE_RBC 0x0e
+#define TYPE_OSD 0x11
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TYPE_ZBC 0x14
+#define TYPE_WLUN 0x1e
+#define TYPE_NO_LUN 0x7f
+struct ccs_modesel_head {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 _r1;
+ __u8 medium;
+ __u8 _r2;
+ __u8 block_desc_length;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 density;
+ __u8 number_blocks_hi;
+ __u8 number_blocks_med;
+ __u8 number_blocks_lo;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 _r3;
+ __u8 block_length_hi;
+ __u8 block_length_med;
+ __u8 block_length_lo;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define COMMAND_COMPLETE 0x00
+#define EXTENDED_MESSAGE 0x01
+#define EXTENDED_MODIFY_DATA_POINTER 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EXTENDED_SDTR 0x01
+#define EXTENDED_EXTENDED_IDENTIFY 0x02
+#define EXTENDED_WDTR 0x03
+#define EXTENDED_PPR 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EXTENDED_MODIFY_BIDI_DATA_PTR 0x05
+#define SAVE_POINTERS 0x02
+#define RESTORE_POINTERS 0x03
+#define DISCONNECT 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define INITIATOR_ERROR 0x05
+#define ABORT_TASK_SET 0x06
+#define MESSAGE_REJECT 0x07
+#define NOP 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MSG_PARITY_ERROR 0x09
+#define LINKED_CMD_COMPLETE 0x0a
+#define LINKED_FLG_CMD_COMPLETE 0x0b
+#define TARGET_RESET 0x0c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABORT_TASK 0x0d
+#define CLEAR_TASK_SET 0x0e
+#define INITIATE_RECOVERY 0x0f
+#define RELEASE_RECOVERY 0x10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CLEAR_ACA 0x16
+#define LOGICAL_UNIT_RESET 0x17
+#define SIMPLE_QUEUE_TAG 0x20
+#define HEAD_OF_QUEUE_TAG 0x21
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ORDERED_QUEUE_TAG 0x22
+#define IGNORE_WIDE_RESIDUE 0x23
+#define ACA 0x24
+#define QAS_REQUEST 0x55
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BUS_DEVICE_RESET TARGET_RESET
+#define ABORT ABORT_TASK_SET
+#define SCSI_IOCTL_GET_IDLUN 0x5382
+#define SCSI_IOCTL_PROBE_HOST 0x5385
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386
+#define SCSI_IOCTL_GET_PCI 0x5387
+#endif
diff --git a/libc/kernel/common/scsi/scsi_ioctl.h b/libc/kernel/common/scsi/scsi_ioctl.h
new file mode 100644
index 000000000..c2f64a724
--- /dev/null
+++ b/libc/kernel/common/scsi/scsi_ioctl.h
@@ -0,0 +1,34 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _SCSI_IOCTL_H
+#define _SCSI_IOCTL_H
+#define SCSI_IOCTL_SEND_COMMAND 1
+#define SCSI_IOCTL_TEST_UNIT_READY 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SCSI_IOCTL_BENCHMARK_COMMAND 3
+#define SCSI_IOCTL_SYNC 4
+#define SCSI_IOCTL_START_UNIT 5
+#define SCSI_IOCTL_STOP_UNIT 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SCSI_IOCTL_DOORLOCK 0x5380
+#define SCSI_IOCTL_DOORUNLOCK 0x5381
+#define SCSI_REMOVAL_PREVENT 1
+#define SCSI_REMOVAL_ALLOW 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/common/scsi/sg.h b/libc/kernel/common/scsi/sg.h
new file mode 100644
index 000000000..a38eccbc5
--- /dev/null
+++ b/libc/kernel/common/scsi/sg.h
@@ -0,0 +1,179 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _SCSI_GENERIC_H
+#define _SCSI_GENERIC_H
+#include <linux/compiler.h>
+typedef struct sg_iovec {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ void __user * iov_base;
+ size_t iov_len;
+} sg_iovec_t;
+typedef struct sg_io_hdr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int interface_id;
+ int dxfer_direction;
+ unsigned char cmd_len;
+ unsigned char mx_sb_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short iovec_count;
+ unsigned int dxfer_len;
+ void __user * dxferp;
+ unsigned char __user * cmdp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ void __user * sbp;
+ unsigned int timeout;
+ unsigned int flags;
+ int pack_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ void __user * usr_ptr;
+ unsigned char status;
+ unsigned char masked_status;
+ unsigned char msg_status;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char sb_len_wr;
+ unsigned short host_status;
+ unsigned short driver_status;
+ int resid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int duration;
+ unsigned int info;
+} sg_io_hdr_t;
+#define SG_INTERFACE_ID_ORIG 'S'
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_DXFER_NONE (- 1)
+#define SG_DXFER_TO_DEV (- 2)
+#define SG_DXFER_FROM_DEV (- 3)
+#define SG_DXFER_TO_FROM_DEV (- 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_DXFER_UNKNOWN (- 5)
+#define SG_FLAG_DIRECT_IO 1
+#define SG_FLAG_UNUSED_LUN_INHIBIT 2
+#define SG_FLAG_MMAP_IO 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_FLAG_NO_DXFER 0x10000
+#define SG_FLAG_Q_AT_TAIL 0x10
+#define SG_FLAG_Q_AT_HEAD 0x20
+#define SG_INFO_OK_MASK 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_INFO_OK 0x0
+#define SG_INFO_CHECK 0x1
+#define SG_INFO_DIRECT_IO_MASK 0x6
+#define SG_INFO_INDIRECT_IO 0x0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_INFO_DIRECT_IO 0x2
+#define SG_INFO_MIXED_IO 0x4
+typedef struct sg_scsi_id {
+ int host_no;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int channel;
+ int scsi_id;
+ int lun;
+ int scsi_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ short h_cmd_per_lun;
+ short d_queue_depth;
+ int unused[2];
+} sg_scsi_id_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct sg_req_info {
+ char req_state;
+ char orphan;
+ char sg_io_owned;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char problem;
+ int pack_id;
+ void __user * usr_ptr;
+ unsigned int duration;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int unused;
+} sg_req_info_t;
+#define SG_EMULATED_HOST 0x2203
+#define SG_SET_TRANSFORM 0x2204
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_GET_TRANSFORM 0x2205
+#define SG_SET_RESERVED_SIZE 0x2275
+#define SG_GET_RESERVED_SIZE 0x2272
+#define SG_GET_SCSI_ID 0x2276
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_SET_FORCE_LOW_DMA 0x2279
+#define SG_GET_LOW_DMA 0x227a
+#define SG_SET_FORCE_PACK_ID 0x227b
+#define SG_GET_PACK_ID 0x227c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_GET_NUM_WAITING 0x227d
+#define SG_GET_SG_TABLESIZE 0x227F
+#define SG_GET_VERSION_NUM 0x2282
+#define SG_SCSI_RESET 0x2284
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_SCSI_RESET_NOTHING 0
+#define SG_SCSI_RESET_DEVICE 1
+#define SG_SCSI_RESET_BUS 2
+#define SG_SCSI_RESET_HOST 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_SCSI_RESET_TARGET 4
+#define SG_IO 0x2285
+#define SG_GET_REQUEST_TABLE 0x2286
+#define SG_SET_KEEP_ORPHAN 0x2287
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_GET_KEEP_ORPHAN 0x2288
+#define SG_GET_ACCESS_COUNT 0x2289
+#define SG_SCATTER_SZ (8 * 4096)
+#define SG_DEFAULT_RETRIES 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_DEF_FORCE_LOW_DMA 0
+#define SG_DEF_FORCE_PACK_ID 0
+#define SG_DEF_KEEP_ORPHAN 0
+#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_MAX_QUEUE 16
+#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE
+typedef struct sg_io_hdr Sg_io_hdr;
+typedef struct sg_io_vec Sg_io_vec;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct sg_scsi_id Sg_scsi_id;
+typedef struct sg_req_info Sg_req_info;
+#define SG_MAX_SENSE 16
+struct sg_header {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int pack_len;
+ int reply_len;
+ int pack_id;
+ int result;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int twelve_byte : 1;
+ unsigned int target_status : 5;
+ unsigned int host_status : 8;
+ unsigned int driver_status : 8;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int other_flags : 10;
+ unsigned char sense_buffer[SG_MAX_SENSE];
+};
+#define SG_SET_TIMEOUT 0x2201
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_GET_TIMEOUT 0x2202
+#define SG_GET_COMMAND_Q 0x2270
+#define SG_SET_COMMAND_Q 0x2271
+#define SG_SET_DEBUG 0x227e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SG_NEXT_CMD_LEN 0x2283
+#define SG_DEFAULT_TIMEOUT (60 * HZ)
+#define SG_DEF_COMMAND_Q 0
+#define SG_DEF_UNDERRUN_FLAG 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/tools/clean_header.py b/libc/kernel/tools/clean_header.py
index 0e0ed7658..e84bcf959 100755
--- a/libc/kernel/tools/clean_header.py
+++ b/libc/kernel/tools/clean_header.py
@@ -73,90 +73,77 @@ import sys, cpp, kernel, glob, os, re, getopt
from defaults import *
from utils import *
-noUpdate = 1
+def print_error(no_update, msg):
+ if no_update:
+ panic(msg)
+ sys.stderr.write("warning: " + msg)
-def cleanupFile(path, original_path):
+
+def cleanupFile(dst_dir, src_dir, rel_path, no_update = True):
"""reads an original header and perform the cleanup operation on it
this functions returns the destination path and the clean header
as a single string"""
# check the header path
- src_path = path
-
- if not os.path.exists(src_path):
- if noUpdate:
- panic( "file does not exist: '%s'\n" % path )
- sys.stderr.write( "warning: file does not exit: %s\n" % path )
- return None, None
+ full_path = os.path.join(src_dir, rel_path)
- if not os.path.isfile(src_path):
- if noUpdate:
- panic( "path is not a file: '%s'\n" % path )
- sys.stderr.write( "warning: not a file: %s\n" % path )
+ if not os.path.exists(full_path):
+ print_error(no_update, "file does not exist: '%s'\n" % full_path)
return None, None
- if os.path.commonprefix( [ src_path, original_path ] ) != original_path:
- if noUpdate:
- panic( "file is not in 'original' directory: %s\n" % path );
- sys.stderr.write( "warning: file not in 'original' ignored: %s\n" % path )
+ if not os.path.isfile(full_path):
+ print_error(no_update, "path is not a file: '%s'\n" % full_path)
return None, None
- src_path = src_path[len(original_path):]
- if len(src_path) > 0 and src_path[0] == '/':
- src_path = src_path[1:]
-
- if len(src_path) == 0:
- panic( "oops, internal error, can't extract correct relative path\n" )
-
# convert into destination path, extracting architecture if needed
# and the corresponding list of known static functions
#
arch = None
statics = kernel_known_generic_statics
- m = re.match(r"asm-([\w\d_\+\.\-]+)(/.*)", src_path)
+ m = re.match(r"asm-([\w\d_\+\.\-]+)(/.*)", rel_path)
if m and m.group(1) != 'generic':
dst_path = "arch-%s/asm/%s" % m.groups()
- arch = m.group(1)
- statics = statics.union( kernel_known_statics.get( arch, set() ) )
+ arch = m.group(1)
+ statics = statics.union(kernel_known_statics.get(arch, set()))
else:
# process headers under the uapi directory
# note the "asm" level has been explicitly added in the original
# kernel header tree for architectural-dependent uapi headers
- m_uapi = re.match(r"(uapi)/([\w\d_\+\.\-]+)(/.*)", src_path)
+ m_uapi = re.match(r"(uapi)/([\w\d_\+\.\-]+)(/.*)", rel_path)
if m_uapi:
- dst_path = src_path
+ dst_path = rel_path
m_uapi_arch = re.match(r"asm-([\w\d_\+\.\-]+)", m_uapi.group(2))
if m_uapi_arch and m_uapi_arch.group(1) != 'generic':
- arch = m_uapi_arch.group(1)
- statics = statics.union( kernel_known_statics.get( arch, set() ) )
+ arch = m_uapi_arch.group(1)
+ statics = statics.union(kernel_known_statics.get(arch, set()))
# common headers (ie non-asm and non-uapi)
else:
- dst_path = "common/" + src_path
+ dst_path = os.path.join("common", rel_path)
- dst_path = os.path.normpath( kernel_cleaned_path + "/" + dst_path )
+ dst_path = os.path.join(dst_dir, dst_path)
# now, let's parse the file
#
parser = cpp.BlockParser()
- blocks = parser.parseFile(path)
+ blocks = parser.parseFile(full_path)
if not parser.parsed:
- sys.stderr.write( "error: can't parse '%s'" % path )
- sys.exit(1)
+ print_error(no_update, "can't parse '%s'%" % full_path)
+ return None, None
macros = kernel_known_macros.copy()
if arch and arch in kernel_default_arch_macros:
macros.update(kernel_default_arch_macros[arch])
if arch and arch in kernel_arch_token_replacements:
- blocks.replaceTokens( kernel_arch_token_replacements[arch] )
+ blocks.replaceTokens(kernel_arch_token_replacements[arch])
- blocks.optimizeMacros( macros )
+ blocks.optimizeMacros(macros)
blocks.optimizeIf01()
- blocks.removeVarsAndFuncs( statics )
- blocks.replaceTokens( kernel_token_replacements )
- blocks.removeMacroDefines( kernel_ignored_macros )
+ blocks.removeVarsAndFuncs(statics)
+ blocks.replaceTokens(kernel_token_replacements)
+ blocks.removeMacroDefines(kernel_ignored_macros)
out = StringOutput()
- out.write( kernel_disclaimer )
+ out.write(kernel_disclaimer)
blocks.writeWithWarning(out, kernel_warning, 4)
return dst_path, out.get()
@@ -183,28 +170,31 @@ if __name__ == "__main__":
sys.exit(1)
try:
- optlist, args = getopt.getopt( sys.argv[1:], 'uvk:d:' )
+ optlist, args = getopt.getopt(sys.argv[1:], 'uvk:d:')
except:
# unrecognized option
- sys.stderr.write( "error: unrecognized option\n" )
+ sys.stderr.write("error: unrecognized option\n")
usage()
+ no_update = True
+ dst_dir = get_kernel_dir()
+ src_dir = get_kernel_headers_original_dir()
for opt, arg in optlist:
if opt == '-u':
- noUpdate = 0
+ no_update = False
elif opt == '-v':
logging.basicConfig(level=logging.DEBUG)
elif opt == '-k':
- kernel_original_path = arg
+ src_dir = arg
elif opt == '-d':
- kernel_cleaned_path = arg
+ dst_dir = arg
if len(args) == 0:
usage()
- if noUpdate:
+ if no_update:
for path in args:
- dst_path, newdata = cleanupFile(path,kernel_original_path)
+ dst_path, newdata = cleanupFile(dst_dir, src_dir, path)
print newdata
sys.exit(0)
@@ -214,12 +204,12 @@ if __name__ == "__main__":
b = BatchFileUpdater()
for path in args:
- dst_path, newdata = cleanupFile(path,kernel_original_path)
+ dst_path, newdata = cleanupFile(dst_dir, src_dir, path, no_update)
if not dst_path:
continue
- b.readFile( dst_path )
- r = b.editFile( dst_path, newdata )
+ b.readFile(dst_path)
+ r = b.editFile(dst_path, newdata)
if r == 0:
r = "unchanged"
elif r == 1:
@@ -227,7 +217,7 @@ if __name__ == "__main__":
else:
r = "added"
- print "cleaning: %-*s -> %-*s (%s)" % ( 35, path, 35, dst_path, r )
+ print "cleaning: %-*s -> %-*s (%s)" % (35, path, 35, dst_path, r)
b.updateGitFiles()
diff --git a/libc/kernel/tools/defaults.py b/libc/kernel/tools/defaults.py
index 8aba9985a..773d22f00 100644
--- a/libc/kernel/tools/defaults.py
+++ b/libc/kernel/tools/defaults.py
@@ -12,12 +12,6 @@ kernel_archs = [ 'arm', 'arm64', 'mips', 'x86' ]
# tree. used when looking for sources...
kernel_dirs = [ "linux", "asm", "asm-generic", "mtd" ]
-# path to the directory containing the original kernel headers
-kernel_original_path = os.path.normpath( find_program_dir() + '/../../../../external/kernel-headers/original' )
-
-# path to the default location of the cleaned-up headers
-kernel_cleaned_path = os.path.normpath( find_program_dir() + '/..' )
-
# a special value that is used to indicate that a given macro is known to be
# undefined during optimization
kCppUndefinedMacro = "<<<undefined>>>"
@@ -70,6 +64,8 @@ kernel_token_replacements = {
# The kernel's SIGRTMIN/SIGRTMAX are absolute limits; userspace steals a few.
"SIGRTMIN": "__SIGRTMIN",
"SIGRTMAX": "__SIGRTMAX",
+ # We want to support both BSD and Linux member names in struct udphdr.
+ "udphdr": "__kernel_udphdr",
}
# this is the set of known static inline functions that we want to keep
diff --git a/libc/kernel/tools/generate_uapi_headers.sh b/libc/kernel/tools/generate_uapi_headers.sh
index 90ba0ed3d..3c80d9f53 100755
--- a/libc/kernel/tools/generate_uapi_headers.sh
+++ b/libc/kernel/tools/generate_uapi_headers.sh
@@ -99,6 +99,35 @@ function copy_if_exists () {
done
}
+function check_hdrs () {
+ local src_dir=$1
+ local tgt_dir=$2
+ local kernel_dir=$3
+
+ local search_dirs=()
+
+ # This only works if none of the filenames have spaces.
+ for file in $(ls -d ${src_dir}/* 2> /dev/null); do
+ if [[ -d "${file}" ]]; then
+ search_dirs+=("${file}")
+ elif [[ -f "${file}" ]] && [[ "${file}" =~ .h$ ]]; then
+ tgt_file=${tgt_dir}/$(basename ${file})
+ if [[ -e ${tgt_file} ]] && ! diff "${file}" "${tgt_file}" > /dev/null; then
+ if [[ ${file} =~ ${kernel_dir}/*(.+) ]]; then
+ echo "New version of ${BASH_REMATCH[1]} found in kernel headers."
+ else
+ echo "New version of ${file} found in kernel headers."
+ fi
+ echo "This file needs to be updated manually."
+ fi
+ fi
+ done
+
+ for dir in "${search_dirs[@]}"; do
+ check_hdrs "${dir}" ${tgt_dir}/$(basename ${dir}) "${kernel_dir}"
+ done
+}
+
trap cleanup EXIT
# This automatically triggers a call to cleanup.
trap "exit 1" HUP INT TERM TSTP
@@ -207,3 +236,8 @@ for arch in "${ARCH_LIST[@]}"; do
"${KERNEL_DIR}/${src_dir}/arch/${arch}/include/generated/asm" \
"${ANDROID_KERNEL_DIR}/uapi/asm-${arch}/asm"
done
+
+# Verify if modified headers have changed.
+check_hdrs "${KERNEL_DIR}/${src_dir}/include/scsi" \
+ "${ANDROID_KERNEL_DIR}/scsi" \
+ "${KERNEL_DIR}/${src_dir}"
diff --git a/libc/kernel/tools/update_all.py b/libc/kernel/tools/update_all.py
index f45d4e057..7f3657c20 100755
--- a/libc/kernel/tools/update_all.py
+++ b/libc/kernel/tools/update_all.py
@@ -6,72 +6,93 @@ from utils import *
def usage():
print """\
- usage: %(progname)s [kernel-original-path]
+ usage: %(progname)s [kernel-original-path] [kernel-modified-path]
this program is used to update all the auto-generated clean headers
used by the Bionic C library. it assumes the following:
- - a set of source kernel headers is located in '../original',
- relative to the program's directory
+ - a set of source kernel headers is located in
+ 'external/kernel-headers/original', relative to the current
+ android tree
- - the clean headers will be placed in '../arch-<arch>/asm',
- '../common/linux', '../common/asm-generic', etc..
+ - a set of manually modified kernel header files located in
+ 'external/kernel-headers/modified', relative to the current
+ android tree
+
+ - the clean headers will be placed in 'bionic/libc/kernel/arch-<arch>/asm',
+ 'bionic/libc/kernel/common', etc..
""" % { "progname" : os.path.basename(sys.argv[0]) }
sys.exit(0)
try:
- optlist, args = getopt.getopt( sys.argv[1:], '' )
+ optlist, args = getopt.getopt(sys.argv[1:], '')
except:
# unrecognized option
- sys.stderr.write( "error: unrecognized option\n" )
+ sys.stderr.write("error: unrecognized option\n")
usage()
-if len(optlist) > 0 or len(args) > 1:
+if len(optlist) > 0 or len(args) > 2:
usage()
-progdir = find_program_dir()
-
-if len(args) == 1:
+modified_dir = get_kernel_headers_modified_dir()
+if len(args) == 1 or len(args) == 2:
original_dir = args[0]
if not os.path.isdir(original_dir):
- panic( "Not a directory: %s\n" % original_dir )
+ panic("Not a directory: %s\n" % original_dir)
+
+ if len(args) == 2:
+ modified_dir = args[1]
+ if not os.path.isdir(modified_dir):
+ panic("Not a directory: %s\n" % modified_dir)
else:
- original_dir = kernel_original_path
+ original_dir = get_kernel_headers_original_dir()
if not os.path.isdir(original_dir):
- panic( "Missing directory, please specify one through command-line: %s\n" % original_dir )
+ panic("Missing directory, please specify one through command-line: %s\n" % original_dir)
-skip_ion = False
+if not os.path.isdir(modified_dir):
+ modified_dir = None
-# find all source files in 'original'
-#
-sources = []
-warning_ion = []
-for root, dirs, files in os.walk( original_dir ):
+# Find all source files in 'original'.
+sources = dict()
+original_dir = os.path.normpath(original_dir)
+original_dir_len = len(original_dir) + 1
+for root, _, files in os.walk(original_dir):
for file in files:
- if skip_ion and (file == "ion.h" or file == "ion_test.h"):
- warning_ion.append(" Skipped file %s/%s" % (root, file))
- continue
- base, ext = os.path.splitext(file)
+ _, ext = os.path.splitext(file)
if ext == ".h":
- sources.append( "%s/%s" % (root,file) )
+ rel_path = os.path.normpath(os.path.join(root, file))
+ rel_path = rel_path[original_dir_len:]
+ # Check to see if there is a modified header to use instead.
+ if modified_dir and os.path.exists(os.path.join(modified_dir, rel_path)):
+ sources[rel_path] = False
+ else:
+ sources[rel_path] = True
+
b = BatchFileUpdater()
+kernel_dir = get_kernel_dir()
for arch in kernel_archs:
- b.readDir( os.path.normpath( progdir + "/../arch-%s" % arch ) )
-
-b.readDir( os.path.normpath( progdir + "/../common" ) )
+ b.readDir(os.path.join(kernel_dir, "arch-%s" % arch))
-#print "OLD " + repr(b.old_files)
+b.readDir(os.path.join(kernel_dir, "common"))
oldlen = 120
-for path in sources:
- dst_path, newdata = clean_header.cleanupFile(path, original_dir)
+android_root_len = len(get_android_root()) + 1
+for rel_path in sorted(sources):
+ if sources[rel_path]:
+ src_dir = original_dir
+ src_str = "<original>/"
+ else:
+ src_dir = modified_dir
+ src_str = "<modified>/"
+ dst_path, newdata = clean_header.cleanupFile(kernel_dir, src_dir, rel_path)
if not dst_path:
continue
- b.readFile( dst_path )
- r = b.editFile( dst_path, newdata )
+ dst_path = os.path.join(kernel_dir, dst_path)
+ b.readFile(dst_path)
+ r = b.editFile(dst_path, newdata)
if r == 0:
state = "unchanged"
elif r == 1:
@@ -79,9 +100,11 @@ for path in sources:
else:
state = "added"
- str = "cleaning: %-*s -> %-*s (%s)" % ( 35, "<original>" + path[len(original_dir):], 35, dst_path, state )
+ # dst_path is guaranteed to include android root.
+ rel_dst_path = dst_path[android_root_len:]
+ str = "cleaning: %-*s -> %-*s (%s)" % (35, src_str + rel_path, 35, rel_dst_path, state)
if sys.stdout.isatty():
- print "%-*s" % (oldlen,str),
+ print "%-*s" % (oldlen, str),
if (r == 0):
print "\r",
else:
@@ -92,11 +115,8 @@ for path in sources:
oldlen = len(str)
-print "%-*s" % (oldlen,"Done!")
+print "%-*s" % (oldlen, "Done!")
b.updateGitFiles()
-if warning_ion:
- print "NOTE: Due to import into aosp, some files were not processed."
- print "\n".join(warning_ion)
sys.exit(0)
diff --git a/libc/kernel/tools/utils.py b/libc/kernel/tools/utils.py
index e5a310e03..e2cc9ce10 100644
--- a/libc/kernel/tools/utils.py
+++ b/libc/kernel/tools/utils.py
@@ -13,8 +13,26 @@ def panic(msg):
sys.exit(1)
-def find_program_dir():
- return os.path.dirname(sys.argv[0])
+def get_kernel_headers_dir():
+ return os.path.join(get_android_root(), "external/kernel-headers")
+
+
+def get_kernel_headers_original_dir():
+ return os.path.join(get_kernel_headers_dir(), "original")
+
+
+def get_kernel_headers_modified_dir():
+ return os.path.join(get_kernel_headers_dir(), "modified")
+
+
+def get_kernel_dir():
+ return os.path.join(get_android_root(), "bionic/libc/kernel")
+
+
+def get_android_root():
+ if "ANDROID_BUILD_TOP" in os.environ:
+ return os.environ["ANDROID_BUILD_TOP"]
+ panic("Unable to find root of tree, did you forget to lunch a target?")
class StringOutput:
diff --git a/libc/kernel/uapi/asm-arm/asm/kvm.h b/libc/kernel/uapi/asm-arm/asm/kvm.h
index c37d809f5..aa534ab28 100644
--- a/libc/kernel/uapi/asm-arm/asm/kvm.h
+++ b/libc/kernel/uapi/asm-arm/asm/kvm.h
@@ -154,32 +154,36 @@ struct kvm_arch_memory_slot {
#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
-#define KVM_ARM_IRQ_TYPE_SHIFT 24
+#define KVM_DEV_ARM_VGIC_GRP_CTRL 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_DEV_ARM_VGIC_CTRL_INIT 0
+#define KVM_ARM_IRQ_TYPE_SHIFT 24
#define KVM_ARM_IRQ_TYPE_MASK 0xff
#define KVM_ARM_IRQ_VCPU_SHIFT 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_IRQ_VCPU_MASK 0xff
#define KVM_ARM_IRQ_NUM_SHIFT 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_IRQ_NUM_MASK 0xffff
#define KVM_ARM_IRQ_TYPE_CPU 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_IRQ_TYPE_SPI 1
#define KVM_ARM_IRQ_TYPE_PPI 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_IRQ_CPU_IRQ 0
#define KVM_ARM_IRQ_CPU_FIQ 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_IRQ_GIC_MAX 127
+#define KVM_NR_IRQCHIPS 1
#define KVM_PSCI_FN_BASE 0x95c1ba5e
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_PSCI_FN(n) (KVM_PSCI_FN_BASE + (n))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0)
#define KVM_PSCI_FN_CPU_OFF KVM_PSCI_FN(1)
#define KVM_PSCI_FN_CPU_ON KVM_PSCI_FN(2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_PSCI_FN_MIGRATE KVM_PSCI_FN(3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_PSCI_RET_SUCCESS PSCI_RET_SUCCESS
#define KVM_PSCI_RET_NI PSCI_RET_NOT_SUPPORTED
#define KVM_PSCI_RET_INVAL PSCI_RET_INVALID_PARAMS
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_PSCI_RET_DENIED PSCI_RET_DENIED
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-arm/asm/unistd.h b/libc/kernel/uapi/asm-arm/asm/unistd.h
index 32f66884d..468f50ada 100644
--- a/libc/kernel/uapi/asm-arm/asm/unistd.h
+++ b/libc/kernel/uapi/asm-arm/asm/unistd.h
@@ -464,6 +464,11 @@
#define __NR_getrandom (__NR_SYSCALL_BASE + 384)
#define __NR_memfd_create (__NR_SYSCALL_BASE + 385)
#define __NR_bpf (__NR_SYSCALL_BASE + 386)
+#define __NR_execveat (__NR_SYSCALL_BASE + 387)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_userfaultfd (__NR_SYSCALL_BASE + 388)
+#define __NR_membarrier (__NR_SYSCALL_BASE + 389)
+#define __NR_mlock2 (__NR_SYSCALL_BASE + 390)
#define __ARM_NR_BASE (__NR_SYSCALL_BASE + 0x0f0000)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __ARM_NR_breakpoint (__ARM_NR_BASE + 1)
diff --git a/libc/kernel/uapi/asm-arm64/asm/hwcap.h b/libc/kernel/uapi/asm-arm64/asm/hwcap.h
index ccea53df6..5e2b4959f 100644
--- a/libc/kernel/uapi/asm-arm64/asm/hwcap.h
+++ b/libc/kernel/uapi/asm-arm64/asm/hwcap.h
@@ -28,4 +28,6 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HWCAP_SHA2 (1 << 6)
#define HWCAP_CRC32 (1 << 7)
+#define HWCAP_ATOMICS (1 << 8)
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-arm64/asm/kvm.h b/libc/kernel/uapi/asm-arm64/asm/kvm.h
index 855e084e0..39b961ae8 100644
--- a/libc/kernel/uapi/asm-arm64/asm/kvm.h
+++ b/libc/kernel/uapi/asm-arm64/asm/kvm.h
@@ -29,7 +29,7 @@
#define KVM_NR_SPSR 5
#ifndef __ASSEMBLY__
#include <linux/psci.h>
-#include <asm/types.h>
+#include <linux/types.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <asm/ptrace.h>
#define __KVM_HAVE_GUEST_DEBUG
@@ -52,86 +52,106 @@ struct kvm_regs {
#define KVM_ARM_TARGET_XGENE_POTENZA 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_TARGET_CORTEX_A53 4
-#define KVM_ARM_NUM_TARGETS 5
+#define KVM_ARM_TARGET_GENERIC_V8 5
+#define KVM_ARM_NUM_TARGETS 6
#define KVM_ARM_DEVICE_TYPE_SHIFT 0
-#define KVM_ARM_DEVICE_TYPE_MASK (0xffff << KVM_ARM_DEVICE_TYPE_SHIFT)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_ARM_DEVICE_TYPE_MASK (0xffff << KVM_ARM_DEVICE_TYPE_SHIFT)
#define KVM_ARM_DEVICE_ID_SHIFT 16
#define KVM_ARM_DEVICE_ID_MASK (0xffff << KVM_ARM_DEVICE_ID_SHIFT)
#define KVM_ARM_DEVICE_VGIC_V2 0
-#define KVM_VGIC_V2_ADDR_TYPE_DIST 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_VGIC_V2_ADDR_TYPE_DIST 0
#define KVM_VGIC_V2_ADDR_TYPE_CPU 1
#define KVM_VGIC_V2_DIST_SIZE 0x1000
#define KVM_VGIC_V2_CPU_SIZE 0x2000
-#define KVM_ARM_VCPU_POWER_OFF 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_VGIC_V3_ADDR_TYPE_DIST 2
+#define KVM_VGIC_V3_ADDR_TYPE_REDIST 3
+#define KVM_VGIC_V3_DIST_SIZE SZ_64K
+#define KVM_VGIC_V3_REDIST_SIZE (2 * SZ_64K)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_ARM_VCPU_POWER_OFF 0
#define KVM_ARM_VCPU_EL1_32BIT 1
#define KVM_ARM_VCPU_PSCI_0_2 2
struct kvm_vcpu_init {
- __u32 target;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 target;
__u32 features[7];
};
struct kvm_sregs {
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_fpu {
};
+#define KVM_ARM_MAX_DBG_REGS 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_guest_debug_arch {
-};
+ __u64 dbg_bcr[KVM_ARM_MAX_DBG_REGS];
+ __u64 dbg_bvr[KVM_ARM_MAX_DBG_REGS];
+ __u64 dbg_wcr[KVM_ARM_MAX_DBG_REGS];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 dbg_wvr[KVM_ARM_MAX_DBG_REGS];
+};
struct kvm_debug_exit_arch {
+ __u32 hsr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 far;
};
+#define KVM_GUESTDBG_USE_SW_BP (1 << 16)
+#define KVM_GUESTDBG_USE_HW (1 << 17)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_sync_regs {
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_arch_memory_slot {
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM_COPROC_MASK 0x000000000FFF0000
#define KVM_REG_ARM_COPROC_SHIFT 16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM_CORE (0x0010 << KVM_REG_ARM_COPROC_SHIFT)
#define KVM_REG_ARM_CORE_REG(name) (offsetof(struct kvm_regs, name) / sizeof(__u32))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM_DEMUX (0x0011 << KVM_REG_ARM_COPROC_SHIFT)
#define KVM_REG_ARM_DEMUX_ID_MASK 0x000000000000FF00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM_DEMUX_ID_SHIFT 8
#define KVM_REG_ARM_DEMUX_ID_CCSIDR (0x00 << KVM_REG_ARM_DEMUX_ID_SHIFT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM_DEMUX_VAL_MASK 0x00000000000000FF
#define KVM_REG_ARM_DEMUX_VAL_SHIFT 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM64_SYSREG (0x0013 << KVM_REG_ARM_COPROC_SHIFT)
#define KVM_REG_ARM64_SYSREG_OP0_MASK 0x000000000000c000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM64_SYSREG_OP0_SHIFT 14
#define KVM_REG_ARM64_SYSREG_OP1_MASK 0x0000000000003800
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM64_SYSREG_OP1_SHIFT 11
#define KVM_REG_ARM64_SYSREG_CRN_MASK 0x0000000000000780
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM64_SYSREG_CRN_SHIFT 7
#define KVM_REG_ARM64_SYSREG_CRM_MASK 0x0000000000000078
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM64_SYSREG_CRM_SHIFT 3
#define KVM_REG_ARM64_SYSREG_OP2_MASK 0x0000000000000007
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM64_SYSREG_OP2_SHIFT 0
#define ARM64_SYS_REG_SHIFT_MASK(x,n) (((x) << KVM_REG_ARM64_SYSREG_ ##n ##_SHIFT) & KVM_REG_ARM64_SYSREG_ ##n ##_MASK)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __ARM64_SYS_REG(op0,op1,crn,crm,op2) (KVM_REG_ARM64 | KVM_REG_ARM64_SYSREG | ARM64_SYS_REG_SHIFT_MASK(op0, OP0) | ARM64_SYS_REG_SHIFT_MASK(op1, OP1) | ARM64_SYS_REG_SHIFT_MASK(crn, CRN) | ARM64_SYS_REG_SHIFT_MASK(crm, CRM) | ARM64_SYS_REG_SHIFT_MASK(op2, OP2))
#define ARM64_SYS_REG(...) (__ARM64_SYS_REG(__VA_ARGS__) | KVM_REG_SIZE_U64)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM_TIMER_CTL ARM64_SYS_REG(3, 3, 14, 3, 1)
#define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2)
#define KVM_DEV_ARM_VGIC_GRP_ADDR 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
#define KVM_DEV_ARM_VGIC_GRP_CPU_REGS 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_DEV_ARM_VGIC_CPUID_SHIFT 32
#define KVM_DEV_ARM_VGIC_CPUID_MASK (0xffULL << KVM_DEV_ARM_VGIC_CPUID_SHIFT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0
#define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_DEV_ARM_VGIC_GRP_NR_IRQS 3
+#define KVM_DEV_ARM_VGIC_GRP_CTRL 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_DEV_ARM_VGIC_CTRL_INIT 0
#define KVM_ARM_IRQ_TYPE_SHIFT 24
#define KVM_ARM_IRQ_TYPE_MASK 0xff
#define KVM_ARM_IRQ_VCPU_SHIFT 16
@@ -147,18 +167,19 @@ struct kvm_arch_memory_slot {
#define KVM_ARM_IRQ_CPU_FIQ 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_IRQ_GIC_MAX 127
+#define KVM_NR_IRQCHIPS 1
#define KVM_PSCI_FN_BASE 0x95c1ba5e
#define KVM_PSCI_FN(n) (KVM_PSCI_FN_BASE + (n))
-#define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_PSCI_FN_CPU_SUSPEND KVM_PSCI_FN(0)
#define KVM_PSCI_FN_CPU_OFF KVM_PSCI_FN(1)
#define KVM_PSCI_FN_CPU_ON KVM_PSCI_FN(2)
#define KVM_PSCI_FN_MIGRATE KVM_PSCI_FN(3)
-#define KVM_PSCI_RET_SUCCESS PSCI_RET_SUCCESS
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_PSCI_RET_SUCCESS PSCI_RET_SUCCESS
#define KVM_PSCI_RET_NI PSCI_RET_NOT_SUPPORTED
#define KVM_PSCI_RET_INVAL PSCI_RET_INVALID_PARAMS
#define KVM_PSCI_RET_DENIED PSCI_RET_DENIED
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+#endif
diff --git a/libc/kernel/uapi/asm-arm64/asm/ptrace.h b/libc/kernel/uapi/asm-arm64/asm/ptrace.h
index ec531f96f..37148f5e0 100644
--- a/libc/kernel/uapi/asm-arm64/asm/ptrace.h
+++ b/libc/kernel/uapi/asm-arm64/asm/ptrace.h
@@ -37,43 +37,44 @@
#define PSR_A_BIT 0x00000100
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSR_D_BIT 0x00000200
+#define PSR_PAN_BIT 0x00400000
#define PSR_Q_BIT 0x08000000
#define PSR_V_BIT 0x10000000
-#define PSR_C_BIT 0x20000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PSR_C_BIT 0x20000000
#define PSR_Z_BIT 0x40000000
#define PSR_N_BIT 0x80000000
#define PSR_f 0xff000000
-#define PSR_s 0x00ff0000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PSR_s 0x00ff0000
#define PSR_x 0x0000ff00
#define PSR_c 0x000000ff
#ifndef __ASSEMBLY__
-struct user_pt_regs {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct user_pt_regs {
__u64 regs[31];
__u64 sp;
__u64 pc;
- __u64 pstate;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 pstate;
};
struct user_fpsimd_state {
__uint128_t vregs[32];
- __u32 fpsr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 fpsr;
__u32 fpcr;
};
struct user_hwdebug_state {
- __u32 dbg_info;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 dbg_info;
__u32 pad;
struct {
__u64 addr;
- __u32 ctrl;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ctrl;
__u32 pad;
} dbg_regs[16];
};
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+#endif
diff --git a/libc/kernel/uapi/asm-arm64/asm/signal.h b/libc/kernel/uapi/asm-arm64/asm/signal.h
index 39f8c48cd..0ff3e9675 100644
--- a/libc/kernel/uapi/asm-arm64/asm/signal.h
+++ b/libc/kernel/uapi/asm-arm64/asm/signal.h
@@ -19,6 +19,8 @@
#ifndef __ASM_SIGNAL_H
#define __ASM_SIGNAL_H
#define SA_RESTORER 0x04000000
-#include <asm-generic/signal.h>
+#define MINSIGSTKSZ 5120
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIGSTKSZ 16384
+#include <asm-generic/signal.h>
#endif
diff --git a/libc/kernel/uapi/asm-arm64/asm/ucontext.h b/libc/kernel/uapi/asm-arm64/asm/ucontext.h
new file mode 100644
index 000000000..edb915524
--- /dev/null
+++ b/libc/kernel/uapi/asm-arm64/asm/ucontext.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__ASM_UCONTEXT_H
+#define _UAPI__ASM_UCONTEXT_H
+#include <linux/types.h>
+struct ucontext {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned long uc_flags;
+ struct ucontext * uc_link;
+ stack_t uc_stack;
+ sigset_t uc_sigmask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 __linux_unused[1024 / 8 - sizeof(sigset_t)];
+ struct sigcontext uc_mcontext;
+};
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-generic/mman-common.h b/libc/kernel/uapi/asm-generic/mman-common.h
index 8e6a57f01..00075c7db 100644
--- a/libc/kernel/uapi/asm-generic/mman-common.h
+++ b/libc/kernel/uapi/asm-generic/mman-common.h
@@ -34,32 +34,33 @@
#define MAP_FIXED 0x10
#define MAP_ANONYMOUS 0x20
#define MAP_UNINITIALIZED 0x0
-#define MS_ASYNC 1
+#define MLOCK_ONFAULT 0x01
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MS_ASYNC 1
#define MS_INVALIDATE 2
#define MS_SYNC 4
#define MADV_NORMAL 0
-#define MADV_RANDOM 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MADV_RANDOM 1
#define MADV_SEQUENTIAL 2
#define MADV_WILLNEED 3
#define MADV_DONTNEED 4
-#define MADV_REMOVE 9
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MADV_REMOVE 9
#define MADV_DONTFORK 10
#define MADV_DOFORK 11
#define MADV_HWPOISON 100
-#define MADV_SOFT_OFFLINE 101
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MADV_SOFT_OFFLINE 101
#define MADV_MERGEABLE 12
#define MADV_UNMERGEABLE 13
#define MADV_HUGEPAGE 14
-#define MADV_NOHUGEPAGE 15
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MADV_NOHUGEPAGE 15
#define MADV_DONTDUMP 16
#define MADV_DODUMP 17
#define MAP_FILE 0
-#define MAP_HUGE_SHIFT 26
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MAP_HUGE_SHIFT 26
#define MAP_HUGE_MASK 0x3f
#endif
diff --git a/libc/kernel/uapi/asm-generic/mman.h b/libc/kernel/uapi/asm-generic/mman.h
index 5a0242a6a..5db0e52b4 100644
--- a/libc/kernel/uapi/asm-generic/mman.h
+++ b/libc/kernel/uapi/asm-generic/mman.h
@@ -33,4 +33,6 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MCL_CURRENT 1
#define MCL_FUTURE 2
+#define MCL_ONFAULT 4
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-generic/siginfo.h b/libc/kernel/uapi/asm-generic/siginfo.h
index 2083fa10a..ad5452993 100644
--- a/libc/kernel/uapi/asm-generic/siginfo.h
+++ b/libc/kernel/uapi/asm-generic/siginfo.h
@@ -94,6 +94,11 @@ typedef struct siginfo {
int _trapno;
#endif
short _addr_lsb;
+ struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ void __user * _lower;
+ void __user * _upper;
+ } _addr_bnd;
} _sigfault;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
@@ -132,129 +137,133 @@ typedef struct siginfo {
#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define si_addr_lsb _sifields._sigfault._addr_lsb
+#define si_lower _sifields._sigfault._addr_bnd._lower
+#define si_upper _sifields._sigfault._addr_bnd._upper
#define si_band _sifields._sigpoll._band
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define si_fd _sifields._sigpoll._fd
#ifdef __ARCH_SIGSYS
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define si_call_addr _sifields._sigsys._call_addr
#define si_syscall _sifields._sigsys._syscall
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define si_arch _sifields._sigsys._arch
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __SI_KILL 0
#define __SI_TIMER 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __SI_POLL 0
#define __SI_FAULT 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __SI_CHLD 0
#define __SI_RT 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __SI_MESGQ 0
#define __SI_SYS 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __SI_CODE(T,N) (N)
#define SI_USER 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_KERNEL 0x80
#define SI_QUEUE - 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TIMER __SI_CODE(__SI_TIMER, - 2)
#define SI_MESGQ __SI_CODE(__SI_MESGQ, - 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_ASYNCIO - 4
#define SI_SIGIO - 5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TKILL - 6
#define SI_DETHREAD - 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_FROMUSER(siptr) ((siptr)->si_code <= 0)
#define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ILL_ILLOPC (__SI_FAULT | 1)
#define ILL_ILLOPN (__SI_FAULT | 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ILL_ILLADR (__SI_FAULT | 3)
#define ILL_ILLTRP (__SI_FAULT | 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ILL_PRVOPC (__SI_FAULT | 5)
#define ILL_PRVREG (__SI_FAULT | 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ILL_COPROC (__SI_FAULT | 7)
#define ILL_BADSTK (__SI_FAULT | 8)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NSIGILL 8
#define FPE_INTDIV (__SI_FAULT | 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FPE_INTOVF (__SI_FAULT | 2)
#define FPE_FLTDIV (__SI_FAULT | 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FPE_FLTOVF (__SI_FAULT | 4)
#define FPE_FLTUND (__SI_FAULT | 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FPE_FLTRES (__SI_FAULT | 6)
#define FPE_FLTINV (__SI_FAULT | 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FPE_FLTSUB (__SI_FAULT | 8)
#define NSIGFPE 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEGV_MAPERR (__SI_FAULT | 1)
#define SEGV_ACCERR (__SI_FAULT | 2)
+#define SEGV_BNDERR (__SI_FAULT | 3)
+#define NSIGSEGV 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define NSIGSEGV 2
#define BUS_ADRALN (__SI_FAULT | 1)
#define BUS_ADRERR (__SI_FAULT | 2)
#define BUS_OBJERR (__SI_FAULT | 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_MCEERR_AR (__SI_FAULT | 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_MCEERR_AO (__SI_FAULT | 5)
#define NSIGBUS 5
#define TRAP_BRKPT (__SI_FAULT | 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TRAP_TRACE (__SI_FAULT | 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TRAP_BRANCH (__SI_FAULT | 3)
#define TRAP_HWBKPT (__SI_FAULT | 4)
#define NSIGTRAP 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CLD_EXITED (__SI_CHLD | 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CLD_KILLED (__SI_CHLD | 2)
#define CLD_DUMPED (__SI_CHLD | 3)
#define CLD_TRAPPED (__SI_CHLD | 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CLD_STOPPED (__SI_CHLD | 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CLD_CONTINUED (__SI_CHLD | 6)
#define NSIGCHLD 6
#define POLL_IN (__SI_POLL | 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define POLL_OUT (__SI_POLL | 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define POLL_MSG (__SI_POLL | 3)
#define POLL_ERR (__SI_POLL | 4)
#define POLL_PRI (__SI_POLL | 5)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define POLL_HUP (__SI_POLL | 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NSIGPOLL 6
#define SYS_SECCOMP (__SI_SYS | 1)
#define NSIGSYS 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SIGEV_SIGNAL 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SIGEV_NONE 1
#define SIGEV_THREAD 2
#define SIGEV_THREAD_ID 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#ifndef __ARCH_SIGEV_PREAMBLE_SIZE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(int) * 2 + sizeof(sigval_t))
#endif
#define SIGEV_MAX_SIZE 64
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE - __ARCH_SIGEV_PREAMBLE_SIZE) / sizeof(int))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct sigevent {
sigval_t sigev_value;
int sigev_signo;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int sigev_notify;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
int _pad[SIGEV_PAD_SIZE];
int _tid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
void(* _function) (sigval_t);
void * _attribute;
} _sigev_thread;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} _sigev_un;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} sigevent_t;
#define sigev_notify_function _sigev_un._sigev_thread._function
#define sigev_notify_attributes _sigev_un._sigev_thread._attribute
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define sigev_notify_thread_id _sigev_un._tid
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-generic/signal.h b/libc/kernel/uapi/asm-generic/signal.h
index 30188cb23..d63fd3ed3 100644
--- a/libc/kernel/uapi/asm-generic/signal.h
+++ b/libc/kernel/uapi/asm-generic/signal.h
@@ -82,35 +82,38 @@
#define SA_NOMASK SA_NODEFER
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SA_ONESHOT SA_RESETHAND
+#if !defined(MINSIGSTKSZ) || !defined(SIGSTKSZ)
#define MINSIGSTKSZ 2048
#define SIGSTKSZ 8192
-#ifndef __ASSEMBLY__
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#ifndef __ASSEMBLY__
typedef struct {
unsigned long sig[_NSIG_WORDS];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} sigset_t;
typedef unsigned long old_sigset_t;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <asm-generic/signal-defs.h>
#ifdef SA_RESTORER
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __ARCH_HAS_SA_RESTORER
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct sigaction {
__sighandler_t sa_handler;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long sa_flags;
#ifdef SA_RESTORER
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__sigrestore_t sa_restorer;
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sigset_t sa_mask;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct sigaltstack {
void __user * ss_sp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int ss_flags;
size_t ss_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} stack_t;
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-generic/socket.h b/libc/kernel/uapi/asm-generic/socket.h
index 93daf8382..ec38e2c6c 100644
--- a/libc/kernel/uapi/asm-generic/socket.h
+++ b/libc/kernel/uapi/asm-generic/socket.h
@@ -89,5 +89,8 @@
#define SO_BUSY_POLL 46
#define SO_MAX_PACING_RATE 47
#define SO_BPF_EXTENSIONS 48
-#endif
+#define SO_INCOMING_CPU 49
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SO_ATTACH_BPF 50
+#define SO_DETACH_BPF SO_DETACH_FILTER
+#endif
diff --git a/libc/kernel/uapi/asm-generic/unistd.h b/libc/kernel/uapi/asm-generic/unistd.h
index d7ac6c2ee..635a12394 100644
--- a/libc/kernel/uapi/asm-generic/unistd.h
+++ b/libc/kernel/uapi/asm-generic/unistd.h
@@ -377,8 +377,13 @@
#define __NR_memfd_create 279
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_bpf 280
+#define __NR_execveat 281
+#define __NR_userfaultfd 282
+#define __NR_membarrier 283
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_mlock2 284
#undef __NR_syscalls
-#define __NR_syscalls 281
+#define __NR_syscalls 285
#ifdef __ARCH_WANT_SYSCALL_NO_AT
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_open 1024
diff --git a/libc/kernel/uapi/asm-mips/asm/break.h b/libc/kernel/uapi/asm-mips/asm/break.h
index 7834e5123..d7f308908 100644
--- a/libc/kernel/uapi/asm-mips/asm/break.h
+++ b/libc/kernel/uapi/asm-mips/asm/break.h
@@ -26,9 +26,11 @@
#define BRK_RANGE 8
#define BRK_BUG 12
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BRK_UPROBE 13
+#define BRK_UPROBE_XOL 14
#define BRK_MEMU 514
#define BRK_KPROBE_BP 515
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BRK_KPROBE_SSTEPBP 516
#define BRK_MULOVF 1023
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-mips/asm/hwcap.h b/libc/kernel/uapi/asm-mips/asm/hwcap.h
new file mode 100644
index 000000000..cc4c30c77
--- /dev/null
+++ b/libc/kernel/uapi/asm-mips/asm/hwcap.h
@@ -0,0 +1,24 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_ASM_HWCAP_H
+#define _UAPI_ASM_HWCAP_H
+#define HWCAP_MIPS_R6 (1 << 0)
+#define HWCAP_MIPS_MSA (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/asm-mips/asm/inst.h b/libc/kernel/uapi/asm-mips/asm/inst.h
index e9b8372e0..744622362 100644
--- a/libc/kernel/uapi/asm-mips/asm/inst.h
+++ b/libc/kernel/uapi/asm-mips/asm/inst.h
@@ -32,1019 +32,1072 @@ enum major_op {
bgtz_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
addi_op,
+ cbcond0_op = addi_op,
addiu_op,
slti_op,
- sltiu_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ sltiu_op,
andi_op,
ori_op,
xori_op,
- lui_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ lui_op,
cop0_op,
cop1_op,
cop2_op,
- cop1x_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ cop1x_op,
beql_op,
bnel_op,
blezl_op,
- bgtzl_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ bgtzl_op,
daddi_op,
+ cbcond1_op = daddi_op,
daddiu_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ldl_op,
ldr_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
spec2_op,
jalx_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
mdmx_op,
+ msa_op = mdmx_op,
spec3_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lb_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lh_op,
lwl_op,
lw_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lbu_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lhu_op,
lwr_op,
lwu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sb_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sh_op,
swl_op,
sw_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sdl_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sdr_op,
swr_op,
cache_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ll_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lwc1_op,
lwc2_op,
+ bc6_op = lwc2_op,
pref_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lld_op,
ldc1_op,
ldc2_op,
- ld_op,
+ beqzcjic_op = ldc2_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ld_op,
sc_op,
swc1_op,
swc2_op,
- major_3b_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ balc6_op = swc2_op,
+ major_3b_op,
scd_op,
sdc1_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sdc2_op,
+ bnezcjialc_op = sdc2_op,
sd_op
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum spec_op {
sll_op,
movc_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
srl_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sra_op,
sllv_op,
pmon_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
srlv_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
srav_op,
jr_op,
jalr_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
movz_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
movn_op,
syscall_op,
break_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
spim_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sync_op,
mfhi_op,
mthi_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
mflo_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
mtlo_op,
dsllv_op,
spec2_unused_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsrlv_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsrav_op,
mult_op,
multu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
div_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
divu_op,
dmult_op,
dmultu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ddiv_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ddivu_op,
add_op,
addu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sub_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
subu_op,
and_op,
or_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xor_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
nor_op,
spec3_unused_op,
spec4_unused_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
slt_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sltu_op,
dadd_op,
daddu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsub_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsubu_op,
tge_op,
tgeu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
tlt_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
tltu_op,
teq_op,
spec5_unused_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
tne_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
spec6_unused_op,
dsll_op,
spec7_unused_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsrl_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsra_op,
dsll32_op,
spec8_unused_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsrl32_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dsra32_op
};
enum spec2_op {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
madd_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
maddu_op,
mul_op,
spec2_3_unused_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
msub_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
msubu_op,
clz_op = 0x20,
clo_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dclz_op = 0x24,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dclo_op,
sdbpp_op = 0x3f
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum spec3_op {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ext_op,
dextm_op,
dextu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dext_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ins_op,
dinsm_op,
dinsu_op,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dins_op,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
yield_op = 0x09,
lx_op = 0x0a,
lwle_op = 0x19,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lwre_op = 0x1a,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
cachee_op = 0x1b,
sbe_op = 0x1c,
she_op = 0x1d,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sce_op = 0x1e,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
swe_op = 0x1f,
bshfl_op = 0x20,
swle_op = 0x21,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
swre_op = 0x22,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
prefe_op = 0x23,
dbshfl_op = 0x24,
- lbue_op = 0x28,
+ cache6_op = 0x25,
+ sc6_op = 0x26,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ scd6_op = 0x27,
+ lbue_op = 0x28,
lhue_op = 0x29,
lbe_op = 0x2c,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lhe_op = 0x2d,
lle_op = 0x2e,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lwe_op = 0x2f,
+ pref6_op = 0x35,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ll6_op = 0x36,
+ lld6_op = 0x37,
rdhwr_op = 0x3b
};
-enum rt_op {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum rt_op {
bltz_op,
bgez_op,
bltzl_op,
- bgezl_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ bgezl_op,
spimi_op,
unused_rt_op_0x05,
unused_rt_op_0x06,
- unused_rt_op_0x07,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unused_rt_op_0x07,
tgei_op,
tgeiu_op,
tlti_op,
- tltiu_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ tltiu_op,
teqi_op,
unused_0x0d_rt_op,
tnei_op,
- unused_0x0f_rt_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unused_0x0f_rt_op,
bltzal_op,
bgezal_op,
bltzall_op,
- bgezall_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ bgezall_op,
rt_op_0x14,
rt_op_0x15,
rt_op_0x16,
- rt_op_0x17,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ rt_op_0x17,
rt_op_0x18,
rt_op_0x19,
rt_op_0x1a,
- rt_op_0x1b,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ rt_op_0x1b,
bposge32_op,
rt_op_0x1d,
rt_op_0x1e,
- rt_op_0x1f
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ rt_op_0x1f
};
enum cop_op {
mfc_op = 0x00,
- dmfc_op = 0x01,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ dmfc_op = 0x01,
cfc_op = 0x02,
+ mfhc0_op = 0x02,
mfhc_op = 0x03,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
mtc_op = 0x04,
dmtc_op = 0x05,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ctc_op = 0x06,
+ mthc0_op = 0x06,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
mthc_op = 0x07,
bc_op = 0x08,
- cop_op = 0x10,
+ bc1eqz_op = 0x09,
+ bc1nez_op = 0x0d,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ cop_op = 0x10,
copm_op = 0x18
};
enum bcop_op {
- bcf_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ bcf_op,
bct_op,
bcfl_op,
bctl_op
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum cop0_coi_func {
tlbr_op = 0x01,
tlbwi_op = 0x02,
- tlbwr_op = 0x06,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ tlbwr_op = 0x06,
tlbp_op = 0x08,
rfe_op = 0x10,
eret_op = 0x18,
- wait_op = 0x20,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ wait_op = 0x20,
};
enum cop0_com_func {
tlbr1_op = 0x01,
- tlbw_op = 0x02,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ tlbw_op = 0x02,
tlbp1_op = 0x08,
dctr_op = 0x09,
dctw_op = 0x0a
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum cop1_fmt {
s_fmt,
d_fmt,
- e_fmt,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ e_fmt,
q_fmt,
w_fmt,
l_fmt
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum cop1_sdw_func {
fadd_op = 0x00,
fsub_op = 0x01,
- fmul_op = 0x02,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fmul_op = 0x02,
fdiv_op = 0x03,
fsqrt_op = 0x04,
fabs_op = 0x05,
- fmov_op = 0x06,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fmov_op = 0x06,
fneg_op = 0x07,
froundl_op = 0x08,
ftruncl_op = 0x09,
- fceill_op = 0x0a,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fceill_op = 0x0a,
ffloorl_op = 0x0b,
fround_op = 0x0c,
ftrunc_op = 0x0d,
- fceil_op = 0x0e,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fceil_op = 0x0e,
ffloor_op = 0x0f,
fmovc_op = 0x11,
fmovz_op = 0x12,
- fmovn_op = 0x13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fmovn_op = 0x13,
+ fseleqz_op = 0x14,
frecip_op = 0x15,
frsqrt_op = 0x16,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fselnez_op = 0x17,
+ fmaddf_op = 0x18,
+ fmsubf_op = 0x19,
+ frint_op = 0x1a,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fclass_op = 0x1b,
+ fmin_op = 0x1c,
+ fmina_op = 0x1d,
+ fmax_op = 0x1e,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fmaxa_op = 0x1f,
fcvts_op = 0x20,
fcvtd_op = 0x21,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
fcvte_op = 0x22,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
fcvtw_op = 0x24,
fcvtl_op = 0x25,
fcmp_op = 0x30
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum cop1x_func {
lwxc1_op = 0x00,
ldxc1_op = 0x01,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
swxc1_op = 0x08,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sdxc1_op = 0x09,
pfetch_op = 0x0f,
madd_s_op = 0x20,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
madd_d_op = 0x21,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
madd_e_op = 0x22,
msub_s_op = 0x28,
msub_d_op = 0x29,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
msub_e_op = 0x2a,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
nmadd_s_op = 0x30,
nmadd_d_op = 0x31,
nmadd_e_op = 0x32,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
nmsub_s_op = 0x38,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
nmsub_d_op = 0x39,
nmsub_e_op = 0x3a
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum mad_func {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
madd_fp_op = 0x08,
msub_fp_op = 0x0a,
nmadd_fp_op = 0x0c,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
nmsub_fp_op = 0x0e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum lx_func {
lwx_op = 0x00,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lhx_op = 0x04,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lbux_op = 0x06,
ldx_op = 0x08,
lwux_op = 0x10,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lhux_op = 0x14,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
lbx_op = 0x16,
};
enum bshfl_func {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
wsbh_op = 0x2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
dshd_op = 0x5,
seb_op = 0x10,
seh_op = 0x18,
+};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum msa_mi10_func {
+ msa_ld_op = 8,
+ msa_st_op = 9,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum msa_2b_fmt {
+ msa_fmt_b = 0,
+ msa_fmt_h = 1,
+ msa_fmt_w = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ msa_fmt_d = 3,
};
enum mm_major_op {
mm_pool32a_op,
- mm_pool16a_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_pool16a_op,
mm_lbu16_op,
mm_move16_op,
mm_addi32_op,
- mm_lbu32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_lbu32_op,
mm_sb32_op,
mm_lb32_op,
mm_pool32b_op,
- mm_pool16b_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_pool16b_op,
mm_lhu16_op,
mm_andi16_op,
mm_addiu32_op,
- mm_lhu32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_lhu32_op,
mm_sh32_op,
mm_lh32_op,
mm_pool32i_op,
- mm_pool16c_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_pool16c_op,
mm_lwsp16_op,
mm_pool16d_op,
mm_ori32_op,
- mm_pool32f_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_pool32f_op,
mm_reserved1_op,
mm_reserved2_op,
mm_pool32c_op,
- mm_lwgp16_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_lwgp16_op,
mm_lw16_op,
mm_pool16e_op,
mm_xori32_op,
- mm_jals32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_jals32_op,
mm_addiupc_op,
mm_reserved3_op,
mm_reserved4_op,
- mm_pool16f_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_pool16f_op,
mm_sb16_op,
mm_beqz16_op,
mm_slti32_op,
- mm_beq32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_beq32_op,
mm_swc132_op,
mm_lwc132_op,
mm_reserved5_op,
- mm_reserved6_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_reserved6_op,
mm_sh16_op,
mm_bnez16_op,
mm_sltiu32_op,
- mm_bne32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_bne32_op,
mm_sdc132_op,
mm_ldc132_op,
mm_reserved7_op,
- mm_reserved8_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_reserved8_op,
mm_swsp16_op,
mm_b16_op,
mm_andi32_op,
- mm_j32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_j32_op,
mm_sd32_op,
mm_ld32_op,
mm_reserved11_op,
- mm_reserved12_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_reserved12_op,
mm_sw16_op,
mm_li16_op,
mm_jalx32_op,
- mm_jal32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_jal32_op,
mm_sw32_op,
mm_lw32_op,
};
-enum mm_32i_minor_op {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum mm_32i_minor_op {
mm_bltz_op,
mm_bltzal_op,
mm_bgez_op,
- mm_bgezal_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_bgezal_op,
mm_blez_op,
mm_bnezc_op,
mm_bgtz_op,
- mm_beqzc_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_beqzc_op,
mm_tlti_op,
mm_tgei_op,
mm_tltiu_op,
- mm_tgeiu_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_tgeiu_op,
mm_tnei_op,
mm_lui_op,
mm_teqi_op,
- mm_reserved13_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_reserved13_op,
mm_synci_op,
mm_bltzals_op,
mm_reserved14_op,
- mm_bgezals_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_bgezals_op,
mm_bc2f_op,
mm_bc2t_op,
mm_reserved15_op,
- mm_reserved16_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_reserved16_op,
mm_reserved17_op,
mm_reserved18_op,
mm_bposge64_op,
- mm_bposge32_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_bposge32_op,
mm_bc1f_op,
mm_bc1t_op,
mm_reserved19_op,
- mm_reserved20_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_reserved20_op,
mm_bc1any2f_op,
mm_bc1any2t_op,
mm_bc1any4f_op,
- mm_bc1any4t_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_bc1any4t_op,
};
enum mm_32a_minor_op {
mm_sll32_op = 0x000,
- mm_ins_op = 0x00c,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_ins_op = 0x00c,
mm_sllv32_op = 0x010,
mm_ext_op = 0x02c,
mm_pool32axf_op = 0x03c,
- mm_srl32_op = 0x040,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_srl32_op = 0x040,
mm_sra_op = 0x080,
mm_srlv32_op = 0x090,
mm_rotr_op = 0x0c0,
- mm_lwxs_op = 0x118,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_lwxs_op = 0x118,
mm_addu32_op = 0x150,
mm_subu32_op = 0x1d0,
mm_wsbh_op = 0x1ec,
- mm_mul_op = 0x210,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_mul_op = 0x210,
mm_and_op = 0x250,
mm_or32_op = 0x290,
mm_xor32_op = 0x310,
- mm_slt_op = 0x350,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_slt_op = 0x350,
mm_sltu_op = 0x390,
};
enum mm_32b_func {
- mm_lwc2_func = 0x0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_lwc2_func = 0x0,
mm_lwp_func = 0x1,
mm_ldc2_func = 0x2,
mm_ldp_func = 0x4,
- mm_lwm32_func = 0x5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_lwm32_func = 0x5,
mm_cache_func = 0x6,
mm_ldm_func = 0x7,
mm_swc2_func = 0x8,
- mm_swp_func = 0x9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_swp_func = 0x9,
mm_sdc2_func = 0xa,
mm_sdp_func = 0xc,
mm_swm32_func = 0xd,
- mm_sdm_func = 0xf,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_sdm_func = 0xf,
};
enum mm_32c_func {
mm_pref_func = 0x2,
- mm_ll_func = 0x3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_ll_func = 0x3,
mm_swr_func = 0x9,
mm_sc_func = 0xb,
mm_lwu_func = 0xe,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum mm_32axf_minor_op {
mm_mfc0_op = 0x003,
mm_mtc0_op = 0x00b,
- mm_tlbp_op = 0x00d,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_tlbp_op = 0x00d,
mm_mfhi32_op = 0x035,
mm_jalr_op = 0x03c,
mm_tlbr_op = 0x04d,
- mm_mflo32_op = 0x075,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_mflo32_op = 0x075,
mm_jalrhb_op = 0x07c,
mm_tlbwi_op = 0x08d,
mm_tlbwr_op = 0x0cd,
- mm_jalrs_op = 0x13c,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_jalrs_op = 0x13c,
mm_jalrshb_op = 0x17c,
mm_sync_op = 0x1ad,
mm_syscall_op = 0x22d,
- mm_wait_op = 0x24d,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_wait_op = 0x24d,
mm_eret_op = 0x3cd,
mm_divu_op = 0x5dc,
};
-enum mm_32f_minor_op {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum mm_32f_minor_op {
mm_32f_00_op = 0x00,
mm_32f_01_op = 0x01,
mm_32f_02_op = 0x02,
- mm_32f_10_op = 0x08,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_32f_10_op = 0x08,
mm_32f_11_op = 0x09,
mm_32f_12_op = 0x0a,
mm_32f_20_op = 0x10,
- mm_32f_30_op = 0x18,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_32f_30_op = 0x18,
mm_32f_40_op = 0x20,
mm_32f_41_op = 0x21,
mm_32f_42_op = 0x22,
- mm_32f_50_op = 0x28,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_32f_50_op = 0x28,
mm_32f_51_op = 0x29,
mm_32f_52_op = 0x2a,
mm_32f_60_op = 0x30,
- mm_32f_70_op = 0x38,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_32f_70_op = 0x38,
mm_32f_73_op = 0x3b,
mm_32f_74_op = 0x3c,
};
-enum mm_32f_10_minor_op {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum mm_32f_10_minor_op {
mm_lwxc1_op = 0x1,
mm_swxc1_op,
mm_ldxc1_op,
- mm_sdxc1_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_sdxc1_op,
mm_luxc1_op,
mm_suxc1_op,
};
-enum mm_32f_func {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum mm_32f_func {
mm_lwxc1_func = 0x048,
mm_swxc1_func = 0x088,
mm_ldxc1_func = 0x0c8,
- mm_sdxc1_func = 0x108,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_sdxc1_func = 0x108,
};
enum mm_32f_40_minor_op {
mm_fmovf_op,
- mm_fmovt_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_fmovt_op,
};
enum mm_32f_60_minor_op {
mm_fadd_op,
- mm_fsub_op,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_fsub_op,
mm_fmul_op,
mm_fdiv_op,
};
-enum mm_32f_70_minor_op {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum mm_32f_70_minor_op {
mm_fmovn_op,
mm_fmovz_op,
};
-enum mm_32f_73_minor_op {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum mm_32f_73_minor_op {
mm_fmov0_op = 0x01,
mm_fcvtl_op = 0x04,
mm_movf0_op = 0x05,
- mm_frsqrt_op = 0x08,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_frsqrt_op = 0x08,
mm_ffloorl_op = 0x0c,
mm_fabs0_op = 0x0d,
mm_fcvtw_op = 0x24,
- mm_movt0_op = 0x25,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_movt0_op = 0x25,
mm_fsqrt_op = 0x28,
mm_ffloorw_op = 0x2c,
mm_fneg0_op = 0x2d,
- mm_cfc1_op = 0x40,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_cfc1_op = 0x40,
mm_frecip_op = 0x48,
mm_fceill_op = 0x4c,
mm_fcvtd0_op = 0x4d,
- mm_ctc1_op = 0x60,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_ctc1_op = 0x60,
mm_fceilw_op = 0x6c,
mm_fcvts0_op = 0x6d,
mm_mfc1_op = 0x80,
- mm_fmov1_op = 0x81,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_fmov1_op = 0x81,
mm_movf1_op = 0x85,
mm_ftruncl_op = 0x8c,
mm_fabs1_op = 0x8d,
- mm_mtc1_op = 0xa0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_mtc1_op = 0xa0,
mm_movt1_op = 0xa5,
mm_ftruncw_op = 0xac,
mm_fneg1_op = 0xad,
- mm_mfhc1_op = 0xc0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_mfhc1_op = 0xc0,
mm_froundl_op = 0xcc,
mm_fcvtd1_op = 0xcd,
mm_mthc1_op = 0xe0,
- mm_froundw_op = 0xec,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_froundw_op = 0xec,
mm_fcvts1_op = 0xed,
};
enum mm_16c_minor_op {
- mm_lwm16_op = 0x04,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_lwm16_op = 0x04,
mm_swm16_op = 0x05,
mm_jr16_op = 0x0c,
mm_jrc_op = 0x0d,
- mm_jalr16_op = 0x0e,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ mm_jalr16_op = 0x0e,
mm_jalrs16_op = 0x0f,
mm_jraddiusp_op = 0x18,
};
-enum mm_16d_minor_op {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum mm_16d_minor_op {
mm_addius5_func,
mm_addiusp_func,
};
-enum MIPS16e_ops {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum MIPS16e_ops {
MIPS16e_jal_op = 003,
MIPS16e_ld_op = 007,
MIPS16e_i8_op = 014,
- MIPS16e_sd_op = 017,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MIPS16e_sd_op = 017,
MIPS16e_lb_op = 020,
MIPS16e_lh_op = 021,
MIPS16e_lwsp_op = 022,
- MIPS16e_lw_op = 023,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MIPS16e_lw_op = 023,
MIPS16e_lbu_op = 024,
MIPS16e_lhu_op = 025,
MIPS16e_lwpc_op = 026,
- MIPS16e_lwu_op = 027,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MIPS16e_lwu_op = 027,
MIPS16e_sb_op = 030,
MIPS16e_sh_op = 031,
MIPS16e_swsp_op = 032,
- MIPS16e_sw_op = 033,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MIPS16e_sw_op = 033,
MIPS16e_rr_op = 035,
MIPS16e_extend_op = 036,
MIPS16e_i64_op = 037,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum MIPS16e_i64_func {
MIPS16e_ldsp_func,
MIPS16e_sdsp_func,
- MIPS16e_sdrasp_func,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MIPS16e_sdrasp_func,
MIPS16e_dadjsp_func,
MIPS16e_ldpc_func,
};
-enum MIPS16e_rr_func {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum MIPS16e_rr_func {
MIPS16e_jr_func,
};
enum MIPS6e_i8_func {
- MIPS16e_swrasp_func = 02,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MIPS16e_swrasp_func = 02,
};
#define MM_NOP16 0x0c00
struct j_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int target : 26,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int target : 26,;
))
};
struct i_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(signed int simmediate : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(signed int simmediate : 16,;
))))
};
struct u_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int uimmediate : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int uimmediate : 16,;
))))
};
struct c_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int c_op : 3, __BITFIELD_FIELD(unsigned int cache : 2, __BITFIELD_FIELD(unsigned int simmediate : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int c_op : 3, __BITFIELD_FIELD(unsigned int cache : 2, __BITFIELD_FIELD(unsigned int simmediate : 16,;
)))))
};
struct r_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int re : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int re : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct p_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int re : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int re : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct f_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int : 1, __BITFIELD_FIELD(unsigned int fmt : 4, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int re : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int : 1, __BITFIELD_FIELD(unsigned int fmt : 4, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int re : 5, __BITFIELD_FIELD(unsigned int func : 6,;
)))))))
};
struct ma_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fr : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 4, __BITFIELD_FIELD(unsigned int fmt : 2,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fr : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 4, __BITFIELD_FIELD(unsigned int fmt : 2,;
)))))))
};
struct b_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int code : 20, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int code : 20, __BITFIELD_FIELD(unsigned int func : 6,;
)))
};
struct ps_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct v_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int sel : 4, __BITFIELD_FIELD(unsigned int fmt : 1, __BITFIELD_FIELD(unsigned int vt : 5, __BITFIELD_FIELD(unsigned int vs : 5, __BITFIELD_FIELD(unsigned int vd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int sel : 4, __BITFIELD_FIELD(unsigned int fmt : 1, __BITFIELD_FIELD(unsigned int vt : 5, __BITFIELD_FIELD(unsigned int vs : 5, __BITFIELD_FIELD(unsigned int vd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
)))))))
};
+struct msa_mi10_format {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(signed int s10 : 10, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int wd : 5, __BITFIELD_FIELD(unsigned int func : 4, __BITFIELD_FIELD(unsigned int df : 2,;
+ ))))))
+};
struct spec3_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(signed int simmediate : 9, __BITFIELD_FIELD(unsigned int func : 7,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(signed int simmediate : 9, __BITFIELD_FIELD(unsigned int func : 7,;
)))))
};
struct fb_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int bc : 5, __BITFIELD_FIELD(unsigned int cc : 3, __BITFIELD_FIELD(unsigned int flag : 2, __BITFIELD_FIELD(signed int simmediate : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int bc : 5, __BITFIELD_FIELD(unsigned int cc : 3, __BITFIELD_FIELD(unsigned int flag : 2, __BITFIELD_FIELD(signed int simmediate : 16,;
)))))
};
struct fp0_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fmt : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fmt : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct mm_fp0_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int fmt : 3, __BITFIELD_FIELD(unsigned int op : 2, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int fmt : 3, __BITFIELD_FIELD(unsigned int op : 2, __BITFIELD_FIELD(unsigned int func : 6,;
)))))))
};
struct fp1_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int op : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int op : 5, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct mm_fp1_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fmt : 2, __BITFIELD_FIELD(unsigned int op : 8, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fmt : 2, __BITFIELD_FIELD(unsigned int op : 8, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct mm_fp2_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int cc : 3, __BITFIELD_FIELD(unsigned int zero : 2, __BITFIELD_FIELD(unsigned int fmt : 2, __BITFIELD_FIELD(unsigned int op : 3, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int cc : 3, __BITFIELD_FIELD(unsigned int zero : 2, __BITFIELD_FIELD(unsigned int fmt : 2, __BITFIELD_FIELD(unsigned int op : 3, __BITFIELD_FIELD(unsigned int func : 6,;
))))))))
};
struct mm_fp3_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fmt : 3, __BITFIELD_FIELD(unsigned int op : 7, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fmt : 3, __BITFIELD_FIELD(unsigned int op : 7, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct mm_fp4_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int cc : 3, __BITFIELD_FIELD(unsigned int fmt : 3, __BITFIELD_FIELD(unsigned int cond : 4, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int cc : 3, __BITFIELD_FIELD(unsigned int fmt : 3, __BITFIELD_FIELD(unsigned int cond : 4, __BITFIELD_FIELD(unsigned int func : 6,;
)))))))
};
struct mm_fp5_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int index : 5, __BITFIELD_FIELD(unsigned int base : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int op : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int index : 5, __BITFIELD_FIELD(unsigned int base : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int op : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct fp6_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fr : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int fr : 5, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct mm_fp6_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int fr : 5, __BITFIELD_FIELD(unsigned int func : 6,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int ft : 5, __BITFIELD_FIELD(unsigned int fs : 5, __BITFIELD_FIELD(unsigned int fd : 5, __BITFIELD_FIELD(unsigned int fr : 5, __BITFIELD_FIELD(unsigned int func : 6,;
))))))
};
struct mm_i_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(signed int simmediate : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(unsigned int rs : 5, __BITFIELD_FIELD(signed int simmediate : 16,;
))))
};
struct mm_m_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int base : 5, __BITFIELD_FIELD(unsigned int func : 4, __BITFIELD_FIELD(signed int simmediate : 12,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int base : 5, __BITFIELD_FIELD(unsigned int func : 4, __BITFIELD_FIELD(signed int simmediate : 12,;
)))))
};
struct mm_x_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int index : 5, __BITFIELD_FIELD(unsigned int base : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int func : 11,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int index : 5, __BITFIELD_FIELD(unsigned int base : 5, __BITFIELD_FIELD(unsigned int rd : 5, __BITFIELD_FIELD(unsigned int func : 11,;
)))))
};
struct mm_b0_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(signed int simmediate : 10, __BITFIELD_FIELD(unsigned int : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(signed int simmediate : 10, __BITFIELD_FIELD(unsigned int : 16,;
)))
};
struct mm_b1_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 3, __BITFIELD_FIELD(signed int simmediate : 7, __BITFIELD_FIELD(unsigned int : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rs : 3, __BITFIELD_FIELD(signed int simmediate : 7, __BITFIELD_FIELD(unsigned int : 16,;
))))
};
struct mm16_m_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int func : 4, __BITFIELD_FIELD(unsigned int rlist : 2, __BITFIELD_FIELD(unsigned int imm : 4, __BITFIELD_FIELD(unsigned int : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int func : 4, __BITFIELD_FIELD(unsigned int rlist : 2, __BITFIELD_FIELD(unsigned int imm : 4, __BITFIELD_FIELD(unsigned int : 16,;
)))))
};
struct mm16_rb_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 3, __BITFIELD_FIELD(unsigned int base : 3, __BITFIELD_FIELD(signed int simmediate : 4, __BITFIELD_FIELD(unsigned int : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 3, __BITFIELD_FIELD(unsigned int base : 3, __BITFIELD_FIELD(signed int simmediate : 4, __BITFIELD_FIELD(unsigned int : 16,;
)))))
};
struct mm16_r3_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 3, __BITFIELD_FIELD(signed int simmediate : 7, __BITFIELD_FIELD(unsigned int : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 3, __BITFIELD_FIELD(signed int simmediate : 7, __BITFIELD_FIELD(unsigned int : 16,;
))))
};
struct mm16_r5_format {
- __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(signed int simmediate : 5, __BITFIELD_FIELD(unsigned int : 16,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 6, __BITFIELD_FIELD(unsigned int rt : 5, __BITFIELD_FIELD(signed int simmediate : 5, __BITFIELD_FIELD(unsigned int : 16,;
))))
};
struct m16e_rr {
- __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int rx : 3, __BITFIELD_FIELD(unsigned int nd : 1, __BITFIELD_FIELD(unsigned int l : 1, __BITFIELD_FIELD(unsigned int ra : 1, __BITFIELD_FIELD(unsigned int func : 5,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int rx : 3, __BITFIELD_FIELD(unsigned int nd : 1, __BITFIELD_FIELD(unsigned int l : 1, __BITFIELD_FIELD(unsigned int ra : 1, __BITFIELD_FIELD(unsigned int func : 5,;
))))))
};
struct m16e_jal {
- __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int x : 1, __BITFIELD_FIELD(unsigned int imm20_16 : 5, __BITFIELD_FIELD(signed int imm25_21 : 5,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int x : 1, __BITFIELD_FIELD(unsigned int imm20_16 : 5, __BITFIELD_FIELD(signed int imm25_21 : 5,;
))))
};
struct m16e_i64 {
- __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int func : 3, __BITFIELD_FIELD(unsigned int imm : 8,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int func : 3, __BITFIELD_FIELD(unsigned int imm : 8,;
)))
};
struct m16e_ri64 {
- __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int func : 3, __BITFIELD_FIELD(unsigned int ry : 3, __BITFIELD_FIELD(unsigned int imm : 5,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int func : 3, __BITFIELD_FIELD(unsigned int ry : 3, __BITFIELD_FIELD(unsigned int imm : 5,;
))))
};
struct m16e_ri {
- __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int rx : 3, __BITFIELD_FIELD(unsigned int imm : 8,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int rx : 3, __BITFIELD_FIELD(unsigned int imm : 8,;
)))
};
struct m16e_rri {
- __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int rx : 3, __BITFIELD_FIELD(unsigned int ry : 3, __BITFIELD_FIELD(unsigned int imm : 5,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int rx : 3, __BITFIELD_FIELD(unsigned int ry : 3, __BITFIELD_FIELD(unsigned int imm : 5,;
))))
};
struct m16e_i8 {
- __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int func : 3, __BITFIELD_FIELD(unsigned int imm : 8,;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __BITFIELD_FIELD(unsigned int opcode : 5, __BITFIELD_FIELD(unsigned int func : 3, __BITFIELD_FIELD(unsigned int imm : 8,;
)))
};
union mips_instruction {
- unsigned int word;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int word;
unsigned short halfword[2];
unsigned char byte[4];
struct j_format j_format;
- struct i_format i_format;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct i_format i_format;
struct u_format u_format;
struct c_format c_format;
struct r_format r_format;
- struct p_format p_format;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct p_format p_format;
struct f_format f_format;
struct ma_format ma_format;
+ struct msa_mi10_format msa_mi10_format;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct b_format b_format;
struct ps_format ps_format;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v_format v_format;
struct spec3_format spec3_format;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct fb_format fb_format;
struct fp0_format fp0_format;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm_fp0_format mm_fp0_format;
struct fp1_format fp1_format;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm_fp1_format mm_fp1_format;
struct mm_fp2_format mm_fp2_format;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm_fp3_format mm_fp3_format;
struct mm_fp4_format mm_fp4_format;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm_fp5_format mm_fp5_format;
struct fp6_format fp6_format;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm_fp6_format mm_fp6_format;
struct mm_i_format mm_i_format;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm_m_format mm_m_format;
struct mm_x_format mm_x_format;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm_b0_format mm_b0_format;
struct mm_b1_format mm_b1_format;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm16_m_format mm16_m_format;
struct mm16_rb_format mm16_rb_format;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mm16_r3_format mm16_r3_format;
struct mm16_r5_format mm16_r5_format;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
union mips16e_instruction {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int full : 16;
struct m16e_rr rr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct m16e_jal jal;
struct m16e_i64 i64;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct m16e_ri64 ri64;
struct m16e_ri ri;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct m16e_rri rri;
struct m16e_i8 i8;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-mips/asm/kvm.h b/libc/kernel/uapi/asm-mips/asm/kvm.h
index 0206d16b9..9c014703a 100644
--- a/libc/kernel/uapi/asm-mips/asm/kvm.h
+++ b/libc/kernel/uapi/asm-mips/asm/kvm.h
@@ -28,79 +28,88 @@ struct kvm_regs {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct kvm_fpu {
- __u64 fpr[32];
- __u32 fir;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 fccr;
- __u32 fexr;
- __u32 fenr;
- __u32 fcsr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 pad;
};
-#define KVM_REG_MIPS_R0 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0)
-#define KVM_REG_MIPS_R1 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R2 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 2)
-#define KVM_REG_MIPS_R3 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 3)
-#define KVM_REG_MIPS_R4 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 4)
-#define KVM_REG_MIPS_R5 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 5)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R6 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 6)
-#define KVM_REG_MIPS_R7 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 7)
-#define KVM_REG_MIPS_R8 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 8)
-#define KVM_REG_MIPS_R9 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 9)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R10 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 10)
-#define KVM_REG_MIPS_R11 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 11)
-#define KVM_REG_MIPS_R12 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 12)
-#define KVM_REG_MIPS_R13 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 13)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R14 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 14)
-#define KVM_REG_MIPS_R15 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 15)
-#define KVM_REG_MIPS_R16 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 16)
-#define KVM_REG_MIPS_R17 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 17)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R18 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 18)
-#define KVM_REG_MIPS_R19 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 19)
-#define KVM_REG_MIPS_R20 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 20)
-#define KVM_REG_MIPS_R21 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 21)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R22 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 22)
-#define KVM_REG_MIPS_R23 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 23)
-#define KVM_REG_MIPS_R24 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 24)
-#define KVM_REG_MIPS_R25 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 25)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R26 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 26)
-#define KVM_REG_MIPS_R27 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 27)
-#define KVM_REG_MIPS_R28 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 28)
-#define KVM_REG_MIPS_R29 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 29)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_R30 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 30)
-#define KVM_REG_MIPS_R31 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 31)
-#define KVM_REG_MIPS_HI (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 32)
-#define KVM_REG_MIPS_LO (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 33)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_PC (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 34)
-#define KVM_REG_MIPS_COUNT_CTL (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0x20000 | 0)
+#define KVM_REG_MIPS_GP (KVM_REG_MIPS | 0x0000000000000000ULL)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_CP0 (KVM_REG_MIPS | 0x0000000000010000ULL)
+#define KVM_REG_MIPS_KVM (KVM_REG_MIPS | 0x0000000000020000ULL)
+#define KVM_REG_MIPS_FPU (KVM_REG_MIPS | 0x0000000000030000ULL)
+#define KVM_REG_MIPS_R0 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R1 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 1)
+#define KVM_REG_MIPS_R2 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 2)
+#define KVM_REG_MIPS_R3 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 3)
+#define KVM_REG_MIPS_R4 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R5 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 5)
+#define KVM_REG_MIPS_R6 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 6)
+#define KVM_REG_MIPS_R7 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 7)
+#define KVM_REG_MIPS_R8 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 8)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R9 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 9)
+#define KVM_REG_MIPS_R10 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 10)
+#define KVM_REG_MIPS_R11 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 11)
+#define KVM_REG_MIPS_R12 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 12)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R13 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 13)
+#define KVM_REG_MIPS_R14 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 14)
+#define KVM_REG_MIPS_R15 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 15)
+#define KVM_REG_MIPS_R16 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 16)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R17 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 17)
+#define KVM_REG_MIPS_R18 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 18)
+#define KVM_REG_MIPS_R19 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 19)
+#define KVM_REG_MIPS_R20 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 20)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R21 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 21)
+#define KVM_REG_MIPS_R22 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 22)
+#define KVM_REG_MIPS_R23 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 23)
+#define KVM_REG_MIPS_R24 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 24)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R25 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 25)
+#define KVM_REG_MIPS_R26 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 26)
+#define KVM_REG_MIPS_R27 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 27)
+#define KVM_REG_MIPS_R28 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 28)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_R29 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 29)
+#define KVM_REG_MIPS_R30 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 30)
+#define KVM_REG_MIPS_R31 (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 31)
+#define KVM_REG_MIPS_HI (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 32)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_LO (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 33)
+#define KVM_REG_MIPS_PC (KVM_REG_MIPS_GP | KVM_REG_SIZE_U64 | 34)
+#define KVM_REG_MIPS_COUNT_CTL (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 0)
#define KVM_REG_MIPS_COUNT_CTL_DC 0x00000001
-#define KVM_REG_MIPS_COUNT_RESUME (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0x20000 | 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_REG_MIPS_COUNT_HZ (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0x20000 | 2)
+#define KVM_REG_MIPS_COUNT_RESUME (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 1)
+#define KVM_REG_MIPS_COUNT_HZ (KVM_REG_MIPS_KVM | KVM_REG_SIZE_U64 | 2)
+#define KVM_REG_MIPS_FPR (KVM_REG_MIPS_FPU | 0x0000000000000000ULL)
+#define KVM_REG_MIPS_FCR (KVM_REG_MIPS_FPU | 0x0000000000000100ULL)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_MSACR (KVM_REG_MIPS_FPU | 0x0000000000000200ULL)
+#define KVM_REG_MIPS_FPR_32(n) (KVM_REG_MIPS_FPR | KVM_REG_SIZE_U32 | (n))
+#define KVM_REG_MIPS_FPR_64(n) (KVM_REG_MIPS_FPR | KVM_REG_SIZE_U64 | (n))
+#define KVM_REG_MIPS_VEC_128(n) (KVM_REG_MIPS_FPR | KVM_REG_SIZE_U128 | (n))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_MIPS_FCR_IR (KVM_REG_MIPS_FCR | KVM_REG_SIZE_U32 | 0)
+#define KVM_REG_MIPS_FCR_CSR (KVM_REG_MIPS_FCR | KVM_REG_SIZE_U32 | 31)
+#define KVM_REG_MIPS_MSA_IR (KVM_REG_MIPS_MSACR | KVM_REG_SIZE_U32 | 0)
+#define KVM_REG_MIPS_MSA_CSR (KVM_REG_MIPS_MSACR | KVM_REG_SIZE_U32 | 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_debug_exit_arch {
__u64 epc;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_guest_debug_arch {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct kvm_sync_regs {
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_sregs {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct kvm_mips_interrupt {
__u32 cpu;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 irq;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif
diff --git a/libc/kernel/uapi/asm-mips/asm/mman.h b/libc/kernel/uapi/asm-mips/asm/mman.h
index b9a903121..7d7f68dfc 100644
--- a/libc/kernel/uapi/asm-mips/asm/mman.h
+++ b/libc/kernel/uapi/asm-mips/asm/mman.h
@@ -56,26 +56,29 @@
#define MCL_CURRENT 1
#define MCL_FUTURE 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MCL_ONFAULT 4
+#define MLOCK_ONFAULT 0x01
#define MADV_NORMAL 0
#define MADV_RANDOM 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MADV_SEQUENTIAL 2
#define MADV_WILLNEED 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MADV_DONTNEED 4
#define MADV_REMOVE 9
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MADV_DONTFORK 10
#define MADV_DOFORK 11
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MADV_MERGEABLE 12
#define MADV_UNMERGEABLE 13
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MADV_HWPOISON 100
#define MADV_HUGEPAGE 14
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MADV_NOHUGEPAGE 15
#define MADV_DONTDUMP 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MADV_DODUMP 17
#define MAP_FILE 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MAP_HUGE_SHIFT 26
#define MAP_HUGE_MASK 0x3f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-mips/asm/sigcontext.h b/libc/kernel/uapi/asm-mips/asm/sigcontext.h
index 59870bc06..2fc02291f 100644
--- a/libc/kernel/uapi/asm-mips/asm/sigcontext.h
+++ b/libc/kernel/uapi/asm-mips/asm/sigcontext.h
@@ -21,6 +21,11 @@
#include <linux/types.h>
#include <asm/sgidefs.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USED_FP (1 << 0)
+#define USED_FR1 (1 << 1)
+#define USED_HYBRID_FPRS (1 << 2)
+#define USED_EXTCONTEXT (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#if _MIPS_SIM == _MIPS_SIM_ABI32
struct sigcontext {
unsigned int sc_regmask;
diff --git a/libc/kernel/uapi/asm-mips/asm/siginfo.h b/libc/kernel/uapi/asm-mips/asm/siginfo.h
index 2f95d1765..758327c85 100644
--- a/libc/kernel/uapi/asm-mips/asm/siginfo.h
+++ b/libc/kernel/uapi/asm-mips/asm/siginfo.h
@@ -22,93 +22,97 @@
#undef __ARCH_SI_TRAPNO
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HAVE_ARCH_SIGINFO_T
-#define HAVE_ARCH_COPY_SIGINFO
-struct siginfo;
#if _MIPS_SZLONG == 32
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
#elif _MIPS_SZLONG==64
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int))
#else
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#error _MIPS_SZLONG neither 32 nor 64
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __ARCH_SIGSYS
#include <asm-generic/siginfo.h>
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct siginfo {
int si_signo;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int si_code;
int si_errno;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int __pad0[SI_MAX_SIZE / sizeof(int) - SI_PAD_SIZE - 3];
union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int _pad[SI_PAD_SIZE];
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
pid_t _pid;
__ARCH_SI_UID_T _uid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} _kill;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
timer_t _tid;
int _overrun;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char _pad[sizeof(__ARCH_SI_UID_T) - sizeof(int)];
sigval_t _sigval;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int _sys_private;
} _timer;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
pid_t _pid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__ARCH_SI_UID_T _uid;
sigval_t _sigval;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} _rt;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
pid_t _pid;
__ARCH_SI_UID_T _uid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int _status;
clock_t _utime;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
clock_t _stime;
} _sigchld;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
pid_t _pid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
clock_t _utime;
int _status;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
clock_t _stime;
} _irix_sigchld;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
void __user * _addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#ifdef __ARCH_SI_TRAPNO
int _trapno;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
short _addr_lsb;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
+ void __user * _lower;
+ void __user * _upper;
+ } _addr_bnd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} _sigfault;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__ARCH_SI_BAND_T _band;
int _fd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} _sigpoll;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
void __user * _call_addr;
int _syscall;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int _arch;
} _sigsys;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} _sifields;
} siginfo_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#undef SI_ASYNCIO
#undef SI_TIMER
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#undef SI_MESGQ
#define SI_ASYNCIO - 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TIMER __SI_CODE(__SI_TIMER, - 3)
#define SI_MESGQ __SI_CODE(__SI_MESGQ, - 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <asm-generic/siginfo.h>
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-mips/asm/socket.h b/libc/kernel/uapi/asm-mips/asm/socket.h
index 38e4e63a9..44050534c 100644
--- a/libc/kernel/uapi/asm-mips/asm/socket.h
+++ b/libc/kernel/uapi/asm-mips/asm/socket.h
@@ -88,4 +88,8 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SO_MAX_PACING_RATE 47
#define SO_BPF_EXTENSIONS 48
+#define SO_INCOMING_CPU 49
+#define SO_ATTACH_BPF 50
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SO_DETACH_BPF SO_DETACH_FILTER
#endif
diff --git a/libc/kernel/uapi/asm-mips/asm/swab.h b/libc/kernel/uapi/asm-mips/asm/swab.h
index 0629d36cf..d78191d59 100644
--- a/libc/kernel/uapi/asm-mips/asm/swab.h
+++ b/libc/kernel/uapi/asm-mips/asm/swab.h
@@ -22,7 +22,7 @@
#include <linux/types.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __SWAB_64_THRU_32__
-#if defined(__mips_isa_rev) && __mips_isa_rev >= 2 || defined(_MIPS_ARCH_LOONGSON3A)
+#if !defined(__mips16) && (defined(__mips_isa_rev) && __mips_isa_rev >= 2 || defined(_MIPS_ARCH_LOONGSON3A))
#define __arch_swab16 __arch_swab16
#define __arch_swab32 __arch_swab32
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-mips/asm/unistd.h b/libc/kernel/uapi/asm-mips/asm/unistd.h
index 04a45bfa8..d5c3de3fb 100644
--- a/libc/kernel/uapi/asm-mips/asm/unistd.h
+++ b/libc/kernel/uapi/asm-mips/asm/unistd.h
@@ -466,10 +466,15 @@
#define __NR_memfd_create (__NR_Linux + 354)
#define __NR_bpf (__NR_Linux + 355)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define __NR_Linux_syscalls 355
+#define __NR_execveat (__NR_Linux + 356)
+#define __NR_userfaultfd (__NR_Linux + 357)
+#define __NR_membarrier (__NR_Linux + 358)
+#define __NR_mlock2 (__NR_Linux + 359)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_Linux_syscalls 359
#endif
#define __NR_O32_Linux 4000
-#define __NR_O32_Linux_syscalls 355
+#define __NR_O32_Linux_syscalls 359
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#if _MIPS_SIM == _MIPS_SIM_ABI64
#define __NR_Linux 5000
@@ -867,11 +872,16 @@
#define __NR_memfd_create (__NR_Linux + 314)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_bpf (__NR_Linux + 315)
-#define __NR_Linux_syscalls 315
+#define __NR_execveat (__NR_Linux + 316)
+#define __NR_userfaultfd (__NR_Linux + 317)
+#define __NR_membarrier (__NR_Linux + 318)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_mlock2 (__NR_Linux + 319)
+#define __NR_Linux_syscalls 319
#endif
#define __NR_64_Linux 5000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define __NR_64_Linux_syscalls 315
+#define __NR_64_Linux_syscalls 319
#if _MIPS_SIM == _MIPS_SIM_NABI32
#define __NR_Linux 6000
#define __NR_read (__NR_Linux + 0)
@@ -1273,9 +1283,14 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_memfd_create (__NR_Linux + 318)
#define __NR_bpf (__NR_Linux + 319)
-#define __NR_Linux_syscalls 319
+#define __NR_execveat (__NR_Linux + 320)
+#define __NR_userfaultfd (__NR_Linux + 321)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_membarrier (__NR_Linux + 322)
+#define __NR_mlock2 (__NR_Linux + 323)
+#define __NR_Linux_syscalls 323
#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_N32_Linux 6000
-#define __NR_N32_Linux_syscalls 319
+#define __NR_N32_Linux_syscalls 323
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/bitsperlong.h b/libc/kernel/uapi/asm-x86/asm/bitsperlong.h
index 2deae2450..0bc255c55 100644
--- a/libc/kernel/uapi/asm-x86/asm/bitsperlong.h
+++ b/libc/kernel/uapi/asm-x86/asm/bitsperlong.h
@@ -18,7 +18,7 @@
****************************************************************************/
#ifndef __ASM_X86_BITSPERLONG_H
#define __ASM_X86_BITSPERLONG_H
-#ifdef __x86_64__
+#if defined(__x86_64__) && !defined(__ILP32__)
#define __BITS_PER_LONG 64
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#else
diff --git a/libc/kernel/uapi/asm-x86/asm/bootparam.h b/libc/kernel/uapi/asm-x86/asm/bootparam.h
index 27201d6e9..1394829d9 100644
--- a/libc/kernel/uapi/asm-x86/asm/bootparam.h
+++ b/libc/kernel/uapi/asm-x86/asm/bootparam.h
@@ -29,161 +29,162 @@
#define RAMDISK_PROMPT_FLAG 0x8000
#define RAMDISK_LOAD_FLAG 0x4000
#define LOADED_HIGH (1 << 0)
-#define QUIET_FLAG (1 << 5)
+#define KASLR_FLAG (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define QUIET_FLAG (1 << 5)
#define KEEP_SEGMENTS (1 << 6)
#define CAN_USE_HEAP (1 << 7)
#define XLF_KERNEL_64 (1 << 0)
-#define XLF_CAN_BE_LOADED_ABOVE_4G (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define XLF_CAN_BE_LOADED_ABOVE_4G (1 << 1)
#define XLF_EFI_HANDOVER_32 (1 << 2)
#define XLF_EFI_HANDOVER_64 (1 << 3)
#define XLF_EFI_KEXEC (1 << 4)
-#ifndef __ASSEMBLY__
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef __ASSEMBLY__
#include <linux/types.h>
#include <linux/screen_info.h>
#include <linux/apm_bios.h>
-#include <linux/edd.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <linux/edd.h>
#include <asm/e820.h>
#include <asm/ist.h>
#include <video/edid.h>
-struct setup_data {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct setup_data {
__u64 next;
__u32 type;
__u32 len;
- __u8 data[0];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 data[0];
};
struct setup_header {
__u8 setup_sects;
- __u16 root_flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 root_flags;
__u32 syssize;
__u16 ram_size;
__u16 vid_mode;
- __u16 root_dev;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 root_dev;
__u16 boot_flag;
__u16 jump;
__u32 header;
- __u16 version;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 version;
__u32 realmode_swtch;
__u16 start_sys;
__u16 kernel_version;
- __u8 type_of_loader;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 type_of_loader;
__u8 loadflags;
__u16 setup_move_size;
__u32 code32_start;
- __u32 ramdisk_image;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ramdisk_image;
__u32 ramdisk_size;
__u32 bootsect_kludge;
__u16 heap_end_ptr;
- __u8 ext_loader_ver;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 ext_loader_ver;
__u8 ext_loader_type;
__u32 cmd_line_ptr;
__u32 initrd_addr_max;
- __u32 kernel_alignment;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 kernel_alignment;
__u8 relocatable_kernel;
__u8 min_alignment;
__u16 xloadflags;
- __u32 cmdline_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cmdline_size;
__u32 hardware_subarch;
__u64 hardware_subarch_data;
__u32 payload_offset;
- __u32 payload_length;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 payload_length;
__u64 setup_data;
__u64 pref_address;
__u32 init_size;
- __u32 handover_offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 handover_offset;
} __attribute__((packed));
struct sys_desc_table {
__u16 length;
- __u8 table[14];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 table[14];
};
struct olpc_ofw_header {
__u32 ofw_magic;
- __u32 ofw_version;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ofw_version;
__u32 cif_handler;
__u32 irq_desc_table;
} __attribute__((packed));
-struct efi_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct efi_info {
__u32 efi_loader_signature;
__u32 efi_systab;
__u32 efi_memdesc_size;
- __u32 efi_memdesc_version;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 efi_memdesc_version;
__u32 efi_memmap;
__u32 efi_memmap_size;
__u32 efi_systab_hi;
- __u32 efi_memmap_hi;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 efi_memmap_hi;
};
struct boot_params {
struct screen_info screen_info;
- struct apm_bios_info apm_bios_info;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct apm_bios_info apm_bios_info;
__u8 _pad2[4];
__u64 tboot_addr;
struct ist_info ist_info;
- __u8 _pad3[16];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 _pad3[16];
__u8 hd0_info[16];
__u8 hd1_info[16];
struct sys_desc_table sys_desc_table;
- struct olpc_ofw_header olpc_ofw_header;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct olpc_ofw_header olpc_ofw_header;
__u32 ext_ramdisk_image;
__u32 ext_ramdisk_size;
__u32 ext_cmd_line_ptr;
- __u8 _pad4[116];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 _pad4[116];
struct edid_info edid_info;
struct efi_info efi_info;
__u32 alt_mem_k;
- __u32 scratch;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 scratch;
__u8 e820_entries;
__u8 eddbuf_entries;
__u8 edd_mbr_sig_buf_entries;
- __u8 kbd_status;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 kbd_status;
__u8 _pad5[3];
__u8 sentinel;
__u8 _pad6[1];
- struct setup_header hdr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct setup_header hdr;
__u8 _pad7[0x290 - 0x1f1 - sizeof(struct setup_header)];
__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX];
struct e820entry e820_map[E820MAX];
- __u8 _pad8[48];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 _pad8[48];
struct edd_info eddbuf[EDDMAXNR];
__u8 _pad9[276];
} __attribute__((packed));
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
X86_SUBARCH_PC = 0,
X86_SUBARCH_LGUEST,
X86_SUBARCH_XEN,
- X86_SUBARCH_INTEL_MID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ X86_SUBARCH_INTEL_MID,
X86_SUBARCH_CE4100,
X86_NR_SUBARCHS,
};
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/e820.h b/libc/kernel/uapi/asm-x86/asm/e820.h
index d4cb389e1..10ec6b9ed 100644
--- a/libc/kernel/uapi/asm-x86/asm/e820.h
+++ b/libc/kernel/uapi/asm-x86/asm/e820.h
@@ -29,28 +29,31 @@
#define E820_ACPI 3
#define E820_NVS 4
#define E820_UNUSABLE 5
-#define E820_RESERVED_KERN 128
+#define E820_PMEM 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define E820_PRAM 12
+#define E820_RESERVED_KERN 128
#ifndef __ASSEMBLY__
#include <linux/types.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct e820entry {
__u64 addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 size;
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct e820map {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 nr_map;
struct e820entry map[E820_X_MAX];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define ISA_START_ADDRESS 0xa0000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ISA_END_ADDRESS 0x100000
#define BIOS_BEGIN 0x000a0000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BIOS_END 0x00100000
#define BIOS_ROM_BASE 0xffe00000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BIOS_ROM_END 0xffffffff
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/hyperv.h b/libc/kernel/uapi/asm-x86/asm/hyperv.h
index e869504ae..312726f35 100644
--- a/libc/kernel/uapi/asm-x86/asm/hyperv.h
+++ b/libc/kernel/uapi/asm-x86/asm/hyperv.h
@@ -33,52 +33,57 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_MSR_VP_RUNTIME_AVAILABLE (1 << 0)
#define HV_X64_MSR_TIME_REF_COUNT_AVAILABLE (1 << 1)
+#define HV_X64_MSR_REFERENCE_TSC_AVAILABLE (1 << 9)
#define HV_X64_MSR_REFERENCE_TSC 0x40000021
-#define HV_X64_MSR_APIC_FREQUENCY_AVAILABLE (1 << 11)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_MSR_APIC_FREQUENCY_AVAILABLE (1 << 11)
#define HV_X64_MSR_TSC_FREQUENCY_AVAILABLE (1 << 11)
#define HV_X64_MSR_SYNIC_AVAILABLE (1 << 2)
#define HV_X64_MSR_SYNTIMER_AVAILABLE (1 << 3)
-#define HV_X64_MSR_APIC_ACCESS_AVAILABLE (1 << 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_MSR_APIC_ACCESS_AVAILABLE (1 << 4)
#define HV_X64_MSR_HYPERCALL_AVAILABLE (1 << 5)
#define HV_X64_MSR_VP_INDEX_AVAILABLE (1 << 6)
#define HV_X64_MSR_RESET_AVAILABLE (1 << 7)
-#define HV_X64_MSR_STAT_PAGES_AVAILABLE (1 << 8)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_MSR_STAT_PAGES_AVAILABLE (1 << 8)
#define HV_X64_CREATE_PARTITIONS (1 << 0)
#define HV_X64_ACCESS_PARTITION_ID (1 << 1)
#define HV_X64_ACCESS_MEMORY_POOL (1 << 2)
-#define HV_X64_ADJUST_MESSAGE_BUFFERS (1 << 3)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_ADJUST_MESSAGE_BUFFERS (1 << 3)
#define HV_X64_POST_MESSAGES (1 << 4)
#define HV_X64_SIGNAL_EVENTS (1 << 5)
#define HV_X64_CREATE_PORT (1 << 6)
-#define HV_X64_CONNECT_PORT (1 << 7)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_CONNECT_PORT (1 << 7)
#define HV_X64_ACCESS_STATS (1 << 8)
#define HV_X64_DEBUGGING (1 << 11)
#define HV_X64_CPU_POWER_MANAGEMENT (1 << 12)
-#define HV_X64_CONFIGURE_PROFILER (1 << 13)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_CONFIGURE_PROFILER (1 << 13)
#define HV_X64_MWAIT_AVAILABLE (1 << 0)
#define HV_X64_GUEST_DEBUGGING_AVAILABLE (1 << 1)
#define HV_X64_PERF_MONITOR_AVAILABLE (1 << 2)
-#define HV_X64_CPU_DYNAMIC_PARTITIONING_AVAILABLE (1 << 3)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_CPU_DYNAMIC_PARTITIONING_AVAILABLE (1 << 3)
#define HV_X64_HYPERCALL_PARAMS_XMM_AVAILABLE (1 << 4)
#define HV_X64_GUEST_IDLE_STATE_AVAILABLE (1 << 5)
+#define HV_X64_GUEST_CRASH_MSR_AVAILABLE (1 << 10)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_MWAIT_RECOMMENDED (1 << 0)
#define HV_X64_LOCAL_TLB_FLUSH_RECOMMENDED (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED (1 << 2)
#define HV_X64_APIC_ACCESS_RECOMMENDED (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_SYSTEM_RESET_RECOMMENDED (1 << 4)
#define HV_X64_RELAXED_TIMING_RECOMMENDED (1 << 5)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_MSR_GUEST_OS_ID 0x40000000
#define HV_X64_MSR_HYPERCALL 0x40000001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_MSR_VP_INDEX 0x40000002
+#define HV_X64_MSR_RESET 0x40000003
+#define HV_X64_MSR_VP_RUNTIME 0x40000010
#define HV_X64_MSR_TIME_REF_COUNT 0x40000020
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_MSR_TSC_FREQUENCY 0x40000022
@@ -114,6 +119,26 @@
#define HV_X64_MSR_SINT13 0x4000009D
#define HV_X64_MSR_SINT14 0x4000009E
#define HV_X64_MSR_SINT15 0x4000009F
+#define HV_X64_MSR_STIMER0_CONFIG 0x400000B0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_MSR_STIMER0_COUNT 0x400000B1
+#define HV_X64_MSR_STIMER1_CONFIG 0x400000B2
+#define HV_X64_MSR_STIMER1_COUNT 0x400000B3
+#define HV_X64_MSR_STIMER2_CONFIG 0x400000B4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_MSR_STIMER2_COUNT 0x400000B5
+#define HV_X64_MSR_STIMER3_CONFIG 0x400000B6
+#define HV_X64_MSR_STIMER3_COUNT 0x400000B7
+#define HV_X64_MSR_CRASH_P0 0x40000100
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_MSR_CRASH_P1 0x40000101
+#define HV_X64_MSR_CRASH_P2 0x40000102
+#define HV_X64_MSR_CRASH_P3 0x40000103
+#define HV_X64_MSR_CRASH_P4 0x40000104
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_X64_MSR_CRASH_CTL 0x40000105
+#define HV_X64_MSR_CRASH_CTL_NOTIFY (1ULL << 63)
+#define HV_X64_MSR_CRASH_PARAMS (1 + (HV_X64_MSR_CRASH_P4 - HV_X64_MSR_CRASH_P0))
#define HV_X64_MSR_HYPERCALL_ENABLE 0x00000001
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_X64_MSR_HYPERCALL_PAGE_ADDRESS_SHIFT 12
@@ -136,13 +161,25 @@
#define HV_STATUS_INVALID_HYPERCALL_INPUT 3
#define HV_STATUS_INVALID_ALIGNMENT 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_STATUS_INSUFFICIENT_MEMORY 11
+#define HV_STATUS_INVALID_CONNECTION_ID 18
#define HV_STATUS_INSUFFICIENT_BUFFERS 19
typedef struct _HV_REFERENCE_TSC_PAGE {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tsc_sequence;
__u32 res1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 tsc_scale;
__s64 tsc_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} HV_REFERENCE_TSC_PAGE, * PHV_REFERENCE_TSC_PAGE;
-#endif
+#define HV_SYNIC_SINT_COUNT (16)
+#define HV_SYNIC_VERSION_1 (0x1)
+#define HV_SYNIC_CONTROL_ENABLE (1ULL << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_SYNIC_SIMP_ENABLE (1ULL << 0)
+#define HV_SYNIC_SIEFP_ENABLE (1ULL << 0)
+#define HV_SYNIC_SINT_MASKED (1ULL << 16)
+#define HV_SYNIC_SINT_AUTO_EOI (1ULL << 17)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HV_SYNIC_SINT_VECTOR_MASK (0xFF)
+#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/kvm.h b/libc/kernel/uapi/asm-x86/asm/kvm.h
index 6b6b6f26d..45c8d12c7 100644
--- a/libc/kernel/uapi/asm-x86/asm/kvm.h
+++ b/libc/kernel/uapi/asm-x86/asm/kvm.h
@@ -129,209 +129,219 @@ struct kvm_ioapic_state {
#define KVM_IRQCHIP_PIC_SLAVE 1
#define KVM_IRQCHIP_IOAPIC 2
#define KVM_NR_IRQCHIPS 3
-struct kvm_regs {
+#define KVM_RUN_X86_SMM (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_regs {
__u64 rax, rbx, rcx, rdx;
__u64 rsi, rdi, rsp, rbp;
__u64 r8, r9, r10, r11;
- __u64 r12, r13, r14, r15;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 r12, r13, r14, r15;
__u64 rip, rflags;
};
#define KVM_APIC_REG_SIZE 0x400
-struct kvm_lapic_state {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_lapic_state {
char regs[KVM_APIC_REG_SIZE];
};
struct kvm_segment {
- __u64 base;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 base;
__u32 limit;
__u16 selector;
__u8 type;
- __u8 present, dpl, db, s, l, g, avl;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 present, dpl, db, s, l, g, avl;
__u8 unusable;
__u8 padding;
};
-struct kvm_dtable {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_dtable {
__u64 base;
__u16 limit;
__u16 padding[3];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_sregs {
struct kvm_segment cs, ds, es, fs, gs, ss;
struct kvm_segment tr, ldt;
- struct kvm_dtable gdt, idt;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct kvm_dtable gdt, idt;
__u64 cr0, cr2, cr3, cr4, cr8;
__u64 efer;
__u64 apic_base;
- __u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 interrupt_bitmap[(KVM_NR_INTERRUPTS + 63) / 64];
};
struct kvm_fpu {
__u8 fpr[8][16];
- __u16 fcw;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 fcw;
__u16 fsw;
__u8 ftwx;
__u8 pad1;
- __u16 last_opcode;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 last_opcode;
__u64 last_ip;
__u64 last_dp;
__u8 xmm[16][16];
- __u32 mxcsr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 mxcsr;
__u32 pad2;
};
struct kvm_msr_entry {
- __u32 index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 index;
__u32 reserved;
__u64 data;
};
-struct kvm_msrs {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_msrs {
__u32 nmsrs;
__u32 pad;
struct kvm_msr_entry entries[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_msr_list {
__u32 nmsrs;
__u32 indices[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_cpuid_entry {
__u32 function;
__u32 eax;
- __u32 ebx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ebx;
__u32 ecx;
__u32 edx;
__u32 padding;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_cpuid {
__u32 nent;
__u32 padding;
- struct kvm_cpuid_entry entries[0];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct kvm_cpuid_entry entries[0];
};
struct kvm_cpuid_entry2 {
__u32 function;
- __u32 index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 index;
__u32 flags;
__u32 eax;
__u32 ebx;
- __u32 ecx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ecx;
__u32 edx;
__u32 padding[3];
};
-#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX BIT(0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_CPUID_FLAG_SIGNIFCANT_INDEX BIT(0)
#define KVM_CPUID_FLAG_STATEFUL_FUNC BIT(1)
#define KVM_CPUID_FLAG_STATE_READ_NEXT BIT(2)
struct kvm_cpuid2 {
- __u32 nent;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 nent;
__u32 padding;
struct kvm_cpuid_entry2 entries[0];
};
-struct kvm_pit_channel_state {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_pit_channel_state {
__u32 count;
__u16 latched_count;
__u8 count_latched;
- __u8 status_latched;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 status_latched;
__u8 status;
__u8 read_state;
__u8 write_state;
- __u8 write_latch;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 write_latch;
__u8 rw_mode;
__u8 mode;
__u8 bcd;
- __u8 gate;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 gate;
__s64 count_load_time;
};
struct kvm_debug_exit_arch {
- __u32 exception;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 exception;
__u32 pad;
__u64 pc;
__u64 dr6;
- __u64 dr7;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 dr7;
};
#define KVM_GUESTDBG_USE_SW_BP 0x00010000
#define KVM_GUESTDBG_USE_HW_BP 0x00020000
-#define KVM_GUESTDBG_INJECT_DB 0x00040000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_GUESTDBG_INJECT_DB 0x00040000
#define KVM_GUESTDBG_INJECT_BP 0x00080000
struct kvm_guest_debug_arch {
__u64 debugreg[8];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_pit_state {
struct kvm_pit_channel_state channels[3];
};
-#define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_PIT_FLAGS_HPET_LEGACY 0x00000001
struct kvm_pit_state2 {
struct kvm_pit_channel_state channels[3];
__u32 flags;
- __u32 reserved[9];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved[9];
};
struct kvm_reinject_control {
__u8 pit_reinject;
- __u8 reserved[31];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 reserved[31];
};
#define KVM_VCPUEVENT_VALID_NMI_PENDING 0x00000001
#define KVM_VCPUEVENT_VALID_SIPI_VECTOR 0x00000002
-#define KVM_VCPUEVENT_VALID_SHADOW 0x00000004
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_VCPUEVENT_VALID_SHADOW 0x00000004
+#define KVM_VCPUEVENT_VALID_SMM 0x00000008
#define KVM_X86_SHADOW_INT_MOV_SS 0x01
#define KVM_X86_SHADOW_INT_STI 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_vcpu_events {
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 injected;
__u8 nr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 has_error_code;
__u8 pad;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 error_code;
} exception;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u8 injected;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 nr;
__u8 soft;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 shadow;
} interrupt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u8 injected;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 pending;
__u8 masked;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 pad;
} nmi;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 sipi_vector;
__u32 flags;
+ struct {
+ __u8 smm;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 pending;
+ __u8 smm_inside_nmi;
+ __u8 latched_init;
+ } smi;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 reserved[10];
+ __u32 reserved[9];
};
struct kvm_debugregs {
__u64 db[4];
@@ -363,4 +373,7 @@ struct kvm_xcrs {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_sync_regs {
};
+#define KVM_X86_QUIRK_LINT0_REENABLED (1 << 0)
+#define KVM_X86_QUIRK_CD_NW_CLEARED (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/mce.h b/libc/kernel/uapi/asm-x86/asm/mce.h
index dce419440..ca24c4480 100644
--- a/libc/kernel/uapi/asm-x86/asm/mce.h
+++ b/libc/kernel/uapi/asm-x86/asm/mce.h
@@ -19,7 +19,7 @@
#ifndef _UAPI_ASM_X86_MCE_H
#define _UAPI_ASM_X86_MCE_H
#include <linux/types.h>
-#include <asm/ioctls.h>
+#include <linux/ioctl.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct mce {
__u64 status;
@@ -33,22 +33,23 @@ struct mce {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 cpuvendor;
__u8 inject_flags;
- __u16 pad;
- __u32 cpuid;
+ __u8 severity;
+ __u8 usable_addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cpuid;
__u8 cs;
__u8 bank;
__u8 cpu;
- __u8 finished;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 finished;
__u32 extcpu;
__u32 socketid;
__u32 apicid;
- __u64 mcgcap;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 mcgcap;
};
#define MCE_GET_RECORD_LEN _IOR('M', 1, int)
#define MCE_GET_LOG_LEN _IOR('M', 2, int)
-#define MCE_GETCLEAR_FLAGS _IOR('M', 3, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MCE_GETCLEAR_FLAGS _IOR('M', 3, int)
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/msr.h b/libc/kernel/uapi/asm-x86/asm/msr.h
index c64841016..020bf3acf 100644
--- a/libc/kernel/uapi/asm-x86/asm/msr.h
+++ b/libc/kernel/uapi/asm-x86/asm/msr.h
@@ -18,13 +18,12 @@
****************************************************************************/
#ifndef _UAPI_ASM_X86_MSR_H
#define _UAPI_ASM_X86_MSR_H
-#include <asm/msr-index.h>
#ifndef __ASSEMBLY__
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/types.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/ioctl.h>
#define X86_IOC_RDMSR_REGS _IOWR('c', 0xA0, __u32[8])
#define X86_IOC_WRMSR_REGS _IOWR('c', 0xA1, __u32[8])
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/mtrr.h b/libc/kernel/uapi/asm-x86/asm/mtrr.h
index 135fa33bb..b697b7f73 100644
--- a/libc/kernel/uapi/asm-x86/asm/mtrr.h
+++ b/libc/kernel/uapi/asm-x86/asm/mtrr.h
@@ -98,4 +98,6 @@ struct mtrr_state_type {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MTRR_TYPE_WRBACK 6
#define MTRR_NUM_TYPES 7
+#define MTRR_TYPE_INVALID 0xff
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-x86/asm/processor-flags.h b/libc/kernel/uapi/asm-x86/asm/processor-flags.h
index 3c36ddc42..74fbff2df 100644
--- a/libc/kernel/uapi/asm-x86/asm/processor-flags.h
+++ b/libc/kernel/uapi/asm-x86/asm/processor-flags.h
@@ -57,113 +57,110 @@
#define X86_EFLAGS_AC_BIT 18
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_EFLAGS_AC _BITUL(X86_EFLAGS_AC_BIT)
-#define X86_EFLAGS_AC_BIT 18
-#define X86_EFLAGS_AC _BITUL(X86_EFLAGS_AC_BIT)
#define X86_EFLAGS_VIF_BIT 19
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_EFLAGS_VIF _BITUL(X86_EFLAGS_VIF_BIT)
#define X86_EFLAGS_VIP_BIT 20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_EFLAGS_VIP _BITUL(X86_EFLAGS_VIP_BIT)
#define X86_EFLAGS_ID_BIT 21
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_EFLAGS_ID _BITUL(X86_EFLAGS_ID_BIT)
#define X86_CR0_PE_BIT 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_PE _BITUL(X86_CR0_PE_BIT)
#define X86_CR0_MP_BIT 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_MP _BITUL(X86_CR0_MP_BIT)
#define X86_CR0_EM_BIT 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_EM _BITUL(X86_CR0_EM_BIT)
#define X86_CR0_TS_BIT 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_TS _BITUL(X86_CR0_TS_BIT)
#define X86_CR0_ET_BIT 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_ET _BITUL(X86_CR0_ET_BIT)
#define X86_CR0_NE_BIT 5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_NE _BITUL(X86_CR0_NE_BIT)
#define X86_CR0_WP_BIT 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_WP _BITUL(X86_CR0_WP_BIT)
#define X86_CR0_AM_BIT 18
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_AM _BITUL(X86_CR0_AM_BIT)
#define X86_CR0_NW_BIT 29
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_NW _BITUL(X86_CR0_NW_BIT)
#define X86_CR0_CD_BIT 30
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_CD _BITUL(X86_CR0_CD_BIT)
#define X86_CR0_PG_BIT 31
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR0_PG _BITUL(X86_CR0_PG_BIT)
#define X86_CR3_PWT_BIT 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR3_PWT _BITUL(X86_CR3_PWT_BIT)
#define X86_CR3_PCD_BIT 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR3_PCD _BITUL(X86_CR3_PCD_BIT)
#define X86_CR3_PCID_MASK _AC(0x00000fff, UL)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_VME_BIT 0
#define X86_CR4_VME _BITUL(X86_CR4_VME_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_PVI_BIT 1
#define X86_CR4_PVI _BITUL(X86_CR4_PVI_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_TSD_BIT 2
#define X86_CR4_TSD _BITUL(X86_CR4_TSD_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_DE_BIT 3
#define X86_CR4_DE _BITUL(X86_CR4_DE_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_PSE_BIT 4
#define X86_CR4_PSE _BITUL(X86_CR4_PSE_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_PAE_BIT 5
#define X86_CR4_PAE _BITUL(X86_CR4_PAE_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_MCE_BIT 6
#define X86_CR4_MCE _BITUL(X86_CR4_MCE_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_PGE_BIT 7
#define X86_CR4_PGE _BITUL(X86_CR4_PGE_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_PCE_BIT 8
#define X86_CR4_PCE _BITUL(X86_CR4_PCE_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_OSFXSR_BIT 9
#define X86_CR4_OSFXSR _BITUL(X86_CR4_OSFXSR_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_OSXMMEXCPT_BIT 10
#define X86_CR4_OSXMMEXCPT _BITUL(X86_CR4_OSXMMEXCPT_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_VMXE_BIT 13
#define X86_CR4_VMXE _BITUL(X86_CR4_VMXE_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_SMXE_BIT 14
#define X86_CR4_SMXE _BITUL(X86_CR4_SMXE_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_FSGSBASE_BIT 16
#define X86_CR4_FSGSBASE _BITUL(X86_CR4_FSGSBASE_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_PCIDE_BIT 17
#define X86_CR4_PCIDE _BITUL(X86_CR4_PCIDE_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_OSXSAVE_BIT 18
#define X86_CR4_OSXSAVE _BITUL(X86_CR4_OSXSAVE_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_SMEP_BIT 20
#define X86_CR4_SMEP _BITUL(X86_CR4_SMEP_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR4_SMAP_BIT 21
#define X86_CR4_SMAP _BITUL(X86_CR4_SMAP_BIT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define X86_CR8_TPR _AC(0x0000000f, UL)
#define CX86_PCR0 0x20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CX86_GCR 0xb8
#define CX86_CCR0 0xc0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CX86_CCR1 0xc1
#define CX86_CCR2 0xc2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CX86_CCR3 0xc3
#define CX86_CCR4 0xe8
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CX86_CCR5 0xe9
#define CX86_CCR6 0xea
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CX86_CCR7 0xeb
#define CX86_PCR1 0xf0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CX86_DIR0 0xfe
#define CX86_DIR1 0xff
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CX86_ARR_BASE 0xc4
#define CX86_RCR_BASE 0xdc
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/ptrace-abi.h b/libc/kernel/uapi/asm-x86/asm/ptrace-abi.h
index f10a19508..b09aedb68 100644
--- a/libc/kernel/uapi/asm-x86/asm/ptrace-abi.h
+++ b/libc/kernel/uapi/asm-x86/asm/ptrace-abi.h
@@ -71,31 +71,30 @@
#define RSP 152
#define SS 160
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ARGOFFSET R11
#endif
#define FRAME_SIZE 168
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_GETREGS 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_SETREGS 13
#define PTRACE_GETFPREGS 14
#define PTRACE_SETFPREGS 15
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_GETFPXREGS 18
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_SETFPXREGS 19
#define PTRACE_OLDSETOPTIONS 21
#define PTRACE_GET_THREAD_AREA 25
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_SET_THREAD_AREA 26
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#ifdef __x86_64__
#define PTRACE_ARCH_PRCTL 30
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_SYSEMU 31
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_SYSEMU_SINGLESTEP 32
#define PTRACE_SINGLEBLOCK 33
#ifndef __ASSEMBLY__
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/types.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/sigcontext.h b/libc/kernel/uapi/asm-x86/asm/sigcontext.h
index b925d4440..c9dbc508d 100644
--- a/libc/kernel/uapi/asm-x86/asm/sigcontext.h
+++ b/libc/kernel/uapi/asm-x86/asm/sigcontext.h
@@ -28,166 +28,246 @@ struct _fpx_sw_bytes {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 magic1;
__u32 extended_size;
- __u64 xstate_bv;
+ __u64 xfeatures;
__u32 xstate_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 padding[7];
};
-#ifdef __i386__
struct _fpreg {
+ __u16 significand[4];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned short significand[4];
- unsigned short exponent;
+ __u16 exponent;
};
struct _fpxreg {
+ __u16 significand[4];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned short significand[4];
- unsigned short exponent;
- unsigned short padding[3];
+ __u16 exponent;
+ __u16 padding[3];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct _xmmreg {
- unsigned long element[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 element[4];
};
-struct _fpstate {
+#define X86_FXSR_MAGIC 0x0000
+struct _fpstate_32 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long cw;
- unsigned long sw;
- unsigned long tag;
- unsigned long ipoff;
+ __u32 cw;
+ __u32 sw;
+ __u32 tag;
+ __u32 ipoff;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long cssel;
- unsigned long dataoff;
- unsigned long datasel;
+ __u32 cssel;
+ __u32 dataoff;
+ __u32 datasel;
struct _fpreg _st[8];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned short status;
- unsigned short magic;
- unsigned long _fxsr_env[6];
- unsigned long mxcsr;
+ __u16 status;
+ __u16 magic;
+ __u32 _fxsr_env[6];
+ __u32 mxcsr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long reserved;
+ __u32 reserved;
struct _fpxreg _fxsr_st[8];
struct _xmmreg _xmm[8];
- unsigned long padding1[44];
+ union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 padding1[44];
+ __u32 padding[44];
+ };
union {
- unsigned long padding2[12];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 padding2[12];
struct _fpx_sw_bytes sw_reserved;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-};
-#define X86_FXSR_MAGIC 0x0000
-struct sigcontext {
- unsigned short gs, __gsh;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned short fs, __fsh;
- unsigned short es, __esh;
- unsigned short ds, __dsh;
- unsigned long edi;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long esi;
- unsigned long ebp;
- unsigned long esp;
- unsigned long ebx;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long edx;
- unsigned long ecx;
- unsigned long eax;
- unsigned long trapno;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long err;
- unsigned long eip;
- unsigned short cs, __csh;
- unsigned long eflags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long esp_at_signal;
- unsigned short ss, __ssh;
- struct _fpstate __user * fpstate;
- unsigned long oldmask;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned long cr2;
};
-#else
-struct _fpstate {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct _fpstate_64 {
__u16 cwd;
__u16 swd;
__u16 twd;
- __u16 fop;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 fop;
__u64 rip;
__u64 rdp;
__u32 mxcsr;
- __u32 mxcsr_mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 mxcsr_mask;
__u32 st_space[32];
__u32 xmm_space[64];
__u32 reserved2[12];
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
__u32 reserved3[12];
struct _fpx_sw_bytes sw_reserved;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+#ifdef __i386__
+#define _fpstate _fpstate_32
+#else
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _fpstate _fpstate_64
+#endif
+struct _header {
+ __u64 xfeatures;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 reserved1[2];
+ __u64 reserved2[5];
+};
+struct _ymmh_state {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ymmh_space[64];
+};
+struct _xstate {
+ struct _fpstate fpstate;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct _header xstate_hdr;
+ struct _ymmh_state ymmh;
+};
+struct sigcontext_32 {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 gs, __gsh;
+ __u16 fs, __fsh;
+ __u16 es, __esh;
+ __u16 ds, __dsh;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 di;
+ __u32 si;
+ __u32 bp;
+ __u32 sp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 bx;
+ __u32 dx;
+ __u32 cx;
+ __u32 ax;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 trapno;
+ __u32 err;
+ __u32 ip;
+ __u16 cs, __csh;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
+ __u32 sp_at_signal;
+ __u16 ss, __ssh;
+ __u32 fpstate;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 oldmask;
+ __u32 cr2;
+};
+struct sigcontext_64 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct sigcontext {
__u64 r8;
__u64 r9;
__u64 r10;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 r11;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 r12;
__u64 r13;
__u64 r14;
+ __u64 r15;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 di;
+ __u64 si;
+ __u64 bp;
+ __u64 bx;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 dx;
+ __u64 ax;
+ __u64 cx;
+ __u64 sp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 ip;
+ __u64 flags;
+ __u16 cs;
+ __u16 gs;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 fs;
+ __u16 __pad0;
+ __u64 err;
+ __u64 trapno;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 oldmask;
+ __u64 cr2;
+ __u64 fpstate;
+ __u64 reserved1[8];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define _fpstate_ia32 _fpstate_32
+#define sigcontext_ia32 sigcontext_32
+#ifdef __i386__
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct sigcontext {
+ __u16 gs, __gsh;
+ __u16 fs, __fsh;
+ __u16 es, __esh;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 ds, __dsh;
+ __u32 edi;
+ __u32 esi;
+ __u32 ebp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 esp;
+ __u32 ebx;
+ __u32 edx;
+ __u32 ecx;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 eax;
+ __u32 trapno;
+ __u32 err;
+ __u32 eip;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 cs, __csh;
+ __u32 eflags;
+ __u32 esp_at_signal;
+ __u16 ss, __ssh;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct _fpstate __user * fpstate;
+ __u32 oldmask;
+ __u32 cr2;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#else
+struct sigcontext {
+ __u64 r8;
+ __u64 r9;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 r10;
+ __u64 r11;
+ __u64 r12;
+ __u64 r13;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 r14;
__u64 r15;
__u64 rdi;
__u64 rsi;
- __u64 rbp;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 rbp;
__u64 rbx;
__u64 rdx;
__u64 rax;
- __u64 rcx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 rcx;
__u64 rsp;
__u64 rip;
__u64 eflags;
- __u16 cs;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 cs;
__u16 gs;
__u16 fs;
__u16 __pad0;
- __u64 err;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 err;
__u64 trapno;
__u64 oldmask;
__u64 cr2;
- struct _fpstate __user * fpstate;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct _fpstate __user * fpstate;
#ifdef __ILP32__
__u32 __fpstate_pad;
#endif
- __u64 reserved1[8];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 reserved1[8];
};
#endif
-struct _xsave_hdr {
- __u64 xstate_bv;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u64 reserved1[2];
- __u64 reserved2[5];
-};
-struct _ymmh_state {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 ymmh_space[64];
-};
-struct _xstate {
- struct _fpstate fpstate;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- struct _xsave_hdr xstate_hdr;
- struct _ymmh_state ymmh;
-};
#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-x86/asm/sigcontext32.h b/libc/kernel/uapi/asm-x86/asm/sigcontext32.h
index 8f38dfd16..9e3b963f8 100644
--- a/libc/kernel/uapi/asm-x86/asm/sigcontext32.h
+++ b/libc/kernel/uapi/asm-x86/asm/sigcontext32.h
@@ -18,79 +18,6 @@
****************************************************************************/
#ifndef _ASM_X86_SIGCONTEXT32_H
#define _ASM_X86_SIGCONTEXT32_H
-#include <linux/types.h>
-#define X86_FXSR_MAGIC 0x0000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct _fpreg {
- unsigned short significand[4];
- unsigned short exponent;
-};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct _fpxreg {
- unsigned short significand[4];
- unsigned short exponent;
- unsigned short padding[3];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-};
-struct _xmmreg {
- __u32 element[4];
-};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct _fpstate_ia32 {
- __u32 cw;
- __u32 sw;
- __u32 tag;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 ipoff;
- __u32 cssel;
- __u32 dataoff;
- __u32 datasel;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- struct _fpreg _st[8];
- unsigned short status;
- unsigned short magic;
- __u32 _fxsr_env[6];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 mxcsr;
- __u32 reserved;
- struct _fpxreg _fxsr_st[8];
- struct _xmmreg _xmm[8];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 padding[44];
- union {
- __u32 padding2[12];
- struct _fpx_sw_bytes sw_reserved;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- };
-};
-struct sigcontext_ia32 {
- unsigned short gs, __gsh;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned short fs, __fsh;
- unsigned short es, __esh;
- unsigned short ds, __dsh;
- unsigned int di;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned int si;
- unsigned int bp;
- unsigned int sp;
- unsigned int bx;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned int dx;
- unsigned int cx;
- unsigned int ax;
- unsigned int trapno;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned int err;
- unsigned int ip;
- unsigned short cs, __csh;
- unsigned int flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned int sp_at_signal;
- unsigned short ss, __ssh;
- unsigned int fpstate;
- unsigned int oldmask;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned int cr2;
-};
+#include <asm/sigcontext.h>
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-x86/asm/svm.h b/libc/kernel/uapi/asm-x86/asm/svm.h
index 1ee4fd817..29ead9b75 100644
--- a/libc/kernel/uapi/asm-x86/asm/svm.h
+++ b/libc/kernel/uapi/asm-x86/asm/svm.h
@@ -109,6 +109,6 @@
#define SVM_EXIT_XSETBV 0x08d
#define SVM_EXIT_NPF 0x400
#define SVM_EXIT_ERR - 1
-#define SVM_EXIT_REASONS { SVM_EXIT_READ_CR0, "read_cr0" }, { SVM_EXIT_READ_CR3, "read_cr3" }, { SVM_EXIT_READ_CR4, "read_cr4" }, { SVM_EXIT_READ_CR8, "read_cr8" }, { SVM_EXIT_WRITE_CR0, "write_cr0" }, { SVM_EXIT_WRITE_CR3, "write_cr3" }, { SVM_EXIT_WRITE_CR4, "write_cr4" }, { SVM_EXIT_WRITE_CR8, "write_cr8" }, { SVM_EXIT_READ_DR0, "read_dr0" }, { SVM_EXIT_READ_DR1, "read_dr1" }, { SVM_EXIT_READ_DR2, "read_dr2" }, { SVM_EXIT_READ_DR3, "read_dr3" }, { SVM_EXIT_WRITE_DR0, "write_dr0" }, { SVM_EXIT_WRITE_DR1, "write_dr1" }, { SVM_EXIT_WRITE_DR2, "write_dr2" }, { SVM_EXIT_WRITE_DR3, "write_dr3" }, { SVM_EXIT_WRITE_DR5, "write_dr5" }, { SVM_EXIT_WRITE_DR7, "write_dr7" }, { SVM_EXIT_EXCP_BASE + DB_VECTOR, "DB excp" }, { SVM_EXIT_EXCP_BASE + BP_VECTOR, "BP excp" }, { SVM_EXIT_EXCP_BASE + UD_VECTOR, "UD excp" }, { SVM_EXIT_EXCP_BASE + PF_VECTOR, "PF excp" }, { SVM_EXIT_EXCP_BASE + NM_VECTOR, "NM excp" }, { SVM_EXIT_EXCP_BASE + MC_VECTOR, "MC excp" }, { SVM_EXIT_INTR, "interrupt" }, { SVM_EXIT_NMI, "nmi" }, { SVM_EXIT_SMI, "smi" }, { SVM_EXIT_INIT, "init" }, { SVM_EXIT_VINTR, "vintr" }, { SVM_EXIT_CPUID, "cpuid" }, { SVM_EXIT_INVD, "invd" }, { SVM_EXIT_HLT, "hlt" }, { SVM_EXIT_INVLPG, "invlpg" }, { SVM_EXIT_INVLPGA, "invlpga" }, { SVM_EXIT_IOIO, "io" }, { SVM_EXIT_MSR, "msr" }, { SVM_EXIT_TASK_SWITCH, "task_switch" }, { SVM_EXIT_SHUTDOWN, "shutdown" }, { SVM_EXIT_VMRUN, "vmrun" }, { SVM_EXIT_VMMCALL, "hypercall" }, { SVM_EXIT_VMLOAD, "vmload" }, { SVM_EXIT_VMSAVE, "vmsave" }, { SVM_EXIT_STGI, "stgi" }, { SVM_EXIT_CLGI, "clgi" }, { SVM_EXIT_SKINIT, "skinit" }, { SVM_EXIT_WBINVD, "wbinvd" }, { SVM_EXIT_MONITOR, "monitor" }, { SVM_EXIT_MWAIT, "mwait" }, { SVM_EXIT_XSETBV, "xsetbv" }, { SVM_EXIT_NPF, "npf" }
+#define SVM_EXIT_REASONS { SVM_EXIT_READ_CR0, "read_cr0" }, { SVM_EXIT_READ_CR3, "read_cr3" }, { SVM_EXIT_READ_CR4, "read_cr4" }, { SVM_EXIT_READ_CR8, "read_cr8" }, { SVM_EXIT_WRITE_CR0, "write_cr0" }, { SVM_EXIT_WRITE_CR3, "write_cr3" }, { SVM_EXIT_WRITE_CR4, "write_cr4" }, { SVM_EXIT_WRITE_CR8, "write_cr8" }, { SVM_EXIT_READ_DR0, "read_dr0" }, { SVM_EXIT_READ_DR1, "read_dr1" }, { SVM_EXIT_READ_DR2, "read_dr2" }, { SVM_EXIT_READ_DR3, "read_dr3" }, { SVM_EXIT_WRITE_DR0, "write_dr0" }, { SVM_EXIT_WRITE_DR1, "write_dr1" }, { SVM_EXIT_WRITE_DR2, "write_dr2" }, { SVM_EXIT_WRITE_DR3, "write_dr3" }, { SVM_EXIT_WRITE_DR5, "write_dr5" }, { SVM_EXIT_WRITE_DR7, "write_dr7" }, { SVM_EXIT_EXCP_BASE + DB_VECTOR, "DB excp" }, { SVM_EXIT_EXCP_BASE + BP_VECTOR, "BP excp" }, { SVM_EXIT_EXCP_BASE + UD_VECTOR, "UD excp" }, { SVM_EXIT_EXCP_BASE + PF_VECTOR, "PF excp" }, { SVM_EXIT_EXCP_BASE + NM_VECTOR, "NM excp" }, { SVM_EXIT_EXCP_BASE + AC_VECTOR, "AC excp" }, { SVM_EXIT_EXCP_BASE + MC_VECTOR, "MC excp" }, { SVM_EXIT_INTR, "interrupt" }, { SVM_EXIT_NMI, "nmi" }, { SVM_EXIT_SMI, "smi" }, { SVM_EXIT_INIT, "init" }, { SVM_EXIT_VINTR, "vintr" }, { SVM_EXIT_CPUID, "cpuid" }, { SVM_EXIT_INVD, "invd" }, { SVM_EXIT_HLT, "hlt" }, { SVM_EXIT_INVLPG, "invlpg" }, { SVM_EXIT_INVLPGA, "invlpga" }, { SVM_EXIT_IOIO, "io" }, { SVM_EXIT_MSR, "msr" }, { SVM_EXIT_TASK_SWITCH, "task_switch" }, { SVM_EXIT_SHUTDOWN, "shutdown" }, { SVM_EXIT_VMRUN, "vmrun" }, { SVM_EXIT_VMMCALL, "hypercall" }, { SVM_EXIT_VMLOAD, "vmload" }, { SVM_EXIT_VMSAVE, "vmsave" }, { SVM_EXIT_STGI, "stgi" }, { SVM_EXIT_CLGI, "clgi" }, { SVM_EXIT_SKINIT, "skinit" }, { SVM_EXIT_WBINVD, "wbinvd" }, { SVM_EXIT_MONITOR, "monitor" }, { SVM_EXIT_MWAIT, "mwait" }, { SVM_EXIT_XSETBV, "xsetbv" }, { SVM_EXIT_NPF, "npf" }
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/unistd_32.h b/libc/kernel/uapi/asm-x86/asm/unistd_32.h
index c1a7ef413..6a5a8d401 100644
--- a/libc/kernel/uapi/asm-x86/asm/unistd_32.h
+++ b/libc/kernel/uapi/asm-x86/asm/unistd_32.h
@@ -461,4 +461,28 @@
#define __NR_memfd_create 356
#define __NR_bpf 357
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_execveat 358
+#define __NR_socket 359
+#define __NR_socketpair 360
+#define __NR_bind 361
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_connect 362
+#define __NR_listen 363
+#define __NR_accept4 364
+#define __NR_getsockopt 365
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_setsockopt 366
+#define __NR_getsockname 367
+#define __NR_getpeername 368
+#define __NR_sendto 369
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_sendmsg 370
+#define __NR_recvfrom 371
+#define __NR_recvmsg 372
+#define __NR_shutdown 373
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_userfaultfd 374
+#define __NR_membarrier 375
+#define __NR_mlock2 376
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/asm-x86/asm/unistd_64.h b/libc/kernel/uapi/asm-x86/asm/unistd_64.h
index c538b2115..2d02d21a3 100644
--- a/libc/kernel/uapi/asm-x86/asm/unistd_64.h
+++ b/libc/kernel/uapi/asm-x86/asm/unistd_64.h
@@ -421,4 +421,9 @@
#define __NR_kexec_file_load 320
#define __NR_bpf 321
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_execveat 322
+#define __NR_userfaultfd 323
+#define __NR_membarrier 324
+#define __NR_mlock2 325
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/unistd_x32.h b/libc/kernel/uapi/asm-x86/asm/unistd_x32.h
index d87d07494..894615c50 100644
--- a/libc/kernel/uapi/asm-x86/asm/unistd_x32.h
+++ b/libc/kernel/uapi/asm-x86/asm/unistd_x32.h
@@ -366,45 +366,50 @@
#define __NR_kexec_file_load (__X32_SYSCALL_BIT + 320)
#define __NR_bpf (__X32_SYSCALL_BIT + 321)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_userfaultfd (__X32_SYSCALL_BIT + 323)
+#define __NR_membarrier (__X32_SYSCALL_BIT + 324)
+#define __NR_mlock2 (__X32_SYSCALL_BIT + 325)
#define __NR_rt_sigaction (__X32_SYSCALL_BIT + 512)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_rt_sigreturn (__X32_SYSCALL_BIT + 513)
#define __NR_ioctl (__X32_SYSCALL_BIT + 514)
#define __NR_readv (__X32_SYSCALL_BIT + 515)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_writev (__X32_SYSCALL_BIT + 516)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_recvfrom (__X32_SYSCALL_BIT + 517)
#define __NR_sendmsg (__X32_SYSCALL_BIT + 518)
#define __NR_recvmsg (__X32_SYSCALL_BIT + 519)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_execve (__X32_SYSCALL_BIT + 520)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_ptrace (__X32_SYSCALL_BIT + 521)
#define __NR_rt_sigpending (__X32_SYSCALL_BIT + 522)
#define __NR_rt_sigtimedwait (__X32_SYSCALL_BIT + 523)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_rt_sigqueueinfo (__X32_SYSCALL_BIT + 524)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_sigaltstack (__X32_SYSCALL_BIT + 525)
#define __NR_timer_create (__X32_SYSCALL_BIT + 526)
#define __NR_mq_notify (__X32_SYSCALL_BIT + 527)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_kexec_load (__X32_SYSCALL_BIT + 528)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_waitid (__X32_SYSCALL_BIT + 529)
#define __NR_set_robust_list (__X32_SYSCALL_BIT + 530)
#define __NR_get_robust_list (__X32_SYSCALL_BIT + 531)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_vmsplice (__X32_SYSCALL_BIT + 532)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_move_pages (__X32_SYSCALL_BIT + 533)
#define __NR_preadv (__X32_SYSCALL_BIT + 534)
#define __NR_pwritev (__X32_SYSCALL_BIT + 535)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_rt_tgsigqueueinfo (__X32_SYSCALL_BIT + 536)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_recvmmsg (__X32_SYSCALL_BIT + 537)
#define __NR_sendmmsg (__X32_SYSCALL_BIT + 538)
#define __NR_process_vm_readv (__X32_SYSCALL_BIT + 539)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_process_vm_writev (__X32_SYSCALL_BIT + 540)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_setsockopt (__X32_SYSCALL_BIT + 541)
#define __NR_getsockopt (__X32_SYSCALL_BIT + 542)
#define __NR_io_setup (__X32_SYSCALL_BIT + 543)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NR_io_submit (__X32_SYSCALL_BIT + 544)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __NR_execveat (__X32_SYSCALL_BIT + 545)
#endif
diff --git a/libc/kernel/uapi/asm-x86/asm/vmx.h b/libc/kernel/uapi/asm-x86/asm/vmx.h
index 6731d3c31..d72833d6f 100644
--- a/libc/kernel/uapi/asm-x86/asm/vmx.h
+++ b/libc/kernel/uapi/asm-x86/asm/vmx.h
@@ -54,26 +54,37 @@
#define EXIT_REASON_MSR_READ 31
#define EXIT_REASON_MSR_WRITE 32
#define EXIT_REASON_INVALID_STATE 33
-#define EXIT_REASON_MWAIT_INSTRUCTION 36
+#define EXIT_REASON_MSR_LOAD_FAIL 34
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EXIT_REASON_MWAIT_INSTRUCTION 36
+#define EXIT_REASON_MONITOR_TRAP_FLAG 37
#define EXIT_REASON_MONITOR_INSTRUCTION 39
#define EXIT_REASON_PAUSE_INSTRUCTION 40
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXIT_REASON_MCE_DURING_VMENTRY 41
#define EXIT_REASON_TPR_BELOW_THRESHOLD 43
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXIT_REASON_APIC_ACCESS 44
#define EXIT_REASON_EOI_INDUCED 45
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXIT_REASON_EPT_VIOLATION 48
#define EXIT_REASON_EPT_MISCONFIG 49
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXIT_REASON_INVEPT 50
+#define EXIT_REASON_RDTSCP 51
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXIT_REASON_PREEMPTION_TIMER 52
#define EXIT_REASON_INVVPID 53
#define EXIT_REASON_WBINVD 54
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXIT_REASON_XSETBV 55
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXIT_REASON_APIC_WRITE 56
#define EXIT_REASON_INVPCID 58
-#define VMX_EXIT_REASONS { EXIT_REASON_EXCEPTION_NMI, "EXCEPTION_NMI" }, { EXIT_REASON_EXTERNAL_INTERRUPT, "EXTERNAL_INTERRUPT" }, { EXIT_REASON_TRIPLE_FAULT, "TRIPLE_FAULT" }, { EXIT_REASON_PENDING_INTERRUPT, "PENDING_INTERRUPT" }, { EXIT_REASON_NMI_WINDOW, "NMI_WINDOW" }, { EXIT_REASON_TASK_SWITCH, "TASK_SWITCH" }, { EXIT_REASON_CPUID, "CPUID" }, { EXIT_REASON_HLT, "HLT" }, { EXIT_REASON_INVLPG, "INVLPG" }, { EXIT_REASON_RDPMC, "RDPMC" }, { EXIT_REASON_RDTSC, "RDTSC" }, { EXIT_REASON_VMCALL, "VMCALL" }, { EXIT_REASON_VMCLEAR, "VMCLEAR" }, { EXIT_REASON_VMLAUNCH, "VMLAUNCH" }, { EXIT_REASON_VMPTRLD, "VMPTRLD" }, { EXIT_REASON_VMPTRST, "VMPTRST" }, { EXIT_REASON_VMREAD, "VMREAD" }, { EXIT_REASON_VMRESUME, "VMRESUME" }, { EXIT_REASON_VMWRITE, "VMWRITE" }, { EXIT_REASON_VMOFF, "VMOFF" }, { EXIT_REASON_VMON, "VMON" }, { EXIT_REASON_CR_ACCESS, "CR_ACCESS" }, { EXIT_REASON_DR_ACCESS, "DR_ACCESS" }, { EXIT_REASON_IO_INSTRUCTION, "IO_INSTRUCTION" }, { EXIT_REASON_MSR_READ, "MSR_READ" }, { EXIT_REASON_MSR_WRITE, "MSR_WRITE" }, { EXIT_REASON_MWAIT_INSTRUCTION, "MWAIT_INSTRUCTION" }, { EXIT_REASON_MONITOR_INSTRUCTION, "MONITOR_INSTRUCTION" }, { EXIT_REASON_PAUSE_INSTRUCTION, "PAUSE_INSTRUCTION" }, { EXIT_REASON_MCE_DURING_VMENTRY, "MCE_DURING_VMENTRY" }, { EXIT_REASON_TPR_BELOW_THRESHOLD, "TPR_BELOW_THRESHOLD" }, { EXIT_REASON_APIC_ACCESS, "APIC_ACCESS" }, { EXIT_REASON_EPT_VIOLATION, "EPT_VIOLATION" }, { EXIT_REASON_EPT_MISCONFIG, "EPT_MISCONFIG" }, { EXIT_REASON_INVEPT, "INVEPT" }, { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }, { EXIT_REASON_WBINVD, "WBINVD" }, { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, { EXIT_REASON_INVD, "INVD" }, { EXIT_REASON_INVVPID, "INVVPID" }, { EXIT_REASON_INVPCID, "INVPCID" }
+#define EXIT_REASON_PML_FULL 62
+#define EXIT_REASON_XSAVES 63
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EXIT_REASON_XRSTORS 64
+#define EXIT_REASON_PCOMMIT 65
+#define VMX_EXIT_REASONS { EXIT_REASON_EXCEPTION_NMI, "EXCEPTION_NMI" }, { EXIT_REASON_EXTERNAL_INTERRUPT, "EXTERNAL_INTERRUPT" }, { EXIT_REASON_TRIPLE_FAULT, "TRIPLE_FAULT" }, { EXIT_REASON_PENDING_INTERRUPT, "PENDING_INTERRUPT" }, { EXIT_REASON_NMI_WINDOW, "NMI_WINDOW" }, { EXIT_REASON_TASK_SWITCH, "TASK_SWITCH" }, { EXIT_REASON_CPUID, "CPUID" }, { EXIT_REASON_HLT, "HLT" }, { EXIT_REASON_INVLPG, "INVLPG" }, { EXIT_REASON_RDPMC, "RDPMC" }, { EXIT_REASON_RDTSC, "RDTSC" }, { EXIT_REASON_VMCALL, "VMCALL" }, { EXIT_REASON_VMCLEAR, "VMCLEAR" }, { EXIT_REASON_VMLAUNCH, "VMLAUNCH" }, { EXIT_REASON_VMPTRLD, "VMPTRLD" }, { EXIT_REASON_VMPTRST, "VMPTRST" }, { EXIT_REASON_VMREAD, "VMREAD" }, { EXIT_REASON_VMRESUME, "VMRESUME" }, { EXIT_REASON_VMWRITE, "VMWRITE" }, { EXIT_REASON_VMOFF, "VMOFF" }, { EXIT_REASON_VMON, "VMON" }, { EXIT_REASON_CR_ACCESS, "CR_ACCESS" }, { EXIT_REASON_DR_ACCESS, "DR_ACCESS" }, { EXIT_REASON_IO_INSTRUCTION, "IO_INSTRUCTION" }, { EXIT_REASON_MSR_READ, "MSR_READ" }, { EXIT_REASON_MSR_WRITE, "MSR_WRITE" }, { EXIT_REASON_MWAIT_INSTRUCTION, "MWAIT_INSTRUCTION" }, { EXIT_REASON_MONITOR_TRAP_FLAG, "MONITOR_TRAP_FLAG" }, { EXIT_REASON_MONITOR_INSTRUCTION, "MONITOR_INSTRUCTION" }, { EXIT_REASON_PAUSE_INSTRUCTION, "PAUSE_INSTRUCTION" }, { EXIT_REASON_MCE_DURING_VMENTRY, "MCE_DURING_VMENTRY" }, { EXIT_REASON_TPR_BELOW_THRESHOLD, "TPR_BELOW_THRESHOLD" }, { EXIT_REASON_APIC_ACCESS, "APIC_ACCESS" }, { EXIT_REASON_EPT_VIOLATION, "EPT_VIOLATION" }, { EXIT_REASON_EPT_MISCONFIG, "EPT_MISCONFIG" }, { EXIT_REASON_INVEPT, "INVEPT" }, { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }, { EXIT_REASON_WBINVD, "WBINVD" }, { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, { EXIT_REASON_MSR_LOAD_FAIL, "MSR_LOAD_FAIL" }, { EXIT_REASON_INVD, "INVD" }, { EXIT_REASON_INVVPID, "INVVPID" }, { EXIT_REASON_INVPCID, "INVPCID" }, { EXIT_REASON_XSAVES, "XSAVES" }, { EXIT_REASON_XRSTORS, "XRSTORS" }, { EXIT_REASON_PCOMMIT, "PCOMMIT" }
+#define VMX_ABORT_SAVE_GUEST_MSR_FAIL 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VMX_ABORT_LOAD_HOST_MSR_FAIL 4
#endif
diff --git a/libc/kernel/uapi/drm/amdgpu_drm.h b/libc/kernel/uapi/drm/amdgpu_drm.h
new file mode 100644
index 000000000..16c127c95
--- /dev/null
+++ b/libc/kernel/uapi/drm/amdgpu_drm.h
@@ -0,0 +1,499 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __AMDGPU_DRM_H__
+#define __AMDGPU_DRM_H__
+#include "drm.h"
+#define DRM_AMDGPU_GEM_CREATE 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_AMDGPU_GEM_MMAP 0x01
+#define DRM_AMDGPU_CTX 0x02
+#define DRM_AMDGPU_BO_LIST 0x03
+#define DRM_AMDGPU_CS 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_AMDGPU_INFO 0x05
+#define DRM_AMDGPU_GEM_METADATA 0x06
+#define DRM_AMDGPU_GEM_WAIT_IDLE 0x07
+#define DRM_AMDGPU_GEM_VA 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_AMDGPU_WAIT_CS 0x09
+#define DRM_AMDGPU_GEM_OP 0x10
+#define DRM_AMDGPU_GEM_USERPTR 0x11
+#define DRM_IOCTL_AMDGPU_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_CREATE, union drm_amdgpu_gem_create)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_AMDGPU_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_MMAP, union drm_amdgpu_gem_mmap)
+#define DRM_IOCTL_AMDGPU_CTX DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_CTX, union drm_amdgpu_ctx)
+#define DRM_IOCTL_AMDGPU_BO_LIST DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_BO_LIST, union drm_amdgpu_bo_list)
+#define DRM_IOCTL_AMDGPU_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_CS, union drm_amdgpu_cs)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_AMDGPU_INFO DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_INFO, struct drm_amdgpu_info)
+#define DRM_IOCTL_AMDGPU_GEM_METADATA DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_METADATA, struct drm_amdgpu_gem_metadata)
+#define DRM_IOCTL_AMDGPU_GEM_WAIT_IDLE DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_WAIT_IDLE, union drm_amdgpu_gem_wait_idle)
+#define DRM_IOCTL_AMDGPU_GEM_VA DRM_IOW(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_VA, struct drm_amdgpu_gem_va)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_AMDGPU_WAIT_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_WAIT_CS, union drm_amdgpu_wait_cs)
+#define DRM_IOCTL_AMDGPU_GEM_OP DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_OP, struct drm_amdgpu_gem_op)
+#define DRM_IOCTL_AMDGPU_GEM_USERPTR DRM_IOWR(DRM_COMMAND_BASE + DRM_AMDGPU_GEM_USERPTR, struct drm_amdgpu_gem_userptr)
+#define AMDGPU_GEM_DOMAIN_CPU 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_GEM_DOMAIN_GTT 0x2
+#define AMDGPU_GEM_DOMAIN_VRAM 0x4
+#define AMDGPU_GEM_DOMAIN_GDS 0x8
+#define AMDGPU_GEM_DOMAIN_GWS 0x10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_GEM_DOMAIN_OA 0x20
+#define AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED (1 << 0)
+#define AMDGPU_GEM_CREATE_NO_CPU_ACCESS (1 << 1)
+#define AMDGPU_GEM_CREATE_CPU_GTT_USWC (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_gem_create_in {
+ uint64_t bo_size;
+ uint64_t alignment;
+ uint64_t domains;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t domain_flags;
+};
+struct drm_amdgpu_gem_create_out {
+ uint32_t handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t _pad;
+};
+union drm_amdgpu_gem_create {
+ struct drm_amdgpu_gem_create_in in;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_amdgpu_gem_create_out out;
+};
+#define AMDGPU_BO_LIST_OP_CREATE 0
+#define AMDGPU_BO_LIST_OP_DESTROY 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_BO_LIST_OP_UPDATE 2
+struct drm_amdgpu_bo_list_in {
+ uint32_t operation;
+ uint32_t list_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t bo_number;
+ uint32_t bo_info_size;
+ uint64_t bo_info_ptr;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_bo_list_entry {
+ uint32_t bo_handle;
+ uint32_t bo_priority;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_bo_list_out {
+ uint32_t list_handle;
+ uint32_t _pad;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+union drm_amdgpu_bo_list {
+ struct drm_amdgpu_bo_list_in in;
+ struct drm_amdgpu_bo_list_out out;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_CTX_OP_ALLOC_CTX 1
+#define AMDGPU_CTX_OP_FREE_CTX 2
+#define AMDGPU_CTX_OP_QUERY_STATE 3
+#define AMDGPU_CTX_NO_RESET 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_CTX_GUILTY_RESET 1
+#define AMDGPU_CTX_INNOCENT_RESET 2
+#define AMDGPU_CTX_UNKNOWN_RESET 3
+struct drm_amdgpu_ctx_in {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t op;
+ uint32_t flags;
+ uint32_t ctx_id;
+ uint32_t _pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+union drm_amdgpu_ctx_out {
+ struct {
+ uint32_t ctx_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t _pad;
+ } alloc;
+ struct {
+ uint64_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t hangs;
+ uint32_t reset_status;
+ } state;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+union drm_amdgpu_ctx {
+ struct drm_amdgpu_ctx_in in;
+ union drm_amdgpu_ctx_out out;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_GEM_USERPTR_READONLY (1 << 0)
+#define AMDGPU_GEM_USERPTR_ANONONLY (1 << 1)
+#define AMDGPU_GEM_USERPTR_VALIDATE (1 << 2)
+#define AMDGPU_GEM_USERPTR_REGISTER (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_gem_userptr {
+ uint64_t addr;
+ uint64_t size;
+ uint32_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t handle;
+};
+#define AMDGPU_TILING_ARRAY_MODE_SHIFT 0
+#define AMDGPU_TILING_ARRAY_MODE_MASK 0xf
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_TILING_PIPE_CONFIG_SHIFT 4
+#define AMDGPU_TILING_PIPE_CONFIG_MASK 0x1f
+#define AMDGPU_TILING_TILE_SPLIT_SHIFT 9
+#define AMDGPU_TILING_TILE_SPLIT_MASK 0x7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_TILING_MICRO_TILE_MODE_SHIFT 12
+#define AMDGPU_TILING_MICRO_TILE_MODE_MASK 0x7
+#define AMDGPU_TILING_BANK_WIDTH_SHIFT 15
+#define AMDGPU_TILING_BANK_WIDTH_MASK 0x3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_TILING_BANK_HEIGHT_SHIFT 17
+#define AMDGPU_TILING_BANK_HEIGHT_MASK 0x3
+#define AMDGPU_TILING_MACRO_TILE_ASPECT_SHIFT 19
+#define AMDGPU_TILING_MACRO_TILE_ASPECT_MASK 0x3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_TILING_NUM_BANKS_SHIFT 21
+#define AMDGPU_TILING_NUM_BANKS_MASK 0x3
+#define AMDGPU_TILING_SET(field,value) (((value) & AMDGPU_TILING_ ##field ##_MASK) << AMDGPU_TILING_ ##field ##_SHIFT)
+#define AMDGPU_TILING_GET(value,field) (((value) >> AMDGPU_TILING_ ##field ##_SHIFT) & AMDGPU_TILING_ ##field ##_MASK)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_GEM_METADATA_OP_SET_METADATA 1
+#define AMDGPU_GEM_METADATA_OP_GET_METADATA 2
+struct drm_amdgpu_gem_metadata {
+ uint32_t handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t op;
+ struct {
+ uint64_t flags;
+ uint64_t tiling_info;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t data_size_bytes;
+ uint32_t data[64];
+ } data;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_gem_mmap_in {
+ uint32_t handle;
+ uint32_t _pad;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_gem_mmap_out {
+ uint64_t addr_ptr;
+};
+union drm_amdgpu_gem_mmap {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_amdgpu_gem_mmap_in in;
+ struct drm_amdgpu_gem_mmap_out out;
+};
+struct drm_amdgpu_gem_wait_idle_in {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t handle;
+ uint32_t flags;
+ uint64_t timeout;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_gem_wait_idle_out {
+ uint32_t status;
+ uint32_t domain;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+union drm_amdgpu_gem_wait_idle {
+ struct drm_amdgpu_gem_wait_idle_in in;
+ struct drm_amdgpu_gem_wait_idle_out out;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_wait_cs_in {
+ uint64_t handle;
+ uint64_t timeout;
+ uint32_t ip_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t ip_instance;
+ uint32_t ring;
+ uint32_t ctx_id;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_wait_cs_out {
+ uint64_t status;
+};
+union drm_amdgpu_wait_cs {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_amdgpu_wait_cs_in in;
+ struct drm_amdgpu_wait_cs_out out;
+};
+#define AMDGPU_GEM_OP_GET_GEM_CREATE_INFO 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_GEM_OP_SET_PLACEMENT 1
+struct drm_amdgpu_gem_op {
+ uint32_t handle;
+ uint32_t op;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t value;
+};
+#define AMDGPU_VA_OP_MAP 1
+#define AMDGPU_VA_OP_UNMAP 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_VM_DELAY_UPDATE (1 << 0)
+#define AMDGPU_VM_PAGE_READABLE (1 << 1)
+#define AMDGPU_VM_PAGE_WRITEABLE (1 << 2)
+#define AMDGPU_VM_PAGE_EXECUTABLE (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_gem_va {
+ uint32_t handle;
+ uint32_t _pad;
+ uint32_t operation;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t flags;
+ uint64_t va_address;
+ uint64_t offset_in_bo;
+ uint64_t map_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define AMDGPU_HW_IP_GFX 0
+#define AMDGPU_HW_IP_COMPUTE 1
+#define AMDGPU_HW_IP_DMA 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_HW_IP_UVD 3
+#define AMDGPU_HW_IP_VCE 4
+#define AMDGPU_HW_IP_NUM 5
+#define AMDGPU_HW_IP_INSTANCE_MAX_COUNT 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_CHUNK_ID_IB 0x01
+#define AMDGPU_CHUNK_ID_FENCE 0x02
+#define AMDGPU_CHUNK_ID_DEPENDENCIES 0x03
+struct drm_amdgpu_cs_chunk {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t chunk_id;
+ uint32_t length_dw;
+ uint64_t chunk_data;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_cs_in {
+ uint32_t ctx_id;
+ uint32_t bo_list_handle;
+ uint32_t num_chunks;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t _pad;
+ uint64_t chunks;
+};
+struct drm_amdgpu_cs_out {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t handle;
+};
+union drm_amdgpu_cs {
+ struct drm_amdgpu_cs_in in;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_amdgpu_cs_out out;
+};
+#define AMDGPU_IB_FLAG_CE (1 << 0)
+#define AMDGPU_IB_FLAG_PREAMBLE (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_cs_chunk_ib {
+ uint32_t _pad;
+ uint32_t flags;
+ uint64_t va_start;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t ib_bytes;
+ uint32_t ip_type;
+ uint32_t ip_instance;
+ uint32_t ring;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct drm_amdgpu_cs_chunk_dep {
+ uint32_t ip_type;
+ uint32_t ip_instance;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t ring;
+ uint32_t ctx_id;
+ uint64_t handle;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_cs_chunk_fence {
+ uint32_t handle;
+ uint32_t offset;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_cs_chunk_data {
+ union {
+ struct drm_amdgpu_cs_chunk_ib ib_data;
+ struct drm_amdgpu_cs_chunk_fence fence_data;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
+};
+#define AMDGPU_IDS_FLAGS_FUSION 0x1
+#define AMDGPU_INFO_ACCEL_WORKING 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_INFO_CRTC_FROM_ID 0x01
+#define AMDGPU_INFO_HW_IP_INFO 0x02
+#define AMDGPU_INFO_HW_IP_COUNT 0x03
+#define AMDGPU_INFO_TIMESTAMP 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_INFO_FW_VERSION 0x0e
+#define AMDGPU_INFO_FW_VCE 0x1
+#define AMDGPU_INFO_FW_UVD 0x2
+#define AMDGPU_INFO_FW_GMC 0x03
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_INFO_FW_GFX_ME 0x04
+#define AMDGPU_INFO_FW_GFX_PFP 0x05
+#define AMDGPU_INFO_FW_GFX_CE 0x06
+#define AMDGPU_INFO_FW_GFX_RLC 0x07
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_INFO_FW_GFX_MEC 0x08
+#define AMDGPU_INFO_FW_SMC 0x0a
+#define AMDGPU_INFO_FW_SDMA 0x0b
+#define AMDGPU_INFO_NUM_BYTES_MOVED 0x0f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_INFO_VRAM_USAGE 0x10
+#define AMDGPU_INFO_GTT_USAGE 0x11
+#define AMDGPU_INFO_GDS_CONFIG 0x13
+#define AMDGPU_INFO_VRAM_GTT 0x14
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_INFO_READ_MMR_REG 0x15
+#define AMDGPU_INFO_DEV_INFO 0x16
+#define AMDGPU_INFO_VIS_VRAM_USAGE 0x17
+#define AMDGPU_INFO_MMR_SE_INDEX_SHIFT 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_INFO_MMR_SE_INDEX_MASK 0xff
+#define AMDGPU_INFO_MMR_SH_INDEX_SHIFT 8
+#define AMDGPU_INFO_MMR_SH_INDEX_MASK 0xff
+struct drm_amdgpu_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t return_pointer;
+ uint32_t return_size;
+ uint32_t query;
+ union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
+ uint32_t id;
+ uint32_t _pad;
+ } mode_crtc;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
+ uint32_t type;
+ uint32_t ip_instance;
+ } query_hw_ip;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
+ uint32_t dword_offset;
+ uint32_t count;
+ uint32_t instance;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t flags;
+ } read_mmr_reg;
+ struct {
+ uint32_t fw_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t ip_instance;
+ uint32_t index;
+ uint32_t _pad;
+ } query_fw;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
+};
+struct drm_amdgpu_info_gds {
+ uint32_t gds_gfx_partition_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t compute_partition_size;
+ uint32_t gds_total_size;
+ uint32_t gws_per_gfx_partition;
+ uint32_t gws_per_compute_partition;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t oa_per_gfx_partition;
+ uint32_t oa_per_compute_partition;
+ uint32_t _pad;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_amdgpu_info_vram_gtt {
+ uint64_t vram_size;
+ uint64_t vram_cpu_accessible_size;
+ uint64_t gtt_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct drm_amdgpu_info_firmware {
+ uint32_t ver;
+ uint32_t feature;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define AMDGPU_VRAM_TYPE_UNKNOWN 0
+#define AMDGPU_VRAM_TYPE_GDDR1 1
+#define AMDGPU_VRAM_TYPE_DDR2 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_VRAM_TYPE_GDDR3 3
+#define AMDGPU_VRAM_TYPE_GDDR4 4
+#define AMDGPU_VRAM_TYPE_GDDR5 5
+#define AMDGPU_VRAM_TYPE_HBM 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_VRAM_TYPE_DDR3 7
+struct drm_amdgpu_info_device {
+ uint32_t device_id;
+ uint32_t chip_rev;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t external_rev;
+ uint32_t pci_rev;
+ uint32_t family;
+ uint32_t num_shader_engines;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t num_shader_arrays_per_engine;
+ uint32_t gpu_counter_freq;
+ uint64_t max_engine_clock;
+ uint64_t max_memory_clock;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t cu_active_number;
+ uint32_t cu_ao_mask;
+ uint32_t cu_bitmap[4][4];
+ uint32_t enabled_rb_pipes_mask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t num_rb_pipes;
+ uint32_t num_hw_gfx_contexts;
+ uint32_t _pad;
+ uint64_t ids_flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t virtual_address_offset;
+ uint64_t virtual_address_max;
+ uint32_t virtual_address_alignment;
+ uint32_t pte_fragment_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t gart_page_size;
+ uint32_t ce_ram_size;
+ uint32_t vram_type;
+ uint32_t vram_bit_width;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t vce_harvest_config;
+};
+struct drm_amdgpu_info_hw_ip {
+ uint32_t hw_ip_version_major;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t hw_ip_version_minor;
+ uint64_t capabilities_flags;
+ uint32_t ib_start_alignment;
+ uint32_t ib_size_alignment;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t available_rings;
+ uint32_t _pad;
+};
+#define AMDGPU_FAMILY_UNKNOWN 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDGPU_FAMILY_CI 120
+#define AMDGPU_FAMILY_KV 125
+#define AMDGPU_FAMILY_VI 130
+#define AMDGPU_FAMILY_CZ 135
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/drm/drm.h b/libc/kernel/uapi/drm/drm.h
index 8efc7d776..1f3279792 100644
--- a/libc/kernel/uapi/drm/drm.h
+++ b/libc/kernel/uapi/drm/drm.h
@@ -434,208 +434,215 @@ struct drm_gem_open {
#define DRM_CAP_ASYNC_PAGE_FLIP 0x7
#define DRM_CAP_CURSOR_WIDTH 0x8
#define DRM_CAP_CURSOR_HEIGHT 0x9
-struct drm_get_cap {
+#define DRM_CAP_ADDFB2_MODIFIERS 0x10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_get_cap {
__u64 capability;
__u64 value;
};
-#define DRM_CLIENT_CAP_STEREO_3D 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_CLIENT_CAP_STEREO_3D 1
#define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2
+#define DRM_CLIENT_CAP_ATOMIC 3
struct drm_set_client_cap {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 capability;
__u64 value;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DRM_CLOEXEC O_CLOEXEC
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_prime_handle {
__u32 handle;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__s32 fd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#include <drm/drm_mode.h>
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_BASE 'd'
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE, nr)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOR(nr,type) _IOR(DRM_IOCTL_BASE, nr, type)
#define DRM_IOW(nr,type) _IOW(DRM_IOCTL_BASE, nr, type)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOWR(nr,type) _IOWR(DRM_IOCTL_BASE, nr, type)
#define DRM_IOCTL_VERSION DRM_IOWR(0x00, struct drm_version)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_GET_UNIQUE DRM_IOWR(0x01, struct drm_unique)
#define DRM_IOCTL_GET_MAGIC DRM_IOR(0x02, struct drm_auth)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_IRQ_BUSID DRM_IOWR(0x03, struct drm_irq_busid)
#define DRM_IOCTL_GET_MAP DRM_IOWR(0x04, struct drm_map)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_GET_CLIENT DRM_IOWR(0x05, struct drm_client)
#define DRM_IOCTL_GET_STATS DRM_IOR(0x06, struct drm_stats)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_SET_VERSION DRM_IOWR(0x07, struct drm_set_version)
#define DRM_IOCTL_MODESET_CTL DRM_IOW(0x08, struct drm_modeset_ctl)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_GEM_CLOSE DRM_IOW(0x09, struct drm_gem_close)
#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open)
#define DRM_IOCTL_GET_CAP DRM_IOWR(0x0c, struct drm_get_cap)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_SET_CLIENT_CAP DRM_IOW(0x0d, struct drm_set_client_cap)
#define DRM_IOCTL_SET_UNIQUE DRM_IOW(0x10, struct drm_unique)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_AUTH_MAGIC DRM_IOW(0x11, struct drm_auth)
#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, struct drm_block)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_UNBLOCK DRM_IOWR(0x13, struct drm_block)
#define DRM_IOCTL_CONTROL DRM_IOW(0x14, struct drm_control)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_ADD_MAP DRM_IOWR(0x15, struct drm_map)
#define DRM_IOCTL_ADD_BUFS DRM_IOWR(0x16, struct drm_buf_desc)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MARK_BUFS DRM_IOW(0x17, struct drm_buf_desc)
#define DRM_IOCTL_INFO_BUFS DRM_IOWR(0x18, struct drm_buf_info)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MAP_BUFS DRM_IOWR(0x19, struct drm_buf_map)
#define DRM_IOCTL_FREE_BUFS DRM_IOW(0x1a, struct drm_buf_free)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_RM_MAP DRM_IOW(0x1b, struct drm_map)
#define DRM_IOCTL_SET_SAREA_CTX DRM_IOW(0x1c, struct drm_ctx_priv_map)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_GET_SAREA_CTX DRM_IOWR(0x1d, struct drm_ctx_priv_map)
#define DRM_IOCTL_SET_MASTER DRM_IO(0x1e)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_DROP_MASTER DRM_IO(0x1f)
#define DRM_IOCTL_ADD_CTX DRM_IOWR(0x20, struct drm_ctx)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_RM_CTX DRM_IOWR(0x21, struct drm_ctx)
#define DRM_IOCTL_MOD_CTX DRM_IOW(0x22, struct drm_ctx)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_GET_CTX DRM_IOWR(0x23, struct drm_ctx)
#define DRM_IOCTL_SWITCH_CTX DRM_IOW(0x24, struct drm_ctx)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_NEW_CTX DRM_IOW(0x25, struct drm_ctx)
#define DRM_IOCTL_RES_CTX DRM_IOWR(0x26, struct drm_ctx_res)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_ADD_DRAW DRM_IOWR(0x27, struct drm_draw)
#define DRM_IOCTL_RM_DRAW DRM_IOWR(0x28, struct drm_draw)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_DMA DRM_IOWR(0x29, struct drm_dma)
#define DRM_IOCTL_LOCK DRM_IOW(0x2a, struct drm_lock)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_UNLOCK DRM_IOW(0x2b, struct drm_lock)
#define DRM_IOCTL_FINISH DRM_IOW(0x2c, struct drm_lock)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_PRIME_HANDLE_TO_FD DRM_IOWR(0x2d, struct drm_prime_handle)
#define DRM_IOCTL_PRIME_FD_TO_HANDLE DRM_IOWR(0x2e, struct drm_prime_handle)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO(0x30)
#define DRM_IOCTL_AGP_RELEASE DRM_IO(0x31)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_AGP_ENABLE DRM_IOW(0x32, struct drm_agp_mode)
#define DRM_IOCTL_AGP_INFO DRM_IOR(0x33, struct drm_agp_info)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, struct drm_agp_buffer)
#define DRM_IOCTL_AGP_FREE DRM_IOW(0x35, struct drm_agp_buffer)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_AGP_BIND DRM_IOW(0x36, struct drm_agp_binding)
#define DRM_IOCTL_AGP_UNBIND DRM_IOW(0x37, struct drm_agp_binding)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_SG_ALLOC DRM_IOWR(0x38, struct drm_scatter_gather)
#define DRM_IOCTL_SG_FREE DRM_IOW(0x39, struct drm_scatter_gather)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_WAIT_VBLANK DRM_IOWR(0x3a, union drm_wait_vblank)
#define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc)
#define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut)
#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder)
#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd)
#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property)
#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob)
#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOWR(0xB0, struct drm_mode_crtc_page_flip)
#define DRM_IOCTL_MODE_DIRTYFB DRM_IOWR(0xB1, struct drm_mode_fb_dirty_cmd)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_CREATE_DUMB DRM_IOWR(0xB2, struct drm_mode_create_dumb)
#define DRM_IOCTL_MODE_MAP_DUMB DRM_IOWR(0xB3, struct drm_mode_map_dumb)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb)
#define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_GETPLANE DRM_IOWR(0xB6, struct drm_mode_get_plane)
#define DRM_IOCTL_MODE_SETPLANE DRM_IOWR(0xB7, struct drm_mode_set_plane)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_ADDFB2 DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
#define DRM_IOCTL_MODE_OBJ_GETPROPERTIES DRM_IOWR(0xB9, struct drm_mode_obj_get_properties)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct drm_mode_obj_set_property)
#define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_MODE_ATOMIC DRM_IOWR(0xBC, struct drm_mode_atomic)
+#define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct drm_mode_create_blob)
+#define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
#define DRM_COMMAND_BASE 0x40
-#define DRM_COMMAND_END 0xA0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_COMMAND_END 0xA0
struct drm_event {
__u32 type;
__u32 length;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define DRM_EVENT_VBLANK 0x01
#define DRM_EVENT_FLIP_COMPLETE 0x02
struct drm_event_vblank {
- struct drm_event base;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_event base;
__u64 user_data;
__u32 tv_sec;
__u32 tv_usec;
- __u32 sequence;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 sequence;
__u32 reserved;
};
typedef struct drm_clip_rect drm_clip_rect_t;
-typedef struct drm_drawable_info drm_drawable_info_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_drawable_info drm_drawable_info_t;
typedef struct drm_tex_region drm_tex_region_t;
typedef struct drm_hw_lock drm_hw_lock_t;
typedef struct drm_version drm_version_t;
-typedef struct drm_unique drm_unique_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_unique drm_unique_t;
typedef struct drm_list drm_list_t;
typedef struct drm_block drm_block_t;
typedef struct drm_control drm_control_t;
-typedef enum drm_map_type drm_map_type_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef enum drm_map_type drm_map_type_t;
typedef enum drm_map_flags drm_map_flags_t;
typedef struct drm_ctx_priv_map drm_ctx_priv_map_t;
typedef struct drm_map drm_map_t;
-typedef struct drm_client drm_client_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_client drm_client_t;
typedef enum drm_stat_type drm_stat_type_t;
typedef struct drm_stats drm_stats_t;
typedef enum drm_lock_flags drm_lock_flags_t;
-typedef struct drm_lock drm_lock_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_lock drm_lock_t;
typedef enum drm_dma_flags drm_dma_flags_t;
typedef struct drm_buf_desc drm_buf_desc_t;
typedef struct drm_buf_info drm_buf_info_t;
-typedef struct drm_buf_free drm_buf_free_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_buf_free drm_buf_free_t;
typedef struct drm_buf_pub drm_buf_pub_t;
typedef struct drm_buf_map drm_buf_map_t;
typedef struct drm_dma drm_dma_t;
-typedef union drm_wait_vblank drm_wait_vblank_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef union drm_wait_vblank drm_wait_vblank_t;
typedef struct drm_agp_mode drm_agp_mode_t;
typedef enum drm_ctx_flags drm_ctx_flags_t;
typedef struct drm_ctx drm_ctx_t;
-typedef struct drm_ctx_res drm_ctx_res_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_ctx_res drm_ctx_res_t;
typedef struct drm_draw drm_draw_t;
typedef struct drm_update_draw drm_update_draw_t;
typedef struct drm_auth drm_auth_t;
-typedef struct drm_irq_busid drm_irq_busid_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_irq_busid drm_irq_busid_t;
typedef enum drm_vblank_seq_type drm_vblank_seq_type_t;
typedef struct drm_agp_buffer drm_agp_buffer_t;
typedef struct drm_agp_binding drm_agp_binding_t;
-typedef struct drm_agp_info drm_agp_info_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_agp_info drm_agp_info_t;
typedef struct drm_scatter_gather drm_scatter_gather_t;
typedef struct drm_set_version drm_set_version_t;
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/drm/drm_fourcc.h b/libc/kernel/uapi/drm/drm_fourcc.h
index 47e93dd11..ec8a91adc 100644
--- a/libc/kernel/uapi/drm/drm_fourcc.h
+++ b/libc/kernel/uapi/drm/drm_fourcc.h
@@ -23,79 +23,96 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_BIG_ENDIAN (1 << 31)
#define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ')
+#define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ')
+#define DRM_FORMAT_RG88 fourcc_code('R', 'G', '8', '8')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8')
#define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8')
#define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2')
#define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2')
#define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2')
#define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2')
#define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5')
#define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5')
#define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5')
#define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5')
#define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6')
#define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4')
#define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4')
#define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4')
#define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4')
#define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4')
#define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0')
#define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0')
#define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0')
#define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0')
#define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U')
#define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y')
#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2')
#define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1')
#define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4')
#define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2')
-#define DRM_FORMAT_NV12MT fourcc_code('T', 'M', '1', '2')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9')
#define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1')
#define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2')
#define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6')
#define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4')
#define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_FORMAT_MOD_NONE 0
+#define DRM_FORMAT_MOD_VENDOR_INTEL 0x01
+#define DRM_FORMAT_MOD_VENDOR_AMD 0x02
+#define DRM_FORMAT_MOD_VENDOR_NV 0x03
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_FORMAT_MOD_VENDOR_SAMSUNG 0x04
+#define DRM_FORMAT_MOD_VENDOR_QCOM 0x05
+#define fourcc_mod_code(vendor,val) ((((__u64) DRM_FORMAT_MOD_VENDOR_ ##vendor) << 56) | (val & 0x00ffffffffffffffULL))
+#define I915_FORMAT_MOD_X_TILED fourcc_mod_code(INTEL, 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_FORMAT_MOD_Y_TILED fourcc_mod_code(INTEL, 2)
+#define I915_FORMAT_MOD_Yf_TILED fourcc_mod_code(INTEL, 3)
+#define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE fourcc_mod_code(SAMSUNG, 1)
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/drm/drm_mode.h b/libc/kernel/uapi/drm/drm_mode.h
index abd92a1cc..240a8ae9c 100644
--- a/libc/kernel/uapi/drm/drm_mode.h
+++ b/libc/kernel/uapi/drm/drm_mode.h
@@ -87,8 +87,18 @@
struct drm_mode_modeinfo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 clock;
- __u16 hdisplay, hsync_start, hsync_end, htotal, hskew;
- __u16 vdisplay, vsync_start, vsync_end, vtotal, vscan;
+ __u16 hdisplay;
+ __u16 hsync_start;
+ __u16 hsync_end;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 htotal;
+ __u16 hskew;
+ __u16 vdisplay;
+ __u16 vsync_start;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 vsync_end;
+ __u16 vtotal;
+ __u16 vscan;
__u32 vrefresh;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
@@ -107,121 +117,131 @@ struct drm_mode_card_res {
__u32 count_connectors;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count_encoders;
- __u32 min_width, max_width;
- __u32 min_height, max_height;
-};
+ __u32 min_width;
+ __u32 max_width;
+ __u32 min_height;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 max_height;
+};
struct drm_mode_crtc {
__u64 set_connectors_ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count_connectors;
__u32 crtc_id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 fb_id;
- __u32 x, y;
+ __u32 x;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 y;
__u32 gamma_size;
__u32 mode_valid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_mode_modeinfo mode;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DRM_MODE_PRESENT_TOP_FIELD (1 << 0)
#define DRM_MODE_PRESENT_BOTTOM_FIELD (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_mode_set_plane {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 plane_id;
__u32 crtc_id;
__u32 fb_id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
- __s32 crtc_x, crtc_y;
- __u32 crtc_w, crtc_h;
- __u32 src_x, src_y;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 src_h, src_w;
+ __s32 crtc_x;
+ __s32 crtc_y;
+ __u32 crtc_w;
+ __u32 crtc_h;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 src_x;
+ __u32 src_y;
+ __u32 src_h;
+ __u32 src_w;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_mode_get_plane {
__u32 plane_id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 crtc_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 fb_id;
__u32 possible_crtcs;
__u32 gamma_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count_format_types;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 format_type_ptr;
};
struct drm_mode_get_plane_res {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 plane_id_ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count_planes;
};
#define DRM_MODE_ENCODER_NONE 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_ENCODER_DAC 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_ENCODER_TMDS 2
#define DRM_MODE_ENCODER_LVDS 3
#define DRM_MODE_ENCODER_TVDAC 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_ENCODER_VIRTUAL 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_ENCODER_DSI 6
#define DRM_MODE_ENCODER_DPMST 7
struct drm_mode_get_encoder {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 encoder_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 encoder_type;
__u32 crtc_id;
__u32 possible_crtcs;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 possible_clones;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DRM_MODE_SUBCONNECTOR_Automatic 0
#define DRM_MODE_SUBCONNECTOR_Unknown 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_SUBCONNECTOR_DVID 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_SUBCONNECTOR_DVIA 4
#define DRM_MODE_SUBCONNECTOR_Composite 5
#define DRM_MODE_SUBCONNECTOR_SVIDEO 6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_SUBCONNECTOR_Component 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_SUBCONNECTOR_SCART 9
#define DRM_MODE_CONNECTOR_Unknown 0
#define DRM_MODE_CONNECTOR_VGA 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_DVII 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_DVID 3
#define DRM_MODE_CONNECTOR_DVIA 4
#define DRM_MODE_CONNECTOR_Composite 5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_SVIDEO 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_LVDS 7
#define DRM_MODE_CONNECTOR_Component 8
#define DRM_MODE_CONNECTOR_9PinDIN 9
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_DisplayPort 10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_HDMIA 11
#define DRM_MODE_CONNECTOR_HDMIB 12
#define DRM_MODE_CONNECTOR_TV 13
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_eDP 14
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_MODE_CONNECTOR_VIRTUAL 15
#define DRM_MODE_CONNECTOR_DSI 16
struct drm_mode_get_connector {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 encoders_ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 modes_ptr;
__u64 props_ptr;
__u64 prop_values_ptr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count_modes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count_props;
__u32 count_encoders;
__u32 encoder_id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 connector_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 connector_type;
__u32 connector_type_id;
__u32 connection;
+ __u32 mm_width;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 mm_width, mm_height;
+ __u32 mm_height;
__u32 subpixel;
__u32 pad;
};
@@ -239,66 +259,71 @@ struct drm_mode_get_connector {
#define DRM_MODE_PROP_TYPE(n) ((n) << 6)
#define DRM_MODE_PROP_OBJECT DRM_MODE_PROP_TYPE(1)
#define DRM_MODE_PROP_SIGNED_RANGE DRM_MODE_PROP_TYPE(2)
-struct drm_mode_property_enum {
+#define DRM_MODE_PROP_ATOMIC 0x80000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_mode_property_enum {
__u64 value;
char name[DRM_PROP_NAME_LEN];
};
-struct drm_mode_get_property {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_mode_get_property {
__u64 values_ptr;
__u64 enum_blob_ptr;
__u32 prop_id;
- __u32 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
char name[DRM_PROP_NAME_LEN];
__u32 count_values;
__u32 count_enum_blobs;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct drm_mode_connector_set_property {
__u64 value;
__u32 prop_id;
- __u32 connector_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 connector_id;
};
struct drm_mode_obj_get_properties {
__u64 props_ptr;
- __u64 prop_values_ptr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 prop_values_ptr;
__u32 count_props;
__u32 obj_id;
__u32 obj_type;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct drm_mode_obj_set_property {
__u64 value;
__u32 prop_id;
- __u32 obj_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 obj_id;
__u32 obj_type;
};
struct drm_mode_get_blob {
- __u32 blob_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 blob_id;
__u32 length;
__u64 data;
};
-struct drm_mode_fb_cmd {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_mode_fb_cmd {
__u32 fb_id;
- __u32 width, height;
+ __u32 width;
+ __u32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pitch;
__u32 bpp;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 depth;
__u32 handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DRM_MODE_FB_INTERLACED (1 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_MODE_FB_MODIFIERS (1 << 1)
struct drm_mode_fb_cmd2 {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 fb_id;
- __u32 width, height;
+ __u32 width;
+ __u32 height;
__u32 pixel_format;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
@@ -306,95 +331,124 @@ struct drm_mode_fb_cmd2 {
__u32 pitches[4];
__u32 offsets[4];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 modifier[4];
};
#define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01
#define DRM_MODE_FB_DIRTY_ANNOTATE_FILL 0x02
-#define DRM_MODE_FB_DIRTY_FLAGS 0x03
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_MODE_FB_DIRTY_FLAGS 0x03
#define DRM_MODE_FB_DIRTY_MAX_CLIPS 256
struct drm_mode_fb_dirty_cmd {
__u32 fb_id;
- __u32 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
__u32 color;
__u32 num_clips;
__u64 clips_ptr;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct drm_mode_mode_cmd {
__u32 connector_id;
struct drm_mode_modeinfo mode;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define DRM_MODE_CURSOR_BO 0x01
#define DRM_MODE_CURSOR_MOVE 0x02
#define DRM_MODE_CURSOR_FLAGS 0x03
-struct drm_mode_cursor {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_mode_cursor {
__u32 flags;
__u32 crtc_id;
__s32 x;
- __s32 y;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 y;
__u32 width;
__u32 height;
__u32 handle;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct drm_mode_cursor2 {
__u32 flags;
__u32 crtc_id;
- __s32 x;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 x;
__s32 y;
__u32 width;
__u32 height;
- __u32 handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 handle;
__s32 hot_x;
__s32 hot_y;
};
-struct drm_mode_crtc_lut {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_mode_crtc_lut {
__u32 crtc_id;
__u32 gamma_size;
__u64 red;
- __u64 green;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 green;
__u64 blue;
};
#define DRM_MODE_PAGE_FLIP_EVENT 0x01
-#define DRM_MODE_PAGE_FLIP_ASYNC 0x02
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_MODE_PAGE_FLIP_ASYNC 0x02
#define DRM_MODE_PAGE_FLIP_FLAGS (DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_PAGE_FLIP_ASYNC)
struct drm_mode_crtc_page_flip {
__u32 crtc_id;
- __u32 fb_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 fb_id;
__u32 flags;
__u32 reserved;
__u64 user_data;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct drm_mode_create_dumb {
uint32_t height;
uint32_t width;
- uint32_t bpp;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t bpp;
uint32_t flags;
uint32_t handle;
uint32_t pitch;
- uint64_t size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t size;
};
struct drm_mode_map_dumb {
__u32 handle;
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
__u64 offset;
};
struct drm_mode_destroy_dumb {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t handle;
+};
+#define DRM_MODE_ATOMIC_TEST_ONLY 0x0100
+#define DRM_MODE_ATOMIC_NONBLOCK 0x0200
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_MODE_ATOMIC_ALLOW_MODESET 0x0400
+#define DRM_MODE_ATOMIC_FLAGS (DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_PAGE_FLIP_ASYNC | DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_NONBLOCK | DRM_MODE_ATOMIC_ALLOW_MODESET)
+struct drm_mode_atomic {
+ __u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 count_objs;
+ __u64 objs_ptr;
+ __u64 count_props_ptr;
+ __u64 props_ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 prop_values_ptr;
+ __u64 reserved;
+ __u64 user_data;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_mode_create_blob {
+ __u64 data;
+ __u32 length;
+ __u32 blob_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct drm_mode_destroy_blob {
+ __u32 blob_id;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/drm/i810_drm.h b/libc/kernel/uapi/drm/i810_drm.h
index ebe33325b..9292a802b 100644
--- a/libc/kernel/uapi/drm/i810_drm.h
+++ b/libc/kernel/uapi/drm/i810_drm.h
@@ -18,244 +18,246 @@
****************************************************************************/
#ifndef _I810_DRM_H_
#define _I810_DRM_H_
+#include <drm/drm.h>
#ifndef _I810_DEFINES_
-#define _I810_DEFINES_
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _I810_DEFINES_
#define I810_DMA_BUF_ORDER 12
#define I810_DMA_BUF_SZ (1 << I810_DMA_BUF_ORDER)
#define I810_DMA_BUF_NR 256
-#define I810_NR_SAREA_CLIPRECTS 8
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_NR_SAREA_CLIPRECTS 8
#define I810_NR_TEX_REGIONS 64
#define I810_LOG_MIN_TEX_REGION_SIZE 16
#endif
-#define I810_UPLOAD_TEX0IMAGE 0x1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_UPLOAD_TEX0IMAGE 0x1
#define I810_UPLOAD_TEX1IMAGE 0x2
#define I810_UPLOAD_CTX 0x4
#define I810_UPLOAD_BUFFERS 0x8
-#define I810_UPLOAD_TEX0 0x10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_UPLOAD_TEX0 0x10
#define I810_UPLOAD_TEX1 0x20
#define I810_UPLOAD_CLIPRECTS 0x40
#define I810_DESTREG_DI0 0
-#define I810_DESTREG_DI1 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_DESTREG_DI1 1
#define I810_DESTREG_DV0 2
#define I810_DESTREG_DV1 3
#define I810_DESTREG_DR0 4
-#define I810_DESTREG_DR1 5
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_DESTREG_DR1 5
#define I810_DESTREG_DR2 6
#define I810_DESTREG_DR3 7
#define I810_DESTREG_DR4 8
-#define I810_DEST_SETUP_SIZE 10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_DEST_SETUP_SIZE 10
#define I810_CTXREG_CF0 0
#define I810_CTXREG_CF1 1
#define I810_CTXREG_ST0 2
-#define I810_CTXREG_ST1 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_CTXREG_ST1 3
#define I810_CTXREG_VF 4
#define I810_CTXREG_MT 5
#define I810_CTXREG_MC0 6
-#define I810_CTXREG_MC1 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_CTXREG_MC1 7
#define I810_CTXREG_MC2 8
#define I810_CTXREG_MA0 9
#define I810_CTXREG_MA1 10
-#define I810_CTXREG_MA2 11
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_CTXREG_MA2 11
#define I810_CTXREG_SDM 12
#define I810_CTXREG_FOG 13
#define I810_CTXREG_B1 14
-#define I810_CTXREG_B2 15
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_CTXREG_B2 15
#define I810_CTXREG_LCS 16
#define I810_CTXREG_PV 17
#define I810_CTXREG_ZA 18
-#define I810_CTXREG_AA 19
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_CTXREG_AA 19
#define I810_CTX_SETUP_SIZE 20
#define I810_TEXREG_MI0 0
#define I810_TEXREG_MI1 1
-#define I810_TEXREG_MI2 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_TEXREG_MI2 2
#define I810_TEXREG_MI3 3
#define I810_TEXREG_MF 4
#define I810_TEXREG_MLC 5
-#define I810_TEXREG_MLL 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_TEXREG_MLL 6
#define I810_TEXREG_MCS 7
#define I810_TEX_SETUP_SIZE 8
#define I810_FRONT 0x1
-#define I810_BACK 0x2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I810_BACK 0x2
#define I810_DEPTH 0x4
typedef enum _drm_i810_init_func {
I810_INIT_DMA = 0x01,
- I810_CLEANUP_DMA = 0x02,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ I810_CLEANUP_DMA = 0x02,
I810_INIT_DMA_1_4 = 0x03
} drm_i810_init_func_t;
typedef struct _drm_i810_init {
- drm_i810_init_func_t func;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ drm_i810_init_func_t func;
unsigned int mmio_offset;
unsigned int buffers_offset;
int sarea_priv_offset;
- unsigned int ring_start;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int ring_start;
unsigned int ring_end;
unsigned int ring_size;
unsigned int front_offset;
- unsigned int back_offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int back_offset;
unsigned int depth_offset;
unsigned int overlay_offset;
unsigned int overlay_physical;
- unsigned int w;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int w;
unsigned int h;
unsigned int pitch;
unsigned int pitch_bits;
-} drm_i810_init_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_i810_init_t;
typedef struct _drm_i810_pre12_init {
drm_i810_init_func_t func;
unsigned int mmio_offset;
- unsigned int buffers_offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int buffers_offset;
int sarea_priv_offset;
unsigned int ring_start;
unsigned int ring_end;
- unsigned int ring_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int ring_size;
unsigned int front_offset;
unsigned int back_offset;
unsigned int depth_offset;
- unsigned int w;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int w;
unsigned int h;
unsigned int pitch;
unsigned int pitch_bits;
-} drm_i810_pre12_init_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_i810_pre12_init_t;
typedef struct _drm_i810_tex_region {
unsigned char next, prev;
unsigned char in_use;
- int age;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int age;
} drm_i810_tex_region_t;
typedef struct _drm_i810_sarea {
unsigned int ContextState[I810_CTX_SETUP_SIZE];
- unsigned int BufferState[I810_DEST_SETUP_SIZE];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int BufferState[I810_DEST_SETUP_SIZE];
unsigned int TexState[2][I810_TEX_SETUP_SIZE];
unsigned int dirty;
unsigned int nbox;
- struct drm_clip_rect boxes[I810_NR_SAREA_CLIPRECTS];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_clip_rect boxes[I810_NR_SAREA_CLIPRECTS];
drm_i810_tex_region_t texList[I810_NR_TEX_REGIONS + 1];
int texAge;
int last_enqueue;
- int last_dispatch;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int last_dispatch;
int last_quiescent;
int ctxOwner;
int vertex_prim;
- int pf_enabled;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int pf_enabled;
int pf_active;
int pf_current_page;
} drm_i810_sarea_t;
-#define DRM_I810_INIT 0x00
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_I810_INIT 0x00
#define DRM_I810_VERTEX 0x01
#define DRM_I810_CLEAR 0x02
#define DRM_I810_FLUSH 0x03
-#define DRM_I810_GETAGE 0x04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_I810_GETAGE 0x04
#define DRM_I810_GETBUF 0x05
#define DRM_I810_SWAP 0x06
#define DRM_I810_COPY 0x07
-#define DRM_I810_DOCOPY 0x08
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_I810_DOCOPY 0x08
#define DRM_I810_OV0INFO 0x09
#define DRM_I810_FSTATUS 0x0a
#define DRM_I810_OV0FLIP 0x0b
-#define DRM_I810_MC 0x0c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_I810_MC 0x0c
#define DRM_I810_RSTATUS 0x0d
#define DRM_I810_FLIP 0x0e
#define DRM_IOCTL_I810_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_I810_INIT, drm_i810_init_t)
-#define DRM_IOCTL_I810_VERTEX DRM_IOW(DRM_COMMAND_BASE + DRM_I810_VERTEX, drm_i810_vertex_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_I810_VERTEX DRM_IOW(DRM_COMMAND_BASE + DRM_I810_VERTEX, drm_i810_vertex_t)
#define DRM_IOCTL_I810_CLEAR DRM_IOW(DRM_COMMAND_BASE + DRM_I810_CLEAR, drm_i810_clear_t)
#define DRM_IOCTL_I810_FLUSH DRM_IO(DRM_COMMAND_BASE + DRM_I810_FLUSH)
#define DRM_IOCTL_I810_GETAGE DRM_IO(DRM_COMMAND_BASE + DRM_I810_GETAGE)
-#define DRM_IOCTL_I810_GETBUF DRM_IOWR(DRM_COMMAND_BASE + DRM_I810_GETBUF, drm_i810_dma_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_I810_GETBUF DRM_IOWR(DRM_COMMAND_BASE + DRM_I810_GETBUF, drm_i810_dma_t)
#define DRM_IOCTL_I810_SWAP DRM_IO(DRM_COMMAND_BASE + DRM_I810_SWAP)
#define DRM_IOCTL_I810_COPY DRM_IOW(DRM_COMMAND_BASE + DRM_I810_COPY, drm_i810_copy_t)
#define DRM_IOCTL_I810_DOCOPY DRM_IO(DRM_COMMAND_BASE + DRM_I810_DOCOPY)
-#define DRM_IOCTL_I810_OV0INFO DRM_IOR(DRM_COMMAND_BASE + DRM_I810_OV0INFO, drm_i810_overlay_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_I810_OV0INFO DRM_IOR(DRM_COMMAND_BASE + DRM_I810_OV0INFO, drm_i810_overlay_t)
#define DRM_IOCTL_I810_FSTATUS DRM_IO(DRM_COMMAND_BASE + DRM_I810_FSTATUS)
#define DRM_IOCTL_I810_OV0FLIP DRM_IO(DRM_COMMAND_BASE + DRM_I810_OV0FLIP)
#define DRM_IOCTL_I810_MC DRM_IOW(DRM_COMMAND_BASE + DRM_I810_MC, drm_i810_mc_t)
-#define DRM_IOCTL_I810_RSTATUS DRM_IO(DRM_COMMAND_BASE + DRM_I810_RSTATUS)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_I810_RSTATUS DRM_IO(DRM_COMMAND_BASE + DRM_I810_RSTATUS)
#define DRM_IOCTL_I810_FLIP DRM_IO(DRM_COMMAND_BASE + DRM_I810_FLIP)
typedef struct _drm_i810_clear {
int clear_color;
- int clear_depth;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int clear_depth;
int flags;
} drm_i810_clear_t;
typedef struct _drm_i810_vertex {
- int idx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int idx;
int used;
int discard;
} drm_i810_vertex_t;
-typedef struct _drm_i810_copy_t {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct _drm_i810_copy_t {
int idx;
int used;
void * address;
-} drm_i810_copy_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_i810_copy_t;
#define PR_TRIANGLES (0x0 << 18)
#define PR_TRISTRIP_0 (0x1 << 18)
#define PR_TRISTRIP_1 (0x2 << 18)
-#define PR_TRIFAN (0x3 << 18)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PR_TRIFAN (0x3 << 18)
#define PR_POLYGON (0x4 << 18)
#define PR_LINES (0x5 << 18)
#define PR_LINESTRIP (0x6 << 18)
-#define PR_RECTS (0x7 << 18)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PR_RECTS (0x7 << 18)
#define PR_MASK (0x7 << 18)
typedef struct drm_i810_dma {
void * virtual;
- int request_idx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int request_idx;
int request_size;
int granted;
} drm_i810_dma_t;
-typedef struct _drm_i810_overlay_t {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct _drm_i810_overlay_t {
unsigned int offset;
unsigned int physical;
} drm_i810_overlay_t;
-typedef struct _drm_i810_mc {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct _drm_i810_mc {
int idx;
int used;
int num_blocks;
- int * length;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int * length;
unsigned int last_render;
} drm_i810_mc_t;
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/drm/i915_drm.h b/libc/kernel/uapi/drm/i915_drm.h
index 3d15fec77..da685762f 100644
--- a/libc/kernel/uapi/drm/i915_drm.h
+++ b/libc/kernel/uapi/drm/i915_drm.h
@@ -197,68 +197,73 @@ typedef struct _drm_i915_sarea {
#define DRM_I915_GET_RESET_STATS 0x32
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_I915_GEM_USERPTR 0x33
+#define DRM_I915_GEM_CONTEXT_GETPARAM 0x34
+#define DRM_I915_GEM_CONTEXT_SETPARAM 0x35
#define DRM_IOCTL_I915_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_FLUSH DRM_IO(DRM_COMMAND_BASE + DRM_I915_FLUSH)
#define DRM_IOCTL_I915_FLIP DRM_IO(DRM_COMMAND_BASE + DRM_I915_FLIP)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_BATCHBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_BATCHBUFFER, drm_i915_batchbuffer_t)
#define DRM_IOCTL_I915_IRQ_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_IRQ_EMIT, drm_i915_irq_emit_t)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_IRQ_WAIT DRM_IOW(DRM_COMMAND_BASE + DRM_I915_IRQ_WAIT, drm_i915_irq_wait_t)
#define DRM_IOCTL_I915_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GETPARAM, drm_i915_getparam_t)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_SETPARAM DRM_IOW(DRM_COMMAND_BASE + DRM_I915_SETPARAM, drm_i915_setparam_t)
#define DRM_IOCTL_I915_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_ALLOC, drm_i915_mem_alloc_t)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_FREE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_FREE, drm_i915_mem_free_t)
#define DRM_IOCTL_I915_INIT_HEAP DRM_IOW(DRM_COMMAND_BASE + DRM_I915_INIT_HEAP, drm_i915_mem_init_heap_t)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_CMDBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_CMDBUFFER, drm_i915_cmdbuffer_t)
#define DRM_IOCTL_I915_DESTROY_HEAP DRM_IOW(DRM_COMMAND_BASE + DRM_I915_DESTROY_HEAP, drm_i915_mem_destroy_heap_t)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_SET_VBLANK_PIPE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_SET_VBLANK_PIPE, drm_i915_vblank_pipe_t)
#define DRM_IOCTL_I915_GET_VBLANK_PIPE DRM_IOR(DRM_COMMAND_BASE + DRM_I915_GET_VBLANK_PIPE, drm_i915_vblank_pipe_t)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_VBLANK_SWAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_VBLANK_SWAP, drm_i915_vblank_swap_t)
#define DRM_IOCTL_I915_HWS_ADDR DRM_IOW(DRM_COMMAND_BASE + DRM_I915_HWS_ADDR, struct drm_i915_gem_init)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_INIT, struct drm_i915_gem_init)
#define DRM_IOCTL_I915_GEM_EXECBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER, struct drm_i915_gem_execbuffer)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_EXECBUFFER2 DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_EXECBUFFER2, struct drm_i915_gem_execbuffer2)
#define DRM_IOCTL_I915_GEM_PIN DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_PIN, struct drm_i915_gem_pin)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_UNPIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_UNPIN, struct drm_i915_gem_unpin)
#define DRM_IOCTL_I915_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_BUSY, struct drm_i915_gem_busy)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_SET_CACHING DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_SET_CACHING, struct drm_i915_gem_caching)
#define DRM_IOCTL_I915_GEM_GET_CACHING DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_GET_CACHING, struct drm_i915_gem_caching)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_THROTTLE DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_THROTTLE)
#define DRM_IOCTL_I915_GEM_ENTERVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_ENTERVT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_LEAVEVT DRM_IO(DRM_COMMAND_BASE + DRM_I915_GEM_LEAVEVT)
#define DRM_IOCTL_I915_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CREATE, struct drm_i915_gem_create)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_PREAD DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_PREAD, struct drm_i915_gem_pread)
#define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap)
#define DRM_IOCTL_I915_GEM_MMAP_GTT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain)
#define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling)
#define DRM_IOCTL_I915_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR(DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture)
#define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise)
#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_I915_OVERLAY_PUT_IMAGE, struct drm_intel_overlay_put_image)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs)
#define DRM_IOCTL_I915_SET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_SET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define DRM_IOCTL_I915_GET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_SET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey)
+#define DRM_IOCTL_I915_GET_SPRITE_COLORKEY DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_SPRITE_COLORKEY, struct drm_intel_sprite_colorkey)
#define DRM_IOCTL_I915_GEM_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_WAIT, struct drm_i915_gem_wait)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_CONTEXT_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE, struct drm_i915_gem_context_create)
#define DRM_IOCTL_I915_GEM_CONTEXT_DESTROY DRM_IOW(DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_DESTROY, struct drm_i915_gem_context_destroy)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_REG_READ DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_REG_READ, struct drm_i915_reg_read)
#define DRM_IOCTL_I915_GET_RESET_STATS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_RESET_STATS, struct drm_i915_reset_stats)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_I915_GEM_USERPTR DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_USERPTR, struct drm_i915_gem_userptr)
+#define DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_GETPARAM, struct drm_i915_gem_context_param)
+#define DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_SETPARAM, struct drm_i915_gem_context_param)
typedef struct drm_i915_batchbuffer {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int start;
@@ -322,8 +327,18 @@ typedef struct drm_i915_irq_wait {
#define I915_PARAM_HAS_WT 27
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_PARAM_CMD_PARSER_VERSION 28
+#define I915_PARAM_HAS_COHERENT_PHYS_GTT 29
+#define I915_PARAM_MMAP_VERSION 30
+#define I915_PARAM_HAS_BSD2 31
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_PARAM_REVISION 32
+#define I915_PARAM_SUBSLICE_TOTAL 33
+#define I915_PARAM_EU_TOTAL 34
+#define I915_PARAM_HAS_GPU_RESET 35
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_PARAM_HAS_RESOURCE_STREAMER 36
typedef struct drm_i915_getparam {
- int param;
+ __s32 param;
int __user * value;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} drm_i915_getparam_t;
@@ -413,117 +428,127 @@ struct drm_i915_gem_mmap {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 size;
__u64 addr_ptr;
+ __u64 flags;
+#define I915_MMAP_WC 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_i915_gem_mmap_gtt {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 handle;
__u32 pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 offset;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_gem_set_domain {
__u32 handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 read_domains;
__u32 write_domain;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_i915_gem_sw_finish {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 handle;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_gem_relocation_entry {
__u32 target_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 delta;
__u64 offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 presumed_offset;
__u32 read_domains;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 write_domain;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_GEM_DOMAIN_CPU 0x00000001
#define I915_GEM_DOMAIN_RENDER 0x00000002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_GEM_DOMAIN_SAMPLER 0x00000004
#define I915_GEM_DOMAIN_COMMAND 0x00000008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_GEM_DOMAIN_INSTRUCTION 0x00000010
#define I915_GEM_DOMAIN_VERTEX 0x00000020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_GEM_DOMAIN_GTT 0x00000040
struct drm_i915_gem_exec_object {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 handle;
__u32 relocation_count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 relocs_ptr;
__u64 alignment;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 offset;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_gem_execbuffer {
__u64 buffers_ptr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 buffer_count;
__u32 batch_start_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 batch_len;
__u32 DR1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 DR4;
__u32 num_cliprects;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 cliprects_ptr;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_gem_exec_object2 {
__u32 handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 relocation_count;
__u64 relocs_ptr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 alignment;
__u64 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXEC_OBJECT_NEEDS_FENCE (1 << 0)
#define EXEC_OBJECT_NEEDS_GTT (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXEC_OBJECT_WRITE (1 << 2)
-#define __EXEC_OBJECT_UNKNOWN_FLAGS - (EXEC_OBJECT_WRITE << 1)
+#define EXEC_OBJECT_SUPPORTS_48B_ADDRESS (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __EXEC_OBJECT_UNKNOWN_FLAGS - (EXEC_OBJECT_SUPPORTS_48B_ADDRESS << 1)
__u64 flags;
__u64 rsvd1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 rsvd2;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_i915_gem_execbuffer2 {
__u64 buffers_ptr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 buffer_count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 batch_start_offset;
__u32 batch_len;
__u32 DR1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 DR4;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 num_cliprects;
__u64 cliprects_ptr;
#define I915_EXEC_RING_MASK (7 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_DEFAULT (0 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_RENDER (1 << 0)
#define I915_EXEC_BSD (2 << 0)
#define I915_EXEC_BLT (3 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_VEBOX (4 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_CONSTANTS_MASK (3 << 6)
#define I915_EXEC_CONSTANTS_REL_GENERAL (0 << 6)
#define I915_EXEC_CONSTANTS_ABSOLUTE (1 << 6)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_CONSTANTS_REL_SURFACE (2 << 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
__u64 rsvd1;
__u64 rsvd2;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_GEN7_SOL_RESET (1 << 8)
#define I915_EXEC_SECURE (1 << 9)
#define I915_EXEC_IS_PINNED (1 << 10)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_NO_RELOC (1 << 11)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_EXEC_HANDLE_LUT (1 << 12)
-#define __I915_EXEC_UNKNOWN_FLAGS - (I915_EXEC_HANDLE_LUT << 1)
+#define I915_EXEC_BSD_MASK (3 << 13)
+#define I915_EXEC_BSD_DEFAULT (0 << 13)
+#define I915_EXEC_BSD_RING1 (1 << 13)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_EXEC_BSD_RING2 (2 << 13)
+#define I915_EXEC_RESOURCE_STREAMER (1 << 15)
+#define __I915_EXEC_UNKNOWN_FLAGS - (I915_EXEC_RESOURCE_STREAMER << 1)
#define I915_EXEC_CONTEXT_ID_MASK (0xffffffff)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define i915_execbuffer2_set_context_id(eb2,context) (eb2).rsvd1 = context & I915_EXEC_CONTEXT_ID_MASK
@@ -581,144 +606,156 @@ struct drm_i915_gem_get_tiling {
__u32 tiling_mode;
__u32 swizzle_mode;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 phys_swizzle_mode;
};
struct drm_i915_gem_get_aperture {
__u64 aper_size;
- __u64 aper_available_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 aper_available_size;
};
struct drm_i915_get_pipe_from_crtc_id {
__u32 crtc_id;
- __u32 pipe;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pipe;
};
#define I915_MADV_WILLNEED 0
#define I915_MADV_DONTNEED 1
-#define __I915_MADV_PURGED 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __I915_MADV_PURGED 2
struct drm_i915_gem_madvise {
__u32 handle;
__u32 madv;
- __u32 retained;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 retained;
};
#define I915_OVERLAY_TYPE_MASK 0xff
#define I915_OVERLAY_YUV_PLANAR 0x01
-#define I915_OVERLAY_YUV_PACKED 0x02
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_OVERLAY_YUV_PACKED 0x02
#define I915_OVERLAY_RGB 0x03
#define I915_OVERLAY_DEPTH_MASK 0xff00
#define I915_OVERLAY_RGB24 0x1000
-#define I915_OVERLAY_RGB16 0x2000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_OVERLAY_RGB16 0x2000
#define I915_OVERLAY_RGB15 0x3000
#define I915_OVERLAY_YUV422 0x0100
#define I915_OVERLAY_YUV411 0x0200
-#define I915_OVERLAY_YUV420 0x0300
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_OVERLAY_YUV420 0x0300
#define I915_OVERLAY_YUV410 0x0400
#define I915_OVERLAY_SWAP_MASK 0xff0000
#define I915_OVERLAY_NO_SWAP 0x000000
-#define I915_OVERLAY_UV_SWAP 0x010000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_OVERLAY_UV_SWAP 0x010000
#define I915_OVERLAY_Y_SWAP 0x020000
#define I915_OVERLAY_Y_AND_UV_SWAP 0x030000
#define I915_OVERLAY_FLAGS_MASK 0xff000000
-#define I915_OVERLAY_ENABLE 0x01000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_OVERLAY_ENABLE 0x01000000
struct drm_intel_overlay_put_image {
__u32 flags;
__u32 bo_handle;
- __u16 stride_Y;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 stride_Y;
__u16 stride_UV;
__u32 offset_Y;
__u32 offset_U;
- __u32 offset_V;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 offset_V;
__u16 src_width;
__u16 src_height;
__u16 src_scan_width;
- __u16 src_scan_height;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 src_scan_height;
__u32 crtc_id;
__u16 dst_x;
__u16 dst_y;
- __u16 dst_width;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 dst_width;
__u16 dst_height;
};
#define I915_OVERLAY_UPDATE_ATTRS (1 << 0)
-#define I915_OVERLAY_UPDATE_GAMMA (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I915_OVERLAY_UPDATE_GAMMA (1 << 1)
+#define I915_OVERLAY_DISABLE_DEST_COLORKEY (1 << 2)
struct drm_intel_overlay_attrs {
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 color_key;
__s32 brightness;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 contrast;
__u32 saturation;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 gamma0;
__u32 gamma1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 gamma2;
__u32 gamma3;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 gamma4;
__u32 gamma5;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define I915_SET_COLORKEY_NONE (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_SET_COLORKEY_DESTINATION (1 << 1)
#define I915_SET_COLORKEY_SOURCE (1 << 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_intel_sprite_colorkey {
__u32 plane_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 min_value;
__u32 channel_mask;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_value;
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_i915_gem_wait {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 bo_handle;
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s64 timeout_ns;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_gem_context_create {
__u32 ctx_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pad;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_gem_context_destroy {
__u32 ctx_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pad;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_reg_read {
__u64 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 val;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_reset_stats {
__u32 ctx_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u32 reset_count;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 batch_active;
__u32 batch_pending;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pad;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_i915_gem_userptr {
__u64 user_ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 user_size;
__u32 flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I915_USERPTR_READ_ONLY 0x1
#define I915_USERPTR_UNSYNCHRONIZED 0x80000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 handle;
};
+struct drm_i915_gem_context_param {
+ __u32 ctx_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 size;
+ __u64 param;
+#define I915_CONTEXT_PARAM_BAN_PERIOD 0x1
+#define I915_CONTEXT_PARAM_NO_ZEROMAP 0x2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 value;
+};
#endif
diff --git a/libc/kernel/uapi/drm/msm_drm.h b/libc/kernel/uapi/drm/msm_drm.h
index 8db4b0d00..069fd013a 100644
--- a/libc/kernel/uapi/drm/msm_drm.h
+++ b/libc/kernel/uapi/drm/msm_drm.h
@@ -27,8 +27,8 @@
#define MSM_PIPE_3D0 0x10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_msm_timespec {
- int64_t tv_sec;
- int64_t tv_nsec;
+ __s64 tv_sec;
+ __s64 tv_nsec;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSM_PARAM_GPU_ID 0x01
@@ -36,9 +36,9 @@ struct drm_msm_timespec {
#define MSM_PARAM_CHIP_ID 0x03
struct drm_msm_param {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t pipe;
- uint32_t param;
- uint64_t value;
+ __u32 pipe;
+ __u32 param;
+ __u64 value;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSM_BO_SCANOUT 0x00000001
@@ -51,15 +51,15 @@ struct drm_msm_param {
#define MSM_BO_FLAGS (MSM_BO_SCANOUT | MSM_BO_GPU_READONLY | MSM_BO_CACHED | MSM_BO_WC | MSM_BO_UNCACHED)
struct drm_msm_gem_new {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint64_t size;
- uint32_t flags;
- uint32_t handle;
+ __u64 size;
+ __u32 flags;
+ __u32 handle;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_msm_gem_info {
- uint32_t handle;
- uint32_t pad;
- uint64_t offset;
+ __u32 handle;
+ __u32 pad;
+ __u64 offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define MSM_PREP_READ 0x01
@@ -68,22 +68,22 @@ struct drm_msm_gem_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSM_PREP_FLAGS (MSM_PREP_READ | MSM_PREP_WRITE | MSM_PREP_NOSYNC)
struct drm_msm_gem_cpu_prep {
- uint32_t handle;
- uint32_t op;
+ __u32 handle;
+ __u32 op;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_msm_timespec timeout;
};
struct drm_msm_gem_cpu_fini {
- uint32_t handle;
+ __u32 handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_msm_gem_submit_reloc {
- uint32_t submit_offset;
- uint32_t or;
+ __u32 submit_offset;
+ __u32 or;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- int32_t shift;
- uint32_t reloc_idx;
- uint64_t reloc_offset;
+ __s32 shift;
+ __u32 reloc_idx;
+ __u64 reloc_offset;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSM_SUBMIT_CMD_BUF 0x0001
@@ -91,14 +91,14 @@ struct drm_msm_gem_submit_reloc {
#define MSM_SUBMIT_CMD_CTX_RESTORE_BUF 0x0003
struct drm_msm_gem_submit_cmd {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t type;
- uint32_t submit_idx;
- uint32_t submit_offset;
- uint32_t size;
+ __u32 type;
+ __u32 submit_idx;
+ __u32 submit_offset;
+ __u32 size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t pad;
- uint32_t nr_relocs;
- uint64_t __user relocs;
+ __u32 pad;
+ __u32 nr_relocs;
+ __u64 __user relocs;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSM_SUBMIT_BO_READ 0x0001
@@ -106,24 +106,24 @@ struct drm_msm_gem_submit_cmd {
#define MSM_SUBMIT_BO_FLAGS (MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE)
struct drm_msm_gem_submit_bo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t flags;
- uint32_t handle;
- uint64_t presumed;
+ __u32 flags;
+ __u32 handle;
+ __u64 presumed;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_msm_gem_submit {
- uint32_t pipe;
- uint32_t fence;
- uint32_t nr_bos;
+ __u32 pipe;
+ __u32 fence;
+ __u32 nr_bos;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t nr_cmds;
- uint64_t __user bos;
- uint64_t __user cmds;
+ __u32 nr_cmds;
+ __u64 __user bos;
+ __u64 __user cmds;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_msm_wait_fence {
- uint32_t fence;
- uint32_t pad;
+ __u32 fence;
+ __u32 pad;
struct drm_msm_timespec timeout;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
diff --git a/libc/kernel/uapi/drm/nouveau_drm.h b/libc/kernel/uapi/drm/nouveau_drm.h
index 29248a0c5..38ee5892c 100644
--- a/libc/kernel/uapi/drm/nouveau_drm.h
+++ b/libc/kernel/uapi/drm/nouveau_drm.h
@@ -19,131 +19,128 @@
#ifndef __NOUVEAU_DRM_H__
#define __NOUVEAU_DRM_H__
#define DRM_NOUVEAU_EVENT_NVIF 0x80000000
-#define NOUVEAU_ABI16_CLIENT 0xffffffff
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define NOUVEAU_ABI16_DEVICE 0xdddddddd
-#define NOUVEAU_ABI16_CHAN(n) (0xcccc0000 | (n))
#define NOUVEAU_GEM_DOMAIN_CPU (1 << 0)
-#define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1)
#define NOUVEAU_GEM_DOMAIN_GART (1 << 2)
#define NOUVEAU_GEM_DOMAIN_MAPPABLE (1 << 3)
+#define NOUVEAU_GEM_DOMAIN_COHERENT (1 << 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NOUVEAU_GEM_TILE_COMP 0x00030000
#define NOUVEAU_GEM_TILE_LAYOUT_MASK 0x0000ff00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NOUVEAU_GEM_TILE_16BPP 0x00000001
#define NOUVEAU_GEM_TILE_32BPP 0x00000002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NOUVEAU_GEM_TILE_ZETA 0x00000004
#define NOUVEAU_GEM_TILE_NONCONTIG 0x00000008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_nouveau_gem_info {
uint32_t handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t domain;
uint64_t size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t offset;
uint64_t map_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t tile_mode;
uint32_t tile_flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_nouveau_gem_new {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_nouveau_gem_info info;
uint32_t channel_hint;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t align;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NOUVEAU_GEM_MAX_BUFFERS 1024
struct drm_nouveau_gem_pushbuf_bo_presumed {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t valid;
uint32_t domain;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t offset;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_nouveau_gem_pushbuf_bo {
uint64_t user_priv;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t handle;
uint32_t read_domains;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t write_domains;
uint32_t valid_domains;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_nouveau_gem_pushbuf_bo_presumed presumed;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NOUVEAU_GEM_RELOC_LOW (1 << 0)
#define NOUVEAU_GEM_RELOC_HIGH (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NOUVEAU_GEM_RELOC_OR (1 << 2)
#define NOUVEAU_GEM_MAX_RELOCS 1024
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_nouveau_gem_pushbuf_reloc {
uint32_t reloc_bo_index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t reloc_bo_offset;
uint32_t bo_index;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t flags;
uint32_t data;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t vor;
uint32_t tor;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NOUVEAU_GEM_MAX_PUSH 512
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_nouveau_gem_pushbuf_push {
uint32_t bo_index;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t pad;
uint64_t offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t length;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct drm_nouveau_gem_pushbuf {
uint32_t channel;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t nr_buffers;
uint64_t buffers;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t nr_relocs;
uint32_t nr_push;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t relocs;
uint64_t push;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t suffix0;
uint32_t suffix1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t vram_available;
uint64_t gart_available;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NOUVEAU_GEM_CPU_PREP_NOWAIT 0x00000001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NOUVEAU_GEM_CPU_PREP_WRITE 0x00000004
struct drm_nouveau_gem_cpu_prep {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t handle;
uint32_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_nouveau_gem_cpu_fini {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t handle;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_NOUVEAU_GETPARAM 0x00
#define DRM_NOUVEAU_SETPARAM 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_NOUVEAU_CHANNEL_ALLOC 0x02
#define DRM_NOUVEAU_CHANNEL_FREE 0x03
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_NOUVEAU_GROBJ_ALLOC 0x04
#define DRM_NOUVEAU_NOTIFIEROBJ_ALLOC 0x05
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_NOUVEAU_GPUOBJ_FREE 0x06
#define DRM_NOUVEAU_NVIF 0x07
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_NOUVEAU_GEM_NEW 0x40
#define DRM_NOUVEAU_GEM_PUSHBUF 0x41
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_NOUVEAU_GEM_CPU_PREP 0x42
#define DRM_NOUVEAU_GEM_CPU_FINI 0x43
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_NOUVEAU_GEM_INFO 0x44
#define DRM_IOCTL_NOUVEAU_GEM_NEW DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_NEW, struct drm_nouveau_gem_new)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_NOUVEAU_GEM_PUSHBUF DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_PUSHBUF, struct drm_nouveau_gem_pushbuf)
#define DRM_IOCTL_NOUVEAU_GEM_CPU_PREP DRM_IOW(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_PREP, struct drm_nouveau_gem_cpu_prep)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DRM_IOCTL_NOUVEAU_GEM_CPU_FINI DRM_IOW(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_FINI, struct drm_nouveau_gem_cpu_fini)
#define DRM_IOCTL_NOUVEAU_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_INFO, struct drm_nouveau_gem_info)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/drm/r128_drm.h b/libc/kernel/uapi/drm/r128_drm.h
index 4e6838108..de30d629f 100644
--- a/libc/kernel/uapi/drm/r128_drm.h
+++ b/libc/kernel/uapi/drm/r128_drm.h
@@ -18,263 +18,264 @@
****************************************************************************/
#ifndef __R128_DRM_H__
#define __R128_DRM_H__
+#include <drm/drm.h>
#ifndef __R128_SAREA_DEFINES__
-#define __R128_SAREA_DEFINES__
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __R128_SAREA_DEFINES__
#define R128_UPLOAD_CONTEXT 0x001
#define R128_UPLOAD_SETUP 0x002
#define R128_UPLOAD_TEX0 0x004
-#define R128_UPLOAD_TEX1 0x008
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_UPLOAD_TEX1 0x008
#define R128_UPLOAD_TEX0IMAGES 0x010
#define R128_UPLOAD_TEX1IMAGES 0x020
#define R128_UPLOAD_CORE 0x040
-#define R128_UPLOAD_MASKS 0x080
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_UPLOAD_MASKS 0x080
#define R128_UPLOAD_WINDOW 0x100
#define R128_UPLOAD_CLIPRECTS 0x200
#define R128_REQUIRE_QUIESCENCE 0x400
-#define R128_UPLOAD_ALL 0x7ff
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_UPLOAD_ALL 0x7ff
#define R128_FRONT 0x1
#define R128_BACK 0x2
#define R128_DEPTH 0x4
-#define R128_POINTS 0x1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_POINTS 0x1
#define R128_LINES 0x2
#define R128_LINE_STRIP 0x3
#define R128_TRIANGLES 0x4
-#define R128_TRIANGLE_FAN 0x5
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_TRIANGLE_FAN 0x5
#define R128_TRIANGLE_STRIP 0x6
#define R128_BUFFER_SIZE 16384
#define R128_INDEX_PRIM_OFFSET 20
-#define R128_HOSTDATA_BLIT_OFFSET 32
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_HOSTDATA_BLIT_OFFSET 32
#define R128_NR_SAREA_CLIPRECTS 12
#define R128_LOCAL_TEX_HEAP 0
#define R128_AGP_TEX_HEAP 1
-#define R128_NR_TEX_HEAPS 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_NR_TEX_HEAPS 2
#define R128_NR_TEX_REGIONS 64
#define R128_LOG_TEX_GRANULARITY 16
#define R128_NR_CONTEXT_REGS 12
-#define R128_MAX_TEXTURE_LEVELS 11
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R128_MAX_TEXTURE_LEVELS 11
#define R128_MAX_TEXTURE_UNITS 2
#endif
typedef struct {
- unsigned int dst_pitch_offset_c;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int dst_pitch_offset_c;
unsigned int dp_gui_master_cntl_c;
unsigned int sc_top_left_c;
unsigned int sc_bottom_right_c;
- unsigned int z_offset_c;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int z_offset_c;
unsigned int z_pitch_c;
unsigned int z_sten_cntl_c;
unsigned int tex_cntl_c;
- unsigned int misc_3d_state_cntl_reg;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int misc_3d_state_cntl_reg;
unsigned int texture_clr_cmp_clr_c;
unsigned int texture_clr_cmp_msk_c;
unsigned int fog_color_c;
- unsigned int tex_size_pitch_c;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int tex_size_pitch_c;
unsigned int constant_color_c;
unsigned int pm4_vc_fpu_setup;
unsigned int setup_cntl;
- unsigned int dp_write_mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int dp_write_mask;
unsigned int sten_ref_mask_c;
unsigned int plane_3d_mask_c;
unsigned int window_xy_offset;
- unsigned int scale_3d_cntl;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int scale_3d_cntl;
} drm_r128_context_regs_t;
typedef struct {
unsigned int tex_cntl;
- unsigned int tex_combine_cntl;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int tex_combine_cntl;
unsigned int tex_size_pitch;
unsigned int tex_offset[R128_MAX_TEXTURE_LEVELS];
unsigned int tex_border_color;
-} drm_r128_texture_regs_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_texture_regs_t;
typedef struct drm_r128_sarea {
drm_r128_context_regs_t context_state;
drm_r128_texture_regs_t tex_state[R128_MAX_TEXTURE_UNITS];
- unsigned int dirty;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int dirty;
unsigned int vertsize;
unsigned int vc_format;
struct drm_clip_rect boxes[R128_NR_SAREA_CLIPRECTS];
- unsigned int nbox;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int nbox;
unsigned int last_frame;
unsigned int last_dispatch;
struct drm_tex_region tex_list[R128_NR_TEX_HEAPS][R128_NR_TEX_REGIONS + 1];
- unsigned int tex_age[R128_NR_TEX_HEAPS];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int tex_age[R128_NR_TEX_HEAPS];
int ctx_owner;
int pfAllowPageFlip;
int pfCurrentPage;
-} drm_r128_sarea_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_sarea_t;
#define DRM_R128_INIT 0x00
#define DRM_R128_CCE_START 0x01
#define DRM_R128_CCE_STOP 0x02
-#define DRM_R128_CCE_RESET 0x03
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_R128_CCE_RESET 0x03
#define DRM_R128_CCE_IDLE 0x04
#define DRM_R128_RESET 0x06
#define DRM_R128_SWAP 0x07
-#define DRM_R128_CLEAR 0x08
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_R128_CLEAR 0x08
#define DRM_R128_VERTEX 0x09
#define DRM_R128_INDICES 0x0a
#define DRM_R128_BLIT 0x0b
-#define DRM_R128_DEPTH 0x0c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_R128_DEPTH 0x0c
#define DRM_R128_STIPPLE 0x0d
#define DRM_R128_INDIRECT 0x0f
#define DRM_R128_FULLSCREEN 0x10
-#define DRM_R128_CLEAR2 0x11
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_R128_CLEAR2 0x11
#define DRM_R128_GETPARAM 0x12
#define DRM_R128_FLIP 0x13
#define DRM_IOCTL_R128_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_R128_INIT, drm_r128_init_t)
-#define DRM_IOCTL_R128_CCE_START DRM_IO(DRM_COMMAND_BASE + DRM_R128_CCE_START)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_R128_CCE_START DRM_IO(DRM_COMMAND_BASE + DRM_R128_CCE_START)
#define DRM_IOCTL_R128_CCE_STOP DRM_IOW(DRM_COMMAND_BASE + DRM_R128_CCE_STOP, drm_r128_cce_stop_t)
#define DRM_IOCTL_R128_CCE_RESET DRM_IO(DRM_COMMAND_BASE + DRM_R128_CCE_RESET)
#define DRM_IOCTL_R128_CCE_IDLE DRM_IO(DRM_COMMAND_BASE + DRM_R128_CCE_IDLE)
-#define DRM_IOCTL_R128_RESET DRM_IO(DRM_COMMAND_BASE + DRM_R128_RESET)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_R128_RESET DRM_IO(DRM_COMMAND_BASE + DRM_R128_RESET)
#define DRM_IOCTL_R128_SWAP DRM_IO(DRM_COMMAND_BASE + DRM_R128_SWAP)
#define DRM_IOCTL_R128_CLEAR DRM_IOW(DRM_COMMAND_BASE + DRM_R128_CLEAR, drm_r128_clear_t)
#define DRM_IOCTL_R128_VERTEX DRM_IOW(DRM_COMMAND_BASE + DRM_R128_VERTEX, drm_r128_vertex_t)
-#define DRM_IOCTL_R128_INDICES DRM_IOW(DRM_COMMAND_BASE + DRM_R128_INDICES, drm_r128_indices_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_R128_INDICES DRM_IOW(DRM_COMMAND_BASE + DRM_R128_INDICES, drm_r128_indices_t)
#define DRM_IOCTL_R128_BLIT DRM_IOW(DRM_COMMAND_BASE + DRM_R128_BLIT, drm_r128_blit_t)
#define DRM_IOCTL_R128_DEPTH DRM_IOW(DRM_COMMAND_BASE + DRM_R128_DEPTH, drm_r128_depth_t)
#define DRM_IOCTL_R128_STIPPLE DRM_IOW(DRM_COMMAND_BASE + DRM_R128_STIPPLE, drm_r128_stipple_t)
-#define DRM_IOCTL_R128_INDIRECT DRM_IOWR(DRM_COMMAND_BASE + DRM_R128_INDIRECT, drm_r128_indirect_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_R128_INDIRECT DRM_IOWR(DRM_COMMAND_BASE + DRM_R128_INDIRECT, drm_r128_indirect_t)
#define DRM_IOCTL_R128_FULLSCREEN DRM_IOW(DRM_COMMAND_BASE + DRM_R128_FULLSCREEN, drm_r128_fullscreen_t)
#define DRM_IOCTL_R128_CLEAR2 DRM_IOW(DRM_COMMAND_BASE + DRM_R128_CLEAR2, drm_r128_clear2_t)
#define DRM_IOCTL_R128_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_R128_GETPARAM, drm_r128_getparam_t)
-#define DRM_IOCTL_R128_FLIP DRM_IO(DRM_COMMAND_BASE + DRM_R128_FLIP)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_R128_FLIP DRM_IO(DRM_COMMAND_BASE + DRM_R128_FLIP)
typedef struct drm_r128_init {
enum {
R128_INIT_CCE = 0x01,
- R128_CLEANUP_CCE = 0x02
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ R128_CLEANUP_CCE = 0x02
} func;
unsigned long sarea_priv_offset;
int is_pci;
- int cce_mode;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int cce_mode;
int cce_secure;
int ring_size;
int usec_timeout;
- unsigned int fb_bpp;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int fb_bpp;
unsigned int front_offset, front_pitch;
unsigned int back_offset, back_pitch;
unsigned int depth_bpp;
- unsigned int depth_offset, depth_pitch;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int depth_offset, depth_pitch;
unsigned int span_offset;
unsigned long fb_offset;
unsigned long mmio_offset;
- unsigned long ring_offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned long ring_offset;
unsigned long ring_rptr_offset;
unsigned long buffers_offset;
unsigned long agp_textures_offset;
-} drm_r128_init_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_init_t;
typedef struct drm_r128_cce_stop {
int flush;
int idle;
-} drm_r128_cce_stop_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_cce_stop_t;
typedef struct drm_r128_clear {
unsigned int flags;
unsigned int clear_color;
- unsigned int clear_depth;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int clear_depth;
unsigned int color_mask;
unsigned int depth_mask;
} drm_r128_clear_t;
-typedef struct drm_r128_vertex {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_r128_vertex {
int prim;
int idx;
int count;
- int discard;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int discard;
} drm_r128_vertex_t;
typedef struct drm_r128_indices {
int prim;
- int idx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int idx;
int start;
int end;
int discard;
-} drm_r128_indices_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_indices_t;
typedef struct drm_r128_blit {
int idx;
int pitch;
- int offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int offset;
int format;
unsigned short x, y;
unsigned short width, height;
-} drm_r128_blit_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_blit_t;
typedef struct drm_r128_depth {
enum {
R128_WRITE_SPAN = 0x01,
- R128_WRITE_PIXELS = 0x02,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ R128_WRITE_PIXELS = 0x02,
R128_READ_SPAN = 0x03,
R128_READ_PIXELS = 0x04
} func;
- int n;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int n;
int __user * x;
int __user * y;
unsigned int __user * buffer;
- unsigned char __user * mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char __user * mask;
} drm_r128_depth_t;
typedef struct drm_r128_stipple {
unsigned int __user * mask;
-} drm_r128_stipple_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_stipple_t;
typedef struct drm_r128_indirect {
int idx;
int start;
- int end;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int end;
int discard;
} drm_r128_indirect_t;
typedef struct drm_r128_fullscreen {
- enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ enum {
R128_INIT_FULLSCREEN = 0x01,
R128_CLEANUP_FULLSCREEN = 0x02
} func;
-} drm_r128_fullscreen_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} drm_r128_fullscreen_t;
#define R128_PARAM_IRQ_NR 1
typedef struct drm_r128_getparam {
int param;
- void __user * value;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ void __user * value;
} drm_r128_getparam_t;
#endif
diff --git a/libc/kernel/uapi/drm/radeon_drm.h b/libc/kernel/uapi/drm/radeon_drm.h
index 6fb86f1aa..d85309f20 100644
--- a/libc/kernel/uapi/drm/radeon_drm.h
+++ b/libc/kernel/uapi/drm/radeon_drm.h
@@ -18,7 +18,7 @@
****************************************************************************/
#ifndef __RADEON_DRM_H__
#define __RADEON_DRM_H__
-#include <drm/drm.h>
+#include "drm.h"
#ifndef __RADEON_SAREA_DEFINES__
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __RADEON_SAREA_DEFINES__
@@ -961,29 +961,36 @@ struct drm_radeon_cs {
#define RADEON_INFO_GTT_USAGE 0x1f
#define RADEON_INFO_ACTIVE_CU_COUNT 0x20
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RADEON_INFO_CURRENT_GPU_TEMP 0x21
+#define RADEON_INFO_CURRENT_GPU_SCLK 0x22
+#define RADEON_INFO_CURRENT_GPU_MCLK 0x23
+#define RADEON_INFO_READ_REG 0x24
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RADEON_INFO_VA_UNMAP_WORKING 0x25
+#define RADEON_INFO_GPU_RESET_COUNTER 0x26
struct drm_radeon_info {
uint32_t request;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t pad;
uint64_t value;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define SI_TILE_MODE_COLOR_LINEAR_ALIGNED 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TILE_MODE_COLOR_1D 13
#define SI_TILE_MODE_COLOR_1D_SCANOUT 9
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TILE_MODE_COLOR_2D_8BPP 14
#define SI_TILE_MODE_COLOR_2D_16BPP 15
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TILE_MODE_COLOR_2D_32BPP 16
#define SI_TILE_MODE_COLOR_2D_64BPP 17
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TILE_MODE_COLOR_2D_SCANOUT_16BPP 11
#define SI_TILE_MODE_COLOR_2D_SCANOUT_32BPP 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TILE_MODE_DEPTH_STENCIL_1D 4
#define SI_TILE_MODE_DEPTH_STENCIL_2D 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TILE_MODE_DEPTH_STENCIL_2D_2AA 3
#define SI_TILE_MODE_DEPTH_STENCIL_2D_4AA 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SI_TILE_MODE_DEPTH_STENCIL_2D_8AA 2
#define CIK_TILE_MODE_DEPTH_STENCIL_1D 5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/drm/savage_drm.h b/libc/kernel/uapi/drm/savage_drm.h
index db873b61d..eba99a3bc 100644
--- a/libc/kernel/uapi/drm/savage_drm.h
+++ b/libc/kernel/uapi/drm/savage_drm.h
@@ -18,166 +18,167 @@
****************************************************************************/
#ifndef __SAVAGE_DRM_H__
#define __SAVAGE_DRM_H__
+#include <drm/drm.h>
#ifndef __SAVAGE_SAREA_DEFINES__
-#define __SAVAGE_SAREA_DEFINES__
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __SAVAGE_SAREA_DEFINES__
#define SAVAGE_CARD_HEAP 0
#define SAVAGE_AGP_HEAP 1
#define SAVAGE_NR_TEX_HEAPS 2
-#define SAVAGE_NR_TEX_REGIONS 16
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_NR_TEX_REGIONS 16
#define SAVAGE_LOG_MIN_TEX_REGION_SIZE 16
#endif
typedef struct _drm_savage_sarea {
- struct drm_tex_region texList[SAVAGE_NR_TEX_HEAPS][SAVAGE_NR_TEX_REGIONS + 1];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_tex_region texList[SAVAGE_NR_TEX_HEAPS][SAVAGE_NR_TEX_REGIONS + 1];
unsigned int texAge[SAVAGE_NR_TEX_HEAPS];
int ctxOwner;
} drm_savage_sarea_t, * drm_savage_sarea_ptr;
-#define DRM_SAVAGE_BCI_INIT 0x00
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_SAVAGE_BCI_INIT 0x00
#define DRM_SAVAGE_BCI_CMDBUF 0x01
#define DRM_SAVAGE_BCI_EVENT_EMIT 0x02
#define DRM_SAVAGE_BCI_EVENT_WAIT 0x03
-#define DRM_IOCTL_SAVAGE_BCI_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_INIT, drm_savage_init_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_SAVAGE_BCI_INIT DRM_IOW(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_INIT, drm_savage_init_t)
#define DRM_IOCTL_SAVAGE_BCI_CMDBUF DRM_IOW(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_CMDBUF, drm_savage_cmdbuf_t)
#define DRM_IOCTL_SAVAGE_BCI_EVENT_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_EMIT, drm_savage_event_emit_t)
#define DRM_IOCTL_SAVAGE_BCI_EVENT_WAIT DRM_IOW(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_WAIT, drm_savage_event_wait_t)
-#define SAVAGE_DMA_PCI 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_DMA_PCI 1
#define SAVAGE_DMA_AGP 3
typedef struct drm_savage_init {
enum {
- SAVAGE_INIT_BCI = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SAVAGE_INIT_BCI = 1,
SAVAGE_CLEANUP_BCI = 2
} func;
unsigned int sarea_priv_offset;
- unsigned int cob_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int cob_size;
unsigned int bci_threshold_lo, bci_threshold_hi;
unsigned int dma_type;
unsigned int fb_bpp;
- unsigned int front_offset, front_pitch;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int front_offset, front_pitch;
unsigned int back_offset, back_pitch;
unsigned int depth_bpp;
unsigned int depth_offset, depth_pitch;
- unsigned int texture_offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int texture_offset;
unsigned int texture_size;
unsigned long status_offset;
unsigned long buffers_offset;
- unsigned long agp_textures_offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned long agp_textures_offset;
unsigned long cmd_dma_offset;
} drm_savage_init_t;
typedef union drm_savage_cmd_header drm_savage_cmd_header_t;
-typedef struct drm_savage_cmdbuf {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct drm_savage_cmdbuf {
drm_savage_cmd_header_t __user * cmd_addr;
unsigned int size;
unsigned int dma_idx;
- int discard;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int discard;
unsigned int __user * vb_addr;
unsigned int vb_size;
unsigned int vb_stride;
- struct drm_clip_rect __user * box_addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_clip_rect __user * box_addr;
unsigned int nbox;
} drm_savage_cmdbuf_t;
#define SAVAGE_WAIT_2D 0x1
-#define SAVAGE_WAIT_3D 0x2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_WAIT_3D 0x2
#define SAVAGE_WAIT_IRQ 0x4
typedef struct drm_savage_event {
unsigned int count;
- unsigned int flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int flags;
} drm_savage_event_emit_t, drm_savage_event_wait_t;
#define SAVAGE_CMD_STATE 0
#define SAVAGE_CMD_DMA_PRIM 1
-#define SAVAGE_CMD_VB_PRIM 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_CMD_VB_PRIM 2
#define SAVAGE_CMD_DMA_IDX 3
#define SAVAGE_CMD_VB_IDX 4
#define SAVAGE_CMD_CLEAR 5
-#define SAVAGE_CMD_SWAP 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_CMD_SWAP 6
#define SAVAGE_PRIM_TRILIST 0
#define SAVAGE_PRIM_TRISTRIP 1
#define SAVAGE_PRIM_TRIFAN 2
-#define SAVAGE_PRIM_TRILIST_201 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_PRIM_TRILIST_201 3
#define SAVAGE_SKIP_Z 0x01
#define SAVAGE_SKIP_W 0x02
#define SAVAGE_SKIP_C0 0x04
-#define SAVAGE_SKIP_C1 0x08
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_SKIP_C1 0x08
#define SAVAGE_SKIP_S0 0x10
#define SAVAGE_SKIP_T0 0x20
#define SAVAGE_SKIP_ST0 0x30
-#define SAVAGE_SKIP_S1 0x40
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_SKIP_S1 0x40
#define SAVAGE_SKIP_T1 0x80
#define SAVAGE_SKIP_ST1 0xc0
#define SAVAGE_SKIP_ALL_S3D 0x3f
-#define SAVAGE_SKIP_ALL_S4 0xff
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SAVAGE_SKIP_ALL_S4 0xff
#define SAVAGE_FRONT 0x1
#define SAVAGE_BACK 0x2
#define SAVAGE_DEPTH 0x4
-union drm_savage_cmd_header {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+union drm_savage_cmd_header {
struct {
unsigned char cmd;
unsigned char pad0;
- unsigned short pad1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short pad1;
unsigned short pad2;
unsigned short pad3;
} cmd;
- struct {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
unsigned char cmd;
unsigned char global;
unsigned short count;
- unsigned short start;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short start;
unsigned short pad3;
} state;
struct {
- unsigned char cmd;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char cmd;
unsigned char prim;
unsigned short skip;
unsigned short count;
- unsigned short start;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short start;
} prim;
struct {
unsigned char cmd;
- unsigned char prim;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char prim;
unsigned short skip;
unsigned short count;
unsigned short pad3;
- } idx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } idx;
struct {
unsigned char cmd;
unsigned char pad0;
- unsigned short pad1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short pad1;
unsigned int flags;
} clear0;
struct {
- unsigned int mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int mask;
unsigned int value;
} clear1;
};
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/drm/sis_drm.h b/libc/kernel/uapi/drm/sis_drm.h
index 5a9e8683d..52054c4dd 100644
--- a/libc/kernel/uapi/drm/sis_drm.h
+++ b/libc/kernel/uapi/drm/sis_drm.h
@@ -51,8 +51,4 @@ typedef struct {
unsigned long offset, size;
} drm_sis_fb_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct sis_file_private {
- struct list_head obj_list;
-};
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/drm/tegra_drm.h b/libc/kernel/uapi/drm/tegra_drm.h
index e207c0c58..e5d8b6763 100644
--- a/libc/kernel/uapi/drm/tegra_drm.h
+++ b/libc/kernel/uapi/drm/tegra_drm.h
@@ -31,168 +31,169 @@ struct drm_tegra_gem_create {
struct drm_tegra_gem_mmap {
__u32 handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 offset;
+ __u32 pad;
+ __u64 offset;
};
struct drm_tegra_syncpt_read {
- __u32 id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 id;
__u32 value;
};
struct drm_tegra_syncpt_incr {
- __u32 id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 id;
__u32 pad;
};
struct drm_tegra_syncpt_wait {
- __u32 id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 id;
__u32 thresh;
__u32 timeout;
__u32 value;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define DRM_TEGRA_NO_TIMEOUT (0xffffffff)
struct drm_tegra_open_channel {
__u32 client;
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
__u64 context;
};
struct drm_tegra_close_channel {
- __u64 context;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 context;
};
struct drm_tegra_get_syncpt {
__u64 context;
- __u32 index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 index;
__u32 id;
};
struct drm_tegra_get_syncpt_base {
- __u64 context;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 context;
__u32 syncpt;
__u32 id;
};
-struct drm_tegra_syncpt {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_tegra_syncpt {
__u32 id;
__u32 incrs;
};
-struct drm_tegra_cmdbuf {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_tegra_cmdbuf {
__u32 handle;
__u32 offset;
__u32 words;
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
};
struct drm_tegra_reloc {
struct {
- __u32 handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 handle;
__u32 offset;
} cmdbuf;
struct {
- __u32 handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 handle;
__u32 offset;
} target;
__u32 shift;
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
};
struct drm_tegra_waitchk {
__u32 handle;
- __u32 offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 offset;
__u32 syncpt;
__u32 thresh;
};
-struct drm_tegra_submit {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_tegra_submit {
__u64 context;
__u32 num_syncpts;
__u32 num_cmdbufs;
- __u32 num_relocs;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 num_relocs;
__u32 num_waitchks;
__u32 waitchk_mask;
__u32 timeout;
- __u64 syncpts;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 syncpts;
__u64 cmdbufs;
__u64 relocs;
__u64 waitchks;
- __u32 fence;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 fence;
__u32 reserved[5];
};
#define DRM_TEGRA_GEM_TILING_MODE_PITCH 0
-#define DRM_TEGRA_GEM_TILING_MODE_TILED 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_TEGRA_GEM_TILING_MODE_TILED 1
#define DRM_TEGRA_GEM_TILING_MODE_BLOCK 2
struct drm_tegra_gem_set_tiling {
__u32 handle;
- __u32 mode;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 mode;
__u32 value;
__u32 pad;
};
-struct drm_tegra_gem_get_tiling {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_tegra_gem_get_tiling {
__u32 handle;
__u32 mode;
__u32 value;
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
};
#define DRM_TEGRA_GEM_BOTTOM_UP (1 << 0)
#define DRM_TEGRA_GEM_FLAGS (DRM_TEGRA_GEM_BOTTOM_UP)
-struct drm_tegra_gem_set_flags {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_tegra_gem_set_flags {
__u32 handle;
__u32 flags;
};
-struct drm_tegra_gem_get_flags {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_tegra_gem_get_flags {
__u32 handle;
__u32 flags;
};
-#define DRM_TEGRA_GEM_CREATE 0x00
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_TEGRA_GEM_CREATE 0x00
#define DRM_TEGRA_GEM_MMAP 0x01
#define DRM_TEGRA_SYNCPT_READ 0x02
#define DRM_TEGRA_SYNCPT_INCR 0x03
-#define DRM_TEGRA_SYNCPT_WAIT 0x04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_TEGRA_SYNCPT_WAIT 0x04
#define DRM_TEGRA_OPEN_CHANNEL 0x05
#define DRM_TEGRA_CLOSE_CHANNEL 0x06
#define DRM_TEGRA_GET_SYNCPT 0x07
-#define DRM_TEGRA_SUBMIT 0x08
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_TEGRA_SUBMIT 0x08
#define DRM_TEGRA_GET_SYNCPT_BASE 0x09
#define DRM_TEGRA_GEM_SET_TILING 0x0a
#define DRM_TEGRA_GEM_GET_TILING 0x0b
-#define DRM_TEGRA_GEM_SET_FLAGS 0x0c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_TEGRA_GEM_SET_FLAGS 0x0c
#define DRM_TEGRA_GEM_GET_FLAGS 0x0d
#define DRM_IOCTL_TEGRA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_CREATE, struct drm_tegra_gem_create)
#define DRM_IOCTL_TEGRA_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_MMAP, struct drm_tegra_gem_mmap)
-#define DRM_IOCTL_TEGRA_SYNCPT_READ DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_READ, struct drm_tegra_syncpt_read)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_TEGRA_SYNCPT_READ DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_READ, struct drm_tegra_syncpt_read)
#define DRM_IOCTL_TEGRA_SYNCPT_INCR DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_INCR, struct drm_tegra_syncpt_incr)
#define DRM_IOCTL_TEGRA_SYNCPT_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SYNCPT_WAIT, struct drm_tegra_syncpt_wait)
#define DRM_IOCTL_TEGRA_OPEN_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_OPEN_CHANNEL, struct drm_tegra_open_channel)
-#define DRM_IOCTL_TEGRA_CLOSE_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_CLOSE_CHANNEL, struct drm_tegra_open_channel)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_TEGRA_CLOSE_CHANNEL DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_CLOSE_CHANNEL, struct drm_tegra_open_channel)
#define DRM_IOCTL_TEGRA_GET_SYNCPT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT, struct drm_tegra_get_syncpt)
#define DRM_IOCTL_TEGRA_SUBMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_SUBMIT, struct drm_tegra_submit)
#define DRM_IOCTL_TEGRA_GET_SYNCPT_BASE DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GET_SYNCPT_BASE, struct drm_tegra_get_syncpt_base)
-#define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_TEGRA_GEM_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_TILING, struct drm_tegra_gem_set_tiling)
#define DRM_IOCTL_TEGRA_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_TILING, struct drm_tegra_gem_get_tiling)
#define DRM_IOCTL_TEGRA_GEM_SET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_SET_FLAGS, struct drm_tegra_gem_set_flags)
#define DRM_IOCTL_TEGRA_GEM_GET_FLAGS DRM_IOWR(DRM_COMMAND_BASE + DRM_TEGRA_GEM_GET_FLAGS, struct drm_tegra_gem_get_flags)
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/drm/via_drm.h b/libc/kernel/uapi/drm/via_drm.h
index 8be086c04..18ac0b668 100644
--- a/libc/kernel/uapi/drm/via_drm.h
+++ b/libc/kernel/uapi/drm/via_drm.h
@@ -238,8 +238,4 @@ typedef struct drm_via_dmablit {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
drm_via_blitsync_t sync;
} drm_via_dmablit_t;
-struct via_file_private {
- struct list_head obj_list;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-};
#endif
diff --git a/libc/kernel/uapi/drm/virtgpu_drm.h b/libc/kernel/uapi/drm/virtgpu_drm.h
new file mode 100644
index 000000000..94a82d1c1
--- /dev/null
+++ b/libc/kernel/uapi/drm/virtgpu_drm.h
@@ -0,0 +1,136 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef VIRTGPU_DRM_H
+#define VIRTGPU_DRM_H
+#include <stddef.h>
+#include "drm/drm.h"
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VIRTGPU_MAP 0x01
+#define DRM_VIRTGPU_EXECBUFFER 0x02
+#define DRM_VIRTGPU_GETPARAM 0x03
+#define DRM_VIRTGPU_RESOURCE_CREATE 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VIRTGPU_RESOURCE_INFO 0x05
+#define DRM_VIRTGPU_TRANSFER_FROM_HOST 0x06
+#define DRM_VIRTGPU_TRANSFER_TO_HOST 0x07
+#define DRM_VIRTGPU_WAIT 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VIRTGPU_GET_CAPS 0x09
+struct drm_virtgpu_map {
+ uint64_t offset;
+ uint32_t handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t pad;
+};
+struct drm_virtgpu_execbuffer {
+ uint32_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t size;
+ uint64_t command;
+ uint64_t bo_handles;
+ uint32_t num_bo_handles;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t pad;
+};
+#define VIRTGPU_PARAM_3D_FEATURES 1
+struct drm_virtgpu_getparam {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t param;
+ uint64_t value;
+};
+struct drm_virtgpu_resource_create {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t target;
+ uint32_t format;
+ uint32_t bind;
+ uint32_t width;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t height;
+ uint32_t depth;
+ uint32_t array_size;
+ uint32_t last_level;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t nr_samples;
+ uint32_t flags;
+ uint32_t bo_handle;
+ uint32_t res_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t size;
+ uint32_t stride;
+};
+struct drm_virtgpu_resource_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t bo_handle;
+ uint32_t res_handle;
+ uint32_t size;
+ uint32_t stride;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct drm_virtgpu_3d_box {
+ uint32_t x;
+ uint32_t y;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t z;
+ uint32_t w;
+ uint32_t h;
+ uint32_t d;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct drm_virtgpu_3d_transfer_to_host {
+ uint32_t bo_handle;
+ struct drm_virtgpu_3d_box box;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t level;
+ uint32_t offset;
+};
+struct drm_virtgpu_3d_transfer_from_host {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t bo_handle;
+ struct drm_virtgpu_3d_box box;
+ uint32_t level;
+ uint32_t offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define VIRTGPU_WAIT_NOWAIT 1
+struct drm_virtgpu_3d_wait {
+ uint32_t handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t flags;
+};
+struct drm_virtgpu_get_caps {
+ uint32_t cap_set_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t cap_set_ver;
+ uint64_t addr;
+ uint32_t size;
+ uint32_t pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define DRM_IOCTL_VIRTGPU_MAP DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map)
+#define DRM_IOCTL_VIRTGPU_EXECBUFFER DRM_IOW(DRM_COMMAND_BASE + DRM_VIRTGPU_EXECBUFFER, struct drm_virtgpu_execbuffer)
+#define DRM_IOCTL_VIRTGPU_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_GETPARAM, struct drm_virtgpu_getparam)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_VIRTGPU_RESOURCE_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_RESOURCE_CREATE, struct drm_virtgpu_resource_create)
+#define DRM_IOCTL_VIRTGPU_RESOURCE_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_RESOURCE_INFO, struct drm_virtgpu_resource_info)
+#define DRM_IOCTL_VIRTGPU_TRANSFER_FROM_HOST DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_TRANSFER_FROM_HOST, struct drm_virtgpu_3d_transfer_from_host)
+#define DRM_IOCTL_VIRTGPU_TRANSFER_TO_HOST DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_TRANSFER_TO_HOST, struct drm_virtgpu_3d_transfer_to_host)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_IOCTL_VIRTGPU_WAIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_WAIT, struct drm_virtgpu_3d_wait)
+#define DRM_IOCTL_VIRTGPU_GET_CAPS DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_GET_CAPS, struct drm_virtgpu_get_caps)
+#endif
diff --git a/libc/kernel/uapi/drm/vmwgfx_drm.h b/libc/kernel/uapi/drm/vmwgfx_drm.h
index c12cdd10b..26762ab46 100644
--- a/libc/kernel/uapi/drm/vmwgfx_drm.h
+++ b/libc/kernel/uapi/drm/vmwgfx_drm.h
@@ -54,244 +54,249 @@
#define DRM_VMW_GB_SURFACE_CREATE 23
#define DRM_VMW_GB_SURFACE_REF 24
#define DRM_VMW_SYNCCPU 25
-#define DRM_VMW_PARAM_NUM_STREAMS 0
+#define DRM_VMW_CREATE_EXTENDED_CONTEXT 26
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_PARAM_NUM_STREAMS 0
#define DRM_VMW_PARAM_NUM_FREE_STREAMS 1
#define DRM_VMW_PARAM_3D 2
#define DRM_VMW_PARAM_HW_CAPS 3
-#define DRM_VMW_PARAM_FIFO_CAPS 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_PARAM_FIFO_CAPS 4
#define DRM_VMW_PARAM_MAX_FB_SIZE 5
#define DRM_VMW_PARAM_FIFO_HW_VERSION 6
#define DRM_VMW_PARAM_MAX_SURF_MEMORY 7
-#define DRM_VMW_PARAM_3D_CAPS_SIZE 8
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_PARAM_3D_CAPS_SIZE 8
#define DRM_VMW_PARAM_MAX_MOB_MEMORY 9
#define DRM_VMW_PARAM_MAX_MOB_SIZE 10
+#define DRM_VMW_PARAM_SCREEN_TARGET 11
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_PARAM_DX 12
enum drm_vmw_handle_type {
DRM_VMW_HANDLE_LEGACY = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DRM_VMW_HANDLE_PRIME = 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct drm_vmw_getparam_arg {
uint64_t value;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t param;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t pad64;
};
struct drm_vmw_context_arg {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int32_t cid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t pad64;
};
struct drm_vmw_surface_create_req {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t format;
uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES];
uint64_t size_addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int32_t shareable;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int32_t scanout;
};
struct drm_vmw_surface_arg {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int32_t sid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum drm_vmw_handle_type handle_type;
};
struct drm_vmw_size {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t width;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t height;
uint32_t depth;
uint32_t pad64;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union drm_vmw_surface_create_arg {
struct drm_vmw_surface_arg rep;
struct drm_vmw_surface_create_req req;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union drm_vmw_surface_reference_arg {
struct drm_vmw_surface_create_req rep;
struct drm_vmw_surface_arg req;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
-#define DRM_VMW_EXECBUF_VERSION 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_EXECBUF_VERSION 2
struct drm_vmw_execbuf_arg {
uint64_t commands;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t command_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t throttle_us;
uint64_t fence_rep;
uint32_t version;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t context_handle;
+ uint32_t pad64;
};
struct drm_vmw_fence_rep {
- uint32_t handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t handle;
uint32_t mask;
uint32_t seqno;
uint32_t passed_seqno;
- uint32_t pad64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t pad64;
int32_t error;
};
struct drm_vmw_alloc_dmabuf_req {
- uint32_t size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t size;
uint32_t pad64;
};
struct drm_vmw_dmabuf_rep {
- uint64_t map_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t map_handle;
uint32_t handle;
uint32_t cur_gmr_id;
uint32_t cur_gmr_offset;
- uint32_t pad64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t pad64;
};
union drm_vmw_alloc_dmabuf_arg {
struct drm_vmw_alloc_dmabuf_req req;
- struct drm_vmw_dmabuf_rep rep;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct drm_vmw_dmabuf_rep rep;
};
struct drm_vmw_unref_dmabuf_arg {
uint32_t handle;
- uint32_t pad64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t pad64;
};
struct drm_vmw_rect {
int32_t x;
- int32_t y;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int32_t y;
uint32_t w;
uint32_t h;
};
-struct drm_vmw_control_stream_arg {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_vmw_control_stream_arg {
uint32_t stream_id;
uint32_t enabled;
uint32_t flags;
- uint32_t color_key;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t color_key;
uint32_t handle;
uint32_t offset;
int32_t format;
- uint32_t size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t size;
uint32_t width;
uint32_t height;
uint32_t pitch[3];
- uint32_t pad64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t pad64;
struct drm_vmw_rect src;
struct drm_vmw_rect dst;
};
-#define DRM_VMW_CURSOR_BYPASS_ALL (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_CURSOR_BYPASS_ALL (1 << 0)
#define DRM_VMW_CURSOR_BYPASS_FLAGS (1)
struct drm_vmw_cursor_bypass_arg {
uint32_t flags;
- uint32_t crtc_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t crtc_id;
int32_t xpos;
int32_t ypos;
int32_t xhot;
- int32_t yhot;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int32_t yhot;
};
struct drm_vmw_stream_arg {
uint32_t stream_id;
- uint32_t pad64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t pad64;
};
struct drm_vmw_get_3d_cap_arg {
uint64_t buffer;
- uint32_t max_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t max_size;
uint32_t pad64;
};
#define DRM_VMW_FENCE_FLAG_EXEC (1 << 0)
-#define DRM_VMW_FENCE_FLAG_QUERY (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_FENCE_FLAG_QUERY (1 << 1)
#define DRM_VMW_WAIT_OPTION_UNREF (1 << 0)
struct drm_vmw_fence_wait_arg {
uint32_t handle;
- int32_t cookie_valid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int32_t cookie_valid;
uint64_t kernel_cookie;
uint64_t timeout_us;
int32_t lazy;
- int32_t flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int32_t flags;
int32_t wait_options;
int32_t pad64;
};
-struct drm_vmw_fence_signaled_arg {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_vmw_fence_signaled_arg {
uint32_t handle;
uint32_t flags;
int32_t signaled;
- uint32_t passed_seqno;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t passed_seqno;
uint32_t signaled_flags;
uint32_t pad64;
};
-struct drm_vmw_fence_arg {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_vmw_fence_arg {
uint32_t handle;
uint32_t pad64;
};
-#define DRM_VMW_EVENT_FENCE_SIGNALED 0x80000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DRM_VMW_EVENT_FENCE_SIGNALED 0x80000000
struct drm_vmw_event_fence {
struct drm_event base;
uint64_t user_data;
- uint32_t tv_sec;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t tv_sec;
uint32_t tv_usec;
};
#define DRM_VMW_FE_FLAG_REQ_TIME (1 << 0)
-struct drm_vmw_fence_event_arg {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct drm_vmw_fence_event_arg {
uint64_t fence_rep;
uint64_t user_data;
uint32_t handle;
- uint32_t flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t flags;
};
struct drm_vmw_present_arg {
uint32_t fb_id;
- uint32_t sid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t sid;
int32_t dest_x;
int32_t dest_y;
uint64_t clips_ptr;
- uint32_t num_clips;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t num_clips;
uint32_t pad64;
};
struct drm_vmw_present_readback_arg {
- uint32_t fb_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t fb_id;
uint32_t num_clips;
uint64_t clips_ptr;
uint64_t fence_rep;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct drm_vmw_update_layout_arg {
uint32_t num_outputs;
uint32_t pad64;
- uint64_t rects;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t rects;
};
enum drm_vmw_shader_type {
drm_vmw_shader_type_vs = 0,
- drm_vmw_shader_type_ps,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- drm_vmw_shader_type_gs
+ drm_vmw_shader_type_ps,
};
struct drm_vmw_shader_create_arg {
enum drm_vmw_shader_type shader_type;
@@ -323,7 +328,7 @@ struct drm_vmw_gb_surface_create_req {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t autogen_filter;
uint32_t buffer_handle;
- uint32_t pad64;
+ uint32_t array_size;
struct drm_vmw_size base_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
@@ -371,4 +376,14 @@ struct drm_vmw_synccpu_arg {
uint32_t pad64;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum drm_vmw_extended_context {
+ drm_vmw_context_legacy,
+ drm_vmw_context_dx
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+union drm_vmw_extended_context_arg {
+ enum drm_vmw_extended_context req;
+ struct drm_vmw_context_arg rep;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/am437x-vpfe.h b/libc/kernel/uapi/linux/am437x-vpfe.h
new file mode 100644
index 000000000..6a71994ba
--- /dev/null
+++ b/libc/kernel/uapi/linux/am437x-vpfe.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef AM437X_VPFE_USER_H
+#define AM437X_VPFE_USER_H
+#include <linux/videodev2.h>
+enum vpfe_ccdc_data_size {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VPFE_CCDC_DATA_16BITS = 0,
+ VPFE_CCDC_DATA_15BITS,
+ VPFE_CCDC_DATA_14BITS,
+ VPFE_CCDC_DATA_13BITS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VPFE_CCDC_DATA_12BITS,
+ VPFE_CCDC_DATA_11BITS,
+ VPFE_CCDC_DATA_10BITS,
+ VPFE_CCDC_DATA_8BITS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum vpfe_ccdc_sample_length {
+ VPFE_CCDC_SAMPLE_1PIXELS = 0,
+ VPFE_CCDC_SAMPLE_2PIXELS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VPFE_CCDC_SAMPLE_4PIXELS,
+ VPFE_CCDC_SAMPLE_8PIXELS,
+ VPFE_CCDC_SAMPLE_16PIXELS,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum vpfe_ccdc_sample_line {
+ VPFE_CCDC_SAMPLE_1LINES = 0,
+ VPFE_CCDC_SAMPLE_2LINES,
+ VPFE_CCDC_SAMPLE_4LINES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VPFE_CCDC_SAMPLE_8LINES,
+ VPFE_CCDC_SAMPLE_16LINES,
+};
+enum vpfe_ccdc_gamma_width {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VPFE_CCDC_GAMMA_BITS_15_6 = 0,
+ VPFE_CCDC_GAMMA_BITS_14_5,
+ VPFE_CCDC_GAMMA_BITS_13_4,
+ VPFE_CCDC_GAMMA_BITS_12_3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VPFE_CCDC_GAMMA_BITS_11_2,
+ VPFE_CCDC_GAMMA_BITS_10_1,
+ VPFE_CCDC_GAMMA_BITS_09_0,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct vpfe_ccdc_a_law {
+ unsigned char enable;
+ enum vpfe_ccdc_gamma_width gamma_wd;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct vpfe_ccdc_black_clamp {
+ unsigned char enable;
+ enum vpfe_ccdc_sample_length sample_pixel;
+ enum vpfe_ccdc_sample_line sample_ln;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short start_pixel;
+ unsigned short sgain;
+ unsigned short dc_sub;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct vpfe_ccdc_black_compensation {
+ char r;
+ char gr;
+ char b;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char gb;
+};
+struct vpfe_ccdc_config_params_raw {
+ enum vpfe_ccdc_data_size data_sz;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct vpfe_ccdc_a_law alaw;
+ struct vpfe_ccdc_black_clamp blk_clamp;
+ struct vpfe_ccdc_black_compensation blk_comp;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIDIOC_AM437X_CCDC_CFG _IOW('V', BASE_VIDIOC_PRIVATE + 1, void *)
+#endif
diff --git a/libc/kernel/uapi/linux/android/binder.h b/libc/kernel/uapi/linux/android/binder.h
new file mode 100644
index 000000000..6d465aed5
--- /dev/null
+++ b/libc/kernel/uapi/linux/android/binder.h
@@ -0,0 +1,191 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_BINDER_H
+#define _UAPI_LINUX_BINDER_H
+#include <linux/types.h>
+#include <linux/ioctl.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define B_PACK_CHARS(c1,c2,c3,c4) ((((c1) << 24)) | (((c2) << 16)) | (((c3) << 8)) | (c4))
+#define B_TYPE_LARGE 0x85
+enum {
+ BINDER_TYPE_BINDER = B_PACK_CHARS('s', 'b', '*', B_TYPE_LARGE),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BINDER_TYPE_WEAK_BINDER = B_PACK_CHARS('w', 'b', '*', B_TYPE_LARGE),
+ BINDER_TYPE_HANDLE = B_PACK_CHARS('s', 'h', '*', B_TYPE_LARGE),
+ BINDER_TYPE_WEAK_HANDLE = B_PACK_CHARS('w', 'h', '*', B_TYPE_LARGE),
+ BINDER_TYPE_FD = B_PACK_CHARS('f', 'd', '*', B_TYPE_LARGE),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ FLAT_BINDER_FLAG_PRIORITY_MASK = 0xff,
+ FLAT_BINDER_FLAG_ACCEPTS_FDS = 0x100,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#ifdef BINDER_IPC_32BIT
+typedef __u32 binder_size_t;
+typedef __u32 binder_uintptr_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#else
+typedef __u64 binder_size_t;
+typedef __u64 binder_uintptr_t;
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct flat_binder_object {
+ __u32 type;
+ __u32 flags;
+ union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ binder_uintptr_t binder;
+ __u32 handle;
+ };
+ binder_uintptr_t cookie;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct binder_write_read {
+ binder_size_t write_size;
+ binder_size_t write_consumed;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ binder_uintptr_t write_buffer;
+ binder_size_t read_size;
+ binder_size_t read_consumed;
+ binder_uintptr_t read_buffer;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct binder_version {
+ __s32 protocol_version;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifdef BINDER_IPC_32BIT
+#define BINDER_CURRENT_PROTOCOL_VERSION 7
+#else
+#define BINDER_CURRENT_PROTOCOL_VERSION 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read)
+#define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, __s64)
+#define BINDER_SET_MAX_THREADS _IOW('b', 5, __u32)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BINDER_SET_IDLE_PRIORITY _IOW('b', 6, __s32)
+#define BINDER_SET_CONTEXT_MGR _IOW('b', 7, __s32)
+#define BINDER_THREAD_EXIT _IOW('b', 8, __s32)
+#define BINDER_VERSION _IOWR('b', 9, struct binder_version)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum transaction_flags {
+ TF_ONE_WAY = 0x01,
+ TF_ROOT_OBJECT = 0x04,
+ TF_STATUS_CODE = 0x08,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TF_ACCEPT_FDS = 0x10,
+};
+struct binder_transaction_data {
+ union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 handle;
+ binder_uintptr_t ptr;
+ } target;
+ binder_uintptr_t cookie;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 code;
+ __u32 flags;
+ pid_t sender_pid;
+ uid_t sender_euid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ binder_size_t data_size;
+ binder_size_t offsets_size;
+ union {
+ struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ binder_uintptr_t buffer;
+ binder_uintptr_t offsets;
+ } ptr;
+ __u8 buf[8];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } data;
+};
+struct binder_ptr_cookie {
+ binder_uintptr_t ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ binder_uintptr_t cookie;
+};
+struct binder_handle_cookie {
+ __u32 handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ binder_uintptr_t cookie;
+} __packed;
+struct binder_pri_desc {
+ __s32 priority;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 desc;
+};
+struct binder_pri_ptr_cookie {
+ __s32 priority;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ binder_uintptr_t ptr;
+ binder_uintptr_t cookie;
+};
+enum binder_driver_return_protocol {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BR_ERROR = _IOR('r', 0, __s32),
+ BR_OK = _IO('r', 1),
+ BR_TRANSACTION = _IOR('r', 2, struct binder_transaction_data),
+ BR_REPLY = _IOR('r', 3, struct binder_transaction_data),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BR_ACQUIRE_RESULT = _IOR('r', 4, __s32),
+ BR_DEAD_REPLY = _IO('r', 5),
+ BR_TRANSACTION_COMPLETE = _IO('r', 6),
+ BR_INCREFS = _IOR('r', 7, struct binder_ptr_cookie),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BR_ACQUIRE = _IOR('r', 8, struct binder_ptr_cookie),
+ BR_RELEASE = _IOR('r', 9, struct binder_ptr_cookie),
+ BR_DECREFS = _IOR('r', 10, struct binder_ptr_cookie),
+ BR_ATTEMPT_ACQUIRE = _IOR('r', 11, struct binder_pri_ptr_cookie),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BR_NOOP = _IO('r', 12),
+ BR_SPAWN_LOOPER = _IO('r', 13),
+ BR_FINISHED = _IO('r', 14),
+ BR_DEAD_BINDER = _IOR('r', 15, binder_uintptr_t),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BR_CLEAR_DEATH_NOTIFICATION_DONE = _IOR('r', 16, binder_uintptr_t),
+ BR_FAILED_REPLY = _IO('r', 17),
+};
+enum binder_driver_command_protocol {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BC_TRANSACTION = _IOW('c', 0, struct binder_transaction_data),
+ BC_REPLY = _IOW('c', 1, struct binder_transaction_data),
+ BC_ACQUIRE_RESULT = _IOW('c', 2, __s32),
+ BC_FREE_BUFFER = _IOW('c', 3, binder_uintptr_t),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BC_INCREFS = _IOW('c', 4, __u32),
+ BC_ACQUIRE = _IOW('c', 5, __u32),
+ BC_RELEASE = _IOW('c', 6, __u32),
+ BC_DECREFS = _IOW('c', 7, __u32),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BC_INCREFS_DONE = _IOW('c', 8, struct binder_ptr_cookie),
+ BC_ACQUIRE_DONE = _IOW('c', 9, struct binder_ptr_cookie),
+ BC_ATTEMPT_ACQUIRE = _IOW('c', 10, struct binder_pri_desc),
+ BC_REGISTER_LOOPER = _IO('c', 11),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BC_ENTER_LOOPER = _IO('c', 12),
+ BC_EXIT_LOOPER = _IO('c', 13),
+ BC_REQUEST_DEATH_NOTIFICATION = _IOW('c', 14, struct binder_handle_cookie),
+ BC_CLEAR_DEATH_NOTIFICATION = _IOW('c', 15, struct binder_handle_cookie),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BC_DEAD_BINDER_DONE = _IOW('c', 16, binder_uintptr_t),
+};
+#endif
diff --git a/libc/kernel/uapi/linux/atm_zatm.h b/libc/kernel/uapi/linux/atm_zatm.h
index 34755bb7b..7f4419581 100644
--- a/libc/kernel/uapi/linux/atm_zatm.h
+++ b/libc/kernel/uapi/linux/atm_zatm.h
@@ -38,11 +38,6 @@ struct zatm_pool_req {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct zatm_pool_info info;
};
-struct zatm_t_hist {
- struct timeval real;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- struct timeval expected;
-};
#define ZATM_OAM_POOL 0
#define ZATM_AAL0_POOL 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/audit.h b/libc/kernel/uapi/linux/audit.h
index da6c74603..5c4389d9d 100644
--- a/libc/kernel/uapi/linux/audit.h
+++ b/libc/kernel/uapi/linux/audit.h
@@ -242,97 +242,107 @@
#define AUDIT_OBJ_GID 110
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define AUDIT_FIELD_COMPARE 111
+#define AUDIT_EXE 112
#define AUDIT_ARG0 200
#define AUDIT_ARG1 (AUDIT_ARG0 + 1)
-#define AUDIT_ARG2 (AUDIT_ARG0 + 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARG2 (AUDIT_ARG0 + 2)
#define AUDIT_ARG3 (AUDIT_ARG0 + 3)
#define AUDIT_FILTERKEY 210
#define AUDIT_NEGATE 0x80000000
-#define AUDIT_BIT_MASK 0x08000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_BIT_MASK 0x08000000
#define AUDIT_LESS_THAN 0x10000000
#define AUDIT_GREATER_THAN 0x20000000
#define AUDIT_NOT_EQUAL 0x30000000
-#define AUDIT_EQUAL 0x40000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_EQUAL 0x40000000
#define AUDIT_BIT_TEST (AUDIT_BIT_MASK | AUDIT_EQUAL)
#define AUDIT_LESS_THAN_OR_EQUAL (AUDIT_LESS_THAN | AUDIT_EQUAL)
#define AUDIT_GREATER_THAN_OR_EQUAL (AUDIT_GREATER_THAN | AUDIT_EQUAL)
-#define AUDIT_OPERATORS (AUDIT_EQUAL | AUDIT_NOT_EQUAL | AUDIT_BIT_MASK)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_OPERATORS (AUDIT_EQUAL | AUDIT_NOT_EQUAL | AUDIT_BIT_MASK)
enum {
Audit_equal,
Audit_not_equal,
- Audit_bitmask,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ Audit_bitmask,
Audit_bittest,
Audit_lt,
Audit_gt,
- Audit_le,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ Audit_le,
Audit_ge,
Audit_bad
};
-#define AUDIT_STATUS_ENABLED 0x0001
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_STATUS_ENABLED 0x0001
#define AUDIT_STATUS_FAILURE 0x0002
#define AUDIT_STATUS_PID 0x0004
#define AUDIT_STATUS_RATE_LIMIT 0x0008
-#define AUDIT_STATUS_BACKLOG_LIMIT 0x0010
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_STATUS_BACKLOG_LIMIT 0x0010
#define AUDIT_STATUS_BACKLOG_WAIT_TIME 0x0020
-#define AUDIT_VERSION_BACKLOG_LIMIT 1
-#define AUDIT_VERSION_BACKLOG_WAIT_TIME 2
-#define AUDIT_VERSION_LATEST AUDIT_VERSION_BACKLOG_WAIT_TIME
+#define AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT 0x00000001
+#define AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME 0x00000002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH 0x00000004
+#define AUDIT_FEATURE_BITMAP_ALL (AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT | AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME | AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH)
+#define AUDIT_VERSION_LATEST AUDIT_FEATURE_BITMAP_ALL
+#define AUDIT_VERSION_BACKLOG_LIMIT AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_VERSION_BACKLOG_WAIT_TIME AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME
#define AUDIT_FAIL_SILENT 0
#define AUDIT_FAIL_PRINTK 1
#define AUDIT_FAIL_PANIC 2
-#define __AUDIT_ARCH_CONVENTION_MASK 0x30000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __AUDIT_ARCH_CONVENTION_MASK 0x30000000
#define __AUDIT_ARCH_CONVENTION_MIPS64_N32 0x20000000
#define __AUDIT_ARCH_64BIT 0x80000000
#define __AUDIT_ARCH_LE 0x40000000
-#define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_AARCH64 (EM_AARCH64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_ALPHA (EM_ALPHA | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_ARM (EM_ARM | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_ARMEB (EM_ARM)
-#define AUDIT_ARCH_CRIS (EM_CRIS | __AUDIT_ARCH_LE)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_CRIS (EM_CRIS | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_FRV (EM_FRV)
#define AUDIT_ARCH_I386 (EM_386 | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_IA64 (EM_IA_64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-#define AUDIT_ARCH_M32R (EM_M32R)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_M32R (EM_M32R)
#define AUDIT_ARCH_M68K (EM_68K)
#define AUDIT_ARCH_MICROBLAZE (EM_MICROBLAZE)
#define AUDIT_ARCH_MIPS (EM_MIPS)
-#define AUDIT_ARCH_MIPSEL (EM_MIPS | __AUDIT_ARCH_LE)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_MIPSEL (EM_MIPS | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_MIPS64 (EM_MIPS | __AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_MIPS64N32 (EM_MIPS | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_CONVENTION_MIPS64_N32)
#define AUDIT_ARCH_MIPSEL64 (EM_MIPS | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
-#define AUDIT_ARCH_MIPSEL64N32 (EM_MIPS | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE | __AUDIT_ARCH_CONVENTION_MIPS64_N32)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_MIPSEL64N32 (EM_MIPS | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE | __AUDIT_ARCH_CONVENTION_MIPS64_N32)
#define AUDIT_ARCH_OPENRISC (EM_OPENRISC)
#define AUDIT_ARCH_PARISC (EM_PARISC)
#define AUDIT_ARCH_PARISC64 (EM_PARISC | __AUDIT_ARCH_64BIT)
-#define AUDIT_ARCH_PPC (EM_PPC)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_PPC (EM_PPC)
#define AUDIT_ARCH_PPC64 (EM_PPC64 | __AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_S390 (EM_S390)
-#define AUDIT_ARCH_S390X (EM_S390 | __AUDIT_ARCH_64BIT)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_S390X (EM_S390 | __AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_SH (EM_SH)
#define AUDIT_ARCH_SHEL (EM_SH | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_SH64 (EM_SH | __AUDIT_ARCH_64BIT)
-#define AUDIT_ARCH_SHEL64 (EM_SH | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_SHEL64 (EM_SH | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_SPARC (EM_SPARC)
#define AUDIT_ARCH_SPARC64 (EM_SPARCV9 | __AUDIT_ARCH_64BIT)
+#define AUDIT_ARCH_TILEGX (EM_TILEGX | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AUDIT_ARCH_TILEGX32 (EM_TILEGX | __AUDIT_ARCH_LE)
+#define AUDIT_ARCH_TILEPRO (EM_TILEPRO | __AUDIT_ARCH_LE)
#define AUDIT_ARCH_X86_64 (EM_X86_64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
#define AUDIT_PERM_EXEC 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -359,43 +369,47 @@ struct audit_status {
__u32 backlog_limit;
__u32 lost;
__u32 backlog;
- __u32 version;
+ union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 version;
+ __u32 feature_bitmap;
+ };
__u32 backlog_wait_time;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct audit_features {
#define AUDIT_FEATURE_VERSION 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 vers;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 mask;
__u32 features;
__u32 lock;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define AUDIT_FEATURE_ONLY_UNSET_LOGINUID 0
#define AUDIT_FEATURE_LOGINUID_IMMUTABLE 1
#define AUDIT_LAST_FEATURE AUDIT_FEATURE_LOGINUID_IMMUTABLE
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define audit_feature_valid(x) ((x) >= 0 && (x) <= AUDIT_LAST_FEATURE)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define AUDIT_FEATURE_TO_MASK(x) (1 << ((x) & 31))
struct audit_tty_status {
__u32 enabled;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 log_passwd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define AUDIT_UID_UNSET (unsigned int) - 1
struct audit_rule_data {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 action;
__u32 field_count;
__u32 mask[AUDIT_BITMASK_SIZE];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 fields[AUDIT_MAX_FIELDS];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 values[AUDIT_MAX_FIELDS];
__u32 fieldflags[AUDIT_MAX_FIELDS];
__u32 buflen;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char buf[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif
diff --git a/libc/kernel/uapi/linux/blkpg.h b/libc/kernel/uapi/linux/blkpg.h
index 35b973004..97cb38da0 100644
--- a/libc/kernel/uapi/linux/blkpg.h
+++ b/libc/kernel/uapi/linux/blkpg.h
@@ -16,8 +16,8 @@
***
****************************************************************************
****************************************************************************/
-#ifndef _LINUX_BLKPG_H
-#define _LINUX_BLKPG_H
+#ifndef _UAPI__LINUX_BLKPG_H
+#define _UAPI__LINUX_BLKPG_H
#include <linux/compiler.h>
#include <linux/ioctl.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/bpf.h b/libc/kernel/uapi/linux/bpf.h
index cc9f6d626..8a2199693 100644
--- a/libc/kernel/uapi/linux/bpf.h
+++ b/libc/kernel/uapi/linux/bpf.h
@@ -76,49 +76,131 @@ enum bpf_cmd {
BPF_MAP_GET_NEXT_KEY,
BPF_PROG_LOAD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_OBJ_PIN,
+ BPF_OBJ_GET,
};
enum bpf_map_type {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
BPF_MAP_TYPE_UNSPEC,
-};
+ BPF_MAP_TYPE_HASH,
+ BPF_MAP_TYPE_ARRAY,
+ BPF_MAP_TYPE_PROG_ARRAY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_MAP_TYPE_PERF_EVENT_ARRAY,
+};
enum bpf_prog_type {
BPF_PROG_TYPE_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_PROG_TYPE_SOCKET_FILTER,
+ BPF_PROG_TYPE_KPROBE,
+ BPF_PROG_TYPE_SCHED_CLS,
+ BPF_PROG_TYPE_SCHED_ACT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
-union bpf_attr {
+#define BPF_PSEUDO_MAP_FD 1
+#define BPF_ANY 0
+#define BPF_NOEXIST 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BPF_EXIST 2
+union bpf_attr {
struct {
__u32 map_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 key_size;
__u32 value_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_entries;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u32 map_fd;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__aligned_u64 key;
union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__aligned_u64 value;
__aligned_u64 next_key;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+ __u64 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct {
__u32 prog_type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 insn_cnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__aligned_u64 insns;
__aligned_u64 license;
__u32 log_level;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 log_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__aligned_u64 log_buf;
+ __u32 kern_version;
+ };
+ struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __aligned_u64 pathname;
+ __u32 bpf_fd;
};
} __attribute__((aligned(8)));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum bpf_func_id {
BPF_FUNC_unspec,
+ BPF_FUNC_map_lookup_elem,
+ BPF_FUNC_map_update_elem,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_FUNC_map_delete_elem,
+ BPF_FUNC_probe_read,
+ BPF_FUNC_ktime_get_ns,
+ BPF_FUNC_trace_printk,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_FUNC_get_prandom_u32,
+ BPF_FUNC_get_smp_processor_id,
+ BPF_FUNC_skb_store_bytes,
+ BPF_FUNC_l3_csum_replace,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_FUNC_l4_csum_replace,
+ BPF_FUNC_tail_call,
+ BPF_FUNC_clone_redirect,
+ BPF_FUNC_get_current_pid_tgid,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_FUNC_get_current_uid_gid,
+ BPF_FUNC_get_current_comm,
+ BPF_FUNC_get_cgroup_classid,
+ BPF_FUNC_skb_vlan_push,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_FUNC_skb_vlan_pop,
+ BPF_FUNC_skb_get_tunnel_key,
+ BPF_FUNC_skb_set_tunnel_key,
+ BPF_FUNC_perf_event_read,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BPF_FUNC_redirect,
+ BPF_FUNC_get_route_realm,
+ BPF_FUNC_perf_event_output,
__BPF_FUNC_MAX_ID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct __sk_buff {
+ __u32 len;
+ __u32 pkt_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 mark;
+ __u32 queue_mapping;
+ __u32 protocol;
+ __u32 vlan_present;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 vlan_tci;
+ __u32 vlan_proto;
+ __u32 priority;
+ __u32 ingress_ifindex;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ifindex;
+ __u32 tc_index;
+ __u32 cb[5];
+ __u32 hash;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 tc_classid;
};
+struct bpf_tunnel_key {
+ __u32 tunnel_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 remote_ipv4;
+};
#endif
diff --git a/libc/kernel/uapi/linux/btrfs.h b/libc/kernel/uapi/linux/btrfs.h
index 8047f6af3..98daceed7 100644
--- a/libc/kernel/uapi/linux/btrfs.h
+++ b/libc/kernel/uapi/linux/btrfs.h
@@ -147,358 +147,375 @@ struct btrfs_ioctl_dev_replace_status_params {
#define BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOCTL_DEV_REPLACE_RESULT_ALREADY_STARTED 2
+#define BTRFS_IOCTL_DEV_REPLACE_RESULT_SCRUB_INPROGRESS 3
struct btrfs_ioctl_dev_replace_args {
__u64 cmd;
- __u64 result;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 result;
union {
struct btrfs_ioctl_dev_replace_start_params start;
struct btrfs_ioctl_dev_replace_status_params status;
- };
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
__u64 spare[64];
};
struct btrfs_ioctl_dev_info_args {
- __u64 devid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 devid;
__u8 uuid[BTRFS_UUID_SIZE];
__u64 bytes_used;
__u64 total_bytes;
- __u64 unused[379];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 unused[379];
__u8 path[BTRFS_DEVICE_PATH_NAME_MAX];
};
struct btrfs_ioctl_fs_info_args {
- __u64 max_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 max_id;
__u64 num_devices;
__u8 fsid[BTRFS_FSID_SIZE];
__u32 nodesize;
- __u32 sectorsize;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 sectorsize;
__u32 clone_alignment;
__u32 reserved32;
__u64 reserved[122];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct btrfs_ioctl_feature_flags {
__u64 compat_flags;
__u64 compat_ro_flags;
- __u64 incompat_flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 incompat_flags;
};
#define BTRFS_BALANCE_CTL_PAUSE 1
#define BTRFS_BALANCE_CTL_CANCEL 2
-struct btrfs_balance_args {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct btrfs_balance_args {
__u64 profiles;
- __u64 usage;
+ union {
+ __le64 usage;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
+ __le32 usage_min;
+ __le32 usage_max;
+ };
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
__u64 devid;
__u64 pstart;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 pend;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 vstart;
__u64 vend;
__u64 target;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
- __u64 limit;
- __u64 unused[7];
-} __attribute__((__packed__));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
+ __u64 limit;
+ struct {
+ __u32 limit_min;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 limit_max;
+ };
+ };
+ __le32 stripes_min;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 stripes_max;
+ __u64 unused[6];
+} __attribute__((__packed__));
struct btrfs_balance_progress {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 expected;
__u64 considered;
__u64 completed;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_BALANCE_STATE_RUNNING (1ULL << 0)
#define BTRFS_BALANCE_STATE_PAUSE_REQ (1ULL << 1)
#define BTRFS_BALANCE_STATE_CANCEL_REQ (1ULL << 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_balance_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
__u64 state;
struct btrfs_balance_args data;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_balance_args meta;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_balance_args sys;
struct btrfs_balance_progress stat;
__u64 unused[72];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_INO_LOOKUP_PATH_MAX 4080
struct btrfs_ioctl_ino_lookup_args {
__u64 treeid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 objectid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char name[BTRFS_INO_LOOKUP_PATH_MAX];
};
struct btrfs_ioctl_search_key {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 tree_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 min_objectid;
__u64 max_objectid;
__u64 min_offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 max_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 min_transid;
__u64 max_transid;
__u32 min_type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 nr_items;
__u32 unused;
__u64 unused1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 unused2;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 unused3;
__u64 unused4;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_search_header {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 transid;
__u64 objectid;
__u64 offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 len;
};
#define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_search_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_search_key key;
char buf[BTRFS_SEARCH_ARGS_BUFSIZE];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_search_args_v2 {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_search_key key;
__u64 buf_size;
__u64 buf[0];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_clone_range_args {
__s64 src_fd;
__u64 src_offset, src_length;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 dest_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define BTRFS_DEFRAG_RANGE_COMPRESS 1
#define BTRFS_DEFRAG_RANGE_START_IO 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_SAME_DATA_DIFFERS 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_same_extent_info {
__s64 fd;
__u64 logical_offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 bytes_deduped;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 status;
__u32 reserved;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_same_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 logical_offset;
__u64 length;
__u16 dest_count;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 reserved1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved2;
struct btrfs_ioctl_same_extent_info info[0];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_space_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
__u64 total_bytes;
__u64 used_bytes;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_space_args {
__u64 space_slots;
__u64 total_spaces;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_space_info spaces[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct btrfs_data_container {
__u32 bytes_left;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 bytes_missing;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 elem_cnt;
__u32 elem_missed;
__u64 val[0];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_ino_path_args {
__u64 inum;
__u64 size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 reserved[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 fspath;
};
struct btrfs_ioctl_logical_ino_args {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 logical;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 size;
__u64 reserved[4];
__u64 inodes;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum btrfs_dev_stat_values {
BTRFS_DEV_STAT_WRITE_ERRS,
BTRFS_DEV_STAT_READ_ERRS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
BTRFS_DEV_STAT_FLUSH_ERRS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
BTRFS_DEV_STAT_CORRUPTION_ERRS,
BTRFS_DEV_STAT_GENERATION_ERRS,
BTRFS_DEV_STAT_VALUES_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_DEV_STATS_RESET (1ULL << 0)
struct btrfs_ioctl_get_dev_stats {
__u64 devid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 nr_items;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
__u64 values[BTRFS_DEV_STAT_VALUES_MAX];
__u64 unused[128 - 2 - BTRFS_DEV_STAT_VALUES_MAX];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_QUOTA_CTL_ENABLE 1
#define BTRFS_QUOTA_CTL_DISABLE 2
#define BTRFS_QUOTA_CTL_RESCAN__NOTUSED 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_quota_ctl_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 cmd;
__u64 status;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_quota_rescan_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
__u64 progress;
__u64 reserved[6];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct btrfs_ioctl_qgroup_assign_args {
__u64 assign;
__u64 src;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 dst;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct btrfs_ioctl_qgroup_create_args {
__u64 create;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 qgroupid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct btrfs_ioctl_timespec {
__u64 sec;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 nsec;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct btrfs_ioctl_received_subvol_args {
char uuid[BTRFS_UUID_SIZE];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 stransid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 rtransid;
struct btrfs_ioctl_timespec stime;
struct btrfs_ioctl_timespec rtime;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 reserved[16];
};
#define BTRFS_SEND_FLAG_NO_FILE_DATA 0x1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_SEND_FLAG_OMIT_STREAM_HEADER 0x2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_SEND_FLAG_OMIT_END_CMD 0x4
#define BTRFS_SEND_FLAG_MASK (BTRFS_SEND_FLAG_NO_FILE_DATA | BTRFS_SEND_FLAG_OMIT_STREAM_HEADER | BTRFS_SEND_FLAG_OMIT_END_CMD)
struct btrfs_ioctl_send_args {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s64 send_fd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 clone_sources_count;
__u64 __user * clone_sources;
__u64 parent_root;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 reserved[4];
};
enum btrfs_err_code {
+ BTRFS_ERROR_DEV_RAID1_MIN_NOT_MET = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- notused,
- BTRFS_ERROR_DEV_RAID1_MIN_NOT_MET,
BTRFS_ERROR_DEV_RAID10_MIN_NOT_MET,
BTRFS_ERROR_DEV_RAID5_MIN_NOT_MET,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
BTRFS_ERROR_DEV_RAID6_MIN_NOT_MET,
BTRFS_ERROR_DEV_TGT_REPLACE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
BTRFS_ERROR_DEV_MISSING_NOT_FOUND,
BTRFS_ERROR_DEV_ONLY_WRITABLE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, struct btrfs_ioctl_vol_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_RESIZE _IOW(BTRFS_IOCTL_MAGIC, 3, struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_SCAN_DEV _IOW(BTRFS_IOCTL_MAGIC, 4, struct btrfs_ioctl_vol_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_TRANS_START _IO(BTRFS_IOCTL_MAGIC, 6)
#define BTRFS_IOC_TRANS_END _IO(BTRFS_IOCTL_MAGIC, 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SYNC _IO(BTRFS_IOCTL_MAGIC, 8)
#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_ADD_DEV _IOW(BTRFS_IOCTL_MAGIC, 10, struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_RM_DEV _IOW(BTRFS_IOCTL_MAGIC, 11, struct btrfs_ioctl_vol_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_BALANCE _IOW(BTRFS_IOCTL_MAGIC, 12, struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_CLONE_RANGE _IOW(BTRFS_IOCTL_MAGIC, 13, struct btrfs_ioctl_clone_range_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SUBVOL_CREATE _IOW(BTRFS_IOCTL_MAGIC, 14, struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_SNAP_DESTROY _IOW(BTRFS_IOCTL_MAGIC, 15, struct btrfs_ioctl_vol_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_DEFRAG_RANGE _IOW(BTRFS_IOCTL_MAGIC, 16, struct btrfs_ioctl_defrag_range_args)
#define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, struct btrfs_ioctl_search_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_TREE_SEARCH_V2 _IOWR(BTRFS_IOCTL_MAGIC, 17, struct btrfs_ioctl_search_args_v2)
#define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, struct btrfs_ioctl_ino_lookup_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_DEFAULT_SUBVOL _IOW(BTRFS_IOCTL_MAGIC, 19, __u64)
#define BTRFS_IOC_SPACE_INFO _IOWR(BTRFS_IOCTL_MAGIC, 20, struct btrfs_ioctl_space_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_START_SYNC _IOR(BTRFS_IOCTL_MAGIC, 24, __u64)
#define BTRFS_IOC_WAIT_SYNC _IOW(BTRFS_IOCTL_MAGIC, 22, __u64)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SNAP_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 23, struct btrfs_ioctl_vol_args_v2)
#define BTRFS_IOC_SUBVOL_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 24, struct btrfs_ioctl_vol_args_v2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SUBVOL_GETFLAGS _IOR(BTRFS_IOCTL_MAGIC, 25, __u64)
#define BTRFS_IOC_SUBVOL_SETFLAGS _IOW(BTRFS_IOCTL_MAGIC, 26, __u64)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SCRUB _IOWR(BTRFS_IOCTL_MAGIC, 27, struct btrfs_ioctl_scrub_args)
#define BTRFS_IOC_SCRUB_CANCEL _IO(BTRFS_IOCTL_MAGIC, 28)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SCRUB_PROGRESS _IOWR(BTRFS_IOCTL_MAGIC, 29, struct btrfs_ioctl_scrub_args)
#define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, struct btrfs_ioctl_dev_info_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, struct btrfs_ioctl_fs_info_args)
#define BTRFS_IOC_BALANCE_V2 _IOWR(BTRFS_IOCTL_MAGIC, 32, struct btrfs_ioctl_balance_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_BALANCE_CTL _IOW(BTRFS_IOCTL_MAGIC, 33, int)
#define BTRFS_IOC_BALANCE_PROGRESS _IOR(BTRFS_IOCTL_MAGIC, 34, struct btrfs_ioctl_balance_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_INO_PATHS _IOWR(BTRFS_IOCTL_MAGIC, 35, struct btrfs_ioctl_ino_path_args)
#define BTRFS_IOC_LOGICAL_INO _IOWR(BTRFS_IOCTL_MAGIC, 36, struct btrfs_ioctl_ino_path_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SET_RECEIVED_SUBVOL _IOWR(BTRFS_IOCTL_MAGIC, 37, struct btrfs_ioctl_received_subvol_args)
#define BTRFS_IOC_SEND _IOW(BTRFS_IOCTL_MAGIC, 38, struct btrfs_ioctl_send_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_QUOTA_CTL _IOWR(BTRFS_IOCTL_MAGIC, 40, struct btrfs_ioctl_quota_ctl_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_QGROUP_ASSIGN _IOW(BTRFS_IOCTL_MAGIC, 41, struct btrfs_ioctl_qgroup_assign_args)
#define BTRFS_IOC_QGROUP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 42, struct btrfs_ioctl_qgroup_create_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_QGROUP_LIMIT _IOR(BTRFS_IOCTL_MAGIC, 43, struct btrfs_ioctl_qgroup_limit_args)
#define BTRFS_IOC_QUOTA_RESCAN _IOW(BTRFS_IOCTL_MAGIC, 44, struct btrfs_ioctl_quota_rescan_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_QUOTA_RESCAN_STATUS _IOR(BTRFS_IOCTL_MAGIC, 45, struct btrfs_ioctl_quota_rescan_args)
#define BTRFS_IOC_QUOTA_RESCAN_WAIT _IO(BTRFS_IOCTL_MAGIC, 46)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_GET_FSLABEL _IOR(BTRFS_IOCTL_MAGIC, 49, char[BTRFS_LABEL_SIZE])
#define BTRFS_IOC_SET_FSLABEL _IOW(BTRFS_IOCTL_MAGIC, 50, char[BTRFS_LABEL_SIZE])
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_GET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 52, struct btrfs_ioctl_get_dev_stats)
#define BTRFS_IOC_DEV_REPLACE _IOWR(BTRFS_IOCTL_MAGIC, 53, struct btrfs_ioctl_dev_replace_args)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_FILE_EXTENT_SAME _IOWR(BTRFS_IOCTL_MAGIC, 54, struct btrfs_ioctl_same_args)
#define BTRFS_IOC_GET_FEATURES _IOR(BTRFS_IOCTL_MAGIC, 57, struct btrfs_ioctl_feature_flags)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BTRFS_IOC_SET_FEATURES _IOW(BTRFS_IOCTL_MAGIC, 57, struct btrfs_ioctl_feature_flags[2])
#define BTRFS_IOC_GET_SUPPORTED_FEATURES _IOR(BTRFS_IOCTL_MAGIC, 57, struct btrfs_ioctl_feature_flags[3])
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/can.h b/libc/kernel/uapi/linux/can.h
index 4c4f2c650..fc2c2300c 100644
--- a/libc/kernel/uapi/linux/can.h
+++ b/libc/kernel/uapi/linux/can.h
@@ -42,49 +42,53 @@ struct can_frame {
canid_t can_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 can_dlc;
+ __u8 __pad;
+ __u8 __res0;
+ __u8 __res1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));
};
#define CANFD_BRS 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CANFD_ESI 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct canfd_frame {
canid_t can_id;
__u8 len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 __res0;
__u8 __res1;
__u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8)));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CAN_MTU (sizeof(struct can_frame))
#define CANFD_MTU (sizeof(struct canfd_frame))
#define CAN_RAW 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CAN_BCM 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CAN_TP16 3
#define CAN_TP20 4
#define CAN_MCNET 5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CAN_ISOTP 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CAN_NPROTO 7
#define SOL_CAN_BASE 100
struct sockaddr_can {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__kernel_sa_family_t can_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int can_ifindex;
union {
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
canid_t rx_id, tx_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} tp;
} can_addr;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct can_filter {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
canid_t can_id;
canid_t can_mask;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CAN_INV_FILTER 0x20000000U
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/can/bcm.h b/libc/kernel/uapi/linux/can/bcm.h
index 25d71e828..0a86166a9 100644
--- a/libc/kernel/uapi/linux/can/bcm.h
+++ b/libc/kernel/uapi/linux/can/bcm.h
@@ -21,12 +21,17 @@
#include <linux/types.h>
#include <linux/can.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct bcm_timeval {
+ long tv_sec;
+ long tv_usec;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct bcm_msg_head {
__u32 opcode;
__u32 flags;
__u32 count;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- struct timeval ival1, ival2;
+ struct bcm_timeval ival1, ival2;
canid_t can_id;
__u32 nframes;
struct can_frame frames[0];
diff --git a/libc/kernel/uapi/linux/can/error.h b/libc/kernel/uapi/linux/can/error.h
index 46af75878..59f12851b 100644
--- a/libc/kernel/uapi/linux/can/error.h
+++ b/libc/kernel/uapi/linux/can/error.h
@@ -41,53 +41,54 @@
#define CAN_ERR_CRTL_RX_PASSIVE 0x10
#define CAN_ERR_CRTL_TX_PASSIVE 0x20
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_CRTL_ACTIVE 0x40
#define CAN_ERR_PROT_UNSPEC 0x00
#define CAN_ERR_PROT_BIT 0x01
#define CAN_ERR_PROT_FORM 0x02
-#define CAN_ERR_PROT_STUFF 0x04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_PROT_STUFF 0x04
#define CAN_ERR_PROT_BIT0 0x08
#define CAN_ERR_PROT_BIT1 0x10
#define CAN_ERR_PROT_OVERLOAD 0x20
-#define CAN_ERR_PROT_ACTIVE 0x40
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_PROT_ACTIVE 0x40
#define CAN_ERR_PROT_TX 0x80
#define CAN_ERR_PROT_LOC_UNSPEC 0x00
#define CAN_ERR_PROT_LOC_SOF 0x03
-#define CAN_ERR_PROT_LOC_ID28_21 0x02
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_PROT_LOC_ID28_21 0x02
#define CAN_ERR_PROT_LOC_ID20_18 0x06
#define CAN_ERR_PROT_LOC_SRTR 0x04
#define CAN_ERR_PROT_LOC_IDE 0x05
-#define CAN_ERR_PROT_LOC_ID17_13 0x07
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_PROT_LOC_ID17_13 0x07
#define CAN_ERR_PROT_LOC_ID12_05 0x0F
#define CAN_ERR_PROT_LOC_ID04_00 0x0E
#define CAN_ERR_PROT_LOC_RTR 0x0C
-#define CAN_ERR_PROT_LOC_RES1 0x0D
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_PROT_LOC_RES1 0x0D
#define CAN_ERR_PROT_LOC_RES0 0x09
#define CAN_ERR_PROT_LOC_DLC 0x0B
#define CAN_ERR_PROT_LOC_DATA 0x0A
-#define CAN_ERR_PROT_LOC_CRC_SEQ 0x08
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_PROT_LOC_CRC_SEQ 0x08
#define CAN_ERR_PROT_LOC_CRC_DEL 0x18
#define CAN_ERR_PROT_LOC_ACK 0x19
#define CAN_ERR_PROT_LOC_ACK_DEL 0x1B
-#define CAN_ERR_PROT_LOC_EOF 0x1A
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_PROT_LOC_EOF 0x1A
#define CAN_ERR_PROT_LOC_INTERM 0x12
#define CAN_ERR_TRX_UNSPEC 0x00
#define CAN_ERR_TRX_CANH_NO_WIRE 0x04
-#define CAN_ERR_TRX_CANH_SHORT_TO_BAT 0x05
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_TRX_CANH_SHORT_TO_BAT 0x05
#define CAN_ERR_TRX_CANH_SHORT_TO_VCC 0x06
#define CAN_ERR_TRX_CANH_SHORT_TO_GND 0x07
#define CAN_ERR_TRX_CANL_NO_WIRE 0x40
-#define CAN_ERR_TRX_CANL_SHORT_TO_BAT 0x50
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CAN_ERR_TRX_CANL_SHORT_TO_BAT 0x50
#define CAN_ERR_TRX_CANL_SHORT_TO_VCC 0x60
#define CAN_ERR_TRX_CANL_SHORT_TO_GND 0x70
#define CAN_ERR_TRX_CANL_SHORT_TO_CANH 0x80
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/can/gw.h b/libc/kernel/uapi/linux/can/gw.h
index 37703fec1..a9fd29317 100644
--- a/libc/kernel/uapi/linux/can/gw.h
+++ b/libc/kernel/uapi/linux/can/gw.h
@@ -53,58 +53,59 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
CGW_DELETED,
CGW_LIM_HOPS,
+ CGW_MOD_UID,
__CGW_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define CGW_MAX (__CGW_MAX - 1)
#define CGW_FLAGS_CAN_ECHO 0x01
#define CGW_FLAGS_CAN_SRC_TSTAMP 0x02
-#define CGW_FLAGS_CAN_IIF_TX_OK 0x04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CGW_FLAGS_CAN_IIF_TX_OK 0x04
#define CGW_MOD_FUNCS 4
#define CGW_MOD_ID 0x01
#define CGW_MOD_DLC 0x02
-#define CGW_MOD_DATA 0x04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CGW_MOD_DATA 0x04
#define CGW_FRAME_MODS 3
#define MAX_MODFUNCTIONS (CGW_MOD_FUNCS * CGW_FRAME_MODS)
struct cgw_frame_mod {
- struct can_frame cf;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct can_frame cf;
__u8 modtype;
} __attribute__((packed));
#define CGW_MODATTR_LEN sizeof(struct cgw_frame_mod)
-struct cgw_csum_xor {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct cgw_csum_xor {
__s8 from_idx;
__s8 to_idx;
__s8 result_idx;
- __u8 init_xor_val;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 init_xor_val;
} __attribute__((packed));
struct cgw_csum_crc8 {
__s8 from_idx;
- __s8 to_idx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s8 to_idx;
__s8 result_idx;
__u8 init_crc_val;
__u8 final_xor_val;
- __u8 crctab[256];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 crctab[256];
__u8 profile;
__u8 profile_data[20];
} __attribute__((packed));
-#define CGW_CS_XOR_LEN sizeof(struct cgw_csum_xor)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CGW_CS_XOR_LEN sizeof(struct cgw_csum_xor)
#define CGW_CS_CRC8_LEN sizeof(struct cgw_csum_crc8)
enum {
CGW_CRC8PRF_UNSPEC,
- CGW_CRC8PRF_1U8,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CGW_CRC8PRF_1U8,
CGW_CRC8PRF_16U8,
CGW_CRC8PRF_SFFID_XOR,
__CGW_CRC8PRF_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define CGW_CRC8PRF_MAX (__CGW_CRC8PRF_MAX - 1)
#endif
diff --git a/libc/kernel/uapi/linux/can/raw.h b/libc/kernel/uapi/linux/can/raw.h
index a70d88172..0a19352c6 100644
--- a/libc/kernel/uapi/linux/can/raw.h
+++ b/libc/kernel/uapi/linux/can/raw.h
@@ -28,6 +28,7 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
CAN_RAW_RECV_OWN_MSGS,
CAN_RAW_FD_FRAMES,
+ CAN_RAW_JOIN_FILTERS,
};
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/cryptouser.h b/libc/kernel/uapi/linux/cryptouser.h
new file mode 100644
index 000000000..2a7bc3964
--- /dev/null
+++ b/libc/kernel/uapi/linux/cryptouser.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+enum {
+ CRYPTO_MSG_BASE = 0x10,
+ CRYPTO_MSG_NEWALG = 0x10,
+ CRYPTO_MSG_DELALG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CRYPTO_MSG_UPDATEALG,
+ CRYPTO_MSG_GETALG,
+ CRYPTO_MSG_DELRNG,
+ __CRYPTO_MSG_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define CRYPTO_MSG_MAX (__CRYPTO_MSG_MAX - 1)
+#define CRYPTO_NR_MSGTYPES (CRYPTO_MSG_MAX + 1 - CRYPTO_MSG_BASE)
+#define CRYPTO_MAX_NAME CRYPTO_MAX_ALG_NAME
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum crypto_attr_type_t {
+ CRYPTOCFGA_UNSPEC,
+ CRYPTOCFGA_PRIORITY_VAL,
+ CRYPTOCFGA_REPORT_LARVAL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CRYPTOCFGA_REPORT_HASH,
+ CRYPTOCFGA_REPORT_BLKCIPHER,
+ CRYPTOCFGA_REPORT_AEAD,
+ CRYPTOCFGA_REPORT_COMPRESS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CRYPTOCFGA_REPORT_RNG,
+ CRYPTOCFGA_REPORT_CIPHER,
+ CRYPTOCFGA_REPORT_AKCIPHER,
+ __CRYPTOCFGA_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
+};
+struct crypto_user_alg {
+ char cru_name[CRYPTO_MAX_ALG_NAME];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char cru_driver_name[CRYPTO_MAX_ALG_NAME];
+ char cru_module_name[CRYPTO_MAX_ALG_NAME];
+ __u32 cru_type;
+ __u32 cru_mask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cru_refcnt;
+ __u32 cru_flags;
+};
+struct crypto_report_larval {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char type[CRYPTO_MAX_NAME];
+};
+struct crypto_report_hash {
+ char type[CRYPTO_MAX_NAME];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int blocksize;
+ unsigned int digestsize;
+};
+struct crypto_report_cipher {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char type[CRYPTO_MAX_ALG_NAME];
+ unsigned int blocksize;
+ unsigned int min_keysize;
+ unsigned int max_keysize;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct crypto_report_blkcipher {
+ char type[CRYPTO_MAX_NAME];
+ char geniv[CRYPTO_MAX_NAME];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int blocksize;
+ unsigned int min_keysize;
+ unsigned int max_keysize;
+ unsigned int ivsize;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct crypto_report_aead {
+ char type[CRYPTO_MAX_NAME];
+ char geniv[CRYPTO_MAX_NAME];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int blocksize;
+ unsigned int maxauthsize;
+ unsigned int ivsize;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct crypto_report_comp {
+ char type[CRYPTO_MAX_NAME];
+};
+struct crypto_report_rng {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char type[CRYPTO_MAX_NAME];
+ unsigned int seedsize;
+};
+struct crypto_report_akcipher {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char type[CRYPTO_MAX_NAME];
+};
+#define CRYPTO_REPORT_MAXSIZE (sizeof(struct crypto_user_alg) + sizeof(struct crypto_report_blkcipher))
diff --git a/libc/kernel/uapi/linux/dcbnl.h b/libc/kernel/uapi/linux/dcbnl.h
index 2623b8e42..e111f4b44 100644
--- a/libc/kernel/uapi/linux/dcbnl.h
+++ b/libc/kernel/uapi/linux/dcbnl.h
@@ -44,6 +44,36 @@ struct ieee_ets {
struct ieee_maxrate {
__u64 tc_maxrate[IEEE_8021QAZ_MAX_TCS];
};
+enum dcbnl_cndd_states {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DCB_CNDD_RESET = 0,
+ DCB_CNDD_EDGE,
+ DCB_CNDD_INTERIOR,
+ DCB_CNDD_INTERIOR_READY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct ieee_qcn {
+ __u8 rpg_enable[IEEE_8021QAZ_MAX_TCS];
+ __u32 rppp_max_rps[IEEE_8021QAZ_MAX_TCS];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rpg_time_reset[IEEE_8021QAZ_MAX_TCS];
+ __u32 rpg_byte_reset[IEEE_8021QAZ_MAX_TCS];
+ __u32 rpg_threshold[IEEE_8021QAZ_MAX_TCS];
+ __u32 rpg_max_rate[IEEE_8021QAZ_MAX_TCS];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rpg_ai_rate[IEEE_8021QAZ_MAX_TCS];
+ __u32 rpg_hai_rate[IEEE_8021QAZ_MAX_TCS];
+ __u32 rpg_gd[IEEE_8021QAZ_MAX_TCS];
+ __u32 rpg_min_dec_fac[IEEE_8021QAZ_MAX_TCS];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rpg_min_rate[IEEE_8021QAZ_MAX_TCS];
+ __u32 cndd_state_machine[IEEE_8021QAZ_MAX_TCS];
+};
+struct ieee_qcn_stats {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 rppp_rp_centiseconds[IEEE_8021QAZ_MAX_TCS];
+ __u32 rppp_created_rps[IEEE_8021QAZ_MAX_TCS];
+};
struct ieee_pfc {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 pfc_cap;
@@ -174,213 +204,216 @@ enum ieee_attrs {
DCB_ATTR_IEEE_PEER_PFC,
DCB_ATTR_IEEE_PEER_APP,
DCB_ATTR_IEEE_MAXRATE,
- __DCB_ATTR_IEEE_MAX
+ DCB_ATTR_IEEE_QCN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DCB_ATTR_IEEE_QCN_STATS,
+ __DCB_ATTR_IEEE_MAX
};
#define DCB_ATTR_IEEE_MAX (__DCB_ATTR_IEEE_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum ieee_attrs_app {
DCB_ATTR_IEEE_APP_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_IEEE_APP,
__DCB_ATTR_IEEE_APP_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DCB_ATTR_IEEE_APP_MAX (__DCB_ATTR_IEEE_APP_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum cee_attrs {
DCB_ATTR_CEE_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_CEE_PEER_PG,
DCB_ATTR_CEE_PEER_PFC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_CEE_PEER_APP_TABLE,
DCB_ATTR_CEE_TX_PG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_CEE_RX_PG,
DCB_ATTR_CEE_PFC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_CEE_APP_TABLE,
DCB_ATTR_CEE_FEAT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__DCB_ATTR_CEE_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DCB_ATTR_CEE_MAX (__DCB_ATTR_CEE_MAX - 1)
enum peer_app_attr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_CEE_PEER_APP_UNSPEC,
DCB_ATTR_CEE_PEER_APP_INFO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_CEE_PEER_APP,
__DCB_ATTR_CEE_PEER_APP_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DCB_ATTR_CEE_PEER_APP_MAX (__DCB_ATTR_CEE_PEER_APP_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum cee_attrs_app {
DCB_ATTR_CEE_APP_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_ATTR_CEE_APP,
__DCB_ATTR_CEE_APP_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DCB_ATTR_CEE_APP_MAX (__DCB_ATTR_CEE_APP_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum dcbnl_pfc_up_attrs {
DCB_PFC_UP_ATTR_UNDEFINED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PFC_UP_ATTR_0,
DCB_PFC_UP_ATTR_1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PFC_UP_ATTR_2,
DCB_PFC_UP_ATTR_3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PFC_UP_ATTR_4,
DCB_PFC_UP_ATTR_5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PFC_UP_ATTR_6,
DCB_PFC_UP_ATTR_7,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PFC_UP_ATTR_ALL,
__DCB_PFC_UP_ATTR_ENUM_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PFC_UP_ATTR_MAX = __DCB_PFC_UP_ATTR_ENUM_MAX - 1,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum dcbnl_pg_attrs {
DCB_PG_ATTR_UNDEFINED,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_TC_0,
DCB_PG_ATTR_TC_1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_TC_2,
DCB_PG_ATTR_TC_3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_TC_4,
DCB_PG_ATTR_TC_5,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_TC_6,
DCB_PG_ATTR_TC_7,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_TC_MAX,
DCB_PG_ATTR_TC_ALL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_BW_ID_0,
DCB_PG_ATTR_BW_ID_1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_BW_ID_2,
DCB_PG_ATTR_BW_ID_3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_BW_ID_4,
DCB_PG_ATTR_BW_ID_5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_BW_ID_6,
DCB_PG_ATTR_BW_ID_7,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_PG_ATTR_BW_ID_MAX,
DCB_PG_ATTR_BW_ID_ALL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__DCB_PG_ATTR_ENUM_MAX,
DCB_PG_ATTR_MAX = __DCB_PG_ATTR_ENUM_MAX - 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum dcbnl_tc_attrs {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_TC_ATTR_PARAM_UNDEFINED,
DCB_TC_ATTR_PARAM_PGID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_TC_ATTR_PARAM_UP_MAPPING,
DCB_TC_ATTR_PARAM_STRICT_PRIO,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_TC_ATTR_PARAM_BW_PCT,
DCB_TC_ATTR_PARAM_ALL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__DCB_TC_ATTR_PARAM_ENUM_MAX,
DCB_TC_ATTR_PARAM_MAX = __DCB_TC_ATTR_PARAM_ENUM_MAX - 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum dcbnl_cap_attrs {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_CAP_ATTR_UNDEFINED,
DCB_CAP_ATTR_ALL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_CAP_ATTR_PG,
DCB_CAP_ATTR_PFC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_CAP_ATTR_UP2TC,
DCB_CAP_ATTR_PG_TCS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_CAP_ATTR_PFC_TCS,
DCB_CAP_ATTR_GSP,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_CAP_ATTR_BCN,
DCB_CAP_ATTR_DCBX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__DCB_CAP_ATTR_ENUM_MAX,
DCB_CAP_ATTR_MAX = __DCB_CAP_ATTR_ENUM_MAX - 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DCB_CAP_DCBX_HOST 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DCB_CAP_DCBX_LLD_MANAGED 0x02
#define DCB_CAP_DCBX_VER_CEE 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DCB_CAP_DCBX_VER_IEEE 0x08
#define DCB_CAP_DCBX_STATIC 0x10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum dcbnl_numtcs_attrs {
DCB_NUMTCS_ATTR_UNDEFINED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_NUMTCS_ATTR_ALL,
DCB_NUMTCS_ATTR_PG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_NUMTCS_ATTR_PFC,
__DCB_NUMTCS_ATTR_ENUM_MAX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_NUMTCS_ATTR_MAX = __DCB_NUMTCS_ATTR_ENUM_MAX - 1,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum dcbnl_bcn_attrs {
DCB_BCN_ATTR_UNDEFINED = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_RP_0,
DCB_BCN_ATTR_RP_1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_RP_2,
DCB_BCN_ATTR_RP_3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_RP_4,
DCB_BCN_ATTR_RP_5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_RP_6,
DCB_BCN_ATTR_RP_7,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_RP_ALL,
DCB_BCN_ATTR_BCNA_0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_BCNA_1,
DCB_BCN_ATTR_ALPHA,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_BETA,
DCB_BCN_ATTR_GD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_GI,
DCB_BCN_ATTR_TMAX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_TD,
DCB_BCN_ATTR_RMIN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_W,
DCB_BCN_ATTR_RD,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_RU,
DCB_BCN_ATTR_WRTT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_RI,
DCB_BCN_ATTR_C,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_ALL,
__DCB_BCN_ATTR_ENUM_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_BCN_ATTR_MAX = __DCB_BCN_ATTR_ENUM_MAX - 1,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum dcb_general_attr_values {
DCB_ATTR_VALUE_UNDEFINED = 0xff
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DCB_APP_IDTYPE_ETHTYPE 0x00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DCB_APP_IDTYPE_PORTNUM 0x01
enum dcbnl_app_attrs {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_APP_ATTR_UNDEFINED,
DCB_APP_ATTR_IDTYPE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_APP_ATTR_ID,
DCB_APP_ATTR_PRIORITY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__DCB_APP_ATTR_ENUM_MAX,
DCB_APP_ATTR_MAX = __DCB_APP_ATTR_ENUM_MAX - 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define DCB_FEATCFG_ERROR 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DCB_FEATCFG_ENABLE 0x02
#define DCB_FEATCFG_WILLING 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DCB_FEATCFG_ADVERTISE 0x08
enum dcbnl_featcfg_attrs {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_FEATCFG_ATTR_UNDEFINED,
DCB_FEATCFG_ATTR_ALL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_FEATCFG_ATTR_PG,
DCB_FEATCFG_ATTR_PFC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_FEATCFG_ATTR_APP,
__DCB_FEATCFG_ATTR_ENUM_MAX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DCB_FEATCFG_ATTR_MAX = __DCB_FEATCFG_ATTR_ENUM_MAX - 1,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/dlm_device.h b/libc/kernel/uapi/linux/dlm_device.h
index c496d8d12..3bc43f4fa 100644
--- a/libc/kernel/uapi/linux/dlm_device.h
+++ b/libc/kernel/uapi/linux/dlm_device.h
@@ -24,7 +24,7 @@
#define DLM_USER_LVB_LEN 32
#define DLM_DEVICE_VERSION_MAJOR 6
#define DLM_DEVICE_VERSION_MINOR 0
-#define DLM_DEVICE_VERSION_PATCH 1
+#define DLM_DEVICE_VERSION_PATCH 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct dlm_lock_params {
__u8 mode;
diff --git a/libc/kernel/uapi/linux/dm-ioctl.h b/libc/kernel/uapi/linux/dm-ioctl.h
index 91dccc127..9d427019a 100644
--- a/libc/kernel/uapi/linux/dm-ioctl.h
+++ b/libc/kernel/uapi/linux/dm-ioctl.h
@@ -121,9 +121,9 @@ enum {
#define DM_DEV_SET_GEOMETRY _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
#define DM_VERSION_MAJOR 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define DM_VERSION_MINOR 28
+#define DM_VERSION_MINOR 34
#define DM_VERSION_PATCHLEVEL 0
-#define DM_VERSION_EXTRA "-ioctl(2014-09-17)"
+#define DM_VERSION_EXTRA "-ioctl(2015-10-28)"
#define DM_READONLY_FLAG (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DM_SUSPEND_FLAG (1 << 1)
@@ -144,5 +144,6 @@ enum {
#define DM_SECURE_DATA_FLAG (1 << 15)
#define DM_DATA_OUT_FLAG (1 << 16)
#define DM_DEFERRED_REMOVE (1 << 17)
-#endif
+#define DM_INTERNAL_SUSPEND_FLAG (1 << 18)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/dvb/dmx.h b/libc/kernel/uapi/linux/dvb/dmx.h
index 8e1d71838..99da210e2 100644
--- a/libc/kernel/uapi/linux/dvb/dmx.h
+++ b/libc/kernel/uapi/linux/dvb/dmx.h
@@ -22,117 +22,118 @@
#include <time.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DMX_FILTER_SIZE 16
-typedef enum {
+enum dmx_output {
DMX_OUT_DECODER,
DMX_OUT_TAP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
DMX_OUT_TS_TAP,
DMX_OUT_TSDEMUX_TAP
-} dmx_output_t;
-typedef enum {
+};
+typedef enum dmx_output dmx_output_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef enum dmx_input {
DMX_IN_FRONTEND,
DMX_IN_DVR
} dmx_input_t;
-typedef enum dmx_ts_pes {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef enum dmx_ts_pes {
DMX_PES_AUDIO0,
DMX_PES_VIDEO0,
DMX_PES_TELETEXT0,
- DMX_PES_SUBTITLE0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DMX_PES_SUBTITLE0,
DMX_PES_PCR0,
DMX_PES_AUDIO1,
DMX_PES_VIDEO1,
- DMX_PES_TELETEXT1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DMX_PES_TELETEXT1,
DMX_PES_SUBTITLE1,
DMX_PES_PCR1,
DMX_PES_AUDIO2,
- DMX_PES_VIDEO2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DMX_PES_VIDEO2,
DMX_PES_TELETEXT2,
DMX_PES_SUBTITLE2,
DMX_PES_PCR2,
- DMX_PES_AUDIO3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DMX_PES_AUDIO3,
DMX_PES_VIDEO3,
DMX_PES_TELETEXT3,
DMX_PES_SUBTITLE3,
- DMX_PES_PCR3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DMX_PES_PCR3,
DMX_PES_OTHER
} dmx_pes_type_t;
#define DMX_PES_AUDIO DMX_PES_AUDIO0
-#define DMX_PES_VIDEO DMX_PES_VIDEO0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DMX_PES_VIDEO DMX_PES_VIDEO0
#define DMX_PES_TELETEXT DMX_PES_TELETEXT0
#define DMX_PES_SUBTITLE DMX_PES_SUBTITLE0
#define DMX_PES_PCR DMX_PES_PCR0
-typedef struct dmx_filter {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct dmx_filter {
__u8 filter[DMX_FILTER_SIZE];
__u8 mask[DMX_FILTER_SIZE];
__u8 mode[DMX_FILTER_SIZE];
-} dmx_filter_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} dmx_filter_t;
struct dmx_sct_filter_params {
__u16 pid;
dmx_filter_t filter;
- __u32 timeout;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 timeout;
__u32 flags;
#define DMX_CHECK_CRC 1
#define DMX_ONESHOT 2
-#define DMX_IMMEDIATE_START 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DMX_IMMEDIATE_START 4
#define DMX_KERNEL_CLIENT 0x8000
};
struct dmx_pes_filter_params {
- __u16 pid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 pid;
dmx_input_t input;
dmx_output_t output;
dmx_pes_type_t pes_type;
- __u32 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
};
typedef struct dmx_caps {
__u32 caps;
- int num_decoders;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int num_decoders;
} dmx_caps_t;
-typedef enum {
+typedef enum dmx_source {
DMX_SOURCE_FRONT0 = 0,
- DMX_SOURCE_FRONT1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DMX_SOURCE_FRONT1,
DMX_SOURCE_FRONT2,
DMX_SOURCE_FRONT3,
DMX_SOURCE_DVR0 = 16,
- DMX_SOURCE_DVR1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DMX_SOURCE_DVR1,
DMX_SOURCE_DVR2,
DMX_SOURCE_DVR3
} dmx_source_t;
-struct dmx_stc {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct dmx_stc {
unsigned int num;
unsigned int base;
__u64 stc;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define DMX_START _IO('o', 41)
#define DMX_STOP _IO('o', 42)
#define DMX_SET_FILTER _IOW('o', 43, struct dmx_sct_filter_params)
-#define DMX_SET_PES_FILTER _IOW('o', 44, struct dmx_pes_filter_params)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DMX_SET_PES_FILTER _IOW('o', 44, struct dmx_pes_filter_params)
#define DMX_SET_BUFFER_SIZE _IO('o', 45)
#define DMX_GET_PES_PIDS _IOR('o', 47, __u16[5])
#define DMX_GET_CAPS _IOR('o', 48, dmx_caps_t)
-#define DMX_SET_SOURCE _IOW('o', 49, dmx_source_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DMX_SET_SOURCE _IOW('o', 49, dmx_source_t)
#define DMX_GET_STC _IOWR('o', 50, struct dmx_stc)
#define DMX_ADD_PID _IOW('o', 51, __u16)
#define DMX_REMOVE_PID _IOW('o', 52, __u16)
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/dvb/frontend.h b/libc/kernel/uapi/linux/dvb/frontend.h
index a97d5e7b2..3a833cf17 100644
--- a/libc/kernel/uapi/linux/dvb/frontend.h
+++ b/libc/kernel/uapi/linux/dvb/frontend.h
@@ -19,15 +19,15 @@
#ifndef _DVBFRONTEND_H_
#define _DVBFRONTEND_H_
#include <linux/types.h>
-typedef enum fe_type {
+enum fe_type {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FE_QPSK,
FE_QAM,
FE_OFDM,
FE_ATSC
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-} fe_type_t;
-typedef enum fe_caps {
+};
+enum fe_caps {
FE_IS_STUPID = 0,
FE_CAN_INVERSION_AUTO = 0x1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -67,11 +67,11 @@ typedef enum fe_caps {
FE_CAN_RECOVER = 0x40000000,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FE_CAN_MUTE_TS = 0x80000000
-} fe_caps_t;
+};
struct dvb_frontend_info {
char name[128];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- fe_type_t type;
+ enum fe_type type;
__u32 frequency_min;
__u32 frequency_max;
__u32 frequency_stepsize;
@@ -82,7 +82,7 @@ struct dvb_frontend_info {
__u32 symbol_rate_tolerance;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 notifier_delay;
- fe_caps_t caps;
+ enum fe_caps caps;
};
struct dvb_diseqc_master_cmd {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -96,23 +96,23 @@ struct dvb_diseqc_slave_reply {
int timeout;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-typedef enum fe_sec_voltage {
+enum fe_sec_voltage {
SEC_VOLTAGE_13,
SEC_VOLTAGE_18,
SEC_VOLTAGE_OFF
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-} fe_sec_voltage_t;
-typedef enum fe_sec_tone_mode {
+};
+enum fe_sec_tone_mode {
SEC_TONE_ON,
SEC_TONE_OFF
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-} fe_sec_tone_mode_t;
-typedef enum fe_sec_mini_cmd {
+};
+enum fe_sec_mini_cmd {
SEC_MINI_A,
SEC_MINI_B
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-} fe_sec_mini_cmd_t;
-typedef enum fe_status {
+};
+enum fe_status {
FE_HAS_SIGNAL = 0x01,
FE_HAS_CARRIER = 0x02,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -122,14 +122,14 @@ typedef enum fe_status {
FE_TIMEDOUT = 0x20,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FE_REINIT = 0x40,
-} fe_status_t;
-typedef enum fe_spectral_inversion {
+};
+enum fe_spectral_inversion {
INVERSION_OFF,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
INVERSION_ON,
INVERSION_AUTO
-} fe_spectral_inversion_t;
-typedef enum fe_code_rate {
+};
+enum fe_code_rate {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FEC_NONE = 0,
FEC_1_2,
@@ -147,8 +147,8 @@ typedef enum fe_code_rate {
FEC_9_10,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FEC_2_5,
-} fe_code_rate_t;
-typedef enum fe_modulation {
+};
+enum fe_modulation {
QPSK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
QAM_16,
@@ -167,8 +167,8 @@ typedef enum fe_modulation {
DQPSK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
QAM_4_NR,
-} fe_modulation_t;
-typedef enum fe_transmit_mode {
+};
+enum fe_transmit_mode {
TRANSMISSION_MODE_2K,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TRANSMISSION_MODE_8K,
@@ -181,94 +181,39 @@ typedef enum fe_transmit_mode {
TRANSMISSION_MODE_C1,
TRANSMISSION_MODE_C3780,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-} fe_transmit_mode_t;
-typedef enum fe_bandwidth {
- BANDWIDTH_8_MHZ,
- BANDWIDTH_7_MHZ,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- BANDWIDTH_6_MHZ,
- BANDWIDTH_AUTO,
- BANDWIDTH_5_MHZ,
- BANDWIDTH_10_MHZ,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- BANDWIDTH_1_712_MHZ,
-} fe_bandwidth_t;
-typedef enum fe_guard_interval {
+};
+enum fe_guard_interval {
GUARD_INTERVAL_1_32,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
GUARD_INTERVAL_1_16,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
GUARD_INTERVAL_1_8,
GUARD_INTERVAL_1_4,
GUARD_INTERVAL_AUTO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
GUARD_INTERVAL_1_128,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
GUARD_INTERVAL_19_128,
GUARD_INTERVAL_19_256,
GUARD_INTERVAL_PN420,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
GUARD_INTERVAL_PN595,
- GUARD_INTERVAL_PN945,
-} fe_guard_interval_t;
-typedef enum fe_hierarchy {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ GUARD_INTERVAL_PN945,
+};
+enum fe_hierarchy {
HIERARCHY_NONE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HIERARCHY_1,
HIERARCHY_2,
HIERARCHY_4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HIERARCHY_AUTO
-} fe_hierarchy_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum fe_interleaving {
INTERLEAVING_NONE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
INTERLEAVING_AUTO,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
INTERLEAVING_240,
INTERLEAVING_720,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct dvb_qpsk_parameters {
- __u32 symbol_rate;
- fe_code_rate_t fec_inner;
-};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct dvb_qam_parameters {
- __u32 symbol_rate;
- fe_code_rate_t fec_inner;
- fe_modulation_t modulation;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-};
-struct dvb_vsb_parameters {
- fe_modulation_t modulation;
-};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct dvb_ofdm_parameters {
- fe_bandwidth_t bandwidth;
- fe_code_rate_t code_rate_HP;
- fe_code_rate_t code_rate_LP;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- fe_modulation_t constellation;
- fe_transmit_mode_t transmission_mode;
- fe_guard_interval_t guard_interval;
- fe_hierarchy_t hierarchy_information;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-};
-struct dvb_frontend_parameters {
- __u32 frequency;
- fe_spectral_inversion_t inversion;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- union {
- struct dvb_qpsk_parameters qpsk;
- struct dvb_qam_parameters qam;
- struct dvb_ofdm_parameters ofdm;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- struct dvb_vsb_parameters vsb;
- } u;
-};
-struct dvb_frontend_event {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- fe_status_t status;
- struct dvb_frontend_parameters parameters;
-};
#define DTV_UNDEFINED 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DTV_TUNE 1
@@ -359,21 +304,21 @@ struct dvb_frontend_event {
#define DTV_STAT_ERROR_BLOCK_COUNT 68
#define DTV_STAT_TOTAL_BLOCK_COUNT 69
#define DTV_MAX_COMMAND DTV_STAT_TOTAL_BLOCK_COUNT
-typedef enum fe_pilot {
+enum fe_pilot {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PILOT_ON,
PILOT_OFF,
PILOT_AUTO,
-} fe_pilot_t;
+};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-typedef enum fe_rolloff {
+enum fe_rolloff {
ROLLOFF_35,
ROLLOFF_20,
ROLLOFF_25,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ROLLOFF_AUTO,
-} fe_rolloff_t;
-typedef enum fe_delivery_system {
+};
+enum fe_delivery_system {
SYS_UNDEFINED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
SYS_DVBC_ANNEX_A,
@@ -398,7 +343,7 @@ typedef enum fe_delivery_system {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
SYS_TURBO,
SYS_DVBC_ANNEX_C,
-} fe_delivery_system_t;
+};
#define SYS_DVBC_ANNEX_AC SYS_DVBC_ANNEX_A
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SYS_DMBTH SYS_DTMB
@@ -492,6 +437,81 @@ struct dtv_properties {
struct dtv_property * props;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+enum fe_bandwidth {
+ BANDWIDTH_8_MHZ,
+ BANDWIDTH_7_MHZ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BANDWIDTH_6_MHZ,
+ BANDWIDTH_AUTO,
+ BANDWIDTH_5_MHZ,
+ BANDWIDTH_10_MHZ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BANDWIDTH_1_712_MHZ,
+};
+typedef enum fe_sec_voltage fe_sec_voltage_t;
+typedef enum fe_caps fe_caps_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef enum fe_type fe_type_t;
+typedef enum fe_sec_tone_mode fe_sec_tone_mode_t;
+typedef enum fe_sec_mini_cmd fe_sec_mini_cmd_t;
+typedef enum fe_status fe_status_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef enum fe_spectral_inversion fe_spectral_inversion_t;
+typedef enum fe_code_rate fe_code_rate_t;
+typedef enum fe_modulation fe_modulation_t;
+typedef enum fe_transmit_mode fe_transmit_mode_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef enum fe_bandwidth fe_bandwidth_t;
+typedef enum fe_guard_interval fe_guard_interval_t;
+typedef enum fe_hierarchy fe_hierarchy_t;
+typedef enum fe_pilot fe_pilot_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef enum fe_rolloff fe_rolloff_t;
+typedef enum fe_delivery_system fe_delivery_system_t;
+struct dvb_qpsk_parameters {
+ __u32 symbol_rate;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fe_code_rate_t fec_inner;
+};
+struct dvb_qam_parameters {
+ __u32 symbol_rate;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fe_code_rate_t fec_inner;
+ fe_modulation_t modulation;
+};
+struct dvb_vsb_parameters {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fe_modulation_t modulation;
+};
+struct dvb_ofdm_parameters {
+ fe_bandwidth_t bandwidth;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fe_code_rate_t code_rate_HP;
+ fe_code_rate_t code_rate_LP;
+ fe_modulation_t constellation;
+ fe_transmit_mode_t transmission_mode;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fe_guard_interval_t guard_interval;
+ fe_hierarchy_t hierarchy_information;
+};
+struct dvb_frontend_parameters {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 frequency;
+ fe_spectral_inversion_t inversion;
+ union {
+ struct dvb_qpsk_parameters qpsk;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dvb_qam_parameters qam;
+ struct dvb_ofdm_parameters ofdm;
+ struct dvb_vsb_parameters vsb;
+ } u;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct dvb_frontend_event {
+ fe_status_t status;
+ struct dvb_frontend_parameters parameters;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define FE_SET_PROPERTY _IOW('o', 82, struct dtv_properties)
#define FE_GET_PROPERTY _IOR('o', 83, struct dtv_properties)
#define FE_TUNE_MODE_ONESHOT 0x01
diff --git a/libc/kernel/uapi/linux/elf-em.h b/libc/kernel/uapi/linux/elf-em.h
index 8fe939a6a..1e372fa95 100644
--- a/libc/kernel/uapi/linux/elf-em.h
+++ b/libc/kernel/uapi/linux/elf-em.h
@@ -42,27 +42,33 @@
#define EM_SH 42
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EM_SPARCV9 43
+#define EM_H8_300 46
#define EM_IA_64 50
#define EM_X86_64 62
-#define EM_S390 22
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EM_S390 22
#define EM_CRIS 76
#define EM_V850 87
#define EM_M32R 88
-#define EM_MN10300 89
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EM_MN10300 89
#define EM_OPENRISC 92
#define EM_BLACKFIN 106
+#define EM_ALTERA_NIOS2 113
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EM_TI_C6000 140
#define EM_AARCH64 183
+#define EM_TILEPRO 188
+#define EM_MICROBLAZE 189
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EM_TILEGX 191
#define EM_FRV 0x5441
#define EM_AVR32 0x18ad
#define EM_ALPHA 0x9026
-#define EM_CYGNUS_V850 0x9080
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EM_CYGNUS_V850 0x9080
#define EM_CYGNUS_M32R 0x9041
#define EM_S390_OLD 0xA390
#define EM_CYGNUS_MN10300 0xbeef
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/elf.h b/libc/kernel/uapi/linux/elf.h
index 4e42758e0..27a2f84b0 100644
--- a/libc/kernel/uapi/linux/elf.h
+++ b/libc/kernel/uapi/linux/elf.h
@@ -412,20 +412,22 @@ typedef struct elf64_shdr {
#define NT_ARM_HW_BREAK 0x402
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NT_ARM_HW_WATCH 0x403
+#define NT_ARM_SYSTEM_CALL 0x404
#define NT_METAG_CBUF 0x500
#define NT_METAG_RPIPE 0x501
-#define NT_METAG_TLS 0x502
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NT_METAG_TLS 0x502
typedef struct elf32_note {
Elf32_Word n_namesz;
Elf32_Word n_descsz;
- Elf32_Word n_type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ Elf32_Word n_type;
} Elf32_Nhdr;
typedef struct elf64_note {
Elf64_Word n_namesz;
- Elf64_Word n_descsz;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ Elf64_Word n_descsz;
Elf64_Word n_type;
} Elf64_Nhdr;
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/ethtool.h b/libc/kernel/uapi/linux/ethtool.h
index 1a00c7fd2..a2a2da7c3 100644
--- a/libc/kernel/uapi/linux/ethtool.h
+++ b/libc/kernel/uapi/linux/ethtool.h
@@ -49,180 +49,185 @@ struct ethtool_cmd {
#define ETH_MDIO_SUPPORTS_C45 2
#define ETHTOOL_FWVERS_LEN 32
#define ETHTOOL_BUSINFO_LEN 32
-struct ethtool_drvinfo {
+#define ETHTOOL_EROMVERS_LEN 32
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ethtool_drvinfo {
__u32 cmd;
char driver[32];
char version[32];
- char fw_version[ETHTOOL_FWVERS_LEN];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char fw_version[ETHTOOL_FWVERS_LEN];
char bus_info[ETHTOOL_BUSINFO_LEN];
- char reserved1[32];
+ char erom_version[ETHTOOL_EROMVERS_LEN];
char reserved2[12];
- __u32 n_priv_flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 n_priv_flags;
__u32 n_stats;
__u32 testinfo_len;
__u32 eedump_len;
- __u32 regdump_len;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 regdump_len;
};
#define SOPASS_MAX 6
struct ethtool_wolinfo {
- __u32 cmd;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cmd;
__u32 supported;
__u32 wolopts;
__u8 sopass[SOPASS_MAX];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ethtool_value {
__u32 cmd;
__u32 data;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum tunable_id {
ETHTOOL_ID_UNSPEC,
ETHTOOL_RX_COPYBREAK,
- ETHTOOL_TX_COPYBREAK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ETHTOOL_TX_COPYBREAK,
+ __ETHTOOL_TUNABLE_COUNT,
};
enum tunable_type_id {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETHTOOL_TUNABLE_UNSPEC,
ETHTOOL_TUNABLE_U8,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETHTOOL_TUNABLE_U16,
ETHTOOL_TUNABLE_U32,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETHTOOL_TUNABLE_U64,
ETHTOOL_TUNABLE_STRING,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETHTOOL_TUNABLE_S8,
ETHTOOL_TUNABLE_S16,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETHTOOL_TUNABLE_S32,
ETHTOOL_TUNABLE_S64,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ethtool_tunable {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cmd;
__u32 id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type_id;
__u32 len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
void * data[0];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ethtool_regs {
__u32 cmd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 version;
__u32 len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 data[0];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ethtool_eeprom {
__u32 cmd;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 magic;
__u32 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 len;
__u8 data[0];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ethtool_eee {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cmd;
__u32 supported;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 advertised;
__u32 lp_advertised;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 eee_active;
__u32 eee_enabled;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tx_lpi_enabled;
__u32 tx_lpi_timer;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[2];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ethtool_modinfo {
__u32 cmd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
__u32 eeprom_len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[8];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ethtool_coalesce {
__u32 cmd;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_coalesce_usecs;
__u32 rx_max_coalesced_frames;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_coalesce_usecs_irq;
__u32 rx_max_coalesced_frames_irq;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tx_coalesce_usecs;
__u32 tx_max_coalesced_frames;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tx_coalesce_usecs_irq;
__u32 tx_max_coalesced_frames_irq;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 stats_block_coalesce_usecs;
__u32 use_adaptive_rx_coalesce;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 use_adaptive_tx_coalesce;
__u32 pkt_rate_low;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_coalesce_usecs_low;
__u32 rx_max_coalesced_frames_low;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tx_coalesce_usecs_low;
__u32 tx_max_coalesced_frames_low;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pkt_rate_high;
__u32 rx_coalesce_usecs_high;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_max_coalesced_frames_high;
__u32 tx_coalesce_usecs_high;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tx_max_coalesced_frames_high;
__u32 rate_sample_interval;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ethtool_ringparam {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cmd;
__u32 rx_max_pending;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_mini_max_pending;
__u32 rx_jumbo_max_pending;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tx_max_pending;
__u32 rx_pending;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_mini_pending;
__u32 rx_jumbo_pending;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tx_pending;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ethtool_channels {
__u32 cmd;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_rx;
__u32 max_tx;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_other;
__u32 max_combined;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_count;
__u32 tx_count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 other_count;
__u32 combined_count;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ethtool_pauseparam {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cmd;
__u32 autoneg;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rx_pause;
__u32 tx_pause;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define ETH_GSTRING_LEN 32
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum ethtool_stringset {
ETH_SS_TEST = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETH_SS_STATS,
ETH_SS_PRIV_FLAGS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETH_SS_NTUPLE_FILTERS,
ETH_SS_FEATURES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ETH_SS_RSS_HASH_FUNCS,
+ ETH_SS_TUNABLES,
};
struct ethtool_gstrings {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -337,297 +342,312 @@ struct ethtool_rx_flow_spec {
__u32 location;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
-struct ethtool_rxnfc {
- __u32 cmd;
- __u32 flow_type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u64 data;
- struct ethtool_rx_flow_spec fs;
- __u32 rule_cnt;
- __u32 rule_locs[0];
+#define ETHTOOL_RX_FLOW_SPEC_RING 0x00000000FFFFFFFFLL
+#define ETHTOOL_RX_FLOW_SPEC_RING_VF 0x000000FF00000000LL
+#define ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF 32
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-};
struct ethtool_rxfh_indir {
__u32 cmd;
__u32 size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ring_index[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ethtool_rxfh {
__u32 cmd;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rss_context;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 indir_size;
__u32 key_size;
- __u32 rsvd[2];
+ __u8 hfunc;
+ __u8 rsvd8[3];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rsvd32;
__u32 rss_config[0];
};
#define ETH_RXFH_INDIR_NO_CHANGE 0xffffffff
-struct ethtool_rx_ntuple_flow_spec {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ethtool_rx_ntuple_flow_spec {
__u32 flow_type;
union {
struct ethtool_tcpip4_spec tcp_ip4_spec;
- struct ethtool_tcpip4_spec udp_ip4_spec;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ethtool_tcpip4_spec udp_ip4_spec;
struct ethtool_tcpip4_spec sctp_ip4_spec;
struct ethtool_ah_espip4_spec ah_ip4_spec;
struct ethtool_ah_espip4_spec esp_ip4_spec;
- struct ethtool_usrip4_spec usr_ip4_spec;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ethtool_usrip4_spec usr_ip4_spec;
struct ethhdr ether_spec;
__u8 hdata[72];
} h_u, m_u;
- __u16 vlan_tag;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 vlan_tag;
__u16 vlan_tag_mask;
__u64 data;
__u64 data_mask;
- __s32 action;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 action;
#define ETHTOOL_RXNTUPLE_ACTION_DROP (- 1)
#define ETHTOOL_RXNTUPLE_ACTION_CLEAR (- 2)
};
-struct ethtool_rx_ntuple {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ethtool_rx_ntuple {
__u32 cmd;
struct ethtool_rx_ntuple_flow_spec fs;
};
-#define ETHTOOL_FLASH_MAX_FILENAME 128
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_FLASH_MAX_FILENAME 128
enum ethtool_flash_op_type {
ETHTOOL_FLASH_ALL_REGIONS = 0,
};
-struct ethtool_flash {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ethtool_flash {
__u32 cmd;
__u32 region;
char data[ETHTOOL_FLASH_MAX_FILENAME];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ethtool_dump {
__u32 cmd;
__u32 version;
- __u32 flag;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flag;
__u32 len;
__u8 data[0];
};
-#define ETH_FW_DUMP_DISABLE 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_FW_DUMP_DISABLE 0
struct ethtool_get_features_block {
__u32 available;
__u32 requested;
- __u32 active;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 active;
__u32 never_changed;
};
struct ethtool_gfeatures {
- __u32 cmd;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cmd;
__u32 size;
struct ethtool_get_features_block features[0];
};
-struct ethtool_set_features_block {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ethtool_set_features_block {
__u32 valid;
__u32 requested;
};
-struct ethtool_sfeatures {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ethtool_sfeatures {
__u32 cmd;
__u32 size;
struct ethtool_set_features_block features[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ethtool_ts_info {
__u32 cmd;
__u32 so_timestamping;
- __s32 phc_index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 phc_index;
__u32 tx_types;
__u32 tx_reserved[3];
__u32 rx_filters;
- __u32 rx_reserved[3];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rx_reserved[3];
};
enum ethtool_sfeatures_retval_bits {
ETHTOOL_F_UNSUPPORTED__BIT,
- ETHTOOL_F_WISH__BIT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ETHTOOL_F_WISH__BIT,
ETHTOOL_F_COMPAT__BIT,
};
#define ETHTOOL_F_UNSUPPORTED (1 << ETHTOOL_F_UNSUPPORTED__BIT)
-#define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_F_WISH (1 << ETHTOOL_F_WISH__BIT)
#define ETHTOOL_F_COMPAT (1 << ETHTOOL_F_COMPAT__BIT)
#define ETHTOOL_GSET 0x00000001
#define ETHTOOL_SSET 0x00000002
-#define ETHTOOL_GDRVINFO 0x00000003
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GDRVINFO 0x00000003
#define ETHTOOL_GREGS 0x00000004
#define ETHTOOL_GWOL 0x00000005
#define ETHTOOL_SWOL 0x00000006
-#define ETHTOOL_GMSGLVL 0x00000007
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GMSGLVL 0x00000007
#define ETHTOOL_SMSGLVL 0x00000008
#define ETHTOOL_NWAY_RST 0x00000009
#define ETHTOOL_GLINK 0x0000000a
-#define ETHTOOL_GEEPROM 0x0000000b
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GEEPROM 0x0000000b
#define ETHTOOL_SEEPROM 0x0000000c
#define ETHTOOL_GCOALESCE 0x0000000e
#define ETHTOOL_SCOALESCE 0x0000000f
-#define ETHTOOL_GRINGPARAM 0x00000010
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GRINGPARAM 0x00000010
#define ETHTOOL_SRINGPARAM 0x00000011
#define ETHTOOL_GPAUSEPARAM 0x00000012
#define ETHTOOL_SPAUSEPARAM 0x00000013
-#define ETHTOOL_GRXCSUM 0x00000014
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GRXCSUM 0x00000014
#define ETHTOOL_SRXCSUM 0x00000015
#define ETHTOOL_GTXCSUM 0x00000016
#define ETHTOOL_STXCSUM 0x00000017
-#define ETHTOOL_GSG 0x00000018
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GSG 0x00000018
#define ETHTOOL_SSG 0x00000019
#define ETHTOOL_TEST 0x0000001a
#define ETHTOOL_GSTRINGS 0x0000001b
-#define ETHTOOL_PHYS_ID 0x0000001c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_PHYS_ID 0x0000001c
#define ETHTOOL_GSTATS 0x0000001d
#define ETHTOOL_GTSO 0x0000001e
#define ETHTOOL_STSO 0x0000001f
-#define ETHTOOL_GPERMADDR 0x00000020
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GPERMADDR 0x00000020
#define ETHTOOL_GUFO 0x00000021
#define ETHTOOL_SUFO 0x00000022
#define ETHTOOL_GGSO 0x00000023
-#define ETHTOOL_SGSO 0x00000024
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_SGSO 0x00000024
#define ETHTOOL_GFLAGS 0x00000025
#define ETHTOOL_SFLAGS 0x00000026
#define ETHTOOL_GPFLAGS 0x00000027
-#define ETHTOOL_SPFLAGS 0x00000028
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_SPFLAGS 0x00000028
#define ETHTOOL_GRXFH 0x00000029
#define ETHTOOL_SRXFH 0x0000002a
#define ETHTOOL_GGRO 0x0000002b
-#define ETHTOOL_SGRO 0x0000002c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_SGRO 0x0000002c
#define ETHTOOL_GRXRINGS 0x0000002d
#define ETHTOOL_GRXCLSRLCNT 0x0000002e
#define ETHTOOL_GRXCLSRULE 0x0000002f
-#define ETHTOOL_GRXCLSRLALL 0x00000030
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GRXCLSRLALL 0x00000030
#define ETHTOOL_SRXCLSRLDEL 0x00000031
#define ETHTOOL_SRXCLSRLINS 0x00000032
#define ETHTOOL_FLASHDEV 0x00000033
-#define ETHTOOL_RESET 0x00000034
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_RESET 0x00000034
#define ETHTOOL_SRXNTUPLE 0x00000035
#define ETHTOOL_GRXNTUPLE 0x00000036
#define ETHTOOL_GSSET_INFO 0x00000037
-#define ETHTOOL_GRXFHINDIR 0x00000038
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GRXFHINDIR 0x00000038
#define ETHTOOL_SRXFHINDIR 0x00000039
#define ETHTOOL_GFEATURES 0x0000003a
#define ETHTOOL_SFEATURES 0x0000003b
-#define ETHTOOL_GCHANNELS 0x0000003c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GCHANNELS 0x0000003c
#define ETHTOOL_SCHANNELS 0x0000003d
#define ETHTOOL_SET_DUMP 0x0000003e
#define ETHTOOL_GET_DUMP_FLAG 0x0000003f
-#define ETHTOOL_GET_DUMP_DATA 0x00000040
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GET_DUMP_DATA 0x00000040
#define ETHTOOL_GET_TS_INFO 0x00000041
#define ETHTOOL_GMODULEINFO 0x00000042
#define ETHTOOL_GMODULEEEPROM 0x00000043
-#define ETHTOOL_GEEE 0x00000044
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GEEE 0x00000044
#define ETHTOOL_SEEE 0x00000045
#define ETHTOOL_GRSSH 0x00000046
#define ETHTOOL_SRSSH 0x00000047
-#define ETHTOOL_GTUNABLE 0x00000048
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETHTOOL_GTUNABLE 0x00000048
#define ETHTOOL_STUNABLE 0x00000049
#define SPARC_ETH_GSET ETHTOOL_GSET
#define SPARC_ETH_SSET ETHTOOL_SSET
-#define SUPPORTED_10baseT_Half (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_10baseT_Half (1 << 0)
#define SUPPORTED_10baseT_Full (1 << 1)
#define SUPPORTED_100baseT_Half (1 << 2)
#define SUPPORTED_100baseT_Full (1 << 3)
-#define SUPPORTED_1000baseT_Half (1 << 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_1000baseT_Half (1 << 4)
#define SUPPORTED_1000baseT_Full (1 << 5)
#define SUPPORTED_Autoneg (1 << 6)
#define SUPPORTED_TP (1 << 7)
-#define SUPPORTED_AUI (1 << 8)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_AUI (1 << 8)
#define SUPPORTED_MII (1 << 9)
#define SUPPORTED_FIBRE (1 << 10)
#define SUPPORTED_BNC (1 << 11)
-#define SUPPORTED_10000baseT_Full (1 << 12)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_10000baseT_Full (1 << 12)
#define SUPPORTED_Pause (1 << 13)
#define SUPPORTED_Asym_Pause (1 << 14)
#define SUPPORTED_2500baseX_Full (1 << 15)
-#define SUPPORTED_Backplane (1 << 16)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_Backplane (1 << 16)
#define SUPPORTED_1000baseKX_Full (1 << 17)
#define SUPPORTED_10000baseKX4_Full (1 << 18)
#define SUPPORTED_10000baseKR_Full (1 << 19)
-#define SUPPORTED_10000baseR_FEC (1 << 20)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_10000baseR_FEC (1 << 20)
#define SUPPORTED_20000baseMLD2_Full (1 << 21)
#define SUPPORTED_20000baseKR2_Full (1 << 22)
#define SUPPORTED_40000baseKR4_Full (1 << 23)
-#define SUPPORTED_40000baseCR4_Full (1 << 24)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_40000baseCR4_Full (1 << 24)
#define SUPPORTED_40000baseSR4_Full (1 << 25)
#define SUPPORTED_40000baseLR4_Full (1 << 26)
+#define SUPPORTED_56000baseKR4_Full (1 << 27)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SUPPORTED_56000baseCR4_Full (1 << 28)
+#define SUPPORTED_56000baseSR4_Full (1 << 29)
+#define SUPPORTED_56000baseLR4_Full (1 << 30)
#define ADVERTISED_10baseT_Half (1 << 0)
-#define ADVERTISED_10baseT_Full (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_10baseT_Full (1 << 1)
#define ADVERTISED_100baseT_Half (1 << 2)
#define ADVERTISED_100baseT_Full (1 << 3)
#define ADVERTISED_1000baseT_Half (1 << 4)
-#define ADVERTISED_1000baseT_Full (1 << 5)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_1000baseT_Full (1 << 5)
#define ADVERTISED_Autoneg (1 << 6)
#define ADVERTISED_TP (1 << 7)
#define ADVERTISED_AUI (1 << 8)
-#define ADVERTISED_MII (1 << 9)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_MII (1 << 9)
#define ADVERTISED_FIBRE (1 << 10)
#define ADVERTISED_BNC (1 << 11)
#define ADVERTISED_10000baseT_Full (1 << 12)
-#define ADVERTISED_Pause (1 << 13)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_Pause (1 << 13)
#define ADVERTISED_Asym_Pause (1 << 14)
#define ADVERTISED_2500baseX_Full (1 << 15)
#define ADVERTISED_Backplane (1 << 16)
-#define ADVERTISED_1000baseKX_Full (1 << 17)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_1000baseKX_Full (1 << 17)
#define ADVERTISED_10000baseKX4_Full (1 << 18)
#define ADVERTISED_10000baseKR_Full (1 << 19)
#define ADVERTISED_10000baseR_FEC (1 << 20)
-#define ADVERTISED_20000baseMLD2_Full (1 << 21)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_20000baseMLD2_Full (1 << 21)
#define ADVERTISED_20000baseKR2_Full (1 << 22)
#define ADVERTISED_40000baseKR4_Full (1 << 23)
#define ADVERTISED_40000baseCR4_Full (1 << 24)
-#define ADVERTISED_40000baseSR4_Full (1 << 25)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_40000baseSR4_Full (1 << 25)
#define ADVERTISED_40000baseLR4_Full (1 << 26)
+#define ADVERTISED_56000baseKR4_Full (1 << 27)
+#define ADVERTISED_56000baseCR4_Full (1 << 28)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ADVERTISED_56000baseSR4_Full (1 << 29)
+#define ADVERTISED_56000baseLR4_Full (1 << 30)
#define SPEED_10 10
#define SPEED_100 100
-#define SPEED_1000 1000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SPEED_1000 1000
#define SPEED_2500 2500
+#define SPEED_5000 5000
#define SPEED_10000 10000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SPEED_20000 20000
+#define SPEED_25000 25000
+#define SPEED_40000 40000
+#define SPEED_50000 50000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SPEED_56000 56000
+#define SPEED_100000 100000
#define SPEED_UNKNOWN - 1
#define DUPLEX_HALF 0x00
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -709,6 +729,11 @@ enum ethtool_sfeatures_retval_bits {
#define ETH_MODULE_SFF_8079_LEN 256
#define ETH_MODULE_SFF_8472 0x2
#define ETH_MODULE_SFF_8472_LEN 512
+#define ETH_MODULE_SFF_8636 0x3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_MODULE_SFF_8636_LEN 256
+#define ETH_MODULE_SFF_8436 0x4
+#define ETH_MODULE_SFF_8436_LEN 256
enum ethtool_reset_flags {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
ETH_RESET_MGMT = 1 << 0,
diff --git a/libc/kernel/uapi/linux/falloc.h b/libc/kernel/uapi/linux/falloc.h
index 9ea0b2419..fb734e028 100644
--- a/libc/kernel/uapi/linux/falloc.h
+++ b/libc/kernel/uapi/linux/falloc.h
@@ -24,5 +24,6 @@
#define FALLOC_FL_NO_HIDE_STALE 0x04
#define FALLOC_FL_COLLAPSE_RANGE 0x08
#define FALLOC_FL_ZERO_RANGE 0x10
-#endif
+#define FALLOC_FL_INSERT_RANGE 0x20
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/fib_rules.h b/libc/kernel/uapi/linux/fib_rules.h
index 49953ef27..fdc357793 100644
--- a/libc/kernel/uapi/linux/fib_rules.h
+++ b/libc/kernel/uapi/linux/fib_rules.h
@@ -61,7 +61,7 @@ enum {
FRA_FWMARK,
FRA_FLOW,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- FRA_UNUSED6,
+ FRA_TUN_ID,
FRA_SUPPRESS_IFGROUP,
FRA_SUPPRESS_PREFIXLEN,
FRA_TABLE,
diff --git a/libc/kernel/uapi/linux/filter.h b/libc/kernel/uapi/linux/filter.h
index 4761f9d48..25182fcc7 100644
--- a/libc/kernel/uapi/linux/filter.h
+++ b/libc/kernel/uapi/linux/filter.h
@@ -72,8 +72,12 @@ struct sock_fprog {
#define SKF_AD_PAY_OFFSET 52
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SKF_AD_RANDOM 56
-#define SKF_AD_MAX 60
+#define SKF_AD_VLAN_TPID 60
+#define SKF_AD_MAX 64
#define SKF_NET_OFF (- 0x100000)
-#define SKF_LL_OFF (- 0x200000)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SKF_LL_OFF (- 0x200000)
+#define BPF_NET_OFF SKF_NET_OFF
+#define BPF_LL_OFF SKF_LL_OFF
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/fou.h b/libc/kernel/uapi/linux/fou.h
index a31a4adae..57fa2dbf8 100644
--- a/libc/kernel/uapi/linux/fou.h
+++ b/libc/kernel/uapi/linux/fou.h
@@ -28,23 +28,26 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FOU_ATTR_IPPROTO,
FOU_ATTR_TYPE,
+ FOU_ATTR_REMCSUM_NOPARTIAL,
__FOU_ATTR_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define FOU_ATTR_MAX (__FOU_ATTR_MAX - 1)
enum {
FOU_CMD_UNSPEC,
- FOU_CMD_ADD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FOU_CMD_ADD,
FOU_CMD_DEL,
+ FOU_CMD_GET,
__FOU_CMD_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FOU_ENCAP_UNSPEC,
FOU_ENCAP_DIRECT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FOU_ENCAP_GUE,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FOU_CMD_MAX (__FOU_CMD_MAX - 1)
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/fs.h b/libc/kernel/uapi/linux/fs.h
index bed2405ce..7a63bd80b 100644
--- a/libc/kernel/uapi/linux/fs.h
+++ b/libc/kernel/uapi/linux/fs.h
@@ -89,102 +89,105 @@ struct inodes_stat_t {
#define MS_KERNMOUNT (1 << 22)
#define MS_I_VERSION (1 << 23)
#define MS_STRICTATIME (1 << 24)
-#define MS_NOSEC (1 << 28)
+#define MS_LAZYTIME (1 << 25)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MS_NOSEC (1 << 28)
#define MS_BORN (1 << 29)
#define MS_ACTIVE (1 << 30)
#define MS_NOUSER (1 << 31)
-#define MS_RMT_MASK (MS_RDONLY | MS_SYNCHRONOUS | MS_MANDLOCK | MS_I_VERSION)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MS_RMT_MASK (MS_RDONLY | MS_SYNCHRONOUS | MS_MANDLOCK | MS_I_VERSION | MS_LAZYTIME)
#define MS_MGC_VAL 0xC0ED0000
#define MS_MGC_MSK 0xffff0000
#define BLKROSET _IO(0x12, 93)
-#define BLKROGET _IO(0x12, 94)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BLKROGET _IO(0x12, 94)
#define BLKRRPART _IO(0x12, 95)
#define BLKGETSIZE _IO(0x12, 96)
#define BLKFLSBUF _IO(0x12, 97)
-#define BLKRASET _IO(0x12, 98)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BLKRASET _IO(0x12, 98)
#define BLKRAGET _IO(0x12, 99)
#define BLKFRASET _IO(0x12, 100)
#define BLKFRAGET _IO(0x12, 101)
-#define BLKSECTSET _IO(0x12, 102)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BLKSECTSET _IO(0x12, 102)
#define BLKSECTGET _IO(0x12, 103)
#define BLKSSZGET _IO(0x12, 104)
#define BLKBSZGET _IOR(0x12, 112, size_t)
-#define BLKBSZSET _IOW(0x12, 113, size_t)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BLKBSZSET _IOW(0x12, 113, size_t)
#define BLKGETSIZE64 _IOR(0x12, 114, size_t)
#define BLKTRACESETUP _IOWR(0x12, 115, struct blk_user_trace_setup)
#define BLKTRACESTART _IO(0x12, 116)
-#define BLKTRACESTOP _IO(0x12, 117)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BLKTRACESTOP _IO(0x12, 117)
#define BLKTRACETEARDOWN _IO(0x12, 118)
#define BLKDISCARD _IO(0x12, 119)
#define BLKIOMIN _IO(0x12, 120)
-#define BLKIOOPT _IO(0x12, 121)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BLKIOOPT _IO(0x12, 121)
#define BLKALIGNOFF _IO(0x12, 122)
#define BLKPBSZGET _IO(0x12, 123)
#define BLKDISCARDZEROES _IO(0x12, 124)
-#define BLKSECDISCARD _IO(0x12, 125)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BLKSECDISCARD _IO(0x12, 125)
#define BLKROTATIONAL _IO(0x12, 126)
#define BLKZEROOUT _IO(0x12, 127)
#define BMAP_IOCTL 1
-#define FIBMAP _IO(0x00, 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FIBMAP _IO(0x00, 1)
#define FIGETBSZ _IO(0x00, 2)
#define FIFREEZE _IOWR('X', 119, int)
#define FITHAW _IOWR('X', 120, int)
-#define FITRIM _IOWR('X', 121, struct fstrim_range)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FITRIM _IOWR('X', 121, struct fstrim_range)
#define FS_IOC_GETFLAGS _IOR('f', 1, long)
#define FS_IOC_SETFLAGS _IOW('f', 2, long)
#define FS_IOC_GETVERSION _IOR('v', 1, long)
-#define FS_IOC_SETVERSION _IOW('v', 2, long)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_IOC_SETVERSION _IOW('v', 2, long)
#define FS_IOC_FIEMAP _IOWR('f', 11, struct fiemap)
#define FS_IOC32_GETFLAGS _IOR('f', 1, int)
#define FS_IOC32_SETFLAGS _IOW('f', 2, int)
-#define FS_IOC32_GETVERSION _IOR('v', 1, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_IOC32_GETVERSION _IOR('v', 1, int)
#define FS_IOC32_SETVERSION _IOW('v', 2, int)
#define FS_SECRM_FL 0x00000001
#define FS_UNRM_FL 0x00000002
-#define FS_COMPR_FL 0x00000004
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_COMPR_FL 0x00000004
#define FS_SYNC_FL 0x00000008
#define FS_IMMUTABLE_FL 0x00000010
#define FS_APPEND_FL 0x00000020
-#define FS_NODUMP_FL 0x00000040
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_NODUMP_FL 0x00000040
#define FS_NOATIME_FL 0x00000080
#define FS_DIRTY_FL 0x00000100
#define FS_COMPRBLK_FL 0x00000200
-#define FS_NOCOMP_FL 0x00000400
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_NOCOMP_FL 0x00000400
#define FS_ECOMPR_FL 0x00000800
#define FS_BTREE_FL 0x00001000
#define FS_INDEX_FL 0x00001000
-#define FS_IMAGIC_FL 0x00002000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_IMAGIC_FL 0x00002000
#define FS_JOURNAL_DATA_FL 0x00004000
#define FS_NOTAIL_FL 0x00008000
#define FS_DIRSYNC_FL 0x00010000
-#define FS_TOPDIR_FL 0x00020000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_TOPDIR_FL 0x00020000
#define FS_EXTENT_FL 0x00080000
#define FS_DIRECTIO_FL 0x00100000
#define FS_NOCOW_FL 0x00800000
-#define FS_RESERVED_FL 0x80000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FS_PROJINHERIT_FL 0x20000000
+#define FS_RESERVED_FL 0x80000000
#define FS_FL_USER_VISIBLE 0x0003DFFF
#define FS_FL_USER_MODIFIABLE 0x000380FF
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SYNC_FILE_RANGE_WAIT_BEFORE 1
#define SYNC_FILE_RANGE_WRITE 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SYNC_FILE_RANGE_WAIT_AFTER 4
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/fuse.h b/libc/kernel/uapi/linux/fuse.h
index 4f0d6d3aa..f98296c0d 100644
--- a/libc/kernel/uapi/linux/fuse.h
+++ b/libc/kernel/uapi/linux/fuse.h
@@ -587,4 +587,5 @@ struct fuse_notify_retrieve_in {
uint64_t dummy4;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+#define FUSE_DEV_IOC_CLONE _IOR(229, 0, uint32_t)
#endif
diff --git a/libc/kernel/uapi/linux/gsmmux.h b/libc/kernel/uapi/linux/gsmmux.h
new file mode 100644
index 000000000..a742cffdb
--- /dev/null
+++ b/libc/kernel/uapi/linux/gsmmux.h
@@ -0,0 +1,56 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _LINUX_GSMMUX_H
+#define _LINUX_GSMMUX_H
+#include <linux/if.h>
+#include <linux/ioctl.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <linux/types.h>
+struct gsm_config {
+ unsigned int adaption;
+ unsigned int encapsulation;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int initiator;
+ unsigned int t1;
+ unsigned int t2;
+ unsigned int t3;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int n2;
+ unsigned int mru;
+ unsigned int mtu;
+ unsigned int k;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int i;
+ unsigned int unused[8];
+};
+#define GSMIOC_GETCONF _IOR('G', 0, struct gsm_config)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define GSMIOC_SETCONF _IOW('G', 1, struct gsm_config)
+struct gsm_netconfig {
+ unsigned int adaption;
+ unsigned short protocol;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short unused2;
+ char if_name[IFNAMSIZ];
+ __u8 unused[28];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define GSMIOC_ENABLE_NET _IOW('G', 2, struct gsm_netconfig)
+#define GSMIOC_DISABLE_NET _IO('G', 3)
+#endif
diff --git a/libc/kernel/uapi/linux/hsi/cs-protocol.h b/libc/kernel/uapi/linux/hsi/cs-protocol.h
new file mode 100644
index 000000000..4f6fd4d4b
--- /dev/null
+++ b/libc/kernel/uapi/linux/hsi/cs-protocol.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _CS_PROTOCOL_H
+#define _CS_PROTOCOL_H
+#include <linux/types.h>
+#include <linux/ioctl.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CS_DEV_FILE_NAME "/dev/cmt_speech"
+#define CS_IF_VERSION 2
+#define CS_CMD_SHIFT 28
+#define CS_DOMAIN_SHIFT 24
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CS_CMD_MASK 0xff000000
+#define CS_PARAM_MASK 0xffffff
+#define CS_CMD(id,dom) (((id) << CS_CMD_SHIFT) | ((dom) << CS_DOMAIN_SHIFT))
+#define CS_ERROR CS_CMD(1, 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CS_RX_DATA_RECEIVED CS_CMD(2, 0)
+#define CS_TX_DATA_READY CS_CMD(3, 0)
+#define CS_TX_DATA_SENT CS_CMD(4, 0)
+#define CS_ERR_PEER_RESET 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CS_FEAT_TSTAMP_RX_CTRL (1 << 0)
+#define CS_FEAT_ROLLING_RX_COUNTER (2 << 0)
+#define CS_STATE_CLOSED 0
+#define CS_STATE_OPENED 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CS_STATE_CONFIGURED 2
+#define CS_MAX_BUFFERS_SHIFT 4
+#define CS_MAX_BUFFERS (1 << CS_MAX_BUFFERS_SHIFT)
+struct cs_buffer_config {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rx_bufs;
+ __u32 tx_bufs;
+ __u32 buf_size;
+ __u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved[4];
+};
+struct cs_timestamp {
+ __u32 tv_sec;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 tv_nsec;
+};
+struct cs_mmap_config_block {
+ __u32 reserved1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 buf_size;
+ __u32 rx_bufs;
+ __u32 tx_bufs;
+ __u32 reserved2;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rx_offsets[CS_MAX_BUFFERS];
+ __u32 tx_offsets[CS_MAX_BUFFERS];
+ __u32 rx_ptr;
+ __u32 rx_ptr_boundary;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved3[2];
+ struct cs_timestamp tstamp_rx_ctrl;
+};
+#define CS_IO_MAGIC 'C'
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CS_IOW(num,dtype) _IOW(CS_IO_MAGIC, num, dtype)
+#define CS_IOR(num,dtype) _IOR(CS_IO_MAGIC, num, dtype)
+#define CS_IOWR(num,dtype) _IOWR(CS_IO_MAGIC, num, dtype)
+#define CS_IO(num) _IO(CS_IO_MAGIC, num)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CS_GET_STATE CS_IOR(21, unsigned int)
+#define CS_SET_WAKELINE CS_IOW(23, unsigned int)
+#define CS_GET_IF_VERSION CS_IOR(30, unsigned int)
+#define CS_CONFIG_BUFS CS_IOW(31, struct cs_buffer_config)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/hyperv.h b/libc/kernel/uapi/linux/hyperv.h
index 49b48eebf..51e60e6bc 100644
--- a/libc/kernel/uapi/linux/hyperv.h
+++ b/libc/kernel/uapi/linux/hyperv.h
@@ -27,208 +27,210 @@
#define UTIL_FW_VERSION (UTIL_FW_MAJOR << 16 | UTIL_FW_MINOR)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VSS_OP_REGISTER 128
+#define VSS_OP_REGISTER1 129
enum hv_vss_op {
VSS_OP_CREATE = 0,
- VSS_OP_DELETE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VSS_OP_DELETE,
VSS_OP_HOT_BACKUP,
VSS_OP_GET_DM_INFO,
VSS_OP_BU_COMPLETE,
- VSS_OP_FREEZE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VSS_OP_FREEZE,
VSS_OP_THAW,
VSS_OP_AUTO_RECOVER,
VSS_OP_COUNT
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct hv_vss_hdr {
__u8 operation;
__u8 reserved[7];
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
#define VSS_HBU_NO_AUTO_RECOVERY 0x00000005
struct hv_vss_check_feature {
__u32 flags;
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
struct hv_vss_check_dm_info {
__u32 flags;
} __attribute__((packed));
-struct hv_vss_msg {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct hv_vss_msg {
union {
struct hv_vss_hdr vss_hdr;
int error;
- };
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
union {
struct hv_vss_check_feature vss_cf;
struct hv_vss_check_dm_info dm_info;
- };
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
} __attribute__((packed));
#define FCOPY_VERSION_0 0
-#define FCOPY_CURRENT_VERSION FCOPY_VERSION_0
-#define W_MAX_PATH 260
+#define FCOPY_VERSION_1 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FCOPY_CURRENT_VERSION FCOPY_VERSION_1
+#define W_MAX_PATH 260
enum hv_fcopy_op {
START_FILE_COPY = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
WRITE_TO_FILE,
COMPLETE_FCOPY,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
CANCEL_FCOPY,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_fcopy_hdr {
__u32 operation;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uuid_le service_id0;
uuid_le service_id1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
#define OVER_WRITE 0x1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CREATE_PATH 0x2
struct hv_start_fcopy {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_fcopy_hdr hdr;
__u16 file_name[W_MAX_PATH];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 path_name[W_MAX_PATH];
__u32 copy_flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 file_size;
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define DATA_FRAGMENT (6 * 1024)
struct hv_do_fcopy {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_fcopy_hdr hdr;
__u32 pad;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 offset;
__u32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 data[DATA_FRAGMENT];
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_KVP_EXCHANGE_MAX_VALUE_SIZE (2048)
#define HV_KVP_EXCHANGE_MAX_KEY_SIZE (512)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define REG_SZ 1
#define REG_U32 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define REG_U64 8
#define KVP_OP_REGISTER 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVP_OP_REGISTER1 100
enum hv_kvp_exchg_op {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
KVP_OP_GET = 0,
KVP_OP_SET,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
KVP_OP_DELETE,
KVP_OP_ENUMERATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
KVP_OP_GET_IP_INFO,
KVP_OP_SET_IP_INFO,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
KVP_OP_COUNT
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum hv_kvp_exchg_pool {
KVP_POOL_EXTERNAL = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
KVP_POOL_GUEST,
KVP_POOL_AUTO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
KVP_POOL_AUTO_EXTERNAL,
KVP_POOL_AUTO_INTERNAL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
KVP_POOL_COUNT
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_S_OK 0x00000000
#define HV_E_FAIL 0x80004005
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_S_CONT 0x80070103
#define HV_ERROR_NOT_SUPPORTED 0x80070032
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_ERROR_MACHINE_LOCKED 0x800704F7
#define HV_ERROR_DEVICE_NOT_CONNECTED 0x8007048F
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_INVALIDARG 0x80070057
#define HV_GUID_NOTFOUND 0x80041002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HV_ERROR_ALREADY_EXISTS 0x80070050
#define ADDR_FAMILY_NONE 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ADDR_FAMILY_IPV4 0x01
#define ADDR_FAMILY_IPV6 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MAX_ADAPTER_ID_SIZE 128
#define MAX_IP_ADDR_SIZE 1024
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MAX_GATEWAY_SIZE 512
struct hv_kvp_ipaddr_value {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 adapter_id[MAX_ADAPTER_ID_SIZE];
__u8 addr_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 dhcp_enabled;
__u16 ip_addr[MAX_IP_ADDR_SIZE];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 sub_net[MAX_IP_ADDR_SIZE];
__u16 gate_way[MAX_GATEWAY_SIZE];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 dns_addr[MAX_IP_ADDR_SIZE];
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_hdr {
__u8 operation;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 pool;
__u16 pad;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct hv_kvp_exchg_msg_value {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 value_type;
__u32 key_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 value_size;
__u8 key[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
__u8 value[HV_KVP_EXCHANGE_MAX_VALUE_SIZE];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 value_u32;
__u64 value_u64;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_msg_enumerate {
__u32 index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_exchg_msg_value data;
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_msg_get {
struct hv_kvp_exchg_msg_value data;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct hv_kvp_msg_set {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_exchg_msg_value data;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_msg_delete {
__u32 key_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 key[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_register {
__u8 version[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct hv_kvp_msg {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct hv_kvp_hdr kvp_hdr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int error;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct hv_kvp_msg_get kvp_get;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_msg_set kvp_set;
struct hv_kvp_msg_delete kvp_delete;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_msg_enumerate kvp_enum_data;
struct hv_kvp_ipaddr_value kvp_ip_val;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_register kvp_register;
} body;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct hv_kvp_ip_msg {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 operation;
__u8 pool;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hv_kvp_ipaddr_value kvp_ip_val;
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/i2c-dev.h b/libc/kernel/uapi/linux/i2c-dev.h
index 626f4eee6..fe3ea84a9 100644
--- a/libc/kernel/uapi/linux/i2c-dev.h
+++ b/libc/kernel/uapi/linux/i2c-dev.h
@@ -44,6 +44,7 @@ struct i2c_rdwr_ioctl_data {
struct i2c_msg __user * msgs;
__u32 nmsgs;
};
-#define I2C_RDRW_IOCTL_MAX_MSGS 42
+#define I2C_RDWR_IOCTL_MAX_MSGS 42
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_RDRW_IOCTL_MAX_MSGS I2C_RDWR_IOCTL_MAX_MSGS
#endif
diff --git a/libc/kernel/uapi/linux/i2c.h b/libc/kernel/uapi/linux/i2c.h
index b9a7bf825..3e4d89c45 100644
--- a/libc/kernel/uapi/linux/i2c.h
+++ b/libc/kernel/uapi/linux/i2c.h
@@ -43,49 +43,51 @@ struct i2c_msg {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define I2C_FUNC_SMBUS_PEC 0x00000008
#define I2C_FUNC_NOSTART 0x00000010
+#define I2C_FUNC_SLAVE 0x00000020
#define I2C_FUNC_SMBUS_BLOCK_PROC_CALL 0x00008000
-#define I2C_FUNC_SMBUS_QUICK 0x00010000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_FUNC_SMBUS_QUICK 0x00010000
#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000
#define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000
#define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000
-#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000
#define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000
#define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000
#define I2C_FUNC_SMBUS_PROC_CALL 0x00800000
-#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000
#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000
#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000
#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000
-#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE)
#define I2C_FUNC_SMBUS_BYTE_DATA (I2C_FUNC_SMBUS_READ_BYTE_DATA | I2C_FUNC_SMBUS_WRITE_BYTE_DATA)
#define I2C_FUNC_SMBUS_WORD_DATA (I2C_FUNC_SMBUS_READ_WORD_DATA | I2C_FUNC_SMBUS_WRITE_WORD_DATA)
#define I2C_FUNC_SMBUS_BLOCK_DATA (I2C_FUNC_SMBUS_READ_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)
-#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)
#define I2C_FUNC_SMBUS_EMUL (I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_PROC_CALL | I2C_FUNC_SMBUS_WRITE_BLOCK_DATA | I2C_FUNC_SMBUS_I2C_BLOCK | I2C_FUNC_SMBUS_PEC)
#define I2C_SMBUS_BLOCK_MAX 32
union i2c_smbus_data {
- __u8 byte;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 byte;
__u16 word;
__u8 block[I2C_SMBUS_BLOCK_MAX + 2];
};
-#define I2C_SMBUS_READ 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_SMBUS_READ 1
#define I2C_SMBUS_WRITE 0
#define I2C_SMBUS_QUICK 0
#define I2C_SMBUS_BYTE 1
-#define I2C_SMBUS_BYTE_DATA 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_SMBUS_BYTE_DATA 2
#define I2C_SMBUS_WORD_DATA 3
#define I2C_SMBUS_PROC_CALL 4
#define I2C_SMBUS_BLOCK_DATA 5
-#define I2C_SMBUS_I2C_BLOCK_BROKEN 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define I2C_SMBUS_I2C_BLOCK_BROKEN 6
#define I2C_SMBUS_BLOCK_PROC_CALL 7
#define I2C_SMBUS_I2C_BLOCK_DATA 8
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/if_addr.h b/libc/kernel/uapi/linux/if_addr.h
index 5d8d66790..a148de25c 100644
--- a/libc/kernel/uapi/linux/if_addr.h
+++ b/libc/kernel/uapi/linux/if_addr.h
@@ -59,15 +59,17 @@ enum {
#define IFA_F_PERMANENT 0x80
#define IFA_F_MANAGETEMPADDR 0x100
#define IFA_F_NOPREFIXROUTE 0x200
-struct ifa_cacheinfo {
+#define IFA_F_MCAUTOJOIN 0x400
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IFA_F_STABLE_PRIVACY 0x800
+struct ifa_cacheinfo {
__u32 ifa_prefered;
__u32 ifa_valid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cstamp;
__u32 tstamp;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define IFA_RTA(r) ((struct rtattr *) (((char *) (r)) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct ifaddrmsg))
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/if_alg.h b/libc/kernel/uapi/linux/if_alg.h
index eabd88405..99002decb 100644
--- a/libc/kernel/uapi/linux/if_alg.h
+++ b/libc/kernel/uapi/linux/if_alg.h
@@ -37,7 +37,9 @@ struct af_alg_iv {
#define ALG_SET_IV 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ALG_SET_OP 3
+#define ALG_SET_AEAD_ASSOCLEN 4
+#define ALG_SET_AEAD_AUTHSIZE 5
#define ALG_OP_DECRYPT 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ALG_OP_ENCRYPT 1
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/if_arcnet.h b/libc/kernel/uapi/linux/if_arcnet.h
index d010c7e89..20bf783e5 100644
--- a/libc/kernel/uapi/linux/if_arcnet.h
+++ b/libc/kernel/uapi/linux/if_arcnet.h
@@ -74,21 +74,23 @@ struct arc_cap {
} mes;
};
struct arc_hardware {
- __u8 source, dest, offset[2];
+ __u8 source;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 dest;
+ __u8 offset[2];
};
#define ARC_HDR_SIZE 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct archdr {
struct arc_hardware hard;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct arc_rfc1201 rfc1201;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct arc_rfc1051 rfc1051;
struct arc_eth_encap eth_encap;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct arc_cap cap;
__u8 raw[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} soft;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/if_bridge.h b/libc/kernel/uapi/linux/if_bridge.h
index 1394b6fd3..1c8477fb8 100644
--- a/libc/kernel/uapi/linux/if_bridge.h
+++ b/libc/kernel/uapi/linux/if_bridge.h
@@ -121,18 +121,23 @@ struct __fdb_entry {
#define BRIDGE_MODE_VEB 0
#define BRIDGE_MODE_VEPA 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BRIDGE_MODE_UNDEF 0xFFFF
enum {
IFLA_BRIDGE_FLAGS,
IFLA_BRIDGE_MODE,
- IFLA_BRIDGE_VLAN_INFO,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRIDGE_VLAN_INFO,
__IFLA_BRIDGE_MAX,
};
#define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1)
-#define BRIDGE_VLAN_INFO_MASTER (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BRIDGE_VLAN_INFO_MASTER (1 << 0)
#define BRIDGE_VLAN_INFO_PVID (1 << 1)
#define BRIDGE_VLAN_INFO_UNTAGGED (1 << 2)
+#define BRIDGE_VLAN_INFO_RANGE_BEGIN (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BRIDGE_VLAN_INFO_RANGE_END (1 << 4)
+#define BRIDGE_VLAN_INFO_BRENTRY (1 << 5)
struct bridge_vlan_info {
__u16 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -181,21 +186,23 @@ struct br_mdb_entry {
#define MDB_PERMANENT 1
__u8 state;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 vid;
struct {
union {
__be32 ip4;
- struct in6_addr ip6;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct in6_addr ip6;
} u;
__be16 proto;
} addr;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
MDBA_SET_ENTRY_UNSPEC,
MDBA_SET_ENTRY,
- __MDBA_SET_ENTRY_MAX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __MDBA_SET_ENTRY_MAX,
};
#define MDBA_SET_ENTRY_MAX (__MDBA_SET_ENTRY_MAX - 1)
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/if_ether.h b/libc/kernel/uapi/linux/if_ether.h
index bc032cc42..3f367815e 100644
--- a/libc/kernel/uapi/linux/if_ether.h
+++ b/libc/kernel/uapi/linux/if_ether.h
@@ -31,106 +31,108 @@
#define ETH_P_PUP 0x0200
#define ETH_P_PUPAT 0x0201
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_TSN 0x22F0
#define ETH_P_IP 0x0800
#define ETH_P_X25 0x0805
#define ETH_P_ARP 0x0806
-#define ETH_P_BPQ 0x08FF
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_BPQ 0x08FF
#define ETH_P_IEEEPUP 0x0a00
#define ETH_P_IEEEPUPAT 0x0a01
#define ETH_P_BATMAN 0x4305
-#define ETH_P_DEC 0x6000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_DEC 0x6000
#define ETH_P_DNA_DL 0x6001
#define ETH_P_DNA_RC 0x6002
#define ETH_P_DNA_RT 0x6003
-#define ETH_P_LAT 0x6004
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_LAT 0x6004
#define ETH_P_DIAG 0x6005
#define ETH_P_CUST 0x6006
#define ETH_P_SCA 0x6007
-#define ETH_P_TEB 0x6558
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_TEB 0x6558
#define ETH_P_RARP 0x8035
#define ETH_P_ATALK 0x809B
#define ETH_P_AARP 0x80F3
-#define ETH_P_8021Q 0x8100
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_8021Q 0x8100
#define ETH_P_IPX 0x8137
#define ETH_P_IPV6 0x86DD
#define ETH_P_PAUSE 0x8808
-#define ETH_P_SLOW 0x8809
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_SLOW 0x8809
#define ETH_P_WCCP 0x883E
#define ETH_P_MPLS_UC 0x8847
#define ETH_P_MPLS_MC 0x8848
-#define ETH_P_ATMMPOA 0x884c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_ATMMPOA 0x884c
#define ETH_P_PPP_DISC 0x8863
#define ETH_P_PPP_SES 0x8864
#define ETH_P_LINK_CTL 0x886c
-#define ETH_P_ATMFATE 0x8884
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_ATMFATE 0x8884
#define ETH_P_PAE 0x888E
#define ETH_P_AOE 0x88A2
#define ETH_P_8021AD 0x88A8
-#define ETH_P_802_EX1 0x88B5
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_802_EX1 0x88B5
#define ETH_P_TIPC 0x88CA
#define ETH_P_8021AH 0x88E7
#define ETH_P_MVRP 0x88F5
-#define ETH_P_1588 0x88F7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_1588 0x88F7
#define ETH_P_PRP 0x88FB
#define ETH_P_FCOE 0x8906
#define ETH_P_TDLS 0x890D
-#define ETH_P_FIP 0x8914
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_FIP 0x8914
#define ETH_P_80221 0x8917
#define ETH_P_LOOPBACK 0x9000
#define ETH_P_QINQ1 0x9100
-#define ETH_P_QINQ2 0x9200
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_QINQ2 0x9200
#define ETH_P_QINQ3 0x9300
#define ETH_P_EDSA 0xDADA
#define ETH_P_AF_IUCV 0xFBFB
-#define ETH_P_802_3_MIN 0x0600
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_802_3_MIN 0x0600
#define ETH_P_802_3 0x0001
#define ETH_P_AX25 0x0002
#define ETH_P_ALL 0x0003
-#define ETH_P_802_2 0x0004
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_802_2 0x0004
#define ETH_P_SNAP 0x0005
#define ETH_P_DDCMP 0x0006
#define ETH_P_WAN_PPP 0x0007
-#define ETH_P_PPP_MP 0x0008
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_PPP_MP 0x0008
#define ETH_P_LOCALTALK 0x0009
#define ETH_P_CAN 0x000C
#define ETH_P_CANFD 0x000D
-#define ETH_P_PPPTALK 0x0010
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_PPPTALK 0x0010
#define ETH_P_TR_802_2 0x0011
#define ETH_P_MOBITEX 0x0015
#define ETH_P_CONTROL 0x0016
-#define ETH_P_IRDA 0x0017
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_IRDA 0x0017
#define ETH_P_ECONET 0x0018
#define ETH_P_HDLC 0x0019
#define ETH_P_ARCNET 0x001A
-#define ETH_P_DSA 0x001B
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_DSA 0x001B
#define ETH_P_TRAILER 0x001C
#define ETH_P_PHONET 0x00F5
#define ETH_P_IEEE802154 0x00F6
-#define ETH_P_CAIF 0x00F7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ETH_P_CAIF 0x00F7
#define ETH_P_XDSA 0x00F8
struct ethhdr {
unsigned char h_dest[ETH_ALEN];
- unsigned char h_source[ETH_ALEN];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char h_source[ETH_ALEN];
__be16 h_proto;
} __attribute__((packed));
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/if_link.h b/libc/kernel/uapi/linux/if_link.h
index ffcf3f02a..226968d49 100644
--- a/libc/kernel/uapi/linux/if_link.h
+++ b/libc/kernel/uapi/linux/if_link.h
@@ -152,6 +152,11 @@ enum {
IFLA_PHYS_PORT_ID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_CARRIER_CHANGES,
+ IFLA_PHYS_SWITCH_ID,
+ IFLA_LINK_NETNSID,
+ IFLA_PHYS_PORT_NAME,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_PROTO_DOWN,
__IFLA_MAX
};
#define IFLA_MAX (__IFLA_MAX - 1)
@@ -186,235 +191,360 @@ enum in6_addr_gen_mode {
IN6_ADDR_GEN_MODE_EUI64,
IN6_ADDR_GEN_MODE_NONE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
};
enum {
IFLA_BR_UNSPEC,
- IFLA_BR_FORWARD_DELAY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_FORWARD_DELAY,
IFLA_BR_HELLO_TIME,
IFLA_BR_MAX_AGE,
+ IFLA_BR_AGEING_TIME,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_STP_STATE,
+ IFLA_BR_PRIORITY,
+ IFLA_BR_VLAN_FILTERING,
+ IFLA_BR_VLAN_PROTOCOL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_GROUP_FWD_MASK,
+ IFLA_BR_ROOT_ID,
+ IFLA_BR_BRIDGE_ID,
+ IFLA_BR_ROOT_PORT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_ROOT_PATH_COST,
+ IFLA_BR_TOPOLOGY_CHANGE,
+ IFLA_BR_TOPOLOGY_CHANGE_DETECTED,
+ IFLA_BR_HELLO_TIMER,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_TCN_TIMER,
+ IFLA_BR_TOPOLOGY_CHANGE_TIMER,
+ IFLA_BR_GC_TIMER,
+ IFLA_BR_GROUP_ADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_FDB_FLUSH,
+ IFLA_BR_MCAST_ROUTER,
+ IFLA_BR_MCAST_SNOOPING,
+ IFLA_BR_MCAST_QUERY_USE_IFADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_MCAST_QUERIER,
+ IFLA_BR_MCAST_HASH_ELASTICITY,
+ IFLA_BR_MCAST_HASH_MAX,
+ IFLA_BR_MCAST_LAST_MEMBER_CNT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_MCAST_STARTUP_QUERY_CNT,
+ IFLA_BR_MCAST_LAST_MEMBER_INTVL,
+ IFLA_BR_MCAST_MEMBERSHIP_INTVL,
+ IFLA_BR_MCAST_QUERIER_INTVL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_MCAST_QUERY_INTVL,
+ IFLA_BR_MCAST_QUERY_RESPONSE_INTVL,
+ IFLA_BR_MCAST_STARTUP_QUERY_INTVL,
+ IFLA_BR_NF_CALL_IPTABLES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BR_NF_CALL_IP6TABLES,
+ IFLA_BR_NF_CALL_ARPTABLES,
+ IFLA_BR_VLAN_DEFAULT_PVID,
__IFLA_BR_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define IFLA_BR_MAX (__IFLA_BR_MAX - 1)
+struct ifla_bridge_id {
+ __u8 prio[2];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 addr[6];
+};
enum {
BRIDGE_MODE_UNSPEC,
- BRIDGE_MODE_HAIRPIN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BRIDGE_MODE_HAIRPIN,
};
enum {
IFLA_BRPORT_UNSPEC,
- IFLA_BRPORT_STATE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRPORT_STATE,
IFLA_BRPORT_PRIORITY,
IFLA_BRPORT_COST,
IFLA_BRPORT_MODE,
- IFLA_BRPORT_GUARD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRPORT_GUARD,
IFLA_BRPORT_PROTECT,
IFLA_BRPORT_FAST_LEAVE,
IFLA_BRPORT_LEARNING,
- IFLA_BRPORT_UNICAST_FLOOD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRPORT_UNICAST_FLOOD,
+ IFLA_BRPORT_PROXYARP,
+ IFLA_BRPORT_LEARNING_SYNC,
+ IFLA_BRPORT_PROXYARP_WIFI,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRPORT_ROOT_ID,
+ IFLA_BRPORT_BRIDGE_ID,
+ IFLA_BRPORT_DESIGNATED_PORT,
+ IFLA_BRPORT_DESIGNATED_COST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRPORT_ID,
+ IFLA_BRPORT_NO,
+ IFLA_BRPORT_TOPOLOGY_CHANGE_ACK,
+ IFLA_BRPORT_CONFIG_PENDING,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRPORT_MESSAGE_AGE_TIMER,
+ IFLA_BRPORT_FORWARD_DELAY_TIMER,
+ IFLA_BRPORT_HOLD_TIMER,
+ IFLA_BRPORT_FLUSH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BRPORT_MULTICAST_ROUTER,
__IFLA_BRPORT_MAX
};
#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
-struct ifla_cacheinfo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ifla_cacheinfo {
__u32 max_reasm_len;
__u32 tstamp;
__u32 reachable_time;
- __u32 retrans_time;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 retrans_time;
};
enum {
IFLA_INFO_UNSPEC,
- IFLA_INFO_KIND,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_INFO_KIND,
IFLA_INFO_DATA,
IFLA_INFO_XSTATS,
IFLA_INFO_SLAVE_KIND,
- IFLA_INFO_SLAVE_DATA,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_INFO_SLAVE_DATA,
__IFLA_INFO_MAX,
};
#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1)
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
IFLA_VLAN_UNSPEC,
IFLA_VLAN_ID,
IFLA_VLAN_FLAGS,
- IFLA_VLAN_EGRESS_QOS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VLAN_EGRESS_QOS,
IFLA_VLAN_INGRESS_QOS,
IFLA_VLAN_PROTOCOL,
__IFLA_VLAN_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1)
struct ifla_vlan_flags {
__u32 flags;
- __u32 mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 mask;
};
enum {
IFLA_VLAN_QOS_UNSPEC,
- IFLA_VLAN_QOS_MAPPING,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VLAN_QOS_MAPPING,
__IFLA_VLAN_QOS_MAX
};
#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1)
-struct ifla_vlan_qos_mapping {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ifla_vlan_qos_mapping {
__u32 from;
__u32 to;
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
IFLA_MACVLAN_UNSPEC,
IFLA_MACVLAN_MODE,
IFLA_MACVLAN_FLAGS,
- IFLA_MACVLAN_MACADDR_MODE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_MACVLAN_MACADDR_MODE,
IFLA_MACVLAN_MACADDR,
IFLA_MACVLAN_MACADDR_DATA,
IFLA_MACVLAN_MACADDR_COUNT,
- __IFLA_MACVLAN_MAX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __IFLA_MACVLAN_MAX,
};
#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1)
enum macvlan_mode {
- MACVLAN_MODE_PRIVATE = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MACVLAN_MODE_PRIVATE = 1,
MACVLAN_MODE_VEPA = 2,
MACVLAN_MODE_BRIDGE = 4,
MACVLAN_MODE_PASSTHRU = 8,
- MACVLAN_MODE_SOURCE = 16,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MACVLAN_MODE_SOURCE = 16,
};
enum macvlan_macaddr_mode {
MACVLAN_MACADDR_ADD,
- MACVLAN_MACADDR_DEL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MACVLAN_MACADDR_DEL,
MACVLAN_MACADDR_FLUSH,
MACVLAN_MACADDR_SET,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MACVLAN_FLAG_NOPROMISC 1
+enum {
+ IFLA_VRF_UNSPEC,
+ IFLA_VRF_TABLE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __IFLA_VRF_MAX
+};
+#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1)
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_IPVLAN_UNSPEC,
+ IFLA_IPVLAN_MODE,
+ __IFLA_IPVLAN_MAX
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1)
+enum ipvlan_mode {
+ IPVLAN_MODE_L2 = 0,
+ IPVLAN_MODE_L3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IPVLAN_MODE_MAX
+};
enum {
IFLA_VXLAN_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_ID,
IFLA_VXLAN_GROUP,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_LINK,
IFLA_VXLAN_LOCAL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_TTL,
IFLA_VXLAN_TOS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_LEARNING,
IFLA_VXLAN_AGEING,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_LIMIT,
IFLA_VXLAN_PORT_RANGE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_PROXY,
IFLA_VXLAN_RSC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_L2MISS,
IFLA_VXLAN_L3MISS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_PORT,
IFLA_VXLAN_GROUP6,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_LOCAL6,
IFLA_VXLAN_UDP_CSUM,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VXLAN_UDP_ZERO_CSUM6_TX,
IFLA_VXLAN_UDP_ZERO_CSUM6_RX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VXLAN_REMCSUM_TX,
+ IFLA_VXLAN_REMCSUM_RX,
+ IFLA_VXLAN_GBP,
+ IFLA_VXLAN_REMCSUM_NOPARTIAL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VXLAN_COLLECT_METADATA,
__IFLA_VXLAN_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ifla_vxlan_port_range {
__be16 low;
__be16 high;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ IFLA_GENEVE_UNSPEC,
+ IFLA_GENEVE_ID,
+ IFLA_GENEVE_REMOTE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_GENEVE_TTL,
+ IFLA_GENEVE_TOS,
+ IFLA_GENEVE_PORT,
+ IFLA_GENEVE_COLLECT_METADATA,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_GENEVE_REMOTE6,
+ __IFLA_GENEVE_MAX
};
+#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
IFLA_BOND_UNSPEC,
IFLA_BOND_MODE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_ACTIVE_SLAVE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_MIIMON,
IFLA_BOND_UPDELAY,
IFLA_BOND_DOWNDELAY,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_USE_CARRIER,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_ARP_INTERVAL,
IFLA_BOND_ARP_IP_TARGET,
IFLA_BOND_ARP_VALIDATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_ARP_ALL_TARGETS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_PRIMARY,
IFLA_BOND_PRIMARY_RESELECT,
IFLA_BOND_FAIL_OVER_MAC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_XMIT_HASH_POLICY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_RESEND_IGMP,
IFLA_BOND_NUM_PEER_NOTIF,
IFLA_BOND_ALL_SLAVES_ACTIVE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_MIN_LINKS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_LP_INTERVAL,
IFLA_BOND_PACKETS_PER_SLAVE,
IFLA_BOND_AD_LACP_RATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_AD_SELECT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_AD_INFO,
+ IFLA_BOND_AD_ACTOR_SYS_PRIO,
+ IFLA_BOND_AD_USER_PORT_KEY,
+ IFLA_BOND_AD_ACTOR_SYSTEM,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_BOND_TLB_DYNAMIC_LB,
__IFLA_BOND_MAX,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
IFLA_BOND_AD_INFO_UNSPEC,
IFLA_BOND_AD_INFO_AGGREGATOR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_AD_INFO_NUM_PORTS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_AD_INFO_ACTOR_KEY,
IFLA_BOND_AD_INFO_PARTNER_KEY,
IFLA_BOND_AD_INFO_PARTNER_MAC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IFLA_BOND_AD_INFO_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1)
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_SLAVE_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_SLAVE_STATE,
IFLA_BOND_SLAVE_MII_STATUS,
IFLA_BOND_SLAVE_LINK_FAILURE_COUNT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_SLAVE_PERM_HWADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_BOND_SLAVE_QUEUE_ID,
IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
- __IFLA_BOND_SLAVE_MAX,
+ IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE,
+ IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __IFLA_BOND_SLAVE_MAX,
};
#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1)
enum {
- IFLA_VF_INFO_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VF_INFO_UNSPEC,
IFLA_VF_INFO,
__IFLA_VF_INFO_MAX,
};
-#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1)
enum {
IFLA_VF_UNSPEC,
IFLA_VF_MAC,
- IFLA_VF_VLAN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VF_VLAN,
IFLA_VF_TX_RATE,
IFLA_VF_SPOOFCHK,
IFLA_VF_LINK_STATE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VF_RATE,
+ IFLA_VF_RSS_QUERY_EN,
+ IFLA_VF_STATS,
+ IFLA_VF_TRUST,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IFLA_VF_MAX,
};
@@ -459,92 +589,115 @@ struct ifla_vf_link_state {
__u32 vf;
__u32 link_state;
};
+struct ifla_vf_rss_query_en {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 vf;
+ __u32 setting;
+};
enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VF_STATS_RX_PACKETS,
+ IFLA_VF_STATS_TX_PACKETS,
+ IFLA_VF_STATS_RX_BYTES,
+ IFLA_VF_STATS_TX_BYTES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_VF_STATS_BROADCAST,
+ IFLA_VF_STATS_MULTICAST,
+ __IFLA_VF_STATS_MAX,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1)
+struct ifla_vf_trust {
+ __u32 vf;
+ __u32 setting;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
IFLA_VF_PORT_UNSPEC,
IFLA_VF_PORT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IFLA_VF_PORT_MAX,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1)
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_PORT_UNSPEC,
IFLA_PORT_VF,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_PORT_PROFILE,
IFLA_PORT_VSI_TYPE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_PORT_INSTANCE_UUID,
IFLA_PORT_HOST_UUID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_PORT_REQUEST,
IFLA_PORT_RESPONSE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IFLA_PORT_MAX,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1)
#define PORT_PROFILE_MAX 40
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_UUID_MAX 16
#define PORT_SELF_VF - 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
PORT_REQUEST_PREASSOCIATE = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_REQUEST_PREASSOCIATE_RR,
PORT_REQUEST_ASSOCIATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_REQUEST_DISASSOCIATE,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
PORT_VDP_RESPONSE_SUCCESS = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_VDP_RESPONSE_INVALID_FORMAT,
PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_VDP_RESPONSE_UNUSED_VTID,
PORT_VDP_RESPONSE_VTID_VIOLATION,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION,
PORT_VDP_RESPONSE_OUT_OF_SYNC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_PROFILE_RESPONSE_SUCCESS = 0x100,
PORT_PROFILE_RESPONSE_INPROGRESS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_PROFILE_RESPONSE_INVALID,
PORT_PROFILE_RESPONSE_BADSTATE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES,
PORT_PROFILE_RESPONSE_ERROR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ifla_port_vsi {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 vsi_mgr_id;
__u8 vsi_type_id[3];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 vsi_type_version;
__u8 pad[3];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_IPOIB_UNSPEC,
IFLA_IPOIB_PKEY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_IPOIB_MODE,
IFLA_IPOIB_UMCAST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IFLA_IPOIB_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
IPOIB_MODE_DATAGRAM = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPOIB_MODE_CONNECTED = 1,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1)
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_HSR_UNSPEC,
IFLA_HSR_SLAVE1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_HSR_SLAVE2,
IFLA_HSR_MULTICAST_SPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_HSR_SUPERVISION_ADDR,
IFLA_HSR_SEQ_NR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IFLA_HSR_MAX,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1)
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/if_packet.h b/libc/kernel/uapi/linux/if_packet.h
index 6e9ae6a8c..7c5e27d83 100644
--- a/libc/kernel/uapi/linux/if_packet.h
+++ b/libc/kernel/uapi/linux/if_packet.h
@@ -72,13 +72,18 @@ struct sockaddr_ll {
#define PACKET_TX_HAS_OFF 19
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PACKET_QDISC_BYPASS 20
+#define PACKET_ROLLOVER_STATS 21
+#define PACKET_FANOUT_DATA 22
#define PACKET_FANOUT_HASH 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PACKET_FANOUT_LB 1
#define PACKET_FANOUT_CPU 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PACKET_FANOUT_ROLLOVER 3
#define PACKET_FANOUT_RND 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PACKET_FANOUT_QM 5
+#define PACKET_FANOUT_CBPF 6
+#define PACKET_FANOUT_EBPF 7
#define PACKET_FANOUT_FLAG_ROLLOVER 0x1000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PACKET_FANOUT_FLAG_DEFRAG 0x8000
@@ -93,169 +98,177 @@ struct tpacket_stats_v3 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_freeze_q_cnt;
};
+struct tpacket_rollover_stats {
+ __aligned_u64 tp_all;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __aligned_u64 tp_huge;
+ __aligned_u64 tp_failed;
+};
union tpacket_stats_u {
- struct tpacket_stats stats1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct tpacket_stats stats1;
struct tpacket_stats_v3 stats3;
};
struct tpacket_auxdata {
- __u32 tp_status;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 tp_status;
__u32 tp_len;
__u32 tp_snaplen;
__u16 tp_mac;
- __u16 tp_net;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 tp_net;
__u16 tp_vlan_tci;
__u16 tp_vlan_tpid;
};
-#define TP_STATUS_KERNEL 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TP_STATUS_KERNEL 0
#define TP_STATUS_USER (1 << 0)
#define TP_STATUS_COPY (1 << 1)
#define TP_STATUS_LOSING (1 << 2)
-#define TP_STATUS_CSUMNOTREADY (1 << 3)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TP_STATUS_CSUMNOTREADY (1 << 3)
#define TP_STATUS_VLAN_VALID (1 << 4)
#define TP_STATUS_BLK_TMO (1 << 5)
#define TP_STATUS_VLAN_TPID_VALID (1 << 6)
-#define TP_STATUS_AVAILABLE 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TP_STATUS_CSUM_VALID (1 << 7)
+#define TP_STATUS_AVAILABLE 0
#define TP_STATUS_SEND_REQUEST (1 << 0)
#define TP_STATUS_SENDING (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TP_STATUS_WRONG_FORMAT (1 << 2)
#define TP_STATUS_TS_SOFTWARE (1 << 29)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TP_STATUS_TS_SYS_HARDWARE (1 << 30)
#define TP_STATUS_TS_RAW_HARDWARE (1 << 31)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TP_FT_REQ_FILL_RXHASH 0x1
struct tpacket_hdr {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long tp_status;
unsigned int tp_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_snaplen;
unsigned short tp_mac;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short tp_net;
unsigned int tp_sec;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_usec;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TPACKET_ALIGNMENT 16
#define TPACKET_ALIGN(x) (((x) + TPACKET_ALIGNMENT - 1) & ~(TPACKET_ALIGNMENT - 1))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TPACKET_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket_hdr)) + sizeof(struct sockaddr_ll))
struct tpacket2_hdr {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tp_status;
__u32 tp_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tp_snaplen;
__u16 tp_mac;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 tp_net;
__u32 tp_sec;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tp_nsec;
__u16 tp_vlan_tci;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 tp_vlan_tpid;
__u8 tp_padding[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tpacket_hdr_variant1 {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tp_rxhash;
__u32 tp_vlan_tci;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 tp_vlan_tpid;
__u16 tp_padding;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tpacket3_hdr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tp_next_offset;
__u32 tp_sec;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tp_nsec;
__u32 tp_snaplen;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tp_len;
__u32 tp_status;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 tp_mac;
__u16 tp_net;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct tpacket_hdr_variant1 hv1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
__u8 tp_padding[8];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tpacket_bd_ts {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int ts_sec;
union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int ts_usec;
unsigned int ts_nsec;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tpacket_hdr_v1 {
__u32 block_status;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 num_pkts;
__u32 offset_to_first_pkt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 blk_len;
__aligned_u64 seq_num;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tpacket_bd_ts ts_first_pkt, ts_last_pkt;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union tpacket_bd_header_u {
struct tpacket_hdr_v1 bh1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tpacket_block_desc {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 version;
__u32 offset_to_priv;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union tpacket_bd_header_u hdr;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TPACKET2_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket2_hdr)) + sizeof(struct sockaddr_ll))
#define TPACKET3_HDRLEN (TPACKET_ALIGN(sizeof(struct tpacket3_hdr)) + sizeof(struct sockaddr_ll))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum tpacket_versions {
TPACKET_V1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TPACKET_V2,
TPACKET_V3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tpacket_req {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_block_size;
unsigned int tp_block_nr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_frame_size;
unsigned int tp_frame_nr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tpacket_req3 {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_block_size;
unsigned int tp_block_nr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_frame_size;
unsigned int tp_frame_nr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_retire_blk_tov;
unsigned int tp_sizeof_priv;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tp_feature_req_word;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union tpacket_req_u {
struct tpacket_req req;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tpacket_req3 req3;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct packet_mreq {
int mr_ifindex;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short mr_type;
unsigned short mr_alen;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char mr_address[8];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PACKET_MR_MULTICAST 0
#define PACKET_MR_PROMISC 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PACKET_MR_ALLMULTI 2
#define PACKET_MR_UNICAST 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/if_tun.h b/libc/kernel/uapi/linux/if_tun.h
index dd2dc2a7b..c5c1c2787 100644
--- a/libc/kernel/uapi/linux/if_tun.h
+++ b/libc/kernel/uapi/linux/if_tun.h
@@ -23,77 +23,73 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/filter.h>
#define TUN_READQ_SIZE 500
-#define TUN_TUN_DEV 0x0001
-#define TUN_TAP_DEV 0x0002
+#define TUN_TUN_DEV IFF_TUN
+#define TUN_TAP_DEV IFF_TAP
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TUN_TYPE_MASK 0x000f
-#define TUN_FASYNC 0x0010
-#define TUN_NOCHECKSUM 0x0020
-#define TUN_NO_PI 0x0040
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define TUN_ONE_QUEUE 0x0080
-#define TUN_PERSIST 0x0100
-#define TUN_VNET_HDR 0x0200
-#define TUN_TAP_MQ 0x0400
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TUNSETNOCSUM _IOW('T', 200, int)
#define TUNSETDEBUG _IOW('T', 201, int)
#define TUNSETIFF _IOW('T', 202, int)
-#define TUNSETPERSIST _IOW('T', 203, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TUNSETPERSIST _IOW('T', 203, int)
#define TUNSETOWNER _IOW('T', 204, int)
#define TUNSETLINK _IOW('T', 205, int)
#define TUNSETGROUP _IOW('T', 206, int)
-#define TUNGETFEATURES _IOR('T', 207, unsigned int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TUNGETFEATURES _IOR('T', 207, unsigned int)
#define TUNSETOFFLOAD _IOW('T', 208, unsigned int)
#define TUNSETTXFILTER _IOW('T', 209, unsigned int)
#define TUNGETIFF _IOR('T', 210, unsigned int)
-#define TUNGETSNDBUF _IOR('T', 211, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TUNGETSNDBUF _IOR('T', 211, int)
#define TUNSETSNDBUF _IOW('T', 212, int)
#define TUNATTACHFILTER _IOW('T', 213, struct sock_fprog)
#define TUNDETACHFILTER _IOW('T', 214, struct sock_fprog)
-#define TUNGETVNETHDRSZ _IOR('T', 215, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TUNGETVNETHDRSZ _IOR('T', 215, int)
#define TUNSETVNETHDRSZ _IOW('T', 216, int)
#define TUNSETQUEUE _IOW('T', 217, int)
#define TUNSETIFINDEX _IOW('T', 218, unsigned int)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TUNGETFILTER _IOR('T', 219, struct sock_fprog)
+#define TUNSETVNETLE _IOW('T', 220, int)
+#define TUNGETVNETLE _IOR('T', 221, int)
+#define TUNSETVNETBE _IOW('T', 222, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TUNGETVNETBE _IOR('T', 223, int)
#define IFF_TUN 0x0001
#define IFF_TAP 0x0002
#define IFF_NO_PI 0x1000
-#define IFF_ONE_QUEUE 0x2000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IFF_ONE_QUEUE 0x2000
#define IFF_VNET_HDR 0x4000
#define IFF_TUN_EXCL 0x8000
#define IFF_MULTI_QUEUE 0x0100
-#define IFF_ATTACH_QUEUE 0x0200
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IFF_ATTACH_QUEUE 0x0200
#define IFF_DETACH_QUEUE 0x0400
#define IFF_PERSIST 0x0800
#define IFF_NOFILTER 0x1000
-#define TUN_TX_TIMESTAMP 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TUN_TX_TIMESTAMP 1
#define TUN_F_CSUM 0x01
#define TUN_F_TSO4 0x02
#define TUN_F_TSO6 0x04
-#define TUN_F_TSO_ECN 0x08
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TUN_F_TSO_ECN 0x08
#define TUN_F_UFO 0x10
#define TUN_PKT_STRIP 0x0001
struct tun_pi {
- __u16 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 flags;
__be16 proto;
};
#define TUN_FLT_ALLMULTI 0x0001
-struct tun_filter {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tun_filter {
__u16 flags;
__u16 count;
__u8 addr[0][ETH_ALEN];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#endif
diff --git a/libc/kernel/uapi/linux/if_tunnel.h b/libc/kernel/uapi/linux/if_tunnel.h
index fea34288d..2855e244c 100644
--- a/libc/kernel/uapi/linux/if_tunnel.h
+++ b/libc/kernel/uapi/linux/if_tunnel.h
@@ -94,65 +94,67 @@ enum tunnel_encap_types {
};
#define TUNNEL_ENCAP_FLAG_CSUM (1 << 0)
#define TUNNEL_ENCAP_FLAG_CSUM6 (1 << 1)
-#define SIT_ISATAP 0x0001
+#define TUNNEL_ENCAP_FLAG_REMCSUM (1 << 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SIT_ISATAP 0x0001
struct ip_tunnel_prl {
__be32 addr;
__u16 flags;
- __u16 __reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 __reserved;
__u32 datalen;
__u32 __reserved2;
};
-#define PRL_DEFAULT 0x0001
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PRL_DEFAULT 0x0001
struct ip_tunnel_6rd {
struct in6_addr prefix;
__be32 relay_prefix;
- __u16 prefixlen;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 prefixlen;
__u16 relay_prefixlen;
};
enum {
- IFLA_GRE_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_GRE_UNSPEC,
IFLA_GRE_LINK,
IFLA_GRE_IFLAGS,
IFLA_GRE_OFLAGS,
- IFLA_GRE_IKEY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_GRE_IKEY,
IFLA_GRE_OKEY,
IFLA_GRE_LOCAL,
IFLA_GRE_REMOTE,
- IFLA_GRE_TTL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_GRE_TTL,
IFLA_GRE_TOS,
IFLA_GRE_PMTUDISC,
IFLA_GRE_ENCAP_LIMIT,
- IFLA_GRE_FLOWINFO,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_GRE_FLOWINFO,
IFLA_GRE_FLAGS,
IFLA_GRE_ENCAP_TYPE,
IFLA_GRE_ENCAP_FLAGS,
- IFLA_GRE_ENCAP_SPORT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IFLA_GRE_ENCAP_SPORT,
IFLA_GRE_ENCAP_DPORT,
+ IFLA_GRE_COLLECT_METADATA,
__IFLA_GRE_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VTI_ISVTI ((__force __be16) 0x0001)
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VTI_UNSPEC,
IFLA_VTI_LINK,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VTI_IKEY,
IFLA_VTI_OKEY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IFLA_VTI_LOCAL,
IFLA_VTI_REMOTE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IFLA_VTI_MAX,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1)
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/iio/events.h b/libc/kernel/uapi/linux/iio/events.h
new file mode 100644
index 000000000..67ecbb202
--- /dev/null
+++ b/libc/kernel/uapi/linux/iio/events.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_IIO_EVENTS_H_
+#define _UAPI_IIO_EVENTS_H_
+#include <linux/ioctl.h>
+#include <linux/types.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct iio_event_data {
+ __u64 id;
+ __s64 timestamp;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IIO_GET_EVENT_FD_IOCTL _IOR('i', 0x90, int)
+#define IIO_EVENT_CODE_EXTRACT_TYPE(mask) ((mask >> 56) & 0xFF)
+#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0x7F)
+#define IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(mask) ((mask >> 32) & 0xFF)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IIO_EVENT_CODE_EXTRACT_CHAN(mask) ((__s16) (mask & 0xFFFF))
+#define IIO_EVENT_CODE_EXTRACT_CHAN2(mask) ((__s16) (((mask) >> 16) & 0xFFFF))
+#define IIO_EVENT_CODE_EXTRACT_MODIFIER(mask) ((mask >> 40) & 0xFF)
+#define IIO_EVENT_CODE_EXTRACT_DIFF(mask) (((mask) >> 55) & 0x1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/iio/types.h b/libc/kernel/uapi/linux/iio/types.h
new file mode 100644
index 000000000..7520dbf53
--- /dev/null
+++ b/libc/kernel/uapi/linux/iio/types.h
@@ -0,0 +1,121 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_IIO_TYPES_H_
+#define _UAPI_IIO_TYPES_H_
+enum iio_chan_type {
+ IIO_VOLTAGE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_CURRENT,
+ IIO_POWER,
+ IIO_ACCEL,
+ IIO_ANGL_VEL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MAGN,
+ IIO_LIGHT,
+ IIO_INTENSITY,
+ IIO_PROXIMITY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_TEMP,
+ IIO_INCLI,
+ IIO_ROT,
+ IIO_ANGL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_TIMESTAMP,
+ IIO_CAPACITANCE,
+ IIO_ALTVOLTAGE,
+ IIO_CCT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_PRESSURE,
+ IIO_HUMIDITYRELATIVE,
+ IIO_ACTIVITY,
+ IIO_STEPS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_ENERGY,
+ IIO_DISTANCE,
+ IIO_VELOCITY,
+ IIO_CONCENTRATION,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_RESISTANCE,
+};
+enum iio_modifier {
+ IIO_NO_MOD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_X,
+ IIO_MOD_Y,
+ IIO_MOD_Z,
+ IIO_MOD_X_AND_Y,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_X_AND_Z,
+ IIO_MOD_Y_AND_Z,
+ IIO_MOD_X_AND_Y_AND_Z,
+ IIO_MOD_X_OR_Y,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_X_OR_Z,
+ IIO_MOD_Y_OR_Z,
+ IIO_MOD_X_OR_Y_OR_Z,
+ IIO_MOD_LIGHT_BOTH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_LIGHT_IR,
+ IIO_MOD_ROOT_SUM_SQUARED_X_Y,
+ IIO_MOD_SUM_SQUARED_X_Y_Z,
+ IIO_MOD_LIGHT_CLEAR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_LIGHT_RED,
+ IIO_MOD_LIGHT_GREEN,
+ IIO_MOD_LIGHT_BLUE,
+ IIO_MOD_QUATERNION,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_TEMP_AMBIENT,
+ IIO_MOD_TEMP_OBJECT,
+ IIO_MOD_NORTH_MAGN,
+ IIO_MOD_NORTH_TRUE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_NORTH_MAGN_TILT_COMP,
+ IIO_MOD_NORTH_TRUE_TILT_COMP,
+ IIO_MOD_RUNNING,
+ IIO_MOD_JOGGING,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_WALKING,
+ IIO_MOD_STILL,
+ IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z,
+ IIO_MOD_I,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_MOD_Q,
+ IIO_MOD_CO2,
+ IIO_MOD_VOC,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum iio_event_type {
+ IIO_EV_TYPE_THRESH,
+ IIO_EV_TYPE_MAG,
+ IIO_EV_TYPE_ROC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_EV_TYPE_THRESH_ADAPTIVE,
+ IIO_EV_TYPE_MAG_ADAPTIVE,
+ IIO_EV_TYPE_CHANGE,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum iio_event_direction {
+ IIO_EV_DIR_EITHER,
+ IIO_EV_DIR_RISING,
+ IIO_EV_DIR_FALLING,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IIO_EV_DIR_NONE,
+};
+#endif
diff --git a/libc/kernel/uapi/linux/ila.h b/libc/kernel/uapi/linux/ila.h
new file mode 100644
index 000000000..dc036d7b0
--- /dev/null
+++ b/libc/kernel/uapi/linux/ila.h
@@ -0,0 +1,29 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_ILA_H
+#define _UAPI_LINUX_ILA_H
+enum {
+ ILA_ATTR_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ILA_ATTR_LOCATOR,
+ __ILA_ATTR_MAX,
+};
+#define ILA_ATTR_MAX (__ILA_ATTR_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/in.h b/libc/kernel/uapi/linux/in.h
index 6a6d16e0e..03fdf991a 100644
--- a/libc/kernel/uapi/linux/in.h
+++ b/libc/kernel/uapi/linux/in.h
@@ -19,206 +19,226 @@
#ifndef _UAPI_LINUX_IN_H
#define _UAPI_LINUX_IN_H
#include <linux/types.h>
-#include <linux/socket.h>
+#include <linux/libc-compat.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <linux/socket.h>
+#if __UAPI_DEF_IN_IPPROTO
enum {
IPPROTO_IP = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_IP IPPROTO_IP
IPPROTO_ICMP = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_ICMP IPPROTO_ICMP
IPPROTO_IGMP = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_IGMP IPPROTO_IGMP
IPPROTO_IPIP = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_IPIP IPPROTO_IPIP
IPPROTO_TCP = 6,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_TCP IPPROTO_TCP
IPPROTO_EGP = 8,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_EGP IPPROTO_EGP
IPPROTO_PUP = 12,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_PUP IPPROTO_PUP
IPPROTO_UDP = 17,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_UDP IPPROTO_UDP
IPPROTO_IDP = 22,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_IDP IPPROTO_IDP
IPPROTO_TP = 29,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_TP IPPROTO_TP
IPPROTO_DCCP = 33,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_DCCP IPPROTO_DCCP
IPPROTO_IPV6 = 41,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_IPV6 IPPROTO_IPV6
IPPROTO_RSVP = 46,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_RSVP IPPROTO_RSVP
IPPROTO_GRE = 47,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_GRE IPPROTO_GRE
IPPROTO_ESP = 50,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_ESP IPPROTO_ESP
IPPROTO_AH = 51,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_AH IPPROTO_AH
IPPROTO_MTP = 92,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_MTP IPPROTO_MTP
IPPROTO_BEETPH = 94,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_BEETPH IPPROTO_BEETPH
IPPROTO_ENCAP = 98,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_ENCAP IPPROTO_ENCAP
IPPROTO_PIM = 103,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_PIM IPPROTO_PIM
IPPROTO_COMP = 108,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_COMP IPPROTO_COMP
IPPROTO_SCTP = 132,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_SCTP IPPROTO_SCTP
IPPROTO_UDPLITE = 136,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_UDPLITE IPPROTO_UDPLITE
+ IPPROTO_MPLS = 137,
+#define IPPROTO_MPLS IPPROTO_MPLS
IPPROTO_RAW = 255,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPPROTO_RAW IPPROTO_RAW
IPPROTO_MAX
};
-struct in_addr {
+#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#if __UAPI_DEF_IN_ADDR
+struct in_addr {
__be32 s_addr;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
#define IP_TOS 1
#define IP_TTL 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_HDRINCL 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_OPTIONS 4
#define IP_ROUTER_ALERT 5
#define IP_RECVOPTS 6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_RETOPTS 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_PKTINFO 8
#define IP_PKTOPTIONS 9
#define IP_MTU_DISCOVER 10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_RECVERR 11
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_RECVTTL 12
#define IP_RECVTOS 13
#define IP_MTU 14
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_FREEBIND 15
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_IPSEC_POLICY 16
#define IP_XFRM_POLICY 17
#define IP_PASSSEC 18
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_TRANSPARENT 19
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_RECVRETOPTS IP_RETOPTS
#define IP_ORIGDSTADDR 20
#define IP_RECVORIGDSTADDR IP_ORIGDSTADDR
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_MINTTL 21
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_NODEFRAG 22
+#define IP_CHECKSUM 23
+#define IP_BIND_ADDRESS_NO_PORT 24
#define IP_PMTUDISC_DONT 0
-#define IP_PMTUDISC_WANT 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IP_PMTUDISC_WANT 1
#define IP_PMTUDISC_DO 2
#define IP_PMTUDISC_PROBE 3
#define IP_PMTUDISC_INTERFACE 4
-#define IP_PMTUDISC_OMIT 5
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IP_PMTUDISC_OMIT 5
#define IP_MULTICAST_IF 32
#define IP_MULTICAST_TTL 33
#define IP_MULTICAST_LOOP 34
-#define IP_ADD_MEMBERSHIP 35
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IP_ADD_MEMBERSHIP 35
#define IP_DROP_MEMBERSHIP 36
#define IP_UNBLOCK_SOURCE 37
#define IP_BLOCK_SOURCE 38
-#define IP_ADD_SOURCE_MEMBERSHIP 39
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IP_ADD_SOURCE_MEMBERSHIP 39
#define IP_DROP_SOURCE_MEMBERSHIP 40
#define IP_MSFILTER 41
#define MCAST_JOIN_GROUP 42
-#define MCAST_BLOCK_SOURCE 43
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MCAST_BLOCK_SOURCE 43
#define MCAST_UNBLOCK_SOURCE 44
#define MCAST_LEAVE_GROUP 45
#define MCAST_JOIN_SOURCE_GROUP 46
-#define MCAST_LEAVE_SOURCE_GROUP 47
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MCAST_LEAVE_SOURCE_GROUP 47
#define MCAST_MSFILTER 48
#define IP_MULTICAST_ALL 49
#define IP_UNICAST_IF 50
-#define MCAST_EXCLUDE 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MCAST_EXCLUDE 0
#define MCAST_INCLUDE 1
#define IP_DEFAULT_MULTICAST_TTL 1
#define IP_DEFAULT_MULTICAST_LOOP 1
-struct ip_mreq {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#if __UAPI_DEF_IP_MREQ
+struct ip_mreq {
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ip_mreqn {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct in_addr imr_multiaddr;
struct in_addr imr_address;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int imr_ifindex;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ip_mreq_source {
__be32 imr_multiaddr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 imr_interface;
__be32 imr_sourceaddr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ip_msfilter {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 imsf_multiaddr;
__be32 imsf_interface;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 imsf_fmode;
__u32 imsf_numsrc;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 imsf_slist[1];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IP_MSFILTER_SIZE(numsrc) (sizeof(struct ip_msfilter) - sizeof(__u32) + (numsrc) * sizeof(__u32))
struct group_req {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 gr_interface;
struct __kernel_sockaddr_storage gr_group;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct group_source_req {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 gsr_interface;
struct __kernel_sockaddr_storage gsr_group;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct __kernel_sockaddr_storage gsr_source;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct group_filter {
__u32 gf_interface;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct __kernel_sockaddr_storage gf_group;
__u32 gf_fmode;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 gf_numsrc;
struct __kernel_sockaddr_storage gf_slist[1];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define GROUP_FILTER_SIZE(numsrc) (sizeof(struct group_filter) - sizeof(struct __kernel_sockaddr_storage) + (numsrc) * sizeof(struct __kernel_sockaddr_storage))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#if __UAPI_DEF_IN_PKTINFO
struct in_pktinfo {
int ipi_ifindex;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct in_addr ipi_spec_dst;
struct in_addr ipi_addr;
};
-#define __SOCK_SIZE__ 16
+#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#if __UAPI_DEF_SOCKADDR_IN
+#define __SOCK_SIZE__ 16
struct sockaddr_in {
__kernel_sa_family_t sin_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 sin_port;
struct in_addr sin_addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) - sizeof(unsigned short int) - sizeof(struct in_addr)];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define sin_zero __pad
+#endif
+#if __UAPI_DEF_IN_CLASS
#define IN_CLASSA(a) ((((long int) (a)) & 0x80000000) == 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IN_CLASSA_NET 0xff000000
@@ -256,5 +276,6 @@ struct sockaddr_in {
#define INADDR_ALLRTRS_GROUP 0xe0000002U
#define INADDR_MAX_LOCAL_GROUP 0xe00000ffU
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
#include <asm/byteorder.h>
#endif
diff --git a/libc/kernel/uapi/linux/inet_diag.h b/libc/kernel/uapi/linux/inet_diag.h
index 447d92821..d904418cd 100644
--- a/libc/kernel/uapi/linux/inet_diag.h
+++ b/libc/kernel/uapi/linux/inet_diag.h
@@ -118,31 +118,38 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
INET_DIAG_SHUTDOWN,
INET_DIAG_DCTCPINFO,
-};
-#define INET_DIAG_MAX INET_DIAG_DCTCPINFO
+ INET_DIAG_PROTOCOL,
+ INET_DIAG_SKV6ONLY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define INET_DIAG_MAX INET_DIAG_SKV6ONLY
struct inet_diag_meminfo {
__u32 idiag_rmem;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 idiag_wmem;
__u32 idiag_fmem;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 idiag_tmem;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tcpvegas_info {
__u32 tcpv_enabled;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpv_rttcnt;
__u32 tcpv_rtt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpv_minrtt;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tcp_dctcp_info {
__u16 dctcp_enabled;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 dctcp_ce_state;
__u32 dctcp_alpha;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 dctcp_ab_ecn;
__u32 dctcp_ab_tot;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
-#endif
+union tcp_cc_info {
+ struct tcpvegas_info vegas;
+ struct tcp_dctcp_info dctcp;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#endif
diff --git a/libc/kernel/uapi/linux/input-event-codes.h b/libc/kernel/uapi/linux/input-event-codes.h
new file mode 100644
index 000000000..3bf47e9e2
--- /dev/null
+++ b/libc/kernel/uapi/linux/input-event-codes.h
@@ -0,0 +1,865 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_INPUT_EVENT_CODES_H
+#define _UAPI_INPUT_EVENT_CODES_H
+#define INPUT_PROP_POINTER 0x00
+#define INPUT_PROP_DIRECT 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define INPUT_PROP_BUTTONPAD 0x02
+#define INPUT_PROP_SEMI_MT 0x03
+#define INPUT_PROP_TOPBUTTONPAD 0x04
+#define INPUT_PROP_POINTING_STICK 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define INPUT_PROP_ACCELEROMETER 0x06
+#define INPUT_PROP_MAX 0x1f
+#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
+#define EV_SYN 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EV_KEY 0x01
+#define EV_REL 0x02
+#define EV_ABS 0x03
+#define EV_MSC 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EV_SW 0x05
+#define EV_LED 0x11
+#define EV_SND 0x12
+#define EV_REP 0x14
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EV_FF 0x15
+#define EV_PWR 0x16
+#define EV_FF_STATUS 0x17
+#define EV_MAX 0x1f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EV_CNT (EV_MAX + 1)
+#define SYN_REPORT 0
+#define SYN_CONFIG 1
+#define SYN_MT_REPORT 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SYN_DROPPED 3
+#define SYN_MAX 0xf
+#define SYN_CNT (SYN_MAX + 1)
+#define KEY_RESERVED 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_ESC 1
+#define KEY_1 2
+#define KEY_2 3
+#define KEY_3 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_4 5
+#define KEY_5 6
+#define KEY_6 7
+#define KEY_7 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_8 9
+#define KEY_9 10
+#define KEY_0 11
+#define KEY_MINUS 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_EQUAL 13
+#define KEY_BACKSPACE 14
+#define KEY_TAB 15
+#define KEY_Q 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_W 17
+#define KEY_E 18
+#define KEY_R 19
+#define KEY_T 20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_Y 21
+#define KEY_U 22
+#define KEY_I 23
+#define KEY_O 24
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_P 25
+#define KEY_LEFTBRACE 26
+#define KEY_RIGHTBRACE 27
+#define KEY_ENTER 28
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_LEFTCTRL 29
+#define KEY_A 30
+#define KEY_S 31
+#define KEY_D 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_F 33
+#define KEY_G 34
+#define KEY_H 35
+#define KEY_J 36
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_K 37
+#define KEY_L 38
+#define KEY_SEMICOLON 39
+#define KEY_APOSTROPHE 40
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_GRAVE 41
+#define KEY_LEFTSHIFT 42
+#define KEY_BACKSLASH 43
+#define KEY_Z 44
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_X 45
+#define KEY_C 46
+#define KEY_V 47
+#define KEY_B 48
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_N 49
+#define KEY_M 50
+#define KEY_COMMA 51
+#define KEY_DOT 52
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_SLASH 53
+#define KEY_RIGHTSHIFT 54
+#define KEY_KPASTERISK 55
+#define KEY_LEFTALT 56
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_SPACE 57
+#define KEY_CAPSLOCK 58
+#define KEY_F1 59
+#define KEY_F2 60
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_F3 61
+#define KEY_F4 62
+#define KEY_F5 63
+#define KEY_F6 64
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_F7 65
+#define KEY_F8 66
+#define KEY_F9 67
+#define KEY_F10 68
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_NUMLOCK 69
+#define KEY_SCROLLLOCK 70
+#define KEY_KP7 71
+#define KEY_KP8 72
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KP9 73
+#define KEY_KPMINUS 74
+#define KEY_KP4 75
+#define KEY_KP5 76
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KP6 77
+#define KEY_KPPLUS 78
+#define KEY_KP1 79
+#define KEY_KP2 80
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KP3 81
+#define KEY_KP0 82
+#define KEY_KPDOT 83
+#define KEY_ZENKAKUHANKAKU 85
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_102ND 86
+#define KEY_F11 87
+#define KEY_F12 88
+#define KEY_RO 89
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KATAKANA 90
+#define KEY_HIRAGANA 91
+#define KEY_HENKAN 92
+#define KEY_KATAKANAHIRAGANA 93
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_MUHENKAN 94
+#define KEY_KPJPCOMMA 95
+#define KEY_KPENTER 96
+#define KEY_RIGHTCTRL 97
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KPSLASH 98
+#define KEY_SYSRQ 99
+#define KEY_RIGHTALT 100
+#define KEY_LINEFEED 101
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_HOME 102
+#define KEY_UP 103
+#define KEY_PAGEUP 104
+#define KEY_LEFT 105
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_RIGHT 106
+#define KEY_END 107
+#define KEY_DOWN 108
+#define KEY_PAGEDOWN 109
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_INSERT 110
+#define KEY_DELETE 111
+#define KEY_MACRO 112
+#define KEY_MUTE 113
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_VOLUMEDOWN 114
+#define KEY_VOLUMEUP 115
+#define KEY_POWER 116
+#define KEY_KPEQUAL 117
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KPPLUSMINUS 118
+#define KEY_PAUSE 119
+#define KEY_SCALE 120
+#define KEY_KPCOMMA 121
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_HANGEUL 122
+#define KEY_HANGUEL KEY_HANGEUL
+#define KEY_HANJA 123
+#define KEY_YEN 124
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_LEFTMETA 125
+#define KEY_RIGHTMETA 126
+#define KEY_COMPOSE 127
+#define KEY_STOP 128
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_AGAIN 129
+#define KEY_PROPS 130
+#define KEY_UNDO 131
+#define KEY_FRONT 132
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_COPY 133
+#define KEY_OPEN 134
+#define KEY_PASTE 135
+#define KEY_FIND 136
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_CUT 137
+#define KEY_HELP 138
+#define KEY_MENU 139
+#define KEY_CALC 140
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_SETUP 141
+#define KEY_SLEEP 142
+#define KEY_WAKEUP 143
+#define KEY_FILE 144
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_SENDFILE 145
+#define KEY_DELETEFILE 146
+#define KEY_XFER 147
+#define KEY_PROG1 148
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_PROG2 149
+#define KEY_WWW 150
+#define KEY_MSDOS 151
+#define KEY_COFFEE 152
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_SCREENLOCK KEY_COFFEE
+#define KEY_ROTATE_DISPLAY 153
+#define KEY_DIRECTION KEY_ROTATE_DISPLAY
+#define KEY_CYCLEWINDOWS 154
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_MAIL 155
+#define KEY_BOOKMARKS 156
+#define KEY_COMPUTER 157
+#define KEY_BACK 158
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FORWARD 159
+#define KEY_CLOSECD 160
+#define KEY_EJECTCD 161
+#define KEY_EJECTCLOSECD 162
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_NEXTSONG 163
+#define KEY_PLAYPAUSE 164
+#define KEY_PREVIOUSSONG 165
+#define KEY_STOPCD 166
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_RECORD 167
+#define KEY_REWIND 168
+#define KEY_PHONE 169
+#define KEY_ISO 170
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_CONFIG 171
+#define KEY_HOMEPAGE 172
+#define KEY_REFRESH 173
+#define KEY_EXIT 174
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_MOVE 175
+#define KEY_EDIT 176
+#define KEY_SCROLLUP 177
+#define KEY_SCROLLDOWN 178
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KPLEFTPAREN 179
+#define KEY_KPRIGHTPAREN 180
+#define KEY_NEW 181
+#define KEY_REDO 182
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_F13 183
+#define KEY_F14 184
+#define KEY_F15 185
+#define KEY_F16 186
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_F17 187
+#define KEY_F18 188
+#define KEY_F19 189
+#define KEY_F20 190
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_F21 191
+#define KEY_F22 192
+#define KEY_F23 193
+#define KEY_F24 194
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_PLAYCD 200
+#define KEY_PAUSECD 201
+#define KEY_PROG3 202
+#define KEY_PROG4 203
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_DASHBOARD 204
+#define KEY_SUSPEND 205
+#define KEY_CLOSE 206
+#define KEY_PLAY 207
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FASTFORWARD 208
+#define KEY_BASSBOOST 209
+#define KEY_PRINT 210
+#define KEY_HP 211
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_CAMERA 212
+#define KEY_SOUND 213
+#define KEY_QUESTION 214
+#define KEY_EMAIL 215
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_CHAT 216
+#define KEY_SEARCH 217
+#define KEY_CONNECT 218
+#define KEY_FINANCE 219
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_SPORT 220
+#define KEY_SHOP 221
+#define KEY_ALTERASE 222
+#define KEY_CANCEL 223
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_BRIGHTNESSDOWN 224
+#define KEY_BRIGHTNESSUP 225
+#define KEY_MEDIA 226
+#define KEY_SWITCHVIDEOMODE 227
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KBDILLUMTOGGLE 228
+#define KEY_KBDILLUMDOWN 229
+#define KEY_KBDILLUMUP 230
+#define KEY_SEND 231
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_REPLY 232
+#define KEY_FORWARDMAIL 233
+#define KEY_SAVE 234
+#define KEY_DOCUMENTS 235
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_BATTERY 236
+#define KEY_BLUETOOTH 237
+#define KEY_WLAN 238
+#define KEY_UWB 239
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_UNKNOWN 240
+#define KEY_VIDEO_NEXT 241
+#define KEY_VIDEO_PREV 242
+#define KEY_BRIGHTNESS_CYCLE 243
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_BRIGHTNESS_AUTO 244
+#define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO
+#define KEY_DISPLAY_OFF 245
+#define KEY_WWAN 246
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_WIMAX KEY_WWAN
+#define KEY_RFKILL 247
+#define KEY_MICMUTE 248
+#define BTN_MISC 0x100
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_0 0x100
+#define BTN_1 0x101
+#define BTN_2 0x102
+#define BTN_3 0x103
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_4 0x104
+#define BTN_5 0x105
+#define BTN_6 0x106
+#define BTN_7 0x107
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_8 0x108
+#define BTN_9 0x109
+#define BTN_MOUSE 0x110
+#define BTN_LEFT 0x110
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_RIGHT 0x111
+#define BTN_MIDDLE 0x112
+#define BTN_SIDE 0x113
+#define BTN_EXTRA 0x114
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_FORWARD 0x115
+#define BTN_BACK 0x116
+#define BTN_TASK 0x117
+#define BTN_JOYSTICK 0x120
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER 0x120
+#define BTN_THUMB 0x121
+#define BTN_THUMB2 0x122
+#define BTN_TOP 0x123
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TOP2 0x124
+#define BTN_PINKIE 0x125
+#define BTN_BASE 0x126
+#define BTN_BASE2 0x127
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_BASE3 0x128
+#define BTN_BASE4 0x129
+#define BTN_BASE5 0x12a
+#define BTN_BASE6 0x12b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_DEAD 0x12f
+#define BTN_GAMEPAD 0x130
+#define BTN_SOUTH 0x130
+#define BTN_A BTN_SOUTH
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_EAST 0x131
+#define BTN_B BTN_EAST
+#define BTN_C 0x132
+#define BTN_NORTH 0x133
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_X BTN_NORTH
+#define BTN_WEST 0x134
+#define BTN_Y BTN_WEST
+#define BTN_Z 0x135
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TL 0x136
+#define BTN_TR 0x137
+#define BTN_TL2 0x138
+#define BTN_TR2 0x139
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_SELECT 0x13a
+#define BTN_START 0x13b
+#define BTN_MODE 0x13c
+#define BTN_THUMBL 0x13d
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_THUMBR 0x13e
+#define BTN_DIGI 0x140
+#define BTN_TOOL_PEN 0x140
+#define BTN_TOOL_RUBBER 0x141
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TOOL_BRUSH 0x142
+#define BTN_TOOL_PENCIL 0x143
+#define BTN_TOOL_AIRBRUSH 0x144
+#define BTN_TOOL_FINGER 0x145
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TOOL_MOUSE 0x146
+#define BTN_TOOL_LENS 0x147
+#define BTN_TOOL_QUINTTAP 0x148
+#define BTN_TOUCH 0x14a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_STYLUS 0x14b
+#define BTN_STYLUS2 0x14c
+#define BTN_TOOL_DOUBLETAP 0x14d
+#define BTN_TOOL_TRIPLETAP 0x14e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TOOL_QUADTAP 0x14f
+#define BTN_WHEEL 0x150
+#define BTN_GEAR_DOWN 0x150
+#define BTN_GEAR_UP 0x151
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_OK 0x160
+#define KEY_SELECT 0x161
+#define KEY_GOTO 0x162
+#define KEY_CLEAR 0x163
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_POWER2 0x164
+#define KEY_OPTION 0x165
+#define KEY_INFO 0x166
+#define KEY_TIME 0x167
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_VENDOR 0x168
+#define KEY_ARCHIVE 0x169
+#define KEY_PROGRAM 0x16a
+#define KEY_CHANNEL 0x16b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FAVORITES 0x16c
+#define KEY_EPG 0x16d
+#define KEY_PVR 0x16e
+#define KEY_MHP 0x16f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_LANGUAGE 0x170
+#define KEY_TITLE 0x171
+#define KEY_SUBTITLE 0x172
+#define KEY_ANGLE 0x173
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_ZOOM 0x174
+#define KEY_MODE 0x175
+#define KEY_KEYBOARD 0x176
+#define KEY_SCREEN 0x177
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_PC 0x178
+#define KEY_TV 0x179
+#define KEY_TV2 0x17a
+#define KEY_VCR 0x17b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_VCR2 0x17c
+#define KEY_SAT 0x17d
+#define KEY_SAT2 0x17e
+#define KEY_CD 0x17f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_TAPE 0x180
+#define KEY_RADIO 0x181
+#define KEY_TUNER 0x182
+#define KEY_PLAYER 0x183
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_TEXT 0x184
+#define KEY_DVD 0x185
+#define KEY_AUX 0x186
+#define KEY_MP3 0x187
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_AUDIO 0x188
+#define KEY_VIDEO 0x189
+#define KEY_DIRECTORY 0x18a
+#define KEY_LIST 0x18b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_MEMO 0x18c
+#define KEY_CALENDAR 0x18d
+#define KEY_RED 0x18e
+#define KEY_GREEN 0x18f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_YELLOW 0x190
+#define KEY_BLUE 0x191
+#define KEY_CHANNELUP 0x192
+#define KEY_CHANNELDOWN 0x193
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FIRST 0x194
+#define KEY_LAST 0x195
+#define KEY_AB 0x196
+#define KEY_NEXT 0x197
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_RESTART 0x198
+#define KEY_SLOW 0x199
+#define KEY_SHUFFLE 0x19a
+#define KEY_BREAK 0x19b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_PREVIOUS 0x19c
+#define KEY_DIGITS 0x19d
+#define KEY_TEEN 0x19e
+#define KEY_TWEN 0x19f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_VIDEOPHONE 0x1a0
+#define KEY_GAMES 0x1a1
+#define KEY_ZOOMIN 0x1a2
+#define KEY_ZOOMOUT 0x1a3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_ZOOMRESET 0x1a4
+#define KEY_WORDPROCESSOR 0x1a5
+#define KEY_EDITOR 0x1a6
+#define KEY_SPREADSHEET 0x1a7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_GRAPHICSEDITOR 0x1a8
+#define KEY_PRESENTATION 0x1a9
+#define KEY_DATABASE 0x1aa
+#define KEY_NEWS 0x1ab
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_VOICEMAIL 0x1ac
+#define KEY_ADDRESSBOOK 0x1ad
+#define KEY_MESSENGER 0x1ae
+#define KEY_DISPLAYTOGGLE 0x1af
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_BRIGHTNESS_TOGGLE KEY_DISPLAYTOGGLE
+#define KEY_SPELLCHECK 0x1b0
+#define KEY_LOGOFF 0x1b1
+#define KEY_DOLLAR 0x1b2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_EURO 0x1b3
+#define KEY_FRAMEBACK 0x1b4
+#define KEY_FRAMEFORWARD 0x1b5
+#define KEY_CONTEXT_MENU 0x1b6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_MEDIA_REPEAT 0x1b7
+#define KEY_10CHANNELSUP 0x1b8
+#define KEY_10CHANNELSDOWN 0x1b9
+#define KEY_IMAGES 0x1ba
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_DEL_EOL 0x1c0
+#define KEY_DEL_EOS 0x1c1
+#define KEY_INS_LINE 0x1c2
+#define KEY_DEL_LINE 0x1c3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FN 0x1d0
+#define KEY_FN_ESC 0x1d1
+#define KEY_FN_F1 0x1d2
+#define KEY_FN_F2 0x1d3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FN_F3 0x1d4
+#define KEY_FN_F4 0x1d5
+#define KEY_FN_F5 0x1d6
+#define KEY_FN_F6 0x1d7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FN_F7 0x1d8
+#define KEY_FN_F8 0x1d9
+#define KEY_FN_F9 0x1da
+#define KEY_FN_F10 0x1db
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FN_F11 0x1dc
+#define KEY_FN_F12 0x1dd
+#define KEY_FN_1 0x1de
+#define KEY_FN_2 0x1df
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FN_D 0x1e0
+#define KEY_FN_E 0x1e1
+#define KEY_FN_F 0x1e2
+#define KEY_FN_S 0x1e3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_FN_B 0x1e4
+#define KEY_BRL_DOT1 0x1f1
+#define KEY_BRL_DOT2 0x1f2
+#define KEY_BRL_DOT3 0x1f3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_BRL_DOT4 0x1f4
+#define KEY_BRL_DOT5 0x1f5
+#define KEY_BRL_DOT6 0x1f6
+#define KEY_BRL_DOT7 0x1f7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_BRL_DOT8 0x1f8
+#define KEY_BRL_DOT9 0x1f9
+#define KEY_BRL_DOT10 0x1fa
+#define KEY_NUMERIC_0 0x200
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_NUMERIC_1 0x201
+#define KEY_NUMERIC_2 0x202
+#define KEY_NUMERIC_3 0x203
+#define KEY_NUMERIC_4 0x204
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_NUMERIC_5 0x205
+#define KEY_NUMERIC_6 0x206
+#define KEY_NUMERIC_7 0x207
+#define KEY_NUMERIC_8 0x208
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_NUMERIC_9 0x209
+#define KEY_NUMERIC_STAR 0x20a
+#define KEY_NUMERIC_POUND 0x20b
+#define KEY_NUMERIC_A 0x20c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_NUMERIC_B 0x20d
+#define KEY_NUMERIC_C 0x20e
+#define KEY_NUMERIC_D 0x20f
+#define KEY_CAMERA_FOCUS 0x210
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_WPS_BUTTON 0x211
+#define KEY_TOUCHPAD_TOGGLE 0x212
+#define KEY_TOUCHPAD_ON 0x213
+#define KEY_TOUCHPAD_OFF 0x214
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_CAMERA_ZOOMIN 0x215
+#define KEY_CAMERA_ZOOMOUT 0x216
+#define KEY_CAMERA_UP 0x217
+#define KEY_CAMERA_DOWN 0x218
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_CAMERA_LEFT 0x219
+#define KEY_CAMERA_RIGHT 0x21a
+#define KEY_ATTENDANT_ON 0x21b
+#define KEY_ATTENDANT_OFF 0x21c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_ATTENDANT_TOGGLE 0x21d
+#define KEY_LIGHTS_TOGGLE 0x21e
+#define BTN_DPAD_UP 0x220
+#define BTN_DPAD_DOWN 0x221
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_DPAD_LEFT 0x222
+#define BTN_DPAD_RIGHT 0x223
+#define KEY_ALS_TOGGLE 0x230
+#define KEY_BUTTONCONFIG 0x240
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_TASKMANAGER 0x241
+#define KEY_JOURNAL 0x242
+#define KEY_CONTROLPANEL 0x243
+#define KEY_APPSELECT 0x244
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_SCREENSAVER 0x245
+#define KEY_VOICECOMMAND 0x246
+#define KEY_BRIGHTNESS_MIN 0x250
+#define KEY_BRIGHTNESS_MAX 0x251
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KBDINPUTASSIST_PREV 0x260
+#define KEY_KBDINPUTASSIST_NEXT 0x261
+#define KEY_KBDINPUTASSIST_PREVGROUP 0x262
+#define KEY_KBDINPUTASSIST_NEXTGROUP 0x263
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_KBDINPUTASSIST_ACCEPT 0x264
+#define KEY_KBDINPUTASSIST_CANCEL 0x265
+#define BTN_TRIGGER_HAPPY 0x2c0
+#define BTN_TRIGGER_HAPPY1 0x2c0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY2 0x2c1
+#define BTN_TRIGGER_HAPPY3 0x2c2
+#define BTN_TRIGGER_HAPPY4 0x2c3
+#define BTN_TRIGGER_HAPPY5 0x2c4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY6 0x2c5
+#define BTN_TRIGGER_HAPPY7 0x2c6
+#define BTN_TRIGGER_HAPPY8 0x2c7
+#define BTN_TRIGGER_HAPPY9 0x2c8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY10 0x2c9
+#define BTN_TRIGGER_HAPPY11 0x2ca
+#define BTN_TRIGGER_HAPPY12 0x2cb
+#define BTN_TRIGGER_HAPPY13 0x2cc
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY14 0x2cd
+#define BTN_TRIGGER_HAPPY15 0x2ce
+#define BTN_TRIGGER_HAPPY16 0x2cf
+#define BTN_TRIGGER_HAPPY17 0x2d0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY18 0x2d1
+#define BTN_TRIGGER_HAPPY19 0x2d2
+#define BTN_TRIGGER_HAPPY20 0x2d3
+#define BTN_TRIGGER_HAPPY21 0x2d4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY22 0x2d5
+#define BTN_TRIGGER_HAPPY23 0x2d6
+#define BTN_TRIGGER_HAPPY24 0x2d7
+#define BTN_TRIGGER_HAPPY25 0x2d8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY26 0x2d9
+#define BTN_TRIGGER_HAPPY27 0x2da
+#define BTN_TRIGGER_HAPPY28 0x2db
+#define BTN_TRIGGER_HAPPY29 0x2dc
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY30 0x2dd
+#define BTN_TRIGGER_HAPPY31 0x2de
+#define BTN_TRIGGER_HAPPY32 0x2df
+#define BTN_TRIGGER_HAPPY33 0x2e0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY34 0x2e1
+#define BTN_TRIGGER_HAPPY35 0x2e2
+#define BTN_TRIGGER_HAPPY36 0x2e3
+#define BTN_TRIGGER_HAPPY37 0x2e4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BTN_TRIGGER_HAPPY38 0x2e5
+#define BTN_TRIGGER_HAPPY39 0x2e6
+#define BTN_TRIGGER_HAPPY40 0x2e7
+#define KEY_MIN_INTERESTING KEY_MUTE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KEY_MAX 0x2ff
+#define KEY_CNT (KEY_MAX + 1)
+#define REL_X 0x00
+#define REL_Y 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define REL_Z 0x02
+#define REL_RX 0x03
+#define REL_RY 0x04
+#define REL_RZ 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define REL_HWHEEL 0x06
+#define REL_DIAL 0x07
+#define REL_WHEEL 0x08
+#define REL_MISC 0x09
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define REL_MAX 0x0f
+#define REL_CNT (REL_MAX + 1)
+#define ABS_X 0x00
+#define ABS_Y 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_Z 0x02
+#define ABS_RX 0x03
+#define ABS_RY 0x04
+#define ABS_RZ 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_THROTTLE 0x06
+#define ABS_RUDDER 0x07
+#define ABS_WHEEL 0x08
+#define ABS_GAS 0x09
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_BRAKE 0x0a
+#define ABS_HAT0X 0x10
+#define ABS_HAT0Y 0x11
+#define ABS_HAT1X 0x12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_HAT1Y 0x13
+#define ABS_HAT2X 0x14
+#define ABS_HAT2Y 0x15
+#define ABS_HAT3X 0x16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_HAT3Y 0x17
+#define ABS_PRESSURE 0x18
+#define ABS_DISTANCE 0x19
+#define ABS_TILT_X 0x1a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_TILT_Y 0x1b
+#define ABS_TOOL_WIDTH 0x1c
+#define ABS_VOLUME 0x20
+#define ABS_MISC 0x28
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_MT_SLOT 0x2f
+#define ABS_MT_TOUCH_MAJOR 0x30
+#define ABS_MT_TOUCH_MINOR 0x31
+#define ABS_MT_WIDTH_MAJOR 0x32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_MT_WIDTH_MINOR 0x33
+#define ABS_MT_ORIENTATION 0x34
+#define ABS_MT_POSITION_X 0x35
+#define ABS_MT_POSITION_Y 0x36
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_MT_TOOL_TYPE 0x37
+#define ABS_MT_BLOB_ID 0x38
+#define ABS_MT_TRACKING_ID 0x39
+#define ABS_MT_PRESSURE 0x3a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_MT_DISTANCE 0x3b
+#define ABS_MT_TOOL_X 0x3c
+#define ABS_MT_TOOL_Y 0x3d
+#define ABS_MAX 0x3f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ABS_CNT (ABS_MAX + 1)
+#define SW_LID 0x00
+#define SW_TABLET_MODE 0x01
+#define SW_HEADPHONE_INSERT 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SW_RFKILL_ALL 0x03
+#define SW_RADIO SW_RFKILL_ALL
+#define SW_MICROPHONE_INSERT 0x04
+#define SW_DOCK 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SW_LINEOUT_INSERT 0x06
+#define SW_JACK_PHYSICAL_INSERT 0x07
+#define SW_VIDEOOUT_INSERT 0x08
+#define SW_CAMERA_LENS_COVER 0x09
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SW_KEYPAD_SLIDE 0x0a
+#define SW_FRONT_PROXIMITY 0x0b
+#define SW_ROTATE_LOCK 0x0c
+#define SW_LINEIN_INSERT 0x0d
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SW_MUTE_DEVICE 0x0e
+#define SW_MAX 0x0f
+#define SW_CNT (SW_MAX + 1)
+#define MSC_SERIAL 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MSC_PULSELED 0x01
+#define MSC_GESTURE 0x02
+#define MSC_RAW 0x03
+#define MSC_SCAN 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MSC_TIMESTAMP 0x05
+#define MSC_MAX 0x07
+#define MSC_CNT (MSC_MAX + 1)
+#define LED_NUML 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LED_CAPSL 0x01
+#define LED_SCROLLL 0x02
+#define LED_COMPOSE 0x03
+#define LED_KANA 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LED_SLEEP 0x05
+#define LED_SUSPEND 0x06
+#define LED_MUTE 0x07
+#define LED_MISC 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LED_MAIL 0x09
+#define LED_CHARGING 0x0a
+#define LED_MAX 0x0f
+#define LED_CNT (LED_MAX + 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define REP_DELAY 0x00
+#define REP_PERIOD 0x01
+#define REP_MAX 0x01
+#define REP_CNT (REP_MAX + 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_CLICK 0x00
+#define SND_BELL 0x01
+#define SND_TONE 0x02
+#define SND_MAX 0x07
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_CNT (SND_MAX + 1)
+#endif
diff --git a/libc/kernel/uapi/linux/input.h b/libc/kernel/uapi/linux/input.h
index 88a1f0e17..9fbebb618 100644
--- a/libc/kernel/uapi/linux/input.h
+++ b/libc/kernel/uapi/linux/input.h
@@ -23,943 +23,118 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <sys/types.h>
#include <linux/types.h>
+#include "input-event-codes.h"
struct input_event {
- struct timeval time;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct timeval time;
__u16 type;
__u16 code;
__s32 value;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define EV_VERSION 0x010001
struct input_id {
__u16 bustype;
- __u16 vendor;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 vendor;
__u16 product;
__u16 version;
};
-struct input_absinfo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct input_absinfo {
__s32 value;
__s32 minimum;
__s32 maximum;
- __s32 fuzz;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 fuzz;
__s32 flat;
__s32 resolution;
};
-struct input_keymap_entry {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct input_keymap_entry {
#define INPUT_KEYMAP_BY_INDEX (1 << 0)
__u8 flags;
__u8 len;
- __u16 index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 index;
__u32 keycode;
__u8 scancode[32];
};
-#define EVIOCGVERSION _IOR('E', 0x01, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct input_mask {
+ __u32 type;
+ __u32 codes_size;
+ __u64 codes_ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define EVIOCGVERSION _IOR('E', 0x01, int)
#define EVIOCGID _IOR('E', 0x02, struct input_id)
#define EVIOCGREP _IOR('E', 0x03, unsigned int[2])
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCSREP _IOW('E', 0x03, unsigned int[2])
#define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2])
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry)
#define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2])
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry)
#define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len)
#define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len)
#define EVIOCGMTSLOTS(len) _IOC(_IOC_READ, 'E', 0x0a, len)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len)
#define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len)
#define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + (ev), len)
#define EVIOCGABS(abs) _IOR('E', 0x40 + (abs), struct input_absinfo)
-#define EVIOCSABS(abs) _IOW('E', 0xc0 + (abs), struct input_absinfo)
-#define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EVIOCSABS(abs) _IOW('E', 0xc0 + (abs), struct input_absinfo)
+#define EVIOCSFF _IOW('E', 0x80, struct ff_effect)
#define EVIOCRMFF _IOW('E', 0x81, int)
#define EVIOCGEFFECTS _IOR('E', 0x84, int)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCGRAB _IOW('E', 0x90, int)
#define EVIOCREVOKE _IOW('E', 0x91, int)
+#define EVIOCGMASK _IOR('E', 0x92, struct input_mask)
+#define EVIOCSMASK _IOW('E', 0x93, struct input_mask)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EVIOCSCLOCKID _IOW('E', 0xa0, int)
-#define INPUT_PROP_POINTER 0x00
-#define INPUT_PROP_DIRECT 0x01
-#define INPUT_PROP_BUTTONPAD 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define INPUT_PROP_SEMI_MT 0x03
-#define INPUT_PROP_TOPBUTTONPAD 0x04
-#define INPUT_PROP_POINTING_STICK 0x05
-#define INPUT_PROP_MAX 0x1f
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
-#define EV_SYN 0x00
-#define EV_KEY 0x01
-#define EV_REL 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define EV_ABS 0x03
-#define EV_MSC 0x04
-#define EV_SW 0x05
-#define EV_LED 0x11
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define EV_SND 0x12
-#define EV_REP 0x14
-#define EV_FF 0x15
-#define EV_PWR 0x16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define EV_FF_STATUS 0x17
-#define EV_MAX 0x1f
-#define EV_CNT (EV_MAX + 1)
-#define SYN_REPORT 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SYN_CONFIG 1
-#define SYN_MT_REPORT 2
-#define SYN_DROPPED 3
-#define SYN_MAX 0xf
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SYN_CNT (SYN_MAX + 1)
-#define KEY_RESERVED 0
-#define KEY_ESC 1
-#define KEY_1 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_2 3
-#define KEY_3 4
-#define KEY_4 5
-#define KEY_5 6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_6 7
-#define KEY_7 8
-#define KEY_8 9
-#define KEY_9 10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_0 11
-#define KEY_MINUS 12
-#define KEY_EQUAL 13
-#define KEY_BACKSPACE 14
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_TAB 15
-#define KEY_Q 16
-#define KEY_W 17
-#define KEY_E 18
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_R 19
-#define KEY_T 20
-#define KEY_Y 21
-#define KEY_U 22
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_I 23
-#define KEY_O 24
-#define KEY_P 25
-#define KEY_LEFTBRACE 26
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_RIGHTBRACE 27
-#define KEY_ENTER 28
-#define KEY_LEFTCTRL 29
-#define KEY_A 30
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_S 31
-#define KEY_D 32
-#define KEY_F 33
-#define KEY_G 34
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_H 35
-#define KEY_J 36
-#define KEY_K 37
-#define KEY_L 38
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_SEMICOLON 39
-#define KEY_APOSTROPHE 40
-#define KEY_GRAVE 41
-#define KEY_LEFTSHIFT 42
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BACKSLASH 43
-#define KEY_Z 44
-#define KEY_X 45
-#define KEY_C 46
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_V 47
-#define KEY_B 48
-#define KEY_N 49
-#define KEY_M 50
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_COMMA 51
-#define KEY_DOT 52
-#define KEY_SLASH 53
-#define KEY_RIGHTSHIFT 54
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_KPASTERISK 55
-#define KEY_LEFTALT 56
-#define KEY_SPACE 57
-#define KEY_CAPSLOCK 58
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_F1 59
-#define KEY_F2 60
-#define KEY_F3 61
-#define KEY_F4 62
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_F5 63
-#define KEY_F6 64
-#define KEY_F7 65
-#define KEY_F8 66
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_F9 67
-#define KEY_F10 68
-#define KEY_NUMLOCK 69
-#define KEY_SCROLLLOCK 70
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_KP7 71
-#define KEY_KP8 72
-#define KEY_KP9 73
-#define KEY_KPMINUS 74
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_KP4 75
-#define KEY_KP5 76
-#define KEY_KP6 77
-#define KEY_KPPLUS 78
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_KP1 79
-#define KEY_KP2 80
-#define KEY_KP3 81
-#define KEY_KP0 82
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_KPDOT 83
-#define KEY_ZENKAKUHANKAKU 85
-#define KEY_102ND 86
-#define KEY_F11 87
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_F12 88
-#define KEY_RO 89
-#define KEY_KATAKANA 90
-#define KEY_HIRAGANA 91
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_HENKAN 92
-#define KEY_KATAKANAHIRAGANA 93
-#define KEY_MUHENKAN 94
-#define KEY_KPJPCOMMA 95
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_KPENTER 96
-#define KEY_RIGHTCTRL 97
-#define KEY_KPSLASH 98
-#define KEY_SYSRQ 99
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_RIGHTALT 100
-#define KEY_LINEFEED 101
-#define KEY_HOME 102
-#define KEY_UP 103
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_PAGEUP 104
-#define KEY_LEFT 105
-#define KEY_RIGHT 106
-#define KEY_END 107
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_DOWN 108
-#define KEY_PAGEDOWN 109
-#define KEY_INSERT 110
-#define KEY_DELETE 111
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_MACRO 112
-#define KEY_MUTE 113
-#define KEY_VOLUMEDOWN 114
-#define KEY_VOLUMEUP 115
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_POWER 116
-#define KEY_KPEQUAL 117
-#define KEY_KPPLUSMINUS 118
-#define KEY_PAUSE 119
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_SCALE 120
-#define KEY_KPCOMMA 121
-#define KEY_HANGEUL 122
-#define KEY_HANGUEL KEY_HANGEUL
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_HANJA 123
-#define KEY_YEN 124
-#define KEY_LEFTMETA 125
-#define KEY_RIGHTMETA 126
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_COMPOSE 127
-#define KEY_STOP 128
-#define KEY_AGAIN 129
-#define KEY_PROPS 130
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_UNDO 131
-#define KEY_FRONT 132
-#define KEY_COPY 133
-#define KEY_OPEN 134
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_PASTE 135
-#define KEY_FIND 136
-#define KEY_CUT 137
-#define KEY_HELP 138
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_MENU 139
-#define KEY_CALC 140
-#define KEY_SETUP 141
-#define KEY_SLEEP 142
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_WAKEUP 143
-#define KEY_FILE 144
-#define KEY_SENDFILE 145
-#define KEY_DELETEFILE 146
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_XFER 147
-#define KEY_PROG1 148
-#define KEY_PROG2 149
-#define KEY_WWW 150
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_MSDOS 151
-#define KEY_COFFEE 152
-#define KEY_SCREENLOCK KEY_COFFEE
-#define KEY_DIRECTION 153
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CYCLEWINDOWS 154
-#define KEY_MAIL 155
-#define KEY_BOOKMARKS 156
-#define KEY_COMPUTER 157
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BACK 158
-#define KEY_FORWARD 159
-#define KEY_CLOSECD 160
-#define KEY_EJECTCD 161
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_EJECTCLOSECD 162
-#define KEY_NEXTSONG 163
-#define KEY_PLAYPAUSE 164
-#define KEY_PREVIOUSSONG 165
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_STOPCD 166
-#define KEY_RECORD 167
-#define KEY_REWIND 168
-#define KEY_PHONE 169
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_ISO 170
-#define KEY_CONFIG 171
-#define KEY_HOMEPAGE 172
-#define KEY_REFRESH 173
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_EXIT 174
-#define KEY_MOVE 175
-#define KEY_EDIT 176
-#define KEY_SCROLLUP 177
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_SCROLLDOWN 178
-#define KEY_KPLEFTPAREN 179
-#define KEY_KPRIGHTPAREN 180
-#define KEY_NEW 181
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_REDO 182
-#define KEY_F13 183
-#define KEY_F14 184
-#define KEY_F15 185
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_F16 186
-#define KEY_F17 187
-#define KEY_F18 188
-#define KEY_F19 189
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_F20 190
-#define KEY_F21 191
-#define KEY_F22 192
-#define KEY_F23 193
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_F24 194
-#define KEY_PLAYCD 200
-#define KEY_PAUSECD 201
-#define KEY_PROG3 202
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_PROG4 203
-#define KEY_DASHBOARD 204
-#define KEY_SUSPEND 205
-#define KEY_CLOSE 206
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_PLAY 207
-#define KEY_FASTFORWARD 208
-#define KEY_BASSBOOST 209
-#define KEY_PRINT 210
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_HP 211
-#define KEY_CAMERA 212
-#define KEY_SOUND 213
-#define KEY_QUESTION 214
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_EMAIL 215
-#define KEY_CHAT 216
-#define KEY_SEARCH 217
-#define KEY_CONNECT 218
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_FINANCE 219
-#define KEY_SPORT 220
-#define KEY_SHOP 221
-#define KEY_ALTERASE 222
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CANCEL 223
-#define KEY_BRIGHTNESSDOWN 224
-#define KEY_BRIGHTNESSUP 225
-#define KEY_MEDIA 226
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_SWITCHVIDEOMODE 227
-#define KEY_KBDILLUMTOGGLE 228
-#define KEY_KBDILLUMDOWN 229
-#define KEY_KBDILLUMUP 230
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_SEND 231
-#define KEY_REPLY 232
-#define KEY_FORWARDMAIL 233
-#define KEY_SAVE 234
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_DOCUMENTS 235
-#define KEY_BATTERY 236
-#define KEY_BLUETOOTH 237
-#define KEY_WLAN 238
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_UWB 239
-#define KEY_UNKNOWN 240
-#define KEY_VIDEO_NEXT 241
-#define KEY_VIDEO_PREV 242
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BRIGHTNESS_CYCLE 243
-#define KEY_BRIGHTNESS_AUTO 244
-#define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO
-#define KEY_DISPLAY_OFF 245
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_WWAN 246
-#define KEY_WIMAX KEY_WWAN
-#define KEY_RFKILL 247
-#define KEY_MICMUTE 248
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_MISC 0x100
-#define BTN_0 0x100
-#define BTN_1 0x101
-#define BTN_2 0x102
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_3 0x103
-#define BTN_4 0x104
-#define BTN_5 0x105
-#define BTN_6 0x106
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_7 0x107
-#define BTN_8 0x108
-#define BTN_9 0x109
-#define BTN_MOUSE 0x110
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_LEFT 0x110
-#define BTN_RIGHT 0x111
-#define BTN_MIDDLE 0x112
-#define BTN_SIDE 0x113
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_EXTRA 0x114
-#define BTN_FORWARD 0x115
-#define BTN_BACK 0x116
-#define BTN_TASK 0x117
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_JOYSTICK 0x120
-#define BTN_TRIGGER 0x120
-#define BTN_THUMB 0x121
-#define BTN_THUMB2 0x122
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TOP 0x123
-#define BTN_TOP2 0x124
-#define BTN_PINKIE 0x125
-#define BTN_BASE 0x126
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_BASE2 0x127
-#define BTN_BASE3 0x128
-#define BTN_BASE4 0x129
-#define BTN_BASE5 0x12a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_BASE6 0x12b
-#define BTN_DEAD 0x12f
-#define BTN_GAMEPAD 0x130
-#define BTN_SOUTH 0x130
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_A BTN_SOUTH
-#define BTN_EAST 0x131
-#define BTN_B BTN_EAST
-#define BTN_C 0x132
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_NORTH 0x133
-#define BTN_X BTN_NORTH
-#define BTN_WEST 0x134
-#define BTN_Y BTN_WEST
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_Z 0x135
-#define BTN_TL 0x136
-#define BTN_TR 0x137
-#define BTN_TL2 0x138
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TR2 0x139
-#define BTN_SELECT 0x13a
-#define BTN_START 0x13b
-#define BTN_MODE 0x13c
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_THUMBL 0x13d
-#define BTN_THUMBR 0x13e
-#define BTN_DIGI 0x140
-#define BTN_TOOL_PEN 0x140
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TOOL_RUBBER 0x141
-#define BTN_TOOL_BRUSH 0x142
-#define BTN_TOOL_PENCIL 0x143
-#define BTN_TOOL_AIRBRUSH 0x144
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TOOL_FINGER 0x145
-#define BTN_TOOL_MOUSE 0x146
-#define BTN_TOOL_LENS 0x147
-#define BTN_TOOL_QUINTTAP 0x148
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TOUCH 0x14a
-#define BTN_STYLUS 0x14b
-#define BTN_STYLUS2 0x14c
-#define BTN_TOOL_DOUBLETAP 0x14d
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TOOL_TRIPLETAP 0x14e
-#define BTN_TOOL_QUADTAP 0x14f
-#define BTN_WHEEL 0x150
-#define BTN_GEAR_DOWN 0x150
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_GEAR_UP 0x151
-#define KEY_OK 0x160
-#define KEY_SELECT 0x161
-#define KEY_GOTO 0x162
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CLEAR 0x163
-#define KEY_POWER2 0x164
-#define KEY_OPTION 0x165
-#define KEY_INFO 0x166
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_TIME 0x167
-#define KEY_VENDOR 0x168
-#define KEY_ARCHIVE 0x169
-#define KEY_PROGRAM 0x16a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CHANNEL 0x16b
-#define KEY_FAVORITES 0x16c
-#define KEY_EPG 0x16d
-#define KEY_PVR 0x16e
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_MHP 0x16f
-#define KEY_LANGUAGE 0x170
-#define KEY_TITLE 0x171
-#define KEY_SUBTITLE 0x172
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_ANGLE 0x173
-#define KEY_ZOOM 0x174
-#define KEY_MODE 0x175
-#define KEY_KEYBOARD 0x176
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_SCREEN 0x177
-#define KEY_PC 0x178
-#define KEY_TV 0x179
-#define KEY_TV2 0x17a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_VCR 0x17b
-#define KEY_VCR2 0x17c
-#define KEY_SAT 0x17d
-#define KEY_SAT2 0x17e
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CD 0x17f
-#define KEY_TAPE 0x180
-#define KEY_RADIO 0x181
-#define KEY_TUNER 0x182
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_PLAYER 0x183
-#define KEY_TEXT 0x184
-#define KEY_DVD 0x185
-#define KEY_AUX 0x186
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_MP3 0x187
-#define KEY_AUDIO 0x188
-#define KEY_VIDEO 0x189
-#define KEY_DIRECTORY 0x18a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_LIST 0x18b
-#define KEY_MEMO 0x18c
-#define KEY_CALENDAR 0x18d
-#define KEY_RED 0x18e
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_GREEN 0x18f
-#define KEY_YELLOW 0x190
-#define KEY_BLUE 0x191
-#define KEY_CHANNELUP 0x192
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CHANNELDOWN 0x193
-#define KEY_FIRST 0x194
-#define KEY_LAST 0x195
-#define KEY_AB 0x196
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_NEXT 0x197
-#define KEY_RESTART 0x198
-#define KEY_SLOW 0x199
-#define KEY_SHUFFLE 0x19a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BREAK 0x19b
-#define KEY_PREVIOUS 0x19c
-#define KEY_DIGITS 0x19d
-#define KEY_TEEN 0x19e
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_TWEN 0x19f
-#define KEY_VIDEOPHONE 0x1a0
-#define KEY_GAMES 0x1a1
-#define KEY_ZOOMIN 0x1a2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_ZOOMOUT 0x1a3
-#define KEY_ZOOMRESET 0x1a4
-#define KEY_WORDPROCESSOR 0x1a5
-#define KEY_EDITOR 0x1a6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_SPREADSHEET 0x1a7
-#define KEY_GRAPHICSEDITOR 0x1a8
-#define KEY_PRESENTATION 0x1a9
-#define KEY_DATABASE 0x1aa
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_NEWS 0x1ab
-#define KEY_VOICEMAIL 0x1ac
-#define KEY_ADDRESSBOOK 0x1ad
-#define KEY_MESSENGER 0x1ae
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_DISPLAYTOGGLE 0x1af
-#define KEY_BRIGHTNESS_TOGGLE KEY_DISPLAYTOGGLE
-#define KEY_SPELLCHECK 0x1b0
-#define KEY_LOGOFF 0x1b1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_DOLLAR 0x1b2
-#define KEY_EURO 0x1b3
-#define KEY_FRAMEBACK 0x1b4
-#define KEY_FRAMEFORWARD 0x1b5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CONTEXT_MENU 0x1b6
-#define KEY_MEDIA_REPEAT 0x1b7
-#define KEY_10CHANNELSUP 0x1b8
-#define KEY_10CHANNELSDOWN 0x1b9
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_IMAGES 0x1ba
-#define KEY_DEL_EOL 0x1c0
-#define KEY_DEL_EOS 0x1c1
-#define KEY_INS_LINE 0x1c2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_DEL_LINE 0x1c3
-#define KEY_FN 0x1d0
-#define KEY_FN_ESC 0x1d1
-#define KEY_FN_F1 0x1d2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_FN_F2 0x1d3
-#define KEY_FN_F3 0x1d4
-#define KEY_FN_F4 0x1d5
-#define KEY_FN_F5 0x1d6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_FN_F6 0x1d7
-#define KEY_FN_F7 0x1d8
-#define KEY_FN_F8 0x1d9
-#define KEY_FN_F9 0x1da
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_FN_F10 0x1db
-#define KEY_FN_F11 0x1dc
-#define KEY_FN_F12 0x1dd
-#define KEY_FN_1 0x1de
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_FN_2 0x1df
-#define KEY_FN_D 0x1e0
-#define KEY_FN_E 0x1e1
-#define KEY_FN_F 0x1e2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_FN_S 0x1e3
-#define KEY_FN_B 0x1e4
-#define KEY_BRL_DOT1 0x1f1
-#define KEY_BRL_DOT2 0x1f2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BRL_DOT3 0x1f3
-#define KEY_BRL_DOT4 0x1f4
-#define KEY_BRL_DOT5 0x1f5
-#define KEY_BRL_DOT6 0x1f6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BRL_DOT7 0x1f7
-#define KEY_BRL_DOT8 0x1f8
-#define KEY_BRL_DOT9 0x1f9
-#define KEY_BRL_DOT10 0x1fa
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_NUMERIC_0 0x200
-#define KEY_NUMERIC_1 0x201
-#define KEY_NUMERIC_2 0x202
-#define KEY_NUMERIC_3 0x203
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_NUMERIC_4 0x204
-#define KEY_NUMERIC_5 0x205
-#define KEY_NUMERIC_6 0x206
-#define KEY_NUMERIC_7 0x207
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_NUMERIC_8 0x208
-#define KEY_NUMERIC_9 0x209
-#define KEY_NUMERIC_STAR 0x20a
-#define KEY_NUMERIC_POUND 0x20b
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CAMERA_FOCUS 0x210
-#define KEY_WPS_BUTTON 0x211
-#define KEY_TOUCHPAD_TOGGLE 0x212
-#define KEY_TOUCHPAD_ON 0x213
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_TOUCHPAD_OFF 0x214
-#define KEY_CAMERA_ZOOMIN 0x215
-#define KEY_CAMERA_ZOOMOUT 0x216
-#define KEY_CAMERA_UP 0x217
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_CAMERA_DOWN 0x218
-#define KEY_CAMERA_LEFT 0x219
-#define KEY_CAMERA_RIGHT 0x21a
-#define KEY_ATTENDANT_ON 0x21b
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_ATTENDANT_OFF 0x21c
-#define KEY_ATTENDANT_TOGGLE 0x21d
-#define KEY_LIGHTS_TOGGLE 0x21e
-#define BTN_DPAD_UP 0x220
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_DPAD_DOWN 0x221
-#define BTN_DPAD_LEFT 0x222
-#define BTN_DPAD_RIGHT 0x223
-#define KEY_ALS_TOGGLE 0x230
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BUTTONCONFIG 0x240
-#define KEY_TASKMANAGER 0x241
-#define KEY_JOURNAL 0x242
-#define KEY_CONTROLPANEL 0x243
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_APPSELECT 0x244
-#define KEY_SCREENSAVER 0x245
-#define KEY_VOICECOMMAND 0x246
-#define KEY_BRIGHTNESS_MIN 0x250
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_BRIGHTNESS_MAX 0x251
-#define KEY_KBDINPUTASSIST_PREV 0x260
-#define KEY_KBDINPUTASSIST_NEXT 0x261
-#define KEY_KBDINPUTASSIST_PREVGROUP 0x262
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_KBDINPUTASSIST_NEXTGROUP 0x263
-#define KEY_KBDINPUTASSIST_ACCEPT 0x264
-#define KEY_KBDINPUTASSIST_CANCEL 0x265
-#define BTN_TRIGGER_HAPPY 0x2c0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY1 0x2c0
-#define BTN_TRIGGER_HAPPY2 0x2c1
-#define BTN_TRIGGER_HAPPY3 0x2c2
-#define BTN_TRIGGER_HAPPY4 0x2c3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY5 0x2c4
-#define BTN_TRIGGER_HAPPY6 0x2c5
-#define BTN_TRIGGER_HAPPY7 0x2c6
-#define BTN_TRIGGER_HAPPY8 0x2c7
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY9 0x2c8
-#define BTN_TRIGGER_HAPPY10 0x2c9
-#define BTN_TRIGGER_HAPPY11 0x2ca
-#define BTN_TRIGGER_HAPPY12 0x2cb
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY13 0x2cc
-#define BTN_TRIGGER_HAPPY14 0x2cd
-#define BTN_TRIGGER_HAPPY15 0x2ce
-#define BTN_TRIGGER_HAPPY16 0x2cf
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY17 0x2d0
-#define BTN_TRIGGER_HAPPY18 0x2d1
-#define BTN_TRIGGER_HAPPY19 0x2d2
-#define BTN_TRIGGER_HAPPY20 0x2d3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY21 0x2d4
-#define BTN_TRIGGER_HAPPY22 0x2d5
-#define BTN_TRIGGER_HAPPY23 0x2d6
-#define BTN_TRIGGER_HAPPY24 0x2d7
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY25 0x2d8
-#define BTN_TRIGGER_HAPPY26 0x2d9
-#define BTN_TRIGGER_HAPPY27 0x2da
-#define BTN_TRIGGER_HAPPY28 0x2db
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY29 0x2dc
-#define BTN_TRIGGER_HAPPY30 0x2dd
-#define BTN_TRIGGER_HAPPY31 0x2de
-#define BTN_TRIGGER_HAPPY32 0x2df
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY33 0x2e0
-#define BTN_TRIGGER_HAPPY34 0x2e1
-#define BTN_TRIGGER_HAPPY35 0x2e2
-#define BTN_TRIGGER_HAPPY36 0x2e3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define BTN_TRIGGER_HAPPY37 0x2e4
-#define BTN_TRIGGER_HAPPY38 0x2e5
-#define BTN_TRIGGER_HAPPY39 0x2e6
-#define BTN_TRIGGER_HAPPY40 0x2e7
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KEY_MIN_INTERESTING KEY_MUTE
-#define KEY_MAX 0x2ff
-#define KEY_CNT (KEY_MAX + 1)
-#define REL_X 0x00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define REL_Y 0x01
-#define REL_Z 0x02
-#define REL_RX 0x03
-#define REL_RY 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define REL_RZ 0x05
-#define REL_HWHEEL 0x06
-#define REL_DIAL 0x07
-#define REL_WHEEL 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define REL_MISC 0x09
-#define REL_MAX 0x0f
-#define REL_CNT (REL_MAX + 1)
-#define ABS_X 0x00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_Y 0x01
-#define ABS_Z 0x02
-#define ABS_RX 0x03
-#define ABS_RY 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_RZ 0x05
-#define ABS_THROTTLE 0x06
-#define ABS_RUDDER 0x07
-#define ABS_WHEEL 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_GAS 0x09
-#define ABS_BRAKE 0x0a
-#define ABS_HAT0X 0x10
-#define ABS_HAT0Y 0x11
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_HAT1X 0x12
-#define ABS_HAT1Y 0x13
-#define ABS_HAT2X 0x14
-#define ABS_HAT2Y 0x15
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_HAT3X 0x16
-#define ABS_HAT3Y 0x17
-#define ABS_PRESSURE 0x18
-#define ABS_DISTANCE 0x19
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_TILT_X 0x1a
-#define ABS_TILT_Y 0x1b
-#define ABS_TOOL_WIDTH 0x1c
-#define ABS_VOLUME 0x20
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_MISC 0x28
-#define ABS_MT_SLOT 0x2f
-#define ABS_MT_TOUCH_MAJOR 0x30
-#define ABS_MT_TOUCH_MINOR 0x31
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_MT_WIDTH_MAJOR 0x32
-#define ABS_MT_WIDTH_MINOR 0x33
-#define ABS_MT_ORIENTATION 0x34
-#define ABS_MT_POSITION_X 0x35
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_MT_POSITION_Y 0x36
-#define ABS_MT_TOOL_TYPE 0x37
-#define ABS_MT_BLOB_ID 0x38
-#define ABS_MT_TRACKING_ID 0x39
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_MT_PRESSURE 0x3a
-#define ABS_MT_DISTANCE 0x3b
-#define ABS_MT_TOOL_X 0x3c
-#define ABS_MT_TOOL_Y 0x3d
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define ABS_MAX 0x3f
-#define ABS_CNT (ABS_MAX + 1)
-#define SW_LID 0x00
-#define SW_TABLET_MODE 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SW_HEADPHONE_INSERT 0x02
-#define SW_RFKILL_ALL 0x03
-#define SW_RADIO SW_RFKILL_ALL
-#define SW_MICROPHONE_INSERT 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SW_DOCK 0x05
-#define SW_LINEOUT_INSERT 0x06
-#define SW_JACK_PHYSICAL_INSERT 0x07
-#define SW_VIDEOOUT_INSERT 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SW_CAMERA_LENS_COVER 0x09
-#define SW_KEYPAD_SLIDE 0x0a
-#define SW_FRONT_PROXIMITY 0x0b
-#define SW_ROTATE_LOCK 0x0c
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SW_LINEIN_INSERT 0x0d
-#define SW_MUTE_DEVICE 0x0e
-#define SW_MAX 0x0f
-#define SW_CNT (SW_MAX + 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define MSC_SERIAL 0x00
-#define MSC_PULSELED 0x01
-#define MSC_GESTURE 0x02
-#define MSC_RAW 0x03
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define MSC_SCAN 0x04
-#define MSC_TIMESTAMP 0x05
-#define MSC_MAX 0x07
-#define MSC_CNT (MSC_MAX + 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define LED_NUML 0x00
-#define LED_CAPSL 0x01
-#define LED_SCROLLL 0x02
-#define LED_COMPOSE 0x03
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define LED_KANA 0x04
-#define LED_SLEEP 0x05
-#define LED_SUSPEND 0x06
-#define LED_MUTE 0x07
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define LED_MISC 0x08
-#define LED_MAIL 0x09
-#define LED_CHARGING 0x0a
-#define LED_MAX 0x0f
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define LED_CNT (LED_MAX + 1)
-#define REP_DELAY 0x00
-#define REP_PERIOD 0x01
-#define REP_MAX 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define REP_CNT (REP_MAX + 1)
-#define SND_CLICK 0x00
-#define SND_BELL 0x01
-#define SND_TONE 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SND_MAX 0x07
-#define SND_CNT (SND_MAX + 1)
#define ID_BUS 0
#define ID_VENDOR 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ID_PRODUCT 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ID_VERSION 3
#define BUS_PCI 0x01
#define BUS_ISAPNP 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_USB 0x03
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_HIL 0x04
#define BUS_BLUETOOTH 0x05
#define BUS_VIRTUAL 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_ISA 0x10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_I8042 0x11
#define BUS_XTKBD 0x12
#define BUS_RS232 0x13
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_GAMEPORT 0x14
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_PARPORT 0x15
#define BUS_AMIGA 0x16
#define BUS_ADB 0x17
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_I2C 0x18
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_HOST 0x19
#define BUS_GSC 0x1A
#define BUS_ATARI 0x1B
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BUS_SPI 0x1C
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MT_TOOL_FINGER 0
#define MT_TOOL_PEN 1
-#define MT_TOOL_MAX 1
+#define MT_TOOL_PALM 2
+#define MT_TOOL_MAX 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FF_STATUS_STOPPED 0x00
#define FF_STATUS_PLAYING 0x01
@@ -1063,7 +238,8 @@ struct ff_effect {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FF_GAIN 0x60
#define FF_AUTOCENTER 0x61
+#define FF_MAX_EFFECTS FF_GAIN
#define FF_MAX 0x7f
-#define FF_CNT (FF_MAX + 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FF_CNT (FF_MAX + 1)
#endif
diff --git a/libc/kernel/uapi/linux/ip.h b/libc/kernel/uapi/linux/ip.h
index 8567d2499..a56f1d652 100644
--- a/libc/kernel/uapi/linux/ip.h
+++ b/libc/kernel/uapi/linux/ip.h
@@ -173,8 +173,9 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL,
IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL,
+ IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
__IPV4_DEVCONF_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define IPV4_DEVCONF_MAX (__IPV4_DEVCONF_MAX - 1)
#endif
diff --git a/libc/kernel/uapi/linux/ip_vs.h b/libc/kernel/uapi/linux/ip_vs.h
index 2274c4da5..29718616f 100644
--- a/libc/kernel/uapi/linux/ip_vs.h
+++ b/libc/kernel/uapi/linux/ip_vs.h
@@ -268,66 +268,74 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_SVC_ATTR_STATS,
IPVS_SVC_ATTR_PE_NAME,
+ IPVS_SVC_ATTR_STATS64,
__IPVS_SVC_ATTR_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define IPVS_SVC_ATTR_MAX (__IPVS_SVC_ATTR_MAX - 1)
enum {
IPVS_DEST_ATTR_UNSPEC = 0,
- IPVS_DEST_ATTR_ADDR,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IPVS_DEST_ATTR_ADDR,
IPVS_DEST_ATTR_PORT,
IPVS_DEST_ATTR_FWD_METHOD,
IPVS_DEST_ATTR_WEIGHT,
- IPVS_DEST_ATTR_U_THRESH,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IPVS_DEST_ATTR_U_THRESH,
IPVS_DEST_ATTR_L_THRESH,
IPVS_DEST_ATTR_ACTIVE_CONNS,
IPVS_DEST_ATTR_INACT_CONNS,
- IPVS_DEST_ATTR_PERSIST_CONNS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IPVS_DEST_ATTR_PERSIST_CONNS,
IPVS_DEST_ATTR_STATS,
IPVS_DEST_ATTR_ADDR_FAMILY,
+ IPVS_DEST_ATTR_STATS64,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IPVS_DEST_ATTR_MAX,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPVS_DEST_ATTR_MAX (__IPVS_DEST_ATTR_MAX - 1)
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_DAEMON_ATTR_UNSPEC = 0,
IPVS_DAEMON_ATTR_STATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_DAEMON_ATTR_MCAST_IFN,
IPVS_DAEMON_ATTR_SYNC_ID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IPVS_DAEMON_ATTR_SYNC_MAXLEN,
+ IPVS_DAEMON_ATTR_MCAST_GROUP,
+ IPVS_DAEMON_ATTR_MCAST_GROUP6,
+ IPVS_DAEMON_ATTR_MCAST_PORT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IPVS_DAEMON_ATTR_MCAST_TTL,
__IPVS_DAEMON_ATTR_MAX,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IPVS_DAEMON_ATTR_MAX (__IPVS_DAEMON_ATTR_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
IPVS_STATS_ATTR_UNSPEC = 0,
IPVS_STATS_ATTR_CONNS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_STATS_ATTR_INPKTS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_STATS_ATTR_OUTPKTS,
IPVS_STATS_ATTR_INBYTES,
IPVS_STATS_ATTR_OUTBYTES,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_STATS_ATTR_CPS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_STATS_ATTR_INPPS,
IPVS_STATS_ATTR_OUTPPS,
IPVS_STATS_ATTR_INBPS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_STATS_ATTR_OUTBPS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IPVS_STATS_ATTR_MAX,
};
#define IPVS_STATS_ATTR_MAX (__IPVS_STATS_ATTR_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IPVS_INFO_ATTR_UNSPEC = 0,
IPVS_INFO_ATTR_VERSION,
IPVS_INFO_ATTR_CONN_TAB_SIZE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__IPVS_INFO_ATTR_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define IPVS_INFO_ATTR_MAX (__IPVS_INFO_ATTR_MAX - 1)
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/ipv6.h b/libc/kernel/uapi/linux/ipv6.h
index 3425f5add..24d574375 100644
--- a/libc/kernel/uapi/linux/ipv6.h
+++ b/libc/kernel/uapi/linux/ipv6.h
@@ -18,132 +18,146 @@
****************************************************************************/
#ifndef _UAPI_IPV6_H
#define _UAPI_IPV6_H
+#include <linux/libc-compat.h>
#include <linux/types.h>
-#include <linux/in6.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <linux/in6.h>
#include <asm/byteorder.h>
#define IPV6_MIN_MTU 1280
+#if __UAPI_DEF_IN6_PKTINFO
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct in6_pktinfo {
struct in6_addr ipi6_addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int ipi6_ifindex;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
+#if __UAPI_DEF_IP6_MTUINFO
struct ip6_mtuinfo {
struct sockaddr_in6 ip6m_addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ip6m_mtu;
};
+#endif
struct in6_ifreq {
- struct in6_addr ifr6_addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct in6_addr ifr6_addr;
__u32 ifr6_prefixlen;
int ifr6_ifindex;
};
-#define IPV6_SRCRT_STRICT 0x01
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IPV6_SRCRT_STRICT 0x01
#define IPV6_SRCRT_TYPE_0 0
#define IPV6_SRCRT_TYPE_2 2
struct ipv6_rt_hdr {
- __u8 nexthdr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 nexthdr;
__u8 hdrlen;
__u8 type;
__u8 segments_left;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ipv6_opt_hdr {
__u8 nexthdr;
__u8 hdrlen;
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
#define ipv6_destopt_hdr ipv6_opt_hdr
#define ipv6_hopopt_hdr ipv6_opt_hdr
#define IPV6_OPT_ROUTERALERT_MLD 0x0000
-struct rt0_hdr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct rt0_hdr {
struct ipv6_rt_hdr rt_hdr;
__u32 reserved;
struct in6_addr addr[0];
-#define rt0_type rt_hdr.type
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define rt0_type rt_hdr.type
};
struct rt2_hdr {
struct ipv6_rt_hdr rt_hdr;
- __u32 reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
struct in6_addr addr;
#define rt2_type rt_hdr.type
};
-struct ipv6_destopt_hao {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ipv6_destopt_hao {
__u8 type;
__u8 length;
struct in6_addr addr;
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
struct ipv6hdr {
#ifdef __LITTLE_ENDIAN_BITFIELD
__u8 priority : 4, version : 4;
-#elif defined(__BIG_ENDIAN_BITFIELD)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#elif defined(__BIG_ENDIAN_BITFIELD)
__u8 version : 4, priority : 4;
#else
#error "Please fix <asm/byteorder.h>"
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
__u8 flow_lbl[3];
__be16 payload_len;
__u8 nexthdr;
- __u8 hop_limit;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 hop_limit;
struct in6_addr saddr;
struct in6_addr daddr;
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
DEVCONF_FORWARDING = 0,
DEVCONF_HOPLIMIT,
DEVCONF_MTU6,
- DEVCONF_ACCEPT_RA,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_ACCEPT_RA,
DEVCONF_ACCEPT_REDIRECTS,
DEVCONF_AUTOCONF,
DEVCONF_DAD_TRANSMITS,
- DEVCONF_RTR_SOLICITS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_RTR_SOLICITS,
DEVCONF_RTR_SOLICIT_INTERVAL,
DEVCONF_RTR_SOLICIT_DELAY,
DEVCONF_USE_TEMPADDR,
- DEVCONF_TEMP_VALID_LFT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_TEMP_VALID_LFT,
DEVCONF_TEMP_PREFERED_LFT,
DEVCONF_REGEN_MAX_RETRY,
DEVCONF_MAX_DESYNC_FACTOR,
- DEVCONF_MAX_ADDRESSES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_MAX_ADDRESSES,
DEVCONF_FORCE_MLD_VERSION,
DEVCONF_ACCEPT_RA_DEFRTR,
DEVCONF_ACCEPT_RA_PINFO,
- DEVCONF_ACCEPT_RA_RTR_PREF,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_ACCEPT_RA_RTR_PREF,
DEVCONF_RTR_PROBE_INTERVAL,
DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN,
DEVCONF_PROXY_NDP,
- DEVCONF_OPTIMISTIC_DAD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_OPTIMISTIC_DAD,
DEVCONF_ACCEPT_SOURCE_ROUTE,
DEVCONF_MC_FORWARDING,
DEVCONF_DISABLE_IPV6,
- DEVCONF_ACCEPT_DAD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_ACCEPT_DAD,
DEVCONF_FORCE_TLLAO,
DEVCONF_NDISC_NOTIFY,
DEVCONF_MLDV1_UNSOLICITED_REPORT_INTERVAL,
- DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_MLDV2_UNSOLICITED_REPORT_INTERVAL,
DEVCONF_SUPPRESS_FRAG_NDISC,
DEVCONF_ACCEPT_RA_FROM_LOCAL,
+ DEVCONF_USE_OPTIMISTIC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_ACCEPT_RA_MTU,
+ DEVCONF_STABLE_SECRET,
+ DEVCONF_USE_OIF_ADDRS_ONLY,
+ DEVCONF_ACCEPT_RA_MIN_HOP_LIMIT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN,
DEVCONF_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/ipv6_route.h b/libc/kernel/uapi/linux/ipv6_route.h
index ff7498624..776ad72dc 100644
--- a/libc/kernel/uapi/linux/ipv6_route.h
+++ b/libc/kernel/uapi/linux/ipv6_route.h
@@ -36,28 +36,29 @@
#define RTF_PREF(pref) ((pref) << 27)
#define RTF_PREF_MASK 0x18000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTF_PCPU 0x40000000
#define RTF_LOCAL 0x80000000
struct in6_rtmsg {
struct in6_addr rtmsg_dst;
- struct in6_addr rtmsg_src;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct in6_addr rtmsg_src;
struct in6_addr rtmsg_gateway;
__u32 rtmsg_type;
__u16 rtmsg_dst_len;
- __u16 rtmsg_src_len;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 rtmsg_src_len;
__u32 rtmsg_metric;
unsigned long rtmsg_info;
__u32 rtmsg_flags;
- int rtmsg_ifindex;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int rtmsg_ifindex;
};
#define RTMSG_NEWDEVICE 0x11
#define RTMSG_DELDEVICE 0x12
-#define RTMSG_NEWROUTE 0x21
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTMSG_NEWROUTE 0x21
#define RTMSG_DELROUTE 0x22
#define IP6_RT_PRIO_USER 1024
#define IP6_RT_PRIO_ADDRCONF 256
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/kcmp.h b/libc/kernel/uapi/linux/kcmp.h
new file mode 100644
index 000000000..593705683
--- /dev/null
+++ b/libc/kernel/uapi/linux/kcmp.h
@@ -0,0 +1,34 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_KCMP_H
+#define _UAPI_LINUX_KCMP_H
+enum kcmp_type {
+ KCMP_FILE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ KCMP_VM,
+ KCMP_FILES,
+ KCMP_FS,
+ KCMP_SIGHAND,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ KCMP_IO,
+ KCMP_SYSVSEM,
+ KCMP_TYPES,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/kernel-page-flags.h b/libc/kernel/uapi/linux/kernel-page-flags.h
index ce30be7f7..7e34fe4c5 100644
--- a/libc/kernel/uapi/linux/kernel-page-flags.h
+++ b/libc/kernel/uapi/linux/kernel-page-flags.h
@@ -48,4 +48,7 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KPF_THP 22
#define KPF_BALLOON 23
+#define KPF_ZERO_PAGE 24
+#define KPF_IDLE 25
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/kfd_ioctl.h b/libc/kernel/uapi/linux/kfd_ioctl.h
new file mode 100644
index 000000000..f0d8a3d30
--- /dev/null
+++ b/libc/kernel/uapi/linux/kfd_ioctl.h
@@ -0,0 +1,245 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef KFD_IOCTL_H_INCLUDED
+#define KFD_IOCTL_H_INCLUDED
+#include <linux/types.h>
+#include <linux/ioctl.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KFD_IOCTL_MAJOR_VERSION 1
+#define KFD_IOCTL_MINOR_VERSION 1
+struct kfd_ioctl_get_version_args {
+ uint32_t major_version;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t minor_version;
+};
+#define KFD_IOC_QUEUE_TYPE_COMPUTE 0
+#define KFD_IOC_QUEUE_TYPE_SDMA 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KFD_IOC_QUEUE_TYPE_COMPUTE_AQL 2
+#define KFD_MAX_QUEUE_PERCENTAGE 100
+#define KFD_MAX_QUEUE_PRIORITY 15
+struct kfd_ioctl_create_queue_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t ring_base_address;
+ uint64_t write_pointer_address;
+ uint64_t read_pointer_address;
+ uint64_t doorbell_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t ring_size;
+ uint32_t gpu_id;
+ uint32_t queue_type;
+ uint32_t queue_percentage;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t queue_priority;
+ uint32_t queue_id;
+ uint64_t eop_buffer_address;
+ uint64_t eop_buffer_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t ctx_save_restore_address;
+ uint64_t ctx_save_restore_size;
+};
+struct kfd_ioctl_destroy_queue_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t queue_id;
+ uint32_t pad;
+};
+struct kfd_ioctl_update_queue_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t ring_base_address;
+ uint32_t queue_id;
+ uint32_t ring_size;
+ uint32_t queue_percentage;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t queue_priority;
+};
+#define KFD_IOC_CACHE_POLICY_COHERENT 0
+#define KFD_IOC_CACHE_POLICY_NONCOHERENT 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kfd_ioctl_set_memory_policy_args {
+ uint64_t alternate_aperture_base;
+ uint64_t alternate_aperture_size;
+ uint32_t gpu_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t default_policy;
+ uint32_t alternate_policy;
+ uint32_t pad;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kfd_ioctl_get_clock_counters_args {
+ uint64_t gpu_clock_counter;
+ uint64_t cpu_clock_counter;
+ uint64_t system_clock_counter;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t system_clock_freq;
+ uint32_t gpu_id;
+ uint32_t pad;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NUM_OF_SUPPORTED_GPUS 7
+struct kfd_process_device_apertures {
+ uint64_t lds_base;
+ uint64_t lds_limit;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t scratch_base;
+ uint64_t scratch_limit;
+ uint64_t gpuvm_base;
+ uint64_t gpuvm_limit;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t gpu_id;
+ uint32_t pad;
+};
+struct kfd_ioctl_get_process_apertures_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct kfd_process_device_apertures process_apertures[NUM_OF_SUPPORTED_GPUS];
+ uint32_t num_of_nodes;
+ uint32_t pad;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MAX_ALLOWED_NUM_POINTS 100
+#define MAX_ALLOWED_AW_BUFF_SIZE 4096
+#define MAX_ALLOWED_WAC_BUFF_SIZE 128
+struct kfd_ioctl_dbg_register_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t gpu_id;
+ uint32_t pad;
+};
+struct kfd_ioctl_dbg_unregister_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t gpu_id;
+ uint32_t pad;
+};
+struct kfd_ioctl_dbg_address_watch_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t content_ptr;
+ uint32_t gpu_id;
+ uint32_t buf_size_in_bytes;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kfd_ioctl_dbg_wave_control_args {
+ uint64_t content_ptr;
+ uint32_t gpu_id;
+ uint32_t buf_size_in_bytes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define KFD_IOC_EVENT_SIGNAL 0
+#define KFD_IOC_EVENT_NODECHANGE 1
+#define KFD_IOC_EVENT_DEVICESTATECHANGE 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KFD_IOC_EVENT_HW_EXCEPTION 3
+#define KFD_IOC_EVENT_SYSTEM_EVENT 4
+#define KFD_IOC_EVENT_DEBUG_EVENT 5
+#define KFD_IOC_EVENT_PROFILE_EVENT 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KFD_IOC_EVENT_QUEUE_EVENT 7
+#define KFD_IOC_EVENT_MEMORY 8
+#define KFD_IOC_WAIT_RESULT_COMPLETE 0
+#define KFD_IOC_WAIT_RESULT_TIMEOUT 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KFD_IOC_WAIT_RESULT_FAIL 2
+#define KFD_SIGNAL_EVENT_LIMIT 256
+struct kfd_ioctl_create_event_args {
+ uint64_t event_page_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t event_trigger_data;
+ uint32_t event_type;
+ uint32_t auto_reset;
+ uint32_t node_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t event_id;
+ uint32_t event_slot_index;
+};
+struct kfd_ioctl_destroy_event_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t event_id;
+ uint32_t pad;
+};
+struct kfd_ioctl_set_event_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t event_id;
+ uint32_t pad;
+};
+struct kfd_ioctl_reset_event_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t event_id;
+ uint32_t pad;
+};
+struct kfd_memory_exception_failure {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t NotPresent;
+ uint32_t ReadOnly;
+ uint32_t NoExecute;
+ uint32_t pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct kfd_hsa_memory_exception_data {
+ struct kfd_memory_exception_failure failure;
+ uint64_t va;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t gpu_id;
+ uint32_t pad;
+};
+struct kfd_event_data {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
+ struct kfd_hsa_memory_exception_data memory_exception_data;
+ };
+ uint64_t kfd_event_data_ext;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t event_id;
+ uint32_t pad;
+};
+struct kfd_ioctl_wait_events_args {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t events_ptr;
+ uint32_t num_events;
+ uint32_t wait_for_all;
+ uint32_t timeout;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t wait_result;
+};
+#define AMDKFD_IOCTL_BASE 'K'
+#define AMDKFD_IO(nr) _IO(AMDKFD_IOCTL_BASE, nr)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDKFD_IOR(nr,type) _IOR(AMDKFD_IOCTL_BASE, nr, type)
+#define AMDKFD_IOW(nr,type) _IOW(AMDKFD_IOCTL_BASE, nr, type)
+#define AMDKFD_IOWR(nr,type) _IOWR(AMDKFD_IOCTL_BASE, nr, type)
+#define AMDKFD_IOC_GET_VERSION AMDKFD_IOR(0x01, struct kfd_ioctl_get_version_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDKFD_IOC_CREATE_QUEUE AMDKFD_IOWR(0x02, struct kfd_ioctl_create_queue_args)
+#define AMDKFD_IOC_DESTROY_QUEUE AMDKFD_IOWR(0x03, struct kfd_ioctl_destroy_queue_args)
+#define AMDKFD_IOC_SET_MEMORY_POLICY AMDKFD_IOW(0x04, struct kfd_ioctl_set_memory_policy_args)
+#define AMDKFD_IOC_GET_CLOCK_COUNTERS AMDKFD_IOWR(0x05, struct kfd_ioctl_get_clock_counters_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDKFD_IOC_GET_PROCESS_APERTURES AMDKFD_IOR(0x06, struct kfd_ioctl_get_process_apertures_args)
+#define AMDKFD_IOC_UPDATE_QUEUE AMDKFD_IOW(0x07, struct kfd_ioctl_update_queue_args)
+#define AMDKFD_IOC_CREATE_EVENT AMDKFD_IOWR(0x08, struct kfd_ioctl_create_event_args)
+#define AMDKFD_IOC_DESTROY_EVENT AMDKFD_IOW(0x09, struct kfd_ioctl_destroy_event_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDKFD_IOC_SET_EVENT AMDKFD_IOW(0x0A, struct kfd_ioctl_set_event_args)
+#define AMDKFD_IOC_RESET_EVENT AMDKFD_IOW(0x0B, struct kfd_ioctl_reset_event_args)
+#define AMDKFD_IOC_WAIT_EVENTS AMDKFD_IOWR(0x0C, struct kfd_ioctl_wait_events_args)
+#define AMDKFD_IOC_DBG_REGISTER AMDKFD_IOW(0x0D, struct kfd_ioctl_dbg_register_args)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDKFD_IOC_DBG_UNREGISTER AMDKFD_IOW(0x0E, struct kfd_ioctl_dbg_unregister_args)
+#define AMDKFD_IOC_DBG_ADDRESS_WATCH AMDKFD_IOW(0x0F, struct kfd_ioctl_dbg_address_watch_args)
+#define AMDKFD_IOC_DBG_WAVE_CONTROL AMDKFD_IOW(0x10, struct kfd_ioctl_dbg_wave_control_args)
+#define AMDKFD_COMMAND_START 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define AMDKFD_COMMAND_END 0x11
+#endif
diff --git a/libc/kernel/uapi/linux/kvm.h b/libc/kernel/uapi/linux/kvm.h
index 870fa66f7..c227904a2 100644
--- a/libc/kernel/uapi/linux/kvm.h
+++ b/libc/kernel/uapi/linux/kvm.h
@@ -141,212 +141,257 @@ struct kvm_pit_config {
};
#define KVM_PIT_SPEAKER_DUMMY 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_s390_skeys {
+ __u64 start_gfn;
+ __u64 count;
+ __u64 skeydata_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
+ __u32 reserved[9];
+};
+#define KVM_S390_GET_SKEYS_NONE 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_S390_SKEYS_MAX 1048576
#define KVM_EXIT_UNKNOWN 0
#define KVM_EXIT_EXCEPTION 1
#define KVM_EXIT_IO 2
-#define KVM_EXIT_HYPERCALL 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_EXIT_HYPERCALL 3
#define KVM_EXIT_DEBUG 4
#define KVM_EXIT_HLT 5
#define KVM_EXIT_MMIO 6
-#define KVM_EXIT_IRQ_WINDOW_OPEN 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_EXIT_IRQ_WINDOW_OPEN 7
#define KVM_EXIT_SHUTDOWN 8
#define KVM_EXIT_FAIL_ENTRY 9
#define KVM_EXIT_INTR 10
-#define KVM_EXIT_SET_TPR 11
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_EXIT_SET_TPR 11
#define KVM_EXIT_TPR_ACCESS 12
#define KVM_EXIT_S390_SIEIC 13
#define KVM_EXIT_S390_RESET 14
-#define KVM_EXIT_DCR 15
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_EXIT_DCR 15
#define KVM_EXIT_NMI 16
#define KVM_EXIT_INTERNAL_ERROR 17
#define KVM_EXIT_OSI 18
-#define KVM_EXIT_PAPR_HCALL 19
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_EXIT_PAPR_HCALL 19
#define KVM_EXIT_S390_UCONTROL 20
#define KVM_EXIT_WATCHDOG 21
#define KVM_EXIT_S390_TSCH 22
-#define KVM_EXIT_EPR 23
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_EXIT_EPR 23
#define KVM_EXIT_SYSTEM_EVENT 24
+#define KVM_EXIT_S390_STSI 25
+#define KVM_EXIT_IOAPIC_EOI 26
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_INTERNAL_ERROR_EMULATION 1
#define KVM_INTERNAL_ERROR_SIMUL_EX 2
#define KVM_INTERNAL_ERROR_DELIVERY_EV 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_run {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 request_interrupt_window;
__u8 padding1[7];
__u32 exit_reason;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 ready_for_interrupt_injection;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 if_flag;
- __u8 padding2[2];
+ __u16 flags;
__u64 cr8;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 apic_base;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#ifdef __KVM_S390
__u64 psw_mask;
__u64 psw_addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct {
__u64 hardware_exit_reason;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} hw;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u64 hardware_entry_failure_reason;
} fail_entry;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 exception;
__u32 error_code;
} ex;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_EXIT_IO_IN 0
#define KVM_EXIT_IO_OUT 1
__u8 direction;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 port;
__u32 count;
__u64 data_offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} io;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
struct kvm_debug_exit_arch arch;
} debug;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 phys_addr;
__u8 data[8];
__u32 len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 is_write;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} mmio;
struct {
__u64 nr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 args[6];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 ret;
__u32 longmode;
__u32 pad;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} hypercall;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u64 rip;
__u32 is_write;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} tpr_access;
struct {
__u8 icptcode;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 ipa;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ipb;
} s390_sieic;
#define KVM_S390_RESET_POR 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_S390_RESET_CLEAR 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_S390_RESET_SUBSYSTEM 4
#define KVM_S390_RESET_CPU_INIT 8
#define KVM_S390_RESET_IPL 16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 s390_reset_flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u64 trans_exc_code;
__u32 pgm_code;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} s390_ucontrol;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u32 dcrn;
__u32 data;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 is_write;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} dcr;
struct {
__u32 suberror;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ndata;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 data[16];
} internal;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 gprs[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} osi;
struct {
__u64 nr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 ret;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 args[9];
} papr_hcall;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 subchannel_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 subchannel_nr;
__u32 io_int_parm;
__u32 io_int_word;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ipb;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 dequeued;
} s390_tsch;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 epr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} epr;
struct {
#define KVM_SYSTEM_EVENT_SHUTDOWN 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SYSTEM_EVENT_RESET 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_SYSTEM_EVENT_CRASH 3
__u32 type;
__u64 flags;
} system_event;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
+ __u64 addr;
+ __u8 ar;
+ __u8 reserved;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 fc;
+ __u8 sel1;
+ __u16 sel2;
+ } s390_stsi;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
+ __u8 vector;
+ } eoi;
char padding[256];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
__u64 kvm_valid_regs;
__u64 kvm_dirty_regs;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_sync_regs regs;
- char padding[1024];
+ char padding[2048];
} s;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_coalesced_mmio_zone {
__u64 addr;
__u32 size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct kvm_coalesced_mmio {
__u64 phys_addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pad;
__u8 data[8];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_coalesced_mmio_ring {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 first, last;
struct kvm_coalesced_mmio coalesced_mmio[0];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_COALESCED_MMIO_MAX ((PAGE_SIZE - sizeof(struct kvm_coalesced_mmio_ring)) / sizeof(struct kvm_coalesced_mmio))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct kvm_translation {
__u64 linear_address;
__u64 physical_address;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 valid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 writeable;
__u8 usermode;
__u8 pad[5];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_s390_mem_op {
+ __u64 gaddr;
+ __u64 flags;
+ __u32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 op;
+ __u64 buf;
+ __u8 ar;
+ __u8 reserved[31];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+#define KVM_S390_MEMOP_LOGICAL_READ 0
+#define KVM_S390_MEMOP_LOGICAL_WRITE 1
+#define KVM_S390_MEMOP_F_CHECK_ONLY (1ULL << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_S390_MEMOP_F_INJECT_EXCEPTION (1ULL << 1)
struct kvm_interrupt {
__u32 irq;
};
@@ -416,80 +461,95 @@ struct kvm_s390_psw {
#define KVM_S390_INT_IO_MIN 0x00000000u
#define KVM_S390_INT_IO_MAX 0xfffdffffu
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_S390_INT_IO_AI_MASK 0x04000000u
struct kvm_s390_interrupt {
__u32 type;
__u32 parm;
- __u64 parm64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 parm64;
};
struct kvm_s390_io_info {
__u16 subchannel_id;
- __u16 subchannel_nr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 subchannel_nr;
__u32 io_int_parm;
__u32 io_int_word;
};
-struct kvm_s390_ext_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_s390_ext_info {
__u32 ext_params;
__u32 pad;
__u64 ext_params2;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_s390_pgm_info {
__u64 trans_exc_code;
__u64 mon_code;
- __u64 per_address;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 per_address;
__u32 data_exc_code;
__u16 code;
__u16 mon_class_nr;
- __u8 per_code;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 per_code;
__u8 per_atmid;
__u8 exc_access_id;
__u8 per_access_id;
- __u8 op_access_id;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 op_access_id;
__u8 pad[3];
};
struct kvm_s390_prefix_info {
- __u32 address;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 address;
};
struct kvm_s390_extcall_info {
__u16 code;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_s390_emerg_info {
__u16 code;
};
-struct kvm_s390_mchk_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_S390_STOP_FLAG_STORE_STATUS 0x01
+struct kvm_s390_stop_info {
+ __u32 flags;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_s390_mchk_info {
__u64 cr14;
__u64 mcic;
__u64 failing_storage_address;
- __u32 ext_damage_code;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ext_damage_code;
__u32 pad;
__u8 fixed_logout[16];
};
-struct kvm_s390_irq {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_s390_irq {
__u64 type;
union {
struct kvm_s390_io_info io;
- struct kvm_s390_ext_info ext;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct kvm_s390_ext_info ext;
struct kvm_s390_pgm_info pgm;
struct kvm_s390_emerg_info emerg;
struct kvm_s390_extcall_info extcall;
- struct kvm_s390_prefix_info prefix;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct kvm_s390_prefix_info prefix;
+ struct kvm_s390_stop_info stop;
struct kvm_s390_mchk_info mchk;
char reserved[64];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} u;
};
+struct kvm_s390_irq_state {
+ __u64 buf;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
+ __u32 len;
+ __u32 reserved[4];
+};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GUESTDBG_ENABLE 0x00000001
#define KVM_GUESTDBG_SINGLESTEP 0x00000002
@@ -603,12 +663,7 @@ struct kvm_ppc_smmu_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_CAP_COALESCED_MMIO 15
#define KVM_CAP_SYNC_MMU 16
-#define KVM_CAP_DEVICE_ASSIGNMENT 17
#define KVM_CAP_IOMMU 18
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#ifdef __KVM_HAVE_MSI
-#define KVM_CAP_DEVICE_MSI 20
-#endif
#define KVM_CAP_DESTROY_MEMORY_REGION_WORKS 21
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_CAP_USER_NMI 22
@@ -622,11 +677,6 @@ struct kvm_ppc_smmu_info {
#define KVM_CAP_IRQ_ROUTING 25
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_CAP_IRQ_INJECT_STATUS 26
-#define KVM_CAP_DEVICE_DEASSIGNMENT 27
-#ifdef __KVM_HAVE_MSIX
-#define KVM_CAP_DEVICE_MSIX 28
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#endif
#define KVM_CAP_ASSIGN_DEV_IRQ 29
#define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
#ifdef __KVM_HAVE_MCE
@@ -743,340 +793,370 @@ struct kvm_ppc_smmu_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_CAP_PPC_ENABLE_HCALL 104
#define KVM_CAP_CHECK_EXTENSION_VM 105
+#define KVM_CAP_S390_USER_SIGP 106
+#define KVM_CAP_S390_VECTOR_REGISTERS 107
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_CAP_S390_MEM_OP 108
+#define KVM_CAP_S390_USER_STSI 109
+#define KVM_CAP_S390_SKEYS 110
+#define KVM_CAP_MIPS_FPU 111
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_CAP_MIPS_MSA 112
+#define KVM_CAP_S390_INJECT_IRQ 113
+#define KVM_CAP_S390_IRQ_STATE 114
+#define KVM_CAP_PPC_HWRNG 115
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_CAP_DISABLE_QUIRKS 116
+#define KVM_CAP_X86_SMM 117
+#define KVM_CAP_MULTI_ADDRESS_SPACE 118
+#define KVM_CAP_GUEST_DEBUG_HW_BPS 119
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_CAP_GUEST_DEBUG_HW_WPS 120
+#define KVM_CAP_SPLIT_IRQCHIP 121
+#define KVM_CAP_IOEVENTFD_ANY_LENGTH 122
#ifdef KVM_CAP_IRQ_ROUTING
-struct kvm_irq_routing_irqchip {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_irq_routing_irqchip {
__u32 irqchip;
__u32 pin;
};
-struct kvm_irq_routing_msi {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_irq_routing_msi {
__u32 address_lo;
__u32 address_hi;
__u32 data;
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
};
struct kvm_irq_routing_s390_adapter {
__u64 ind_addr;
- __u64 summary_addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 summary_addr;
__u64 ind_offset;
__u32 summary_offset;
__u32 adapter_id;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define KVM_IRQ_ROUTING_IRQCHIP 1
#define KVM_IRQ_ROUTING_MSI 2
#define KVM_IRQ_ROUTING_S390_ADAPTER 3
-struct kvm_irq_routing_entry {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_irq_routing_entry {
__u32 gsi;
__u32 type;
__u32 flags;
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
union {
struct kvm_irq_routing_irqchip irqchip;
struct kvm_irq_routing_msi msi;
- struct kvm_irq_routing_s390_adapter adapter;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct kvm_irq_routing_s390_adapter adapter;
__u32 pad[8];
} u;
};
-struct kvm_irq_routing {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_irq_routing {
__u32 nr;
__u32 flags;
struct kvm_irq_routing_entry entries[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#endif
#ifdef KVM_CAP_MCE
struct kvm_x86_mce {
- __u64 status;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 status;
__u64 addr;
__u64 misc;
__u64 mcg_status;
- __u8 bank;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bank;
__u8 pad1[7];
__u64 pad2[3];
};
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
#ifdef KVM_CAP_XEN_HVM
struct kvm_xen_hvm_config {
__u32 flags;
- __u32 msr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 msr;
__u64 blob_addr_32;
__u64 blob_addr_64;
__u8 blob_size_32;
- __u8 blob_size_64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 blob_size_64;
__u8 pad2[30];
};
#endif
-#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
#define KVM_IRQFD_FLAG_RESAMPLE (1 << 1)
struct kvm_irqfd {
__u32 fd;
- __u32 gsi;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 gsi;
__u32 flags;
__u32 resamplefd;
__u8 pad[16];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_clock_data {
__u64 clock;
__u32 flags;
- __u32 pad[9];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad[9];
};
#define KVM_MMU_FSL_BOOKE_NOHV 0
#define KVM_MMU_FSL_BOOKE_HV 1
-struct kvm_config_tlb {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_config_tlb {
__u64 params;
__u64 array;
__u32 mmu_type;
- __u32 array_len;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 array_len;
};
struct kvm_dirty_tlb {
__u64 bitmap;
- __u32 num_dirty;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 num_dirty;
};
#define KVM_REG_ARCH_MASK 0xff00000000000000ULL
#define KVM_REG_GENERIC 0x0000000000000000ULL
-#define KVM_REG_PPC 0x1000000000000000ULL
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_PPC 0x1000000000000000ULL
#define KVM_REG_X86 0x2000000000000000ULL
#define KVM_REG_IA64 0x3000000000000000ULL
#define KVM_REG_ARM 0x4000000000000000ULL
-#define KVM_REG_S390 0x5000000000000000ULL
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_S390 0x5000000000000000ULL
#define KVM_REG_ARM64 0x6000000000000000ULL
#define KVM_REG_MIPS 0x7000000000000000ULL
#define KVM_REG_SIZE_SHIFT 52
-#define KVM_REG_SIZE_MASK 0x00f0000000000000ULL
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_SIZE_MASK 0x00f0000000000000ULL
#define KVM_REG_SIZE_U8 0x0000000000000000ULL
#define KVM_REG_SIZE_U16 0x0010000000000000ULL
#define KVM_REG_SIZE_U32 0x0020000000000000ULL
-#define KVM_REG_SIZE_U64 0x0030000000000000ULL
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_SIZE_U64 0x0030000000000000ULL
#define KVM_REG_SIZE_U128 0x0040000000000000ULL
#define KVM_REG_SIZE_U256 0x0050000000000000ULL
#define KVM_REG_SIZE_U512 0x0060000000000000ULL
-#define KVM_REG_SIZE_U1024 0x0070000000000000ULL
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_REG_SIZE_U1024 0x0070000000000000ULL
struct kvm_reg_list {
__u64 n;
__u64 reg[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_one_reg {
__u64 id;
__u64 addr;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct kvm_msi {
__u32 address_lo;
__u32 address_hi;
- __u32 data;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 data;
__u32 flags;
__u8 pad[16];
};
-struct kvm_arm_device_addr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct kvm_arm_device_addr {
__u64 id;
__u64 addr;
};
-#define KVM_CREATE_DEVICE_TEST 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_CREATE_DEVICE_TEST 1
struct kvm_create_device {
__u32 type;
__u32 fd;
- __u32 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
};
struct kvm_device_attr {
__u32 flags;
- __u32 group;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 group;
__u64 attr;
__u64 addr;
};
-#define KVM_DEV_VFIO_GROUP 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_DEV_VFIO_GROUP 1
#define KVM_DEV_VFIO_GROUP_ADD 1
#define KVM_DEV_VFIO_GROUP_DEL 2
enum kvm_device_type {
- KVM_DEV_TYPE_FSL_MPIC_20 = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ KVM_DEV_TYPE_FSL_MPIC_20 = 1,
#define KVM_DEV_TYPE_FSL_MPIC_20 KVM_DEV_TYPE_FSL_MPIC_20
KVM_DEV_TYPE_FSL_MPIC_42,
#define KVM_DEV_TYPE_FSL_MPIC_42 KVM_DEV_TYPE_FSL_MPIC_42
- KVM_DEV_TYPE_XICS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ KVM_DEV_TYPE_XICS,
#define KVM_DEV_TYPE_XICS KVM_DEV_TYPE_XICS
KVM_DEV_TYPE_VFIO,
#define KVM_DEV_TYPE_VFIO KVM_DEV_TYPE_VFIO
- KVM_DEV_TYPE_ARM_VGIC_V2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ KVM_DEV_TYPE_ARM_VGIC_V2,
#define KVM_DEV_TYPE_ARM_VGIC_V2 KVM_DEV_TYPE_ARM_VGIC_V2
KVM_DEV_TYPE_FLIC,
#define KVM_DEV_TYPE_FLIC KVM_DEV_TYPE_FLIC
- KVM_DEV_TYPE_MAX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ KVM_DEV_TYPE_ARM_VGIC_V3,
+#define KVM_DEV_TYPE_ARM_VGIC_V3 KVM_DEV_TYPE_ARM_VGIC_V3
+ KVM_DEV_TYPE_MAX,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_MEMORY_REGION _IOW(KVMIO, 0x40, struct kvm_memory_region)
#define KVM_CREATE_VCPU _IO(KVMIO, 0x41)
#define KVM_GET_DIRTY_LOG _IOW(KVMIO, 0x42, struct kvm_dirty_log)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_MEMORY_ALIAS _IOW(KVMIO, 0x43, struct kvm_memory_alias)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_NR_MMU_PAGES _IO(KVMIO, 0x44)
#define KVM_GET_NR_MMU_PAGES _IO(KVMIO, 0x45)
#define KVM_SET_USER_MEMORY_REGION _IOW(KVMIO, 0x46, struct kvm_userspace_memory_region)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_TSS_ADDR _IO(KVMIO, 0x47)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_IDENTITY_MAP_ADDR _IOW(KVMIO, 0x48, __u64)
struct kvm_s390_ucas_mapping {
__u64 user_addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 vcpu_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 length;
};
#define KVM_S390_UCAS_MAP _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_S390_VCPU_FAULT _IOW(KVMIO, 0x52, unsigned long)
#define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
#define KVM_IRQ_LINE _IOW(KVMIO, 0x61, struct kvm_irq_level)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GET_IRQCHIP _IOWR(KVMIO, 0x62, struct kvm_irqchip)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_IRQCHIP _IOR(KVMIO, 0x63, struct kvm_irqchip)
#define KVM_CREATE_PIT _IO(KVMIO, 0x64)
#define KVM_GET_PIT _IOWR(KVMIO, 0x65, struct kvm_pit_state)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_PIT _IOR(KVMIO, 0x66, struct kvm_pit_state)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_IRQ_LINE_STATUS _IOWR(KVMIO, 0x67, struct kvm_irq_level)
#define KVM_REGISTER_COALESCED_MMIO _IOW(KVMIO, 0x67, struct kvm_coalesced_mmio_zone)
#define KVM_UNREGISTER_COALESCED_MMIO _IOW(KVMIO, 0x68, struct kvm_coalesced_mmio_zone)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ASSIGN_PCI_DEVICE _IOR(KVMIO, 0x69, struct kvm_assigned_pci_dev)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_GSI_ROUTING _IOW(KVMIO, 0x6a, struct kvm_irq_routing)
#define KVM_ASSIGN_IRQ __KVM_DEPRECATED_VM_R_0x70
#define KVM_ASSIGN_DEV_IRQ _IOW(KVMIO, 0x70, struct kvm_assigned_irq)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_REINJECT_CONTROL _IO(KVMIO, 0x71)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_DEASSIGN_PCI_DEVICE _IOW(KVMIO, 0x72, struct kvm_assigned_pci_dev)
#define KVM_ASSIGN_SET_MSIX_NR _IOW(KVMIO, 0x73, struct kvm_assigned_msix_nr)
#define KVM_ASSIGN_SET_MSIX_ENTRY _IOW(KVMIO, 0x74, struct kvm_assigned_msix_entry)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_DEASSIGN_DEV_IRQ _IOW(KVMIO, 0x75, struct kvm_assigned_irq)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_IRQFD _IOW(KVMIO, 0x76, struct kvm_irqfd)
#define KVM_CREATE_PIT2 _IOW(KVMIO, 0x77, struct kvm_pit_config)
#define KVM_SET_BOOT_CPU_ID _IO(KVMIO, 0x78)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_IOEVENTFD _IOW(KVMIO, 0x79, struct kvm_ioeventfd)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_XEN_HVM_CONFIG _IOW(KVMIO, 0x7a, struct kvm_xen_hvm_config)
#define KVM_SET_CLOCK _IOW(KVMIO, 0x7b, struct kvm_clock_data)
#define KVM_GET_CLOCK _IOR(KVMIO, 0x7c, struct kvm_clock_data)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GET_PIT2 _IOR(KVMIO, 0x9f, struct kvm_pit_state2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_PIT2 _IOW(KVMIO, 0xa0, struct kvm_pit_state2)
#define KVM_PPC_GET_PVINFO _IOW(KVMIO, 0xa1, struct kvm_ppc_pvinfo)
#define KVM_SET_TSC_KHZ _IO(KVMIO, 0xa2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GET_TSC_KHZ _IO(KVMIO, 0xa3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ASSIGN_SET_INTX_MASK _IOW(KVMIO, 0xa4, struct kvm_assigned_pci_dev)
#define KVM_SIGNAL_MSI _IOW(KVMIO, 0xa5, struct kvm_msi)
#define KVM_PPC_GET_SMMU_INFO _IOR(KVMIO, 0xa6, struct kvm_ppc_smmu_info)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_PPC_ALLOCATE_HTAB _IOWR(KVMIO, 0xa7, __u32)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_CREATE_SPAPR_TCE _IOW(KVMIO, 0xa8, struct kvm_create_spapr_tce)
#define KVM_ALLOCATE_RMA _IOR(KVMIO, 0xa9, struct kvm_allocate_rma)
#define KVM_PPC_GET_HTAB_FD _IOW(KVMIO, 0xaa, struct kvm_get_htab_fd)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_ARM_SET_DEVICE_ADDR _IOW(KVMIO, 0xab, struct kvm_arm_device_addr)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_PPC_RTAS_DEFINE_TOKEN _IOW(KVMIO, 0xac, struct kvm_rtas_token_args)
#define KVM_CREATE_DEVICE _IOWR(KVMIO, 0xe0, struct kvm_create_device)
#define KVM_SET_DEVICE_ATTR _IOW(KVMIO, 0xe1, struct kvm_device_attr)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GET_DEVICE_ATTR _IOW(KVMIO, 0xe2, struct kvm_device_attr)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_HAS_DEVICE_ATTR _IOW(KVMIO, 0xe3, struct kvm_device_attr)
#define KVM_RUN _IO(KVMIO, 0x80)
#define KVM_GET_REGS _IOR(KVMIO, 0x81, struct kvm_regs)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_REGS _IOW(KVMIO, 0x82, struct kvm_regs)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GET_SREGS _IOR(KVMIO, 0x83, struct kvm_sregs)
#define KVM_SET_SREGS _IOW(KVMIO, 0x84, struct kvm_sregs)
#define KVM_TRANSLATE _IOWR(KVMIO, 0x85, struct kvm_translation)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_INTERRUPT _IOW(KVMIO, 0x86, struct kvm_interrupt)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_DEBUG_GUEST __KVM_DEPRECATED_VCPU_W_0x87
#define KVM_GET_MSRS _IOWR(KVMIO, 0x88, struct kvm_msrs)
#define KVM_SET_MSRS _IOW(KVMIO, 0x89, struct kvm_msrs)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_CPUID _IOW(KVMIO, 0x8a, struct kvm_cpuid)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_SIGNAL_MASK _IOW(KVMIO, 0x8b, struct kvm_signal_mask)
#define KVM_GET_FPU _IOR(KVMIO, 0x8c, struct kvm_fpu)
#define KVM_SET_FPU _IOW(KVMIO, 0x8d, struct kvm_fpu)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GET_LAPIC _IOR(KVMIO, 0x8e, struct kvm_lapic_state)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_LAPIC _IOW(KVMIO, 0x8f, struct kvm_lapic_state)
#define KVM_SET_CPUID2 _IOW(KVMIO, 0x90, struct kvm_cpuid2)
#define KVM_GET_CPUID2 _IOWR(KVMIO, 0x91, struct kvm_cpuid2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_TPR_ACCESS_REPORTING _IOWR(KVMIO, 0x92, struct kvm_tpr_access_ctl)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_VAPIC_ADDR _IOW(KVMIO, 0x93, struct kvm_vapic_addr)
#define KVM_S390_INTERRUPT _IOW(KVMIO, 0x94, struct kvm_s390_interrupt)
#define KVM_S390_STORE_STATUS_NOADDR (- 1ul)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_S390_STORE_STATUS_PREFIXED (- 2ul)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_S390_STORE_STATUS _IOW(KVMIO, 0x95, unsigned long)
#define KVM_S390_SET_INITIAL_PSW _IOW(KVMIO, 0x96, struct kvm_s390_psw)
#define KVM_S390_INITIAL_RESET _IO(KVMIO, 0x97)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_GET_MP_STATE _IOR(KVMIO, 0x98, struct kvm_mp_state)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_SET_MP_STATE _IOW(KVMIO, 0x99, struct kvm_mp_state)
#define KVM_NMI _IO(KVMIO, 0x9a)
#define KVM_SET_GUEST_DEBUG _IOW(KVMIO, 0x9b, struct kvm_guest_debug)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_X86_SETUP_MCE _IOW(KVMIO, 0x9c, __u64)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define KVM_X86_GET_MCE_CAP_SUPPORTED _IOR(KVMIO, 0x9d, __u64)
#define KVM_X86_SET_MCE _IOW(KVMIO, 0x9e, struct kvm_x86_mce)
-#define KVM_IA64_VCPU_GET_STACK _IOR(KVMIO, 0x9a, void *)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define KVM_IA64_VCPU_SET_STACK _IOW(KVMIO, 0x9b, void *)
#define KVM_GET_VCPU_EVENTS _IOR(KVMIO, 0x9f, struct kvm_vcpu_events)
#define KVM_SET_VCPU_EVENTS _IOW(KVMIO, 0xa0, struct kvm_vcpu_events)
-#define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_GET_DEBUGREGS _IOR(KVMIO, 0xa1, struct kvm_debugregs)
#define KVM_SET_DEBUGREGS _IOW(KVMIO, 0xa2, struct kvm_debugregs)
#define KVM_ENABLE_CAP _IOW(KVMIO, 0xa3, struct kvm_enable_cap)
#define KVM_GET_XSAVE _IOR(KVMIO, 0xa4, struct kvm_xsave)
-#define KVM_SET_XSAVE _IOW(KVMIO, 0xa5, struct kvm_xsave)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_SET_XSAVE _IOW(KVMIO, 0xa5, struct kvm_xsave)
#define KVM_GET_XCRS _IOR(KVMIO, 0xa6, struct kvm_xcrs)
#define KVM_SET_XCRS _IOW(KVMIO, 0xa7, struct kvm_xcrs)
#define KVM_DIRTY_TLB _IOW(KVMIO, 0xaa, struct kvm_dirty_tlb)
-#define KVM_GET_ONE_REG _IOW(KVMIO, 0xab, struct kvm_one_reg)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_GET_ONE_REG _IOW(KVMIO, 0xab, struct kvm_one_reg)
#define KVM_SET_ONE_REG _IOW(KVMIO, 0xac, struct kvm_one_reg)
#define KVM_KVMCLOCK_CTRL _IO(KVMIO, 0xad)
#define KVM_ARM_VCPU_INIT _IOW(KVMIO, 0xae, struct kvm_vcpu_init)
-#define KVM_ARM_PREFERRED_TARGET _IOR(KVMIO, 0xaf, struct kvm_vcpu_init)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_ARM_PREFERRED_TARGET _IOR(KVMIO, 0xaf, struct kvm_vcpu_init)
#define KVM_GET_REG_LIST _IOWR(KVMIO, 0xb0, struct kvm_reg_list)
+#define KVM_S390_MEM_OP _IOW(KVMIO, 0xb1, struct kvm_s390_mem_op)
+#define KVM_S390_GET_SKEYS _IOW(KVMIO, 0xb2, struct kvm_s390_skeys)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_S390_SET_SKEYS _IOW(KVMIO, 0xb3, struct kvm_s390_skeys)
+#define KVM_S390_IRQ _IOW(KVMIO, 0xb4, struct kvm_s390_irq)
+#define KVM_S390_SET_IRQ_STATE _IOW(KVMIO, 0xb5, struct kvm_s390_irq_state)
+#define KVM_S390_GET_IRQ_STATE _IOW(KVMIO, 0xb6, struct kvm_s390_irq_state)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define KVM_SMI _IO(KVMIO, 0xb7)
#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
#define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1)
#define KVM_DEV_ASSIGN_MASK_INTX (1 << 2)
diff --git a/libc/kernel/uapi/linux/l2tp.h b/libc/kernel/uapi/linux/l2tp.h
index 4eaf7ad5d..cb1504b87 100644
--- a/libc/kernel/uapi/linux/l2tp.h
+++ b/libc/kernel/uapi/linux/l2tp.h
@@ -154,5 +154,6 @@ enum l2tp_seqmode {
};
#define L2TP_GENL_NAME "l2tp"
#define L2TP_GENL_VERSION 0x1
-#endif
+#define L2TP_GENL_MCGROUP "l2tp"
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/libc-compat.h b/libc/kernel/uapi/linux/libc-compat.h
index b66ebe260..c91df87cf 100644
--- a/libc/kernel/uapi/linux/libc-compat.h
+++ b/libc/kernel/uapi/linux/libc-compat.h
@@ -21,27 +21,47 @@
#ifdef __GLIBC__
#ifdef _NETINET_IN_H
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_IN_ADDR 0
+#define __UAPI_DEF_IN_IPPROTO 0
+#define __UAPI_DEF_IN_PKTINFO 0
+#define __UAPI_DEF_IP_MREQ 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_SOCKADDR_IN 0
+#define __UAPI_DEF_IN_CLASS 0
#define __UAPI_DEF_IN6_ADDR 0
#if defined(__USE_MISC) || defined(__USE_GNU)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_IN6_ADDR_ALT 0
#else
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_IN6_ADDR_ALT 1
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_SOCKADDR_IN6 0
#define __UAPI_DEF_IPV6_MREQ 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_IPPROTO_V6 0
#define __UAPI_DEF_IPV6_OPTIONS 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_IN6_PKTINFO 0
+#define __UAPI_DEF_IP6_MTUINFO 0
#else
-#define __UAPI_DEF_IN6_ADDR 1
+#define __UAPI_DEF_IN_ADDR 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_IN_IPPROTO 1
+#define __UAPI_DEF_IN_PKTINFO 1
+#define __UAPI_DEF_IP_MREQ 1
+#define __UAPI_DEF_SOCKADDR_IN 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_IN_CLASS 1
+#define __UAPI_DEF_IN6_ADDR 1
#define __UAPI_DEF_IN6_ADDR_ALT 1
#define __UAPI_DEF_SOCKADDR_IN6 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_IPV6_MREQ 1
#define __UAPI_DEF_IPPROTO_V6 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_IPV6_OPTIONS 1
+#define __UAPI_DEF_IN6_PKTINFO 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_IP6_MTUINFO 1
#endif
#ifdef _SYS_XATTR_H
#define __UAPI_DEF_XATTR 0
@@ -51,13 +71,23 @@
#endif
#else
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_IN_ADDR 1
+#define __UAPI_DEF_IN_IPPROTO 1
+#define __UAPI_DEF_IN_PKTINFO 1
+#define __UAPI_DEF_IP_MREQ 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_SOCKADDR_IN 1
+#define __UAPI_DEF_IN_CLASS 1
#define __UAPI_DEF_IN6_ADDR 1
#define __UAPI_DEF_IN6_ADDR_ALT 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_SOCKADDR_IN6 1
#define __UAPI_DEF_IPV6_MREQ 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __UAPI_DEF_IPPROTO_V6 1
#define __UAPI_DEF_IPV6_OPTIONS 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define __UAPI_DEF_IN6_PKTINFO 1
+#define __UAPI_DEF_IP6_MTUINFO 1
#define __UAPI_DEF_XATTR 1
#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/lightnvm.h b/libc/kernel/uapi/linux/lightnvm.h
new file mode 100644
index 000000000..a3430f382
--- /dev/null
+++ b/libc/kernel/uapi/linux/lightnvm.h
@@ -0,0 +1,113 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_LIGHTNVM_H
+#define _UAPI_LINUX_LIGHTNVM_H
+#include <stdio.h>
+#include <sys/ioctl.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DISK_NAME_LEN 32
+#include <linux/types.h>
+#include <linux/ioctl.h>
+#define NVM_TTYPE_NAME_MAX 48
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NVM_TTYPE_MAX 63
+#define NVM_CTRL_FILE "/dev/lightnvm/control"
+struct nvm_ioctl_info_tgt {
+ __u32 version[3];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
+ char tgtname[NVM_TTYPE_NAME_MAX];
+};
+struct nvm_ioctl_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 version[3];
+ __u16 tgtsize;
+ __u16 reserved16;
+ __u32 reserved[12];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct nvm_ioctl_info_tgt tgts[NVM_TTYPE_MAX];
+};
+enum {
+ NVM_DEVICE_ACTIVE = 1 << 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct nvm_ioctl_device_info {
+ char devname[DISK_NAME_LEN];
+ char bmname[NVM_TTYPE_NAME_MAX];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 bmversion[3];
+ __u32 flags;
+ __u32 reserved[8];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nvm_ioctl_get_devices {
+ __u32 nr_devices;
+ __u32 reserved[31];
+ struct nvm_ioctl_device_info info[31];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct nvm_ioctl_create_simple {
+ __u32 lun_begin;
+ __u32 lun_end;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ NVM_CONFIG_TYPE_SIMPLE = 0,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nvm_ioctl_create_conf {
+ __u32 type;
+ union {
+ struct nvm_ioctl_create_simple s;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
+};
+struct nvm_ioctl_create {
+ char dev[DISK_NAME_LEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char tgttype[NVM_TTYPE_NAME_MAX];
+ char tgtname[DISK_NAME_LEN];
+ __u32 flags;
+ struct nvm_ioctl_create_conf conf;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct nvm_ioctl_remove {
+ char tgtname[DISK_NAME_LEN];
+ __u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ NVM_INFO_CMD = 0x20,
+ NVM_GET_DEVICES_CMD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NVM_DEV_CREATE_CMD,
+ NVM_DEV_REMOVE_CMD,
+};
+#define NVM_IOCTL 'L'
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NVM_INFO _IOWR(NVM_IOCTL, NVM_INFO_CMD, struct nvm_ioctl_info)
+#define NVM_GET_DEVICES _IOR(NVM_IOCTL, NVM_GET_DEVICES_CMD, struct nvm_ioctl_get_devices)
+#define NVM_DEV_CREATE _IOW(NVM_IOCTL, NVM_DEV_CREATE_CMD, struct nvm_ioctl_create)
+#define NVM_DEV_REMOVE _IOW(NVM_IOCTL, NVM_DEV_REMOVE_CMD, struct nvm_ioctl_remove)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NVM_VERSION_MAJOR 1
+#define NVM_VERSION_MINOR 0
+#define NVM_VERSION_PATCHLEVEL 0
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/loop.h b/libc/kernel/uapi/linux/loop.h
index c0881f4af..bc154216a 100644
--- a/libc/kernel/uapi/linux/loop.h
+++ b/libc/kernel/uapi/linux/loop.h
@@ -26,71 +26,74 @@ enum {
LO_FLAGS_AUTOCLEAR = 4,
LO_FLAGS_PARTSCAN = 8,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LO_FLAGS_DIRECT_IO = 16,
};
#include <asm/posix_types.h>
#include <linux/types.h>
-struct loop_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct loop_info {
int lo_number;
__kernel_old_dev_t lo_device;
unsigned long lo_inode;
- __kernel_old_dev_t lo_rdevice;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __kernel_old_dev_t lo_rdevice;
int lo_offset;
int lo_encrypt_type;
int lo_encrypt_key_size;
- int lo_flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int lo_flags;
char lo_name[LO_NAME_SIZE];
unsigned char lo_encrypt_key[LO_KEY_SIZE];
unsigned long lo_init[2];
- char reserved[4];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char reserved[4];
};
struct loop_info64 {
__u64 lo_device;
- __u64 lo_inode;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 lo_inode;
__u64 lo_rdevice;
__u64 lo_offset;
__u64 lo_sizelimit;
- __u32 lo_number;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 lo_number;
__u32 lo_encrypt_type;
__u32 lo_encrypt_key_size;
__u32 lo_flags;
- __u8 lo_file_name[LO_NAME_SIZE];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 lo_file_name[LO_NAME_SIZE];
__u8 lo_crypt_name[LO_NAME_SIZE];
__u8 lo_encrypt_key[LO_KEY_SIZE];
__u64 lo_init[2];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define LO_CRYPT_NONE 0
#define LO_CRYPT_XOR 1
#define LO_CRYPT_DES 2
-#define LO_CRYPT_FISH2 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LO_CRYPT_FISH2 3
#define LO_CRYPT_BLOW 4
#define LO_CRYPT_CAST128 5
#define LO_CRYPT_IDEA 6
-#define LO_CRYPT_DUMMY 9
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LO_CRYPT_DUMMY 9
#define LO_CRYPT_SKIPJACK 10
#define LO_CRYPT_CRYPTOAPI 18
#define MAX_LO_CRYPT 20
-#define LOOP_SET_FD 0x4C00
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LOOP_SET_FD 0x4C00
#define LOOP_CLR_FD 0x4C01
#define LOOP_SET_STATUS 0x4C02
#define LOOP_GET_STATUS 0x4C03
-#define LOOP_SET_STATUS64 0x4C04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LOOP_SET_STATUS64 0x4C04
#define LOOP_GET_STATUS64 0x4C05
#define LOOP_CHANGE_FD 0x4C06
#define LOOP_SET_CAPACITY 0x4C07
-#define LOOP_CTL_ADD 0x4C80
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LOOP_SET_DIRECT_IO 0x4C08
+#define LOOP_CTL_ADD 0x4C80
#define LOOP_CTL_REMOVE 0x4C81
#define LOOP_CTL_GET_FREE 0x4C82
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/lwtunnel.h b/libc/kernel/uapi/linux/lwtunnel.h
new file mode 100644
index 000000000..9bd438f62
--- /dev/null
+++ b/libc/kernel/uapi/linux/lwtunnel.h
@@ -0,0 +1,61 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LWTUNNEL_H_
+#define _UAPI_LWTUNNEL_H_
+#include <linux/types.h>
+enum lwtunnel_encap_types {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LWTUNNEL_ENCAP_NONE,
+ LWTUNNEL_ENCAP_MPLS,
+ LWTUNNEL_ENCAP_IP,
+ LWTUNNEL_ENCAP_ILA,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LWTUNNEL_ENCAP_IP6,
+ __LWTUNNEL_ENCAP_MAX,
+};
+#define LWTUNNEL_ENCAP_MAX (__LWTUNNEL_ENCAP_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum lwtunnel_ip_t {
+ LWTUNNEL_IP_UNSPEC,
+ LWTUNNEL_IP_ID,
+ LWTUNNEL_IP_DST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LWTUNNEL_IP_SRC,
+ LWTUNNEL_IP_TTL,
+ LWTUNNEL_IP_TOS,
+ LWTUNNEL_IP_FLAGS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __LWTUNNEL_IP_MAX,
+};
+#define LWTUNNEL_IP_MAX (__LWTUNNEL_IP_MAX - 1)
+enum lwtunnel_ip6_t {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LWTUNNEL_IP6_UNSPEC,
+ LWTUNNEL_IP6_ID,
+ LWTUNNEL_IP6_DST,
+ LWTUNNEL_IP6_SRC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LWTUNNEL_IP6_HOPLIMIT,
+ LWTUNNEL_IP6_TC,
+ LWTUNNEL_IP6_FLAGS,
+ __LWTUNNEL_IP6_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define LWTUNNEL_IP6_MAX (__LWTUNNEL_IP6_MAX - 1)
+#endif
diff --git a/libc/kernel/uapi/linux/magic.h b/libc/kernel/uapi/linux/magic.h
index 7c7c6c3cb..16b975282 100644
--- a/libc/kernel/uapi/linux/magic.h
+++ b/libc/kernel/uapi/linux/magic.h
@@ -78,21 +78,24 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CGROUP_SUPER_MAGIC 0x27e0eb
#define STACK_END_MAGIC 0x57AC6E9D
+#define TRACEFS_MAGIC 0x74726163
#define V9FS_MAGIC 0x01021997
-#define BDEVFS_MAGIC 0x62646576
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define BDEVFS_MAGIC 0x62646576
#define BINFMTFS_MAGIC 0x42494e4d
#define DEVPTS_SUPER_MAGIC 0x1cd1
#define FUTEXFS_SUPER_MAGIC 0xBAD1DEA
-#define PIPEFS_MAGIC 0x50495045
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PIPEFS_MAGIC 0x50495045
#define PROC_SUPER_MAGIC 0x9fa0
#define SOCKFS_MAGIC 0x534F434B
#define SYSFS_MAGIC 0x62656572
-#define USBDEVICE_SUPER_MAGIC 0x9fa2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVICE_SUPER_MAGIC 0x9fa2
#define MTD_INODE_FS_MAGIC 0x11307854
#define ANON_INODE_FS_MAGIC 0x09041934
#define BTRFS_TEST_MAGIC 0x73727279
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NSFS_MAGIC 0x6e736673
+#define BPF_FS_MAGIC 0xcafe4a11
+#endif
diff --git a/libc/kernel/uapi/linux/media-bus-format.h b/libc/kernel/uapi/linux/media-bus-format.h
new file mode 100644
index 000000000..01f8593a6
--- /dev/null
+++ b/libc/kernel/uapi/linux/media-bus-format.h
@@ -0,0 +1,131 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __LINUX_MEDIA_BUS_FORMAT_H
+#define __LINUX_MEDIA_BUS_FORMAT_H
+#define MEDIA_BUS_FMT_FIXED 0x0001
+#define MEDIA_BUS_FMT_RGB444_1X12 0x1016
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE 0x1001
+#define MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE 0x1002
+#define MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE 0x1003
+#define MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE 0x1004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_RGB565_1X16 0x1017
+#define MEDIA_BUS_FMT_BGR565_2X8_BE 0x1005
+#define MEDIA_BUS_FMT_BGR565_2X8_LE 0x1006
+#define MEDIA_BUS_FMT_RGB565_2X8_BE 0x1007
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_RGB565_2X8_LE 0x1008
+#define MEDIA_BUS_FMT_RGB666_1X18 0x1009
+#define MEDIA_BUS_FMT_RBG888_1X24 0x100e
+#define MEDIA_BUS_FMT_RGB666_1X24_CPADHI 0x1015
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_RGB666_1X7X3_SPWG 0x1010
+#define MEDIA_BUS_FMT_BGR888_1X24 0x1013
+#define MEDIA_BUS_FMT_GBR888_1X24 0x1014
+#define MEDIA_BUS_FMT_RGB888_1X24 0x100a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_RGB888_2X12_BE 0x100b
+#define MEDIA_BUS_FMT_RGB888_2X12_LE 0x100c
+#define MEDIA_BUS_FMT_RGB888_1X7X4_SPWG 0x1011
+#define MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA 0x1012
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_ARGB8888_1X32 0x100d
+#define MEDIA_BUS_FMT_RGB888_1X32_PADHI 0x100f
+#define MEDIA_BUS_FMT_Y8_1X8 0x2001
+#define MEDIA_BUS_FMT_UV8_1X8 0x2015
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_UYVY8_1_5X8 0x2002
+#define MEDIA_BUS_FMT_VYUY8_1_5X8 0x2003
+#define MEDIA_BUS_FMT_YUYV8_1_5X8 0x2004
+#define MEDIA_BUS_FMT_YVYU8_1_5X8 0x2005
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_UYVY8_2X8 0x2006
+#define MEDIA_BUS_FMT_VYUY8_2X8 0x2007
+#define MEDIA_BUS_FMT_YUYV8_2X8 0x2008
+#define MEDIA_BUS_FMT_YVYU8_2X8 0x2009
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_Y10_1X10 0x200a
+#define MEDIA_BUS_FMT_UYVY10_2X10 0x2018
+#define MEDIA_BUS_FMT_VYUY10_2X10 0x2019
+#define MEDIA_BUS_FMT_YUYV10_2X10 0x200b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_YVYU10_2X10 0x200c
+#define MEDIA_BUS_FMT_Y12_1X12 0x2013
+#define MEDIA_BUS_FMT_UYVY12_2X12 0x201c
+#define MEDIA_BUS_FMT_VYUY12_2X12 0x201d
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_YUYV12_2X12 0x201e
+#define MEDIA_BUS_FMT_YVYU12_2X12 0x201f
+#define MEDIA_BUS_FMT_UYVY8_1X16 0x200f
+#define MEDIA_BUS_FMT_VYUY8_1X16 0x2010
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_YUYV8_1X16 0x2011
+#define MEDIA_BUS_FMT_YVYU8_1X16 0x2012
+#define MEDIA_BUS_FMT_YDYUYDYV8_1X16 0x2014
+#define MEDIA_BUS_FMT_UYVY10_1X20 0x201a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_VYUY10_1X20 0x201b
+#define MEDIA_BUS_FMT_YUYV10_1X20 0x200d
+#define MEDIA_BUS_FMT_YVYU10_1X20 0x200e
+#define MEDIA_BUS_FMT_VUY8_1X24 0x2024
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_YUV8_1X24 0x2025
+#define MEDIA_BUS_FMT_UYVY12_1X24 0x2020
+#define MEDIA_BUS_FMT_VYUY12_1X24 0x2021
+#define MEDIA_BUS_FMT_YUYV12_1X24 0x2022
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_YVYU12_1X24 0x2023
+#define MEDIA_BUS_FMT_YUV10_1X30 0x2016
+#define MEDIA_BUS_FMT_AYUV8_1X32 0x2017
+#define MEDIA_BUS_FMT_SBGGR8_1X8 0x3001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_SGBRG8_1X8 0x3013
+#define MEDIA_BUS_FMT_SGRBG8_1X8 0x3002
+#define MEDIA_BUS_FMT_SRGGB8_1X8 0x3014
+#define MEDIA_BUS_FMT_SBGGR10_ALAW8_1X8 0x3015
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_SGBRG10_ALAW8_1X8 0x3016
+#define MEDIA_BUS_FMT_SGRBG10_ALAW8_1X8 0x3017
+#define MEDIA_BUS_FMT_SRGGB10_ALAW8_1X8 0x3018
+#define MEDIA_BUS_FMT_SBGGR10_DPCM8_1X8 0x300b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_SGBRG10_DPCM8_1X8 0x300c
+#define MEDIA_BUS_FMT_SGRBG10_DPCM8_1X8 0x3009
+#define MEDIA_BUS_FMT_SRGGB10_DPCM8_1X8 0x300d
+#define MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_BE 0x3003
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_SBGGR10_2X8_PADHI_LE 0x3004
+#define MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_BE 0x3005
+#define MEDIA_BUS_FMT_SBGGR10_2X8_PADLO_LE 0x3006
+#define MEDIA_BUS_FMT_SBGGR10_1X10 0x3007
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_SGBRG10_1X10 0x300e
+#define MEDIA_BUS_FMT_SGRBG10_1X10 0x300a
+#define MEDIA_BUS_FMT_SRGGB10_1X10 0x300f
+#define MEDIA_BUS_FMT_SBGGR12_1X12 0x3008
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_SGBRG12_1X12 0x3010
+#define MEDIA_BUS_FMT_SGRBG12_1X12 0x3011
+#define MEDIA_BUS_FMT_SRGGB12_1X12 0x3012
+#define MEDIA_BUS_FMT_JPEG_1X8 0x4001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_BUS_FMT_S5C_UYVY_JPEG_1X8 0x5001
+#define MEDIA_BUS_FMT_AHSV8888_1X32 0x6001
+#endif
diff --git a/libc/kernel/uapi/linux/media.h b/libc/kernel/uapi/linux/media.h
index 5ad1330d0..9b9f46592 100644
--- a/libc/kernel/uapi/linux/media.h
+++ b/libc/kernel/uapi/linux/media.h
@@ -46,83 +46,95 @@ struct media_device_info {
#define MEDIA_ENT_T_DEVNODE_FB (MEDIA_ENT_T_DEVNODE + 2)
#define MEDIA_ENT_T_DEVNODE_ALSA (MEDIA_ENT_T_DEVNODE + 3)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define MEDIA_ENT_T_DEVNODE_DVB (MEDIA_ENT_T_DEVNODE + 4)
+#define MEDIA_ENT_T_DEVNODE_DVB_FE (MEDIA_ENT_T_DEVNODE + 4)
+#define MEDIA_ENT_T_DEVNODE_DVB_DEMUX (MEDIA_ENT_T_DEVNODE + 5)
+#define MEDIA_ENT_T_DEVNODE_DVB_DVR (MEDIA_ENT_T_DEVNODE + 6)
+#define MEDIA_ENT_T_DEVNODE_DVB_CA (MEDIA_ENT_T_DEVNODE + 7)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_ENT_T_DEVNODE_DVB_NET (MEDIA_ENT_T_DEVNODE + 8)
+#define MEDIA_ENT_T_DEVNODE_DVB MEDIA_ENT_T_DEVNODE_DVB_FE
#define MEDIA_ENT_T_V4L2_SUBDEV (2 << MEDIA_ENT_TYPE_SHIFT)
#define MEDIA_ENT_T_V4L2_SUBDEV_SENSOR (MEDIA_ENT_T_V4L2_SUBDEV + 1)
-#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH (MEDIA_ENT_T_V4L2_SUBDEV + 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MEDIA_ENT_T_V4L2_SUBDEV_FLASH (MEDIA_ENT_T_V4L2_SUBDEV + 2)
#define MEDIA_ENT_T_V4L2_SUBDEV_LENS (MEDIA_ENT_T_V4L2_SUBDEV + 3)
#define MEDIA_ENT_T_V4L2_SUBDEV_DECODER (MEDIA_ENT_T_V4L2_SUBDEV + 4)
+#define MEDIA_ENT_T_V4L2_SUBDEV_TUNER (MEDIA_ENT_T_V4L2_SUBDEV + 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MEDIA_ENT_FL_DEFAULT (1 << 0)
struct media_entity_desc {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 id;
char name[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
__u32 revision;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u32 group_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 pads;
__u16 links;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[4];
union {
- struct {
- __u32 major;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 minor;
- } v4l;
struct {
__u32 major;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 minor;
- } fb;
+ } dev;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
__u32 card;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 device;
__u32 subdevice;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} alsa;
- int dvb;
+ struct {
+ __u32 major;
+ __u32 minor;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } v4l;
+ struct {
+ __u32 major;
+ __u32 minor;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } fb;
+ int dvb;
__u8 raw[184];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define MEDIA_PAD_FL_SINK (1 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MEDIA_PAD_FL_SOURCE (1 << 1)
#define MEDIA_PAD_FL_MUST_CONNECT (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct media_pad_desc {
__u32 entity;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 index;
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[2];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MEDIA_LNK_FL_ENABLED (1 << 0)
#define MEDIA_LNK_FL_IMMUTABLE (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MEDIA_LNK_FL_DYNAMIC (1 << 2)
struct media_link_desc {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct media_pad_desc source;
struct media_pad_desc sink;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u32 reserved[2];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct media_links_enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 entity;
struct media_pad_desc __user * pads;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct media_link_desc __user * links;
__u32 reserved[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define MEDIA_IOC_DEVICE_INFO _IOWR('|', 0x00, struct media_device_info)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MEDIA_IOC_ENUM_ENTITIES _IOWR('|', 0x01, struct media_entity_desc)
#define MEDIA_IOC_ENUM_LINKS _IOWR('|', 0x02, struct media_links_enum)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MEDIA_IOC_SETUP_LINK _IOWR('|', 0x03, struct media_link_desc)
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/mei.h b/libc/kernel/uapi/linux/mei.h
index ac8031f20..4d3aec6be 100644
--- a/libc/kernel/uapi/linux/mei.h
+++ b/libc/kernel/uapi/linux/mei.h
@@ -34,5 +34,7 @@ struct mei_connect_client_data {
struct mei_client out_client_properties;
};
};
-#endif
+#define IOCTL_MEI_NOTIFY_SET _IOW('H', 0x02, __u32)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IOCTL_MEI_NOTIFY_GET _IOR('H', 0x03, __u32)
+#endif
diff --git a/libc/kernel/uapi/linux/membarrier.h b/libc/kernel/uapi/linux/membarrier.h
new file mode 100644
index 000000000..bdab8fb81
--- /dev/null
+++ b/libc/kernel/uapi/linux/membarrier.h
@@ -0,0 +1,26 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_MEMBARRIER_H
+#define _UAPI_LINUX_MEMBARRIER_H
+enum membarrier_cmd {
+ MEMBARRIER_CMD_QUERY = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MEMBARRIER_CMD_SHARED = (1 << 0),
+};
+#endif
diff --git a/libc/kernel/uapi/linux/mic_common.h b/libc/kernel/uapi/linux/mic_common.h
index 5a1735c4f..8715590ef 100644
--- a/libc/kernel/uapi/linux/mic_common.h
+++ b/libc/kernel/uapi/linux/mic_common.h
@@ -46,69 +46,70 @@ struct mic_device_ctrl {
struct mic_bootparam {
__le32 magic;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __s8 c2h_shutdown_db;
- __s8 h2c_shutdown_db;
__s8 h2c_config_db;
- __u8 shutdown_status;
+ __u8 node_id;
+ __u8 h2c_scif_db;
+ __u8 c2h_scif_db;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u8 shutdown_card;
+ __u64 scif_host_dma_addr;
+ __u64 scif_card_dma_addr;
} __attribute__((aligned(8)));
struct mic_device_page {
- struct mic_bootparam bootparam;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct mic_bootparam bootparam;
struct mic_device_desc desc[0];
};
struct mic_vqconfig {
- __le64 address;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le64 address;
__le64 used_address;
__le16 num;
} __attribute__((aligned(8)));
-#define MIC_VIRTIO_RING_ALIGN 4096
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MIC_VIRTIO_RING_ALIGN 4096
#define MIC_MAX_VRINGS 4
#define MIC_VRING_ENTRIES 128
#define MIC_MAX_VRING_ENTRIES 128
-#define MIC_MAX_DESC_BLK_SIZE 256
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MIC_MAX_DESC_BLK_SIZE 256
struct _mic_vring_info {
__u16 avail_idx;
__le32 magic;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct mic_vring {
struct vring vr;
struct _mic_vring_info * info;
- void * va;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ void * va;
int len;
};
#define mic_aligned_desc_size(d) __mic_align(mic_desc_size(d), 8)
-#ifndef INTEL_MIC_CARD
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef INTEL_MIC_CARD
#endif
#define MIC_DP_SIZE 4096
#define MIC_MAGIC 0xc0ffee00
-enum mic_states {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- MIC_OFFLINE = 0,
+enum mic_states {
+ MIC_READY = 0,
+ MIC_BOOTING,
MIC_ONLINE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
MIC_SHUTTING_DOWN,
+ MIC_RESETTING,
MIC_RESET_FAILED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- MIC_SUSPENDING,
- MIC_SUSPENDED,
MIC_LAST
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum mic_status {
MIC_NOP = 0,
MIC_CRASHED,
- MIC_HALTED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MIC_HALTED,
MIC_POWER_OFF,
MIC_RESTART,
MIC_STATUS_LAST
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#endif
diff --git a/libc/kernel/uapi/linux/mmc/ioctl.h b/libc/kernel/uapi/linux/mmc/ioctl.h
index 761f1d7ef..cd09b3e2e 100644
--- a/libc/kernel/uapi/linux/mmc/ioctl.h
+++ b/libc/kernel/uapi/linux/mmc/ioctl.h
@@ -41,6 +41,14 @@ struct mmc_ioc_cmd {
};
#define mmc_ioc_cmd_set_data(ic,ptr) ic.data_ptr = (__u64) (unsigned long) ptr
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct mmc_ioc_multi_cmd {
+ __u64 num_of_cmds;
+ struct mmc_ioc_cmd cmds[0];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MMC_IOC_CMD _IOWR(MMC_BLOCK_MAJOR, 0, struct mmc_ioc_cmd)
+#define MMC_IOC_MULTI_CMD _IOWR(MMC_BLOCK_MAJOR, 1, struct mmc_ioc_multi_cmd)
#define MMC_IOC_MAX_BYTES (512L * 256)
+#define MMC_IOC_MAX_CMDS 255
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/mpls.h b/libc/kernel/uapi/linux/mpls.h
index 64b427912..1a95a30f2 100644
--- a/libc/kernel/uapi/linux/mpls.h
+++ b/libc/kernel/uapi/linux/mpls.h
@@ -34,5 +34,16 @@ struct mpls_label {
#define MPLS_LS_S_SHIFT 8
#define MPLS_LS_TTL_MASK 0x000000FF
#define MPLS_LS_TTL_SHIFT 0
-#endif
+#define MPLS_LABEL_IPV4NULL 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MPLS_LABEL_RTALERT 1
+#define MPLS_LABEL_IPV6NULL 2
+#define MPLS_LABEL_IMPLNULL 3
+#define MPLS_LABEL_ENTROPY 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MPLS_LABEL_GAL 13
+#define MPLS_LABEL_OAMALERT 14
+#define MPLS_LABEL_EXTENSION 15
+#define MPLS_LABEL_FIRST_UNRESERVED 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/mpls_iptunnel.h b/libc/kernel/uapi/linux/mpls_iptunnel.h
new file mode 100644
index 000000000..865253c86
--- /dev/null
+++ b/libc/kernel/uapi/linux/mpls_iptunnel.h
@@ -0,0 +1,29 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_MPLS_IPTUNNEL_H
+#define _UAPI_LINUX_MPLS_IPTUNNEL_H
+enum {
+ MPLS_IPTUNNEL_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MPLS_IPTUNNEL_DST,
+ __MPLS_IPTUNNEL_MAX,
+};
+#define MPLS_IPTUNNEL_MAX (__MPLS_IPTUNNEL_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/msg.h b/libc/kernel/uapi/linux/msg.h
index ab94ef647..b455f0c54 100644
--- a/libc/kernel/uapi/linux/msg.h
+++ b/libc/kernel/uapi/linux/msg.h
@@ -63,17 +63,16 @@ struct msginfo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short msgseg;
};
-#define MSG_MEM_SCALE 32
-#define MSGMNI 16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MSGMNI 32000
#define MSGMAX 8192
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSGMNB 16384
#define MSGPOOL (MSGMNI * MSGMNB / 1024)
#define MSGTQL MSGMNB
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSGMAP MSGMNB
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MSGSSZ 16
#define __MSGSEG ((MSGPOOL * 1024) / MSGSSZ)
#define MSGSEG (__MSGSEG <= 0xffff ? __MSGSEG : 0xffff)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/nbd.h b/libc/kernel/uapi/linux/nbd.h
index 588fbd812..e24920b62 100644
--- a/libc/kernel/uapi/linux/nbd.h
+++ b/libc/kernel/uapi/linux/nbd.h
@@ -47,23 +47,22 @@ enum {
#define NBD_FLAG_SEND_FLUSH (1 << 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NBD_FLAG_SEND_TRIM (1 << 5)
-#define nbd_cmd(req) ((req)->cmd[0])
#define NBD_REQUEST_MAGIC 0x25609513
#define NBD_REPLY_MAGIC 0x67446698
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct nbd_request {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 magic;
__be32 type;
char handle[8];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be64 from;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 len;
} __attribute__((packed));
struct nbd_reply {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 magic;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 error;
char handle[8];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/ndctl.h b/libc/kernel/uapi/linux/ndctl.h
new file mode 100644
index 000000000..6626e24bd
--- /dev/null
+++ b/libc/kernel/uapi/linux/ndctl.h
@@ -0,0 +1,168 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __NDCTL_H__
+#define __NDCTL_H__
+#include <linux/types.h>
+struct nd_cmd_smart {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 status;
+ __u8 data[128];
+} __packed;
+struct nd_cmd_smart_threshold {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 status;
+ __u8 data[8];
+} __packed;
+struct nd_cmd_dimm_flags {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 status;
+ __u32 flags;
+} __packed;
+struct nd_cmd_get_config_size {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 status;
+ __u32 config_size;
+ __u32 max_xfer;
+} __packed;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nd_cmd_get_config_data_hdr {
+ __u32 in_offset;
+ __u32 in_length;
+ __u32 status;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 out_buf[0];
+} __packed;
+struct nd_cmd_set_config_hdr {
+ __u32 in_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 in_length;
+ __u8 in_buf[0];
+} __packed;
+struct nd_cmd_vendor_hdr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 opcode;
+ __u32 in_length;
+ __u8 in_buf[0];
+} __packed;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nd_cmd_vendor_tail {
+ __u32 status;
+ __u32 out_length;
+ __u8 out_buf[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __packed;
+struct nd_cmd_ars_cap {
+ __u64 address;
+ __u64 length;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 status;
+ __u32 max_ars_out;
+} __packed;
+struct nd_cmd_ars_start {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 address;
+ __u64 length;
+ __u16 type;
+ __u8 reserved[6];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 status;
+} __packed;
+struct nd_cmd_ars_status {
+ __u32 status;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 out_length;
+ __u64 address;
+ __u64 length;
+ __u16 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 num_records;
+ struct nd_ars_record {
+ __u32 handle;
+ __u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 err_address;
+ __u64 length;
+ } __packed records[0];
+} __packed;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ ND_CMD_IMPLEMENTED = 0,
+ ND_CMD_ARS_CAP = 1,
+ ND_CMD_ARS_START = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ND_CMD_ARS_STATUS = 3,
+ ND_CMD_SMART = 1,
+ ND_CMD_SMART_THRESHOLD = 2,
+ ND_CMD_DIMM_FLAGS = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ND_CMD_GET_CONFIG_SIZE = 4,
+ ND_CMD_GET_CONFIG_DATA = 5,
+ ND_CMD_SET_CONFIG_DATA = 6,
+ ND_CMD_VENDOR_EFFECT_LOG_SIZE = 7,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ND_CMD_VENDOR_EFFECT_LOG = 8,
+ ND_CMD_VENDOR = 9,
+};
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ND_ARS_VOLATILE = 1,
+ ND_ARS_PERSISTENT = 2,
+};
+#define ND_IOCTL 'N'
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ND_IOCTL_SMART _IOWR(ND_IOCTL, ND_CMD_SMART, struct nd_cmd_smart)
+#define ND_IOCTL_SMART_THRESHOLD _IOWR(ND_IOCTL, ND_CMD_SMART_THRESHOLD, struct nd_cmd_smart_threshold)
+#define ND_IOCTL_DIMM_FLAGS _IOWR(ND_IOCTL, ND_CMD_DIMM_FLAGS, struct nd_cmd_dimm_flags)
+#define ND_IOCTL_GET_CONFIG_SIZE _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_SIZE, struct nd_cmd_get_config_size)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ND_IOCTL_GET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_DATA, struct nd_cmd_get_config_data_hdr)
+#define ND_IOCTL_SET_CONFIG_DATA _IOWR(ND_IOCTL, ND_CMD_SET_CONFIG_DATA, struct nd_cmd_set_config_hdr)
+#define ND_IOCTL_VENDOR _IOWR(ND_IOCTL, ND_CMD_VENDOR, struct nd_cmd_vendor_hdr)
+#define ND_IOCTL_ARS_CAP _IOWR(ND_IOCTL, ND_CMD_ARS_CAP, struct nd_cmd_ars_cap)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ND_IOCTL_ARS_START _IOWR(ND_IOCTL, ND_CMD_ARS_START, struct nd_cmd_ars_start)
+#define ND_IOCTL_ARS_STATUS _IOWR(ND_IOCTL, ND_CMD_ARS_STATUS, struct nd_cmd_ars_status)
+#define ND_DEVICE_DIMM 1
+#define ND_DEVICE_REGION_PMEM 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ND_DEVICE_REGION_BLK 3
+#define ND_DEVICE_NAMESPACE_IO 4
+#define ND_DEVICE_NAMESPACE_PMEM 5
+#define ND_DEVICE_NAMESPACE_BLK 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nd_driver_flags {
+ ND_DRIVER_DIMM = 1 << ND_DEVICE_DIMM,
+ ND_DRIVER_REGION_PMEM = 1 << ND_DEVICE_REGION_PMEM,
+ ND_DRIVER_REGION_BLK = 1 << ND_DEVICE_REGION_BLK,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ND_DRIVER_NAMESPACE_IO = 1 << ND_DEVICE_NAMESPACE_IO,
+ ND_DRIVER_NAMESPACE_PMEM = 1 << ND_DEVICE_NAMESPACE_PMEM,
+ ND_DRIVER_NAMESPACE_BLK = 1 << ND_DEVICE_NAMESPACE_BLK,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ ND_MIN_NAMESPACE_SIZE = 0x00400000,
+};
+enum ars_masks {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ARS_STATUS_MASK = 0x0000FFFF,
+ ARS_EXT_STATUS_SHIFT = 16,
+};
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/neighbour.h b/libc/kernel/uapi/linux/neighbour.h
index c73c7f466..7af454a79 100644
--- a/libc/kernel/uapi/linux/neighbour.h
+++ b/libc/kernel/uapi/linux/neighbour.h
@@ -46,72 +46,77 @@ enum {
NDA_IFINDEX,
NDA_MASTER,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NDA_LINK_NETNSID,
__NDA_MAX
};
#define NDA_MAX (__NDA_MAX - 1)
-#define NTF_USE 0x01
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define NTF_PROXY 0x08
-#define NTF_ROUTER 0x80
+#define NTF_USE 0x01
#define NTF_SELF 0x02
#define NTF_MASTER 0x04
+#define NTF_PROXY 0x08
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NTF_EXT_LEARNED 0x10
+#define NTF_ROUTER 0x80
#define NUD_INCOMPLETE 0x01
#define NUD_REACHABLE 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NUD_STALE 0x04
#define NUD_DELAY 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NUD_PROBE 0x10
#define NUD_FAILED 0x20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NUD_NOARP 0x40
#define NUD_PERMANENT 0x80
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NUD_NONE 0x00
struct nda_cacheinfo {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ndm_confirmed;
__u32 ndm_used;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ndm_updated;
__u32 ndm_refcnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ndt_stats {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 ndts_allocs;
__u64 ndts_destroys;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 ndts_hash_grows;
__u64 ndts_res_failed;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 ndts_lookups;
__u64 ndts_hits;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 ndts_rcv_probes_mcast;
__u64 ndts_rcv_probes_ucast;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 ndts_periodic_gc_runs;
__u64 ndts_forced_gc_runs;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 ndts_table_fulls;
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_IFINDEX,
NDTPA_REFCNT,
NDTPA_REACHABLE_TIME,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_BASE_REACHABLE_TIME,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_RETRANS_TIME,
NDTPA_GC_STALETIME,
NDTPA_DELAY_PROBE_TIME,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_QUEUE_LEN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_APP_PROBES,
NDTPA_UCAST_PROBES,
NDTPA_MCAST_PROBES,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_ANYCAST_DELAY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_PROXY_DELAY,
NDTPA_PROXY_QLEN,
NDTPA_LOCKTIME,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NDTPA_QUEUE_LENBYTES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NDTPA_MCAST_REPROBES,
__NDTPA_MAX
};
#define NDTPA_MAX (__NDTPA_MAX - 1)
diff --git a/libc/kernel/uapi/linux/net_namespace.h b/libc/kernel/uapi/linux/net_namespace.h
new file mode 100644
index 000000000..c9fdd790a
--- /dev/null
+++ b/libc/kernel/uapi/linux/net_namespace.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_NET_NAMESPACE_H_
+#define _UAPI_LINUX_NET_NAMESPACE_H_
+enum {
+ NETNSA_NONE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETNSA_NSID_NOT_ASSIGNED - 1
+ NETNSA_NSID,
+ NETNSA_PID,
+ NETNSA_FD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NETNSA_MAX,
+};
+#define NETNSA_MAX (__NETNSA_MAX - 1)
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/net_tstamp.h b/libc/kernel/uapi/linux/net_tstamp.h
index 5dfd2ac44..045201ce1 100644
--- a/libc/kernel/uapi/linux/net_tstamp.h
+++ b/libc/kernel/uapi/linux/net_tstamp.h
@@ -33,42 +33,44 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
SOF_TIMESTAMPING_TX_SCHED = (1 << 8),
SOF_TIMESTAMPING_TX_ACK = (1 << 9),
- SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_TX_ACK,
- SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) | SOF_TIMESTAMPING_LAST
+ SOF_TIMESTAMPING_OPT_CMSG = (1 << 10),
+ SOF_TIMESTAMPING_OPT_TSONLY = (1 << 11),
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_TSONLY,
+ SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) | SOF_TIMESTAMPING_LAST
};
struct hwtstamp_config {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int flags;
int tx_type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int rx_filter;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum hwtstamp_tx_types {
HWTSTAMP_TX_OFF,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_TX_ON,
HWTSTAMP_TX_ONESTEP_SYNC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum hwtstamp_rx_filters {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_NONE,
HWTSTAMP_FILTER_ALL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_SOME,
HWTSTAMP_FILTER_PTP_V1_L4_EVENT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_PTP_V1_L4_SYNC,
HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_PTP_V2_L4_EVENT,
HWTSTAMP_FILTER_PTP_V2_L4_SYNC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ,
HWTSTAMP_FILTER_PTP_V2_L2_EVENT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_PTP_V2_L2_SYNC,
HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_PTP_V2_EVENT,
HWTSTAMP_FILTER_PTP_V2_SYNC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
HWTSTAMP_FILTER_PTP_V2_DELAY_REQ,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/netconf.h b/libc/kernel/uapi/linux/netconf.h
index a9bf21687..556ecaf74 100644
--- a/libc/kernel/uapi/linux/netconf.h
+++ b/libc/kernel/uapi/linux/netconf.h
@@ -33,11 +33,12 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NETCONFA_MC_FORWARDING,
NETCONFA_PROXY_NEIGH,
+ NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
__NETCONFA_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define NETCONFA_MAX (__NETCONFA_MAX - 1)
#define NETCONFA_IFINDEX_ALL - 1
#define NETCONFA_IFINDEX_DEFAULT - 2
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/netfilter.h b/libc/kernel/uapi/linux/netfilter.h
index b04daa456..2d85c027e 100644
--- a/libc/kernel/uapi/linux/netfilter.h
+++ b/libc/kernel/uapi/linux/netfilter.h
@@ -22,55 +22,64 @@
#include <linux/compiler.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/sysctl.h>
+#include <linux/in.h>
+#include <linux/in6.h>
#define NF_DROP 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NF_ACCEPT 1
#define NF_STOLEN 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NF_QUEUE 3
#define NF_REPEAT 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NF_STOP 5
#define NF_MAX_VERDICT NF_STOP
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NF_VERDICT_MASK 0x000000ff
#define NF_VERDICT_FLAG_QUEUE_BYPASS 0x00008000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NF_VERDICT_QMASK 0xffff0000
#define NF_VERDICT_QBITS 16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NF_QUEUE_NR(x) ((((x) << 16) & NF_VERDICT_QMASK) | NF_QUEUE)
#define NF_DROP_ERR(x) (((- x) << 16) | NF_DROP)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_UNKNOWN 0x4000
#define NFC_ALTERED 0x8000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NF_VERDICT_BITS 16
enum nf_inet_hooks {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NF_INET_PRE_ROUTING,
NF_INET_LOCAL_IN,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NF_INET_FORWARD,
NF_INET_LOCAL_OUT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NF_INET_POST_ROUTING,
NF_INET_NUMHOOKS
+};
+enum nf_dev_hooks {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NF_NETDEV_INGRESS,
+ NF_NETDEV_NUMHOOKS
};
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFPROTO_UNSPEC = 0,
NFPROTO_INET = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFPROTO_IPV4 = 2,
NFPROTO_ARP = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFPROTO_NETDEV = 5,
NFPROTO_BRIDGE = 7,
NFPROTO_IPV6 = 10,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFPROTO_DECNET = 12,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFPROTO_NUMPROTO,
};
union nf_inet_addr {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 all[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 ip;
__be32 ip6[4];
struct in_addr in;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct in6_addr in6;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif
diff --git a/libc/kernel/uapi/linux/netfilter/ipset/ip_set.h b/libc/kernel/uapi/linux/netfilter/ipset/ip_set.h
index 8210a7441..7459cb448 100644
--- a/libc/kernel/uapi/linux/netfilter/ipset/ip_set.h
+++ b/libc/kernel/uapi/linux/netfilter/ipset/ip_set.h
@@ -21,8 +21,8 @@
#include <linux/types.h>
#define IPSET_PROTOCOL 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define IPSET_MAX_COMMENT_SIZE 255
#define IPSET_MAXNAMELEN 32
+#define IPSET_MAX_COMMENT_SIZE 255
enum ipset_cmd {
IPSET_CMD_NONE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -261,11 +261,16 @@ enum {
IPSET_COUNTER_GT,
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-struct ip_set_counter_match {
+struct ip_set_counter_match0 {
__u8 op;
__u64 value;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ip_set_counter_match {
+ __aligned_u64 value;
+ __u8 op;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SO_IP_SET 83
union ip_set_name_index {
char name[IPSET_MAXNAMELEN];
diff --git a/libc/kernel/uapi/linux/netfilter/nf_conntrack_sctp.h b/libc/kernel/uapi/linux/netfilter/nf_conntrack_sctp.h
index f30c58ee2..dd7525a83 100644
--- a/libc/kernel/uapi/linux/netfilter/nf_conntrack_sctp.h
+++ b/libc/kernel/uapi/linux/netfilter/nf_conntrack_sctp.h
@@ -31,11 +31,14 @@ enum sctp_conntrack {
SCTP_CONNTRACK_SHUTDOWN_RECD,
SCTP_CONNTRACK_SHUTDOWN_ACK_SENT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SCTP_CONNTRACK_HEARTBEAT_SENT,
+ SCTP_CONNTRACK_HEARTBEAT_ACKED,
SCTP_CONNTRACK_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ip_ct_sctp {
enum sctp_conntrack state;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 vtag[IP_CT_DIR_MAX];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/netfilter/nf_conntrack_tcp.h b/libc/kernel/uapi/linux/netfilter/nf_conntrack_tcp.h
index 1af00d157..8ed4c297f 100644
--- a/libc/kernel/uapi/linux/netfilter/nf_conntrack_tcp.h
+++ b/libc/kernel/uapi/linux/netfilter/nf_conntrack_tcp.h
@@ -49,10 +49,11 @@ enum tcp_conntrack {
#define IP_CT_TCP_FLAG_BE_LIBERAL 0x08
#define IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED 0x10
#define IP_CT_TCP_FLAG_MAXACK_SET 0x20
-struct nf_ct_tcp_flags {
+#define IP_CT_EXP_CHALLENGE_ACK 0x40
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nf_ct_tcp_flags {
__u8 flags;
__u8 mask;
};
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/netfilter/nf_tables.h b/libc/kernel/uapi/linux/netfilter/nf_tables.h
index 58984af2d..72845498b 100644
--- a/libc/kernel/uapi/linux/netfilter/nf_tables.h
+++ b/libc/kernel/uapi/linux/netfilter/nf_tables.h
@@ -18,66 +18,91 @@
****************************************************************************/
#ifndef _LINUX_NF_TABLES_H
#define _LINUX_NF_TABLES_H
+#define NFT_TABLE_MAXNAMELEN 32
#define NFT_CHAIN_MAXNAMELEN 32
-#define NFT_USERDATA_MAXLEN 256
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFT_USERDATA_MAXLEN 256
enum nft_registers {
NFT_REG_VERDICT,
NFT_REG_1,
- NFT_REG_2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_REG_2,
NFT_REG_3,
NFT_REG_4,
- __NFT_REG_MAX
-};
+ __NFT_REG_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_REG32_00 = 8,
+ MFT_REG32_01,
+ NFT_REG32_02,
+ NFT_REG32_03,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_REG32_04,
+ NFT_REG32_05,
+ NFT_REG32_06,
+ NFT_REG32_07,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_REG32_08,
+ NFT_REG32_09,
+ NFT_REG32_10,
+ NFT_REG32_11,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_REG32_12,
+ NFT_REG32_13,
+ NFT_REG32_14,
+ NFT_REG32_15,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define NFT_REG_MAX (__NFT_REG_MAX - 1)
+#define NFT_REG_SIZE 16
+#define NFT_REG32_SIZE 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nft_verdicts {
NFT_CONTINUE = - 1,
NFT_BREAK = - 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_JUMP = - 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_GOTO = - 4,
NFT_RETURN = - 5,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nf_tables_msg_types {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_NEWTABLE,
NFT_MSG_GETTABLE,
NFT_MSG_DELTABLE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_NEWCHAIN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_GETCHAIN,
NFT_MSG_DELCHAIN,
NFT_MSG_NEWRULE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_GETRULE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_DELRULE,
NFT_MSG_NEWSET,
NFT_MSG_GETSET,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_DELSET,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_NEWSETELEM,
NFT_MSG_GETSETELEM,
NFT_MSG_DELSETELEM,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_NEWGEN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_MSG_GETGEN,
NFT_MSG_MAX,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nft_list_attributes {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_LIST_UNPEC,
NFTA_LIST_ELEM,
__NFTA_LIST_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFTA_LIST_MAX (__NFTA_LIST_MAX - 1)
enum nft_hook_attributes {
NFTA_HOOK_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_HOOK_HOOKNUM,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_HOOK_PRIORITY,
+ NFTA_HOOK_DEV,
__NFTA_HOOK_MAX
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -147,34 +172,39 @@ enum nft_set_flags {
NFT_SET_INTERVAL = 0x4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_SET_MAP = 0x8,
+ NFT_SET_TIMEOUT = 0x10,
+ NFT_SET_EVAL = 0x20,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nft_set_policies {
NFT_SET_POL_PERFORMANCE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_SET_POL_MEMORY,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nft_set_desc_attributes {
NFTA_SET_DESC_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_SET_DESC_SIZE,
__NFTA_SET_DESC_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NFTA_SET_DESC_MAX (__NFTA_SET_DESC_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nft_set_attributes {
NFTA_SET_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_SET_TABLE,
NFTA_SET_NAME,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_SET_FLAGS,
NFTA_SET_KEY_TYPE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_SET_KEY_LEN,
NFTA_SET_DATA_TYPE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_SET_DATA_LEN,
NFTA_SET_POLICY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_SET_DESC,
NFTA_SET_ID,
+ NFTA_SET_TIMEOUT,
+ NFTA_SET_GC_INTERVAL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NFTA_SET_MAX
};
@@ -189,6 +219,11 @@ enum nft_set_elem_attributes {
NFTA_SET_ELEM_KEY,
NFTA_SET_ELEM_DATA,
NFTA_SET_ELEM_FLAGS,
+ NFTA_SET_ELEM_TIMEOUT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_SET_ELEM_EXPIRATION,
+ NFTA_SET_ELEM_USERDATA,
+ NFTA_SET_ELEM_EXPR,
__NFTA_SET_ELEM_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
@@ -219,200 +254,230 @@ enum nft_data_attributes {
__NFTA_DATA_MAX
};
#define NFTA_DATA_MAX (__NFTA_DATA_MAX - 1)
-enum nft_verdict_attributes {
+#define NFT_DATA_VALUE_MAXLEN 64
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nft_verdict_attributes {
NFTA_VERDICT_UNSPEC,
NFTA_VERDICT_CODE,
NFTA_VERDICT_CHAIN,
- __NFTA_VERDICT_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NFTA_VERDICT_MAX
};
#define NFTA_VERDICT_MAX (__NFTA_VERDICT_MAX - 1)
enum nft_expr_attributes {
- NFTA_EXPR_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_EXPR_UNSPEC,
NFTA_EXPR_NAME,
NFTA_EXPR_DATA,
__NFTA_EXPR_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define NFTA_EXPR_MAX (__NFTA_EXPR_MAX - 1)
enum nft_immediate_attributes {
NFTA_IMMEDIATE_UNSPEC,
- NFTA_IMMEDIATE_DREG,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_IMMEDIATE_DREG,
NFTA_IMMEDIATE_DATA,
__NFTA_IMMEDIATE_MAX
};
-#define NFTA_IMMEDIATE_MAX (__NFTA_IMMEDIATE_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFTA_IMMEDIATE_MAX (__NFTA_IMMEDIATE_MAX - 1)
enum nft_bitwise_attributes {
NFTA_BITWISE_UNSPEC,
NFTA_BITWISE_SREG,
- NFTA_BITWISE_DREG,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_BITWISE_DREG,
NFTA_BITWISE_LEN,
NFTA_BITWISE_MASK,
NFTA_BITWISE_XOR,
- __NFTA_BITWISE_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NFTA_BITWISE_MAX
};
#define NFTA_BITWISE_MAX (__NFTA_BITWISE_MAX - 1)
enum nft_byteorder_ops {
- NFT_BYTEORDER_NTOH,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_BYTEORDER_NTOH,
NFT_BYTEORDER_HTON,
};
enum nft_byteorder_attributes {
- NFTA_BYTEORDER_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_BYTEORDER_UNSPEC,
NFTA_BYTEORDER_SREG,
NFTA_BYTEORDER_DREG,
NFTA_BYTEORDER_OP,
- NFTA_BYTEORDER_LEN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_BYTEORDER_LEN,
NFTA_BYTEORDER_SIZE,
__NFTA_BYTEORDER_MAX
};
-#define NFTA_BYTEORDER_MAX (__NFTA_BYTEORDER_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFTA_BYTEORDER_MAX (__NFTA_BYTEORDER_MAX - 1)
enum nft_cmp_ops {
NFT_CMP_EQ,
NFT_CMP_NEQ,
- NFT_CMP_LT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_CMP_LT,
NFT_CMP_LTE,
NFT_CMP_GT,
NFT_CMP_GTE,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nft_cmp_attributes {
NFTA_CMP_UNSPEC,
NFTA_CMP_SREG,
- NFTA_CMP_OP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_CMP_OP,
NFTA_CMP_DATA,
__NFTA_CMP_MAX
};
-#define NFTA_CMP_MAX (__NFTA_CMP_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFTA_CMP_MAX (__NFTA_CMP_MAX - 1)
enum nft_lookup_attributes {
NFTA_LOOKUP_UNSPEC,
NFTA_LOOKUP_SET,
- NFTA_LOOKUP_SREG,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_LOOKUP_SREG,
NFTA_LOOKUP_DREG,
NFTA_LOOKUP_SET_ID,
__NFTA_LOOKUP_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define NFTA_LOOKUP_MAX (__NFTA_LOOKUP_MAX - 1)
+enum nft_dynset_ops {
+ NFT_DYNSET_OP_ADD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_DYNSET_OP_UPDATE,
+};
+enum nft_dynset_attributes {
+ NFTA_DYNSET_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_DYNSET_SET_NAME,
+ NFTA_DYNSET_SET_ID,
+ NFTA_DYNSET_OP,
+ NFTA_DYNSET_SREG_KEY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_DYNSET_SREG_DATA,
+ NFTA_DYNSET_TIMEOUT,
+ NFTA_DYNSET_EXPR,
+ __NFTA_DYNSET_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define NFTA_DYNSET_MAX (__NFTA_DYNSET_MAX - 1)
enum nft_payload_bases {
NFT_PAYLOAD_LL_HEADER,
- NFT_PAYLOAD_NETWORK_HEADER,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_PAYLOAD_NETWORK_HEADER,
NFT_PAYLOAD_TRANSPORT_HEADER,
};
enum nft_payload_attributes {
- NFTA_PAYLOAD_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_PAYLOAD_UNSPEC,
NFTA_PAYLOAD_DREG,
NFTA_PAYLOAD_BASE,
NFTA_PAYLOAD_OFFSET,
- NFTA_PAYLOAD_LEN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_PAYLOAD_LEN,
__NFTA_PAYLOAD_MAX
};
#define NFTA_PAYLOAD_MAX (__NFTA_PAYLOAD_MAX - 1)
-enum nft_exthdr_attributes {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nft_exthdr_attributes {
NFTA_EXTHDR_UNSPEC,
NFTA_EXTHDR_DREG,
NFTA_EXTHDR_TYPE,
- NFTA_EXTHDR_OFFSET,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_EXTHDR_OFFSET,
NFTA_EXTHDR_LEN,
__NFTA_EXTHDR_MAX
};
-#define NFTA_EXTHDR_MAX (__NFTA_EXTHDR_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFTA_EXTHDR_MAX (__NFTA_EXTHDR_MAX - 1)
enum nft_meta_keys {
NFT_META_LEN,
NFT_META_PROTOCOL,
- NFT_META_PRIORITY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_META_PRIORITY,
NFT_META_MARK,
NFT_META_IIF,
NFT_META_OIF,
- NFT_META_IIFNAME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_META_IIFNAME,
NFT_META_OIFNAME,
NFT_META_IIFTYPE,
NFT_META_OIFTYPE,
- NFT_META_SKUID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_META_SKUID,
NFT_META_SKGID,
NFT_META_NFTRACE,
NFT_META_RTCLASSID,
- NFT_META_SECMARK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_META_SECMARK,
NFT_META_NFPROTO,
NFT_META_L4PROTO,
NFT_META_BRI_IIFNAME,
- NFT_META_BRI_OIFNAME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_META_BRI_OIFNAME,
NFT_META_PKTTYPE,
NFT_META_CPU,
NFT_META_IIFGROUP,
- NFT_META_OIFGROUP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFT_META_OIFGROUP,
+ NFT_META_CGROUP,
};
enum nft_meta_attributes {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_META_UNSPEC,
NFTA_META_DREG,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_META_KEY,
NFTA_META_SREG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NFTA_META_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFTA_META_MAX (__NFTA_META_MAX - 1)
enum nft_ct_keys {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_CT_STATE,
NFT_CT_DIRECTION,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_CT_STATUS,
NFT_CT_MARK,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_CT_SECMARK,
NFT_CT_EXPIRATION,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_CT_HELPER,
NFT_CT_L3PROTOCOL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_CT_SRC,
NFT_CT_DST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_CT_PROTOCOL,
NFT_CT_PROTO_SRC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFT_CT_PROTO_DST,
NFT_CT_LABELS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nft_ct_attributes {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_CT_UNSPEC,
NFTA_CT_DREG,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_CT_KEY,
NFTA_CT_DIRECTION,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_CT_SREG,
__NFTA_CT_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NFTA_CT_MAX (__NFTA_CT_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nft_limit_type {
+ NFT_LIMIT_PKTS,
+ NFT_LIMIT_PKT_BYTES
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nft_limit_attributes {
NFTA_LIMIT_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_LIMIT_RATE,
NFTA_LIMIT_UNIT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_LIMIT_BURST,
+ NFTA_LIMIT_TYPE,
__NFTA_LIMIT_MAX
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -506,11 +571,30 @@ enum nft_masq_attributes {
};
#define NFTA_MASQ_MAX (__NFTA_MASQ_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nft_redir_attributes {
+ NFTA_REDIR_UNSPEC,
+ NFTA_REDIR_REG_PROTO_MIN,
+ NFTA_REDIR_REG_PROTO_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFTA_REDIR_FLAGS,
+ __NFTA_REDIR_MAX
+};
+#define NFTA_REDIR_MAX (__NFTA_REDIR_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nft_dup_attributes {
+ NFTA_DUP_UNSPEC,
+ NFTA_DUP_SREG_ADDR,
+ NFTA_DUP_SREG_DEV,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NFTA_DUP_MAX
+};
+#define NFTA_DUP_MAX (__NFTA_DUP_MAX - 1)
enum nft_gen_attributes {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFTA_GEN_UNSPEC,
NFTA_GEN_ID,
__NFTA_GEN_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFTA_GEN_MAX (__NFTA_GEN_MAX - 1)
#endif
diff --git a/libc/kernel/uapi/linux/netfilter/nfnetlink_conntrack.h b/libc/kernel/uapi/linux/netfilter/nfnetlink_conntrack.h
index 88e404ba2..cde3340c7 100644
--- a/libc/kernel/uapi/linux/netfilter/nfnetlink_conntrack.h
+++ b/libc/kernel/uapi/linux/netfilter/nfnetlink_conntrack.h
@@ -86,228 +86,229 @@ enum ctattr_tuple {
CTA_TUPLE_IP,
CTA_TUPLE_PROTO,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_TUPLE_ZONE,
__CTA_TUPLE_MAX
};
#define CTA_TUPLE_MAX (__CTA_TUPLE_MAX - 1)
-enum ctattr_ip {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ctattr_ip {
CTA_IP_UNSPEC,
CTA_IP_V4_SRC,
CTA_IP_V4_DST,
- CTA_IP_V6_SRC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_IP_V6_SRC,
CTA_IP_V6_DST,
__CTA_IP_MAX
};
-#define CTA_IP_MAX (__CTA_IP_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CTA_IP_MAX (__CTA_IP_MAX - 1)
enum ctattr_l4proto {
CTA_PROTO_UNSPEC,
CTA_PROTO_NUM,
- CTA_PROTO_SRC_PORT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTO_SRC_PORT,
CTA_PROTO_DST_PORT,
CTA_PROTO_ICMP_ID,
CTA_PROTO_ICMP_TYPE,
- CTA_PROTO_ICMP_CODE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTO_ICMP_CODE,
CTA_PROTO_ICMPV6_ID,
CTA_PROTO_ICMPV6_TYPE,
CTA_PROTO_ICMPV6_CODE,
- __CTA_PROTO_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __CTA_PROTO_MAX
};
#define CTA_PROTO_MAX (__CTA_PROTO_MAX - 1)
enum ctattr_protoinfo {
- CTA_PROTOINFO_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTOINFO_UNSPEC,
CTA_PROTOINFO_TCP,
CTA_PROTOINFO_DCCP,
CTA_PROTOINFO_SCTP,
- __CTA_PROTOINFO_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __CTA_PROTOINFO_MAX
};
#define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1)
enum ctattr_protoinfo_tcp {
- CTA_PROTOINFO_TCP_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTOINFO_TCP_UNSPEC,
CTA_PROTOINFO_TCP_STATE,
CTA_PROTOINFO_TCP_WSCALE_ORIGINAL,
CTA_PROTOINFO_TCP_WSCALE_REPLY,
- CTA_PROTOINFO_TCP_FLAGS_ORIGINAL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTOINFO_TCP_FLAGS_ORIGINAL,
CTA_PROTOINFO_TCP_FLAGS_REPLY,
__CTA_PROTOINFO_TCP_MAX
};
-#define CTA_PROTOINFO_TCP_MAX (__CTA_PROTOINFO_TCP_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CTA_PROTOINFO_TCP_MAX (__CTA_PROTOINFO_TCP_MAX - 1)
enum ctattr_protoinfo_dccp {
CTA_PROTOINFO_DCCP_UNSPEC,
CTA_PROTOINFO_DCCP_STATE,
- CTA_PROTOINFO_DCCP_ROLE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTOINFO_DCCP_ROLE,
CTA_PROTOINFO_DCCP_HANDSHAKE_SEQ,
__CTA_PROTOINFO_DCCP_MAX,
};
-#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
enum ctattr_protoinfo_sctp {
CTA_PROTOINFO_SCTP_UNSPEC,
CTA_PROTOINFO_SCTP_STATE,
- CTA_PROTOINFO_SCTP_VTAG_ORIGINAL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTOINFO_SCTP_VTAG_ORIGINAL,
CTA_PROTOINFO_SCTP_VTAG_REPLY,
__CTA_PROTOINFO_SCTP_MAX
};
-#define CTA_PROTOINFO_SCTP_MAX (__CTA_PROTOINFO_SCTP_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CTA_PROTOINFO_SCTP_MAX (__CTA_PROTOINFO_SCTP_MAX - 1)
enum ctattr_counters {
CTA_COUNTERS_UNSPEC,
CTA_COUNTERS_PACKETS,
- CTA_COUNTERS_BYTES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_COUNTERS_BYTES,
CTA_COUNTERS32_PACKETS,
CTA_COUNTERS32_BYTES,
__CTA_COUNTERS_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define CTA_COUNTERS_MAX (__CTA_COUNTERS_MAX - 1)
enum ctattr_tstamp {
CTA_TIMESTAMP_UNSPEC,
- CTA_TIMESTAMP_START,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_TIMESTAMP_START,
CTA_TIMESTAMP_STOP,
__CTA_TIMESTAMP_MAX
};
-#define CTA_TIMESTAMP_MAX (__CTA_TIMESTAMP_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CTA_TIMESTAMP_MAX (__CTA_TIMESTAMP_MAX - 1)
enum ctattr_nat {
CTA_NAT_UNSPEC,
CTA_NAT_V4_MINIP,
-#define CTA_NAT_MINIP CTA_NAT_V4_MINIP
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CTA_NAT_MINIP CTA_NAT_V4_MINIP
CTA_NAT_V4_MAXIP,
#define CTA_NAT_MAXIP CTA_NAT_V4_MAXIP
CTA_NAT_PROTO,
- CTA_NAT_V6_MINIP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_NAT_V6_MINIP,
CTA_NAT_V6_MAXIP,
__CTA_NAT_MAX
};
-#define CTA_NAT_MAX (__CTA_NAT_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CTA_NAT_MAX (__CTA_NAT_MAX - 1)
enum ctattr_protonat {
CTA_PROTONAT_UNSPEC,
CTA_PROTONAT_PORT_MIN,
- CTA_PROTONAT_PORT_MAX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_PROTONAT_PORT_MAX,
__CTA_PROTONAT_MAX
};
#define CTA_PROTONAT_MAX (__CTA_PROTONAT_MAX - 1)
-enum ctattr_seqadj {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ctattr_seqadj {
CTA_SEQADJ_UNSPEC,
CTA_SEQADJ_CORRECTION_POS,
CTA_SEQADJ_OFFSET_BEFORE,
- CTA_SEQADJ_OFFSET_AFTER,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_SEQADJ_OFFSET_AFTER,
__CTA_SEQADJ_MAX
};
#define CTA_SEQADJ_MAX (__CTA_SEQADJ_MAX - 1)
-enum ctattr_natseq {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ctattr_natseq {
CTA_NAT_SEQ_UNSPEC,
CTA_NAT_SEQ_CORRECTION_POS,
CTA_NAT_SEQ_OFFSET_BEFORE,
- CTA_NAT_SEQ_OFFSET_AFTER,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_NAT_SEQ_OFFSET_AFTER,
__CTA_NAT_SEQ_MAX
};
#define CTA_NAT_SEQ_MAX (__CTA_NAT_SEQ_MAX - 1)
-enum ctattr_expect {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ctattr_expect {
CTA_EXPECT_UNSPEC,
CTA_EXPECT_MASTER,
CTA_EXPECT_TUPLE,
- CTA_EXPECT_MASK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_EXPECT_MASK,
CTA_EXPECT_TIMEOUT,
CTA_EXPECT_ID,
CTA_EXPECT_HELP_NAME,
- CTA_EXPECT_ZONE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_EXPECT_ZONE,
CTA_EXPECT_FLAGS,
CTA_EXPECT_CLASS,
CTA_EXPECT_NAT,
- CTA_EXPECT_FN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_EXPECT_FN,
__CTA_EXPECT_MAX
};
#define CTA_EXPECT_MAX (__CTA_EXPECT_MAX - 1)
-enum ctattr_expect_nat {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ctattr_expect_nat {
CTA_EXPECT_NAT_UNSPEC,
CTA_EXPECT_NAT_DIR,
CTA_EXPECT_NAT_TUPLE,
- __CTA_EXPECT_NAT_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __CTA_EXPECT_NAT_MAX
};
#define CTA_EXPECT_NAT_MAX (__CTA_EXPECT_NAT_MAX - 1)
enum ctattr_help {
- CTA_HELP_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_HELP_UNSPEC,
CTA_HELP_NAME,
CTA_HELP_INFO,
__CTA_HELP_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define CTA_HELP_MAX (__CTA_HELP_MAX - 1)
enum ctattr_secctx {
CTA_SECCTX_UNSPEC,
- CTA_SECCTX_NAME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_SECCTX_NAME,
__CTA_SECCTX_MAX
};
#define CTA_SECCTX_MAX (__CTA_SECCTX_MAX - 1)
-enum ctattr_stats_cpu {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ctattr_stats_cpu {
CTA_STATS_UNSPEC,
CTA_STATS_SEARCHED,
CTA_STATS_FOUND,
- CTA_STATS_NEW,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_STATS_NEW,
CTA_STATS_INVALID,
CTA_STATS_IGNORE,
CTA_STATS_DELETE,
- CTA_STATS_DELETE_LIST,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_STATS_DELETE_LIST,
CTA_STATS_INSERT,
CTA_STATS_INSERT_FAILED,
CTA_STATS_DROP,
- CTA_STATS_EARLY_DROP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_STATS_EARLY_DROP,
CTA_STATS_ERROR,
CTA_STATS_SEARCH_RESTART,
__CTA_STATS_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define CTA_STATS_MAX (__CTA_STATS_MAX - 1)
enum ctattr_stats_global {
CTA_STATS_GLOBAL_UNSPEC,
- CTA_STATS_GLOBAL_ENTRIES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_STATS_GLOBAL_ENTRIES,
__CTA_STATS_GLOBAL_MAX,
};
#define CTA_STATS_GLOBAL_MAX (__CTA_STATS_GLOBAL_MAX - 1)
-enum ctattr_expect_stats {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ctattr_expect_stats {
CTA_STATS_EXP_UNSPEC,
CTA_STATS_EXP_NEW,
CTA_STATS_EXP_CREATE,
- CTA_STATS_EXP_DELETE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_STATS_EXP_DELETE,
__CTA_STATS_EXP_MAX,
};
#define CTA_STATS_EXP_MAX (__CTA_STATS_EXP_MAX - 1)
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/netfilter/nfnetlink_cttimeout.h b/libc/kernel/uapi/linux/netfilter/nfnetlink_cttimeout.h
index 4c35ce0e5..74558ce2a 100644
--- a/libc/kernel/uapi/linux/netfilter/nfnetlink_cttimeout.h
+++ b/libc/kernel/uapi/linux/netfilter/nfnetlink_cttimeout.h
@@ -121,25 +121,28 @@ enum ctattr_timeout_sctp {
CTA_TIMEOUT_SCTP_SHUTDOWN_RECD,
CTA_TIMEOUT_SCTP_SHUTDOWN_ACK_SENT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CTA_TIMEOUT_SCTP_HEARTBEAT_SENT,
+ CTA_TIMEOUT_SCTP_HEARTBEAT_ACKED,
__CTA_TIMEOUT_SCTP_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CTA_TIMEOUT_SCTP_MAX (__CTA_TIMEOUT_SCTP_MAX - 1)
enum ctattr_timeout_icmpv6 {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
CTA_TIMEOUT_ICMPV6_UNSPEC,
CTA_TIMEOUT_ICMPV6_TIMEOUT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__CTA_TIMEOUT_ICMPV6_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CTA_TIMEOUT_ICMPV6_MAX (__CTA_TIMEOUT_ICMPV6_MAX - 1)
enum ctattr_timeout_gre {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
CTA_TIMEOUT_GRE_UNSPEC,
CTA_TIMEOUT_GRE_UNREPLIED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
CTA_TIMEOUT_GRE_REPLIED,
__CTA_TIMEOUT_GRE_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define CTA_TIMEOUT_GRE_MAX (__CTA_TIMEOUT_GRE_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CTNL_TIMEOUT_NAME_MAX 32
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/netfilter/nfnetlink_log.h b/libc/kernel/uapi/linux/netfilter/nfnetlink_log.h
index c5345fd86..016414c73 100644
--- a/libc/kernel/uapi/linux/netfilter/nfnetlink_log.h
+++ b/libc/kernel/uapi/linux/netfilter/nfnetlink_log.h
@@ -68,47 +68,51 @@ enum nfulnl_attr_type {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFULA_HWHEADER,
NFULA_HWLEN,
+ NFULA_CT,
+ NFULA_CT_INFO,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NFULA_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFULA_MAX (__NFULA_MAX - 1)
enum nfulnl_msg_config_cmds {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFULNL_CFG_CMD_NONE,
NFULNL_CFG_CMD_BIND,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFULNL_CFG_CMD_UNBIND,
NFULNL_CFG_CMD_PF_BIND,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFULNL_CFG_CMD_PF_UNBIND,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct nfulnl_msg_config_cmd {
__u8 command;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct nfulnl_msg_config_mode {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 copy_range;
__u8 copy_mode;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 _pad;
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nfulnl_attr_config {
NFULA_CFG_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFULA_CFG_CMD,
NFULA_CFG_MODE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFULA_CFG_NLBUFSIZ,
NFULA_CFG_TIMEOUT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFULA_CFG_QTHRESH,
NFULA_CFG_FLAGS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NFULA_CFG_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFULA_CFG_MAX (__NFULA_CFG_MAX - 1)
#define NFULNL_COPY_NONE 0x00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFULNL_COPY_META 0x01
#define NFULNL_COPY_PACKET 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFULNL_CFG_F_SEQ 0x0001
#define NFULNL_CFG_F_SEQ_GLOBAL 0x0002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFULNL_CFG_F_CONNTRACK 0x0004
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/netfilter/nfnetlink_queue.h b/libc/kernel/uapi/linux/netfilter/nfnetlink_queue.h
index 694636b5c..8a09ef21d 100644
--- a/libc/kernel/uapi/linux/netfilter/nfnetlink_queue.h
+++ b/libc/kernel/uapi/linux/netfilter/nfnetlink_queue.h
@@ -71,61 +71,64 @@ enum nfqnl_attr_type {
NFQA_UID,
NFQA_GID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFQA_SECCTX,
__NFQA_MAX
};
#define NFQA_MAX (__NFQA_MAX - 1)
-struct nfqnl_msg_verdict_hdr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nfqnl_msg_verdict_hdr {
__be32 verdict;
__be32 id;
};
-enum nfqnl_msg_config_cmds {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nfqnl_msg_config_cmds {
NFQNL_CFG_CMD_NONE,
NFQNL_CFG_CMD_BIND,
NFQNL_CFG_CMD_UNBIND,
- NFQNL_CFG_CMD_PF_BIND,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFQNL_CFG_CMD_PF_BIND,
NFQNL_CFG_CMD_PF_UNBIND,
};
struct nfqnl_msg_config_cmd {
- __u8 command;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 command;
__u8 _pad;
__be16 pf;
};
-enum nfqnl_config_mode {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nfqnl_config_mode {
NFQNL_COPY_NONE,
NFQNL_COPY_META,
NFQNL_COPY_PACKET,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct nfqnl_msg_config_params {
__be32 copy_range;
__u8 copy_mode;
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
enum nfqnl_attr_config {
NFQA_CFG_UNSPEC,
NFQA_CFG_CMD,
- NFQA_CFG_PARAMS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFQA_CFG_PARAMS,
NFQA_CFG_QUEUE_MAXLEN,
NFQA_CFG_MASK,
NFQA_CFG_FLAGS,
- __NFQA_CFG_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NFQA_CFG_MAX
};
#define NFQA_CFG_MAX (__NFQA_CFG_MAX - 1)
#define NFQA_CFG_F_FAIL_OPEN (1 << 0)
-#define NFQA_CFG_F_CONNTRACK (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFQA_CFG_F_CONNTRACK (1 << 1)
#define NFQA_CFG_F_GSO (1 << 2)
#define NFQA_CFG_F_UID_GID (1 << 3)
-#define NFQA_CFG_F_MAX (1 << 4)
-#define NFQA_SKB_CSUMNOTREADY (1 << 0)
+#define NFQA_CFG_F_SECCTX (1 << 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFQA_CFG_F_MAX (1 << 5)
+#define NFQA_SKB_CSUMNOTREADY (1 << 0)
#define NFQA_SKB_GSO (1 << 1)
#define NFQA_SKB_CSUM_NOTVERIFIED (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/netfilter/xt_CT.h b/libc/kernel/uapi/linux/netfilter/xt_CT.h
index 03d20930a..26ee66871 100644
--- a/libc/kernel/uapi/linux/netfilter/xt_CT.h
+++ b/libc/kernel/uapi/linux/netfilter/xt_CT.h
@@ -23,28 +23,32 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XT_CT_NOTRACK = 1 << 0,
XT_CT_NOTRACK_ALIAS = 1 << 1,
- XT_CT_MASK = XT_CT_NOTRACK | XT_CT_NOTRACK_ALIAS,
-};
+ XT_CT_ZONE_DIR_ORIG = 1 << 2,
+ XT_CT_ZONE_DIR_REPL = 1 << 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ XT_CT_ZONE_MARK = 1 << 4,
+ XT_CT_MASK = XT_CT_NOTRACK | XT_CT_NOTRACK_ALIAS | XT_CT_ZONE_DIR_ORIG | XT_CT_ZONE_DIR_REPL | XT_CT_ZONE_MARK,
+};
struct xt_ct_target_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 flags;
__u16 zone;
__u32 ct_events;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 exp_events;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char helper[16];
struct nf_conn * ct __attribute__((aligned(8)));
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xt_ct_target_info_v1 {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 flags;
__u16 zone;
__u32 ct_events;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 exp_events;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char helper[16];
char timeout[32];
struct nf_conn * ct __attribute__((aligned(8)));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/netfilter/xt_set.h b/libc/kernel/uapi/linux/netfilter/xt_set.h
index 5a2fe0171..5ae39ecea 100644
--- a/libc/kernel/uapi/linux/netfilter/xt_set.h
+++ b/libc/kernel/uapi/linux/netfilter/xt_set.h
@@ -72,8 +72,8 @@ struct xt_set_info_target_v2 {
struct xt_set_info_match_v3 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xt_set_info match_set;
- struct ip_set_counter_match packets;
- struct ip_set_counter_match bytes;
+ struct ip_set_counter_match0 packets;
+ struct ip_set_counter_match0 bytes;
__u32 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
@@ -86,4 +86,11 @@ struct xt_set_info_target_v3 {
__u32 timeout;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct xt_set_info_match_v4 {
+ struct xt_set_info match_set;
+ struct ip_set_counter_match packets;
+ struct ip_set_counter_match bytes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
+};
#endif
diff --git a/libc/kernel/uapi/linux/netfilter/xt_socket.h b/libc/kernel/uapi/linux/netfilter/xt_socket.h
index ff57d2037..06c834aa6 100644
--- a/libc/kernel/uapi/linux/netfilter/xt_socket.h
+++ b/libc/kernel/uapi/linux/netfilter/xt_socket.h
@@ -23,16 +23,22 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XT_SOCKET_TRANSPARENT = 1 << 0,
XT_SOCKET_NOWILDCARD = 1 << 1,
+ XT_SOCKET_RESTORESKMARK = 1 << 2,
};
-struct xt_socket_mtinfo1 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct xt_socket_mtinfo1 {
__u8 flags;
};
#define XT_SOCKET_FLAGS_V1 XT_SOCKET_TRANSPARENT
-struct xt_socket_mtinfo2 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct xt_socket_mtinfo2 {
__u8 flags;
};
#define XT_SOCKET_FLAGS_V2 (XT_SOCKET_TRANSPARENT | XT_SOCKET_NOWILDCARD)
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct xt_socket_mtinfo3 {
+ __u8 flags;
+};
+#define XT_SOCKET_FLAGS_V3 (XT_SOCKET_TRANSPARENT | XT_SOCKET_NOWILDCARD | XT_SOCKET_RESTORESKMARK)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h b/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h
index 6b201a343..aab8490ae 100644
--- a/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h
+++ b/libc/kernel/uapi/linux/netfilter_bridge/ebtables.h
@@ -18,158 +18,155 @@
****************************************************************************/
#ifndef _UAPI__LINUX_BRIDGE_EFF_H
#define _UAPI__LINUX_BRIDGE_EFF_H
-#include <linux/if.h>
#include <linux/netfilter_bridge.h>
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#include <linux/if_ether.h>
#define EBT_TABLE_MAXNAMELEN 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_CHAIN_MAXNAMELEN EBT_TABLE_MAXNAMELEN
#define EBT_FUNCTION_MAXNAMELEN EBT_TABLE_MAXNAMELEN
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_ACCEPT - 1
#define EBT_DROP - 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_CONTINUE - 3
#define EBT_RETURN - 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NUM_STANDARD_TARGETS 4
#define EBT_VERDICT_BITS 0x0000000F
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xt_match;
struct xt_target;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_counter {
uint64_t pcnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t bcnt;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_replace {
char name[EBT_TABLE_MAXNAMELEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int valid_hooks;
unsigned int nentries;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int entries_size;
struct ebt_entries __user * hook_entry[NF_BR_NUMHOOKS];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int num_counters;
struct ebt_counter __user * counters;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char __user * entries;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_replace_kernel {
char name[EBT_TABLE_MAXNAMELEN];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int valid_hooks;
unsigned int nentries;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int entries_size;
struct ebt_entries * hook_entry[NF_BR_NUMHOOKS];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int num_counters;
struct ebt_counter * counters;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char * entries;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_entries {
unsigned int distinguisher;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char name[EBT_CHAIN_MAXNAMELEN];
unsigned int counter_offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int policy;
unsigned int nentries;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char data[0] __attribute__((aligned(__alignof__(struct ebt_replace))));
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_ENTRY_OR_ENTRIES 0x01
#define EBT_NOPROTO 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_802_3 0x04
#define EBT_SOURCEMAC 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_DESTMAC 0x10
#define EBT_F_MASK (EBT_NOPROTO | EBT_802_3 | EBT_SOURCEMAC | EBT_DESTMAC | EBT_ENTRY_OR_ENTRIES)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_IPROTO 0x01
#define EBT_IIN 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_IOUT 0x04
#define EBT_ISOURCE 0x8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_IDEST 0x10
#define EBT_ILOGICALIN 0x20
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_ILOGICALOUT 0x40
#define EBT_INV_MASK (EBT_IPROTO | EBT_IIN | EBT_IOUT | EBT_ILOGICALIN | EBT_ILOGICALOUT | EBT_ISOURCE | EBT_IDEST)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_entry_match {
union {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char name[EBT_FUNCTION_MAXNAMELEN];
struct xt_match * match;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} u;
unsigned int match_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char data[0] __attribute__((aligned(__alignof__(struct ebt_replace))));
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_entry_watcher {
union {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char name[EBT_FUNCTION_MAXNAMELEN];
struct xt_target * watcher;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} u;
unsigned int watcher_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char data[0] __attribute__((aligned(__alignof__(struct ebt_replace))));
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_entry_target {
union {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char name[EBT_FUNCTION_MAXNAMELEN];
struct xt_target * target;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} u;
unsigned int target_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char data[0] __attribute__((aligned(__alignof__(struct ebt_replace))));
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_STANDARD_TARGET "standard"
struct ebt_standard_target {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ebt_entry_target target;
int verdict;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ebt_entry {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int bitmask;
unsigned int invflags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 ethproto;
char in[IFNAMSIZ];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char logical_in[IFNAMSIZ];
char out[IFNAMSIZ];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char logical_out[IFNAMSIZ];
unsigned char sourcemac[ETH_ALEN];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char sourcemsk[ETH_ALEN];
unsigned char destmac[ETH_ALEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char destmsk[ETH_ALEN];
unsigned int watchers_offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int target_offset;
unsigned int next_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char elems[0] __attribute__((aligned(__alignof__(struct ebt_replace))));
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_BASE_CTL 128
#define EBT_SO_SET_ENTRIES (EBT_BASE_CTL)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_SO_SET_COUNTERS (EBT_SO_SET_ENTRIES + 1)
#define EBT_SO_SET_MAX (EBT_SO_SET_COUNTERS + 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_SO_GET_INFO (EBT_BASE_CTL)
#define EBT_SO_GET_ENTRIES (EBT_SO_GET_INFO + 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_SO_GET_INIT_INFO (EBT_SO_GET_ENTRIES + 1)
#define EBT_SO_GET_INIT_ENTRIES (EBT_SO_GET_INIT_INFO + 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_SO_GET_MAX (EBT_SO_GET_INIT_ENTRIES + 1)
#define EBT_MATCH_ITERATE(e,fn,args...) \
({ unsigned int __i; int __ret = 0; struct ebt_entry_match * __match; for(__i = sizeof(struct ebt_entry); __i < (e)->watchers_offset; __i += __match->match_size + sizeof(struct ebt_entry_match)) { __match = (void *) (e) + __i; __ret = fn(__match, ##args); if(__ret != 0) break; } if(__ret == 0) { if(__i != (e)->watchers_offset) __ret = - EINVAL; } __ret; \
})
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EBT_WATCHER_ITERATE(e,fn,args...) \
({ unsigned int __i; int __ret = 0; struct ebt_entry_watcher * __watcher; for(__i = e->watchers_offset; __i < (e)->target_offset; __i += __watcher->watcher_size + sizeof(struct ebt_entry_watcher)) { __watcher = (void *) (e) + __i; __ret = fn(__watcher, ##args); if(__ret != 0) break; } if(__ret == 0) { if(__i != (e)->target_offset) __ret = - EINVAL; } __ret; \
})
#define EBT_ENTRY_ITERATE(entries,size,fn,args...) \
({ unsigned int __i; int __ret = 0; struct ebt_entry * __entry; for(__i = 0; __i < (size);) { __entry = (void *) (entries) + __i; __ret = fn(__entry, ##args); if(__ret != 0) break; if(__entry->bitmask != 0) __i += __entry->next_offset; else __i += sizeof(struct ebt_entries); } if(__ret == 0) { if(__i != (size)) __ret = - EINVAL; } __ret; \
})
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/netfilter_ipv6/ip6t_REJECT.h b/libc/kernel/uapi/linux/netfilter_ipv6/ip6t_REJECT.h
index afe5cd5f7..cf342dcec 100644
--- a/libc/kernel/uapi/linux/netfilter_ipv6/ip6t_REJECT.h
+++ b/libc/kernel/uapi/linux/netfilter_ipv6/ip6t_REJECT.h
@@ -28,11 +28,13 @@ enum ip6t_reject_with {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IP6T_ICMP6_PORT_UNREACH,
IP6T_ICMP6_ECHOREPLY,
- IP6T_TCP_RESET
-};
+ IP6T_TCP_RESET,
+ IP6T_ICMP6_POLICY_FAIL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ IP6T_ICMP6_REJECT_ROUTE
+};
struct ip6t_reject_info {
__u32 with;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/netlink.h b/libc/kernel/uapi/linux/netlink.h
index bcaf02011..bcdac4720 100644
--- a/libc/kernel/uapi/linux/netlink.h
+++ b/libc/kernel/uapi/linux/netlink.h
@@ -73,47 +73,52 @@ struct nlmsghdr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NLM_F_ECHO 8
#define NLM_F_DUMP_INTR 16
+#define NLM_F_DUMP_FILTERED 32
#define NLM_F_ROOT 0x100
-#define NLM_F_MATCH 0x200
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLM_F_MATCH 0x200
#define NLM_F_ATOMIC 0x400
#define NLM_F_DUMP (NLM_F_ROOT | NLM_F_MATCH)
#define NLM_F_REPLACE 0x100
-#define NLM_F_EXCL 0x200
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLM_F_EXCL 0x200
#define NLM_F_CREATE 0x400
#define NLM_F_APPEND 0x800
#define NLMSG_ALIGNTO 4U
-#define NLMSG_ALIGN(len) (((len) + NLMSG_ALIGNTO - 1) & ~(NLMSG_ALIGNTO - 1))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLMSG_ALIGN(len) (((len) + NLMSG_ALIGNTO - 1) & ~(NLMSG_ALIGNTO - 1))
#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr)))
#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN)
#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))
-#define NLMSG_DATA(nlh) ((void *) (((char *) nlh) + NLMSG_LENGTH(0)))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLMSG_DATA(nlh) ((void *) (((char *) nlh) + NLMSG_LENGTH(0)))
#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), (struct nlmsghdr *) (((char *) (nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len)))
#define NLMSG_OK(nlh,len) ((len) >= (int) sizeof(struct nlmsghdr) && (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && (nlh)->nlmsg_len <= (len))
#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len)))
-#define NLMSG_NOOP 0x1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLMSG_NOOP 0x1
#define NLMSG_ERROR 0x2
#define NLMSG_DONE 0x3
#define NLMSG_OVERRUN 0x4
-#define NLMSG_MIN_TYPE 0x10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NLMSG_MIN_TYPE 0x10
struct nlmsgerr {
int error;
struct nlmsghdr msg;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define NETLINK_ADD_MEMBERSHIP 1
#define NETLINK_DROP_MEMBERSHIP 2
#define NETLINK_PKTINFO 3
-#define NETLINK_BROADCAST_ERROR 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_BROADCAST_ERROR 4
#define NETLINK_NO_ENOBUFS 5
#define NETLINK_RX_RING 6
#define NETLINK_TX_RING 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETLINK_LISTEN_ALL_NSID 8
+#define NETLINK_LIST_MEMBERSHIPS 9
+#define NETLINK_CAP_ACK 10
struct nl_pktinfo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 group;
diff --git a/libc/kernel/uapi/linux/nfc.h b/libc/kernel/uapi/linux/nfc.h
index 7a83ac705..1894e92b1 100644
--- a/libc/kernel/uapi/linux/nfc.h
+++ b/libc/kernel/uapi/linux/nfc.h
@@ -61,141 +61,154 @@ enum nfc_commands {
NFC_CMD_GET_SE,
NFC_CMD_SE_IO,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFC_CMD_ACTIVATE_TARGET,
+ NFC_CMD_VENDOR,
__NFC_CMD_AFTER_LAST
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_CMD_MAX (__NFC_CMD_AFTER_LAST - 1)
enum nfc_attrs {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_UNSPEC,
NFC_ATTR_DEVICE_INDEX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_DEVICE_NAME,
NFC_ATTR_PROTOCOLS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_TARGET_INDEX,
NFC_ATTR_TARGET_SENS_RES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_TARGET_SEL_RES,
NFC_ATTR_TARGET_NFCID1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_TARGET_SENSB_RES,
NFC_ATTR_TARGET_SENSF_RES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_COMM_MODE,
NFC_ATTR_RF_MODE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_DEVICE_POWERED,
NFC_ATTR_IM_PROTOCOLS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_TM_PROTOCOLS,
NFC_ATTR_LLC_PARAM_LTO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_LLC_PARAM_RW,
NFC_ATTR_LLC_PARAM_MIUX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_SE,
NFC_ATTR_LLC_SDP,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_FIRMWARE_NAME,
NFC_ATTR_SE_INDEX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_SE_TYPE,
NFC_ATTR_SE_AID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_FIRMWARE_DOWNLOAD_STATUS,
NFC_ATTR_SE_APDU,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_ATTR_TARGET_ISO15693_DSFID,
NFC_ATTR_TARGET_ISO15693_UID,
+ NFC_ATTR_SE_PARAMS,
+ NFC_ATTR_VENDOR_ID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFC_ATTR_VENDOR_SUBCMD,
+ NFC_ATTR_VENDOR_DATA,
__NFC_ATTR_AFTER_LAST
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_ATTR_MAX (__NFC_ATTR_AFTER_LAST - 1)
enum nfc_sdp_attr {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_SDP_ATTR_UNSPEC,
NFC_SDP_ATTR_URI,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NFC_SDP_ATTR_SAP,
__NFC_SDP_ATTR_AFTER_LAST
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NFC_SDP_ATTR_MAX (__NFC_SDP_ATTR_AFTER_LAST - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_DEVICE_NAME_MAXSIZE 8
#define NFC_NFCID1_MAXSIZE 10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_NFCID2_MAXSIZE 8
#define NFC_NFCID3_MAXSIZE 10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_SENSB_RES_MAXSIZE 12
#define NFC_SENSF_RES_MAXSIZE 18
+#define NFC_ATR_REQ_MAXSIZE 64
+#define NFC_ATR_RES_MAXSIZE 64
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFC_ATR_REQ_GB_MAXSIZE 48
+#define NFC_ATR_RES_GB_MAXSIZE 47
#define NFC_GB_MAXSIZE 48
#define NFC_FIRMWARE_NAME_MAXSIZE 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_ISO15693_UID_MAXSIZE 8
#define NFC_PROTO_JEWEL 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_MIFARE 2
#define NFC_PROTO_FELICA 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_ISO14443 4
#define NFC_PROTO_NFC_DEP 5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_ISO14443_B 6
#define NFC_PROTO_ISO15693 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_MAX 8
#define NFC_COMM_ACTIVE 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_COMM_PASSIVE 1
#define NFC_RF_INITIATOR 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_RF_TARGET 1
#define NFC_RF_NONE 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_JEWEL_MASK (1 << NFC_PROTO_JEWEL)
#define NFC_PROTO_MIFARE_MASK (1 << NFC_PROTO_MIFARE)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_FELICA_MASK (1 << NFC_PROTO_FELICA)
#define NFC_PROTO_ISO14443_MASK (1 << NFC_PROTO_ISO14443)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_NFC_DEP_MASK (1 << NFC_PROTO_NFC_DEP)
#define NFC_PROTO_ISO14443_B_MASK (1 << NFC_PROTO_ISO14443_B)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_PROTO_ISO15693_MASK (1 << NFC_PROTO_ISO15693)
#define NFC_SE_UICC 0x1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_SE_EMBEDDED 0x2
#define NFC_SE_DISABLED 0x0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_SE_ENABLED 0x1
struct sockaddr_nfc {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
sa_family_t sa_family;
__u32 dev_idx;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 target_idx;
__u32 nfc_protocol;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NFC_LLCP_MAX_SERVICE_NAME 63
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct sockaddr_nfc_llcp {
sa_family_t sa_family;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 dev_idx;
__u32 target_idx;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 nfc_protocol;
__u8 dsap;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 ssap;
char service_name[NFC_LLCP_MAX_SERVICE_NAME];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
;
size_t service_name_len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NFC_SOCKPROTO_RAW 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_SOCKPROTO_LLCP 1
#define NFC_SOCKPROTO_MAX 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_HEADER_SIZE 1
#define NFC_RAW_HEADER_SIZE 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_DIRECTION_RX 0x00
#define NFC_DIRECTION_TX 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RAW_PAYLOAD_LLCP 0
#define RAW_PAYLOAD_NCI 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RAW_PAYLOAD_HCI 2
#define RAW_PAYLOAD_DIGITAL 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RAW_PAYLOAD_PROPRIETARY 4
#define NFC_LLCP_RW 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_LLCP_MIUX 1
#define NFC_LLCP_REMOTE_MIU 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFC_LLCP_REMOTE_LTO 3
#define NFC_LLCP_REMOTE_RW 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/nfs.h b/libc/kernel/uapi/linux/nfs.h
index 27083a209..0d546e164 100644
--- a/libc/kernel/uapi/linux/nfs.h
+++ b/libc/kernel/uapi/linux/nfs.h
@@ -18,137 +18,138 @@
****************************************************************************/
#ifndef _UAPI_LINUX_NFS_H
#define _UAPI_LINUX_NFS_H
+#include <linux/types.h>
#define NFS_PROGRAM 100003
-#define NFS_PORT 2049
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFS_PORT 2049
#define NFS_MAXDATA 8192
#define NFS_MAXPATHLEN 1024
#define NFS_MAXNAMLEN 255
-#define NFS_MAXGROUPS 16
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFS_MAXGROUPS 16
#define NFS_FHSIZE 32
#define NFS_COOKIESIZE 4
#define NFS_FIFO_DEV (- 1)
-#define NFSMODE_FMT 0170000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFSMODE_FMT 0170000
#define NFSMODE_DIR 0040000
#define NFSMODE_CHR 0020000
#define NFSMODE_BLK 0060000
-#define NFSMODE_REG 0100000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFSMODE_REG 0100000
#define NFSMODE_LNK 0120000
#define NFSMODE_SOCK 0140000
#define NFSMODE_FIFO 0010000
-#define NFS_MNT_PROGRAM 100005
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFS_MNT_PROGRAM 100005
#define NFS_MNT_VERSION 1
#define NFS_MNT3_VERSION 3
#define NFS_PIPE_DIRNAME "nfs"
-enum nfs_stat {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nfs_stat {
NFS_OK = 0,
NFSERR_PERM = 1,
NFSERR_NOENT = 2,
- NFSERR_IO = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_IO = 5,
NFSERR_NXIO = 6,
NFSERR_EAGAIN = 11,
NFSERR_ACCES = 13,
- NFSERR_EXIST = 17,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_EXIST = 17,
NFSERR_XDEV = 18,
NFSERR_NODEV = 19,
NFSERR_NOTDIR = 20,
- NFSERR_ISDIR = 21,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_ISDIR = 21,
NFSERR_INVAL = 22,
NFSERR_FBIG = 27,
NFSERR_NOSPC = 28,
- NFSERR_ROFS = 30,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_ROFS = 30,
NFSERR_MLINK = 31,
NFSERR_OPNOTSUPP = 45,
NFSERR_NAMETOOLONG = 63,
- NFSERR_NOTEMPTY = 66,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_NOTEMPTY = 66,
NFSERR_DQUOT = 69,
NFSERR_STALE = 70,
NFSERR_REMOTE = 71,
- NFSERR_WFLUSH = 99,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_WFLUSH = 99,
NFSERR_BADHANDLE = 10001,
NFSERR_NOT_SYNC = 10002,
NFSERR_BAD_COOKIE = 10003,
- NFSERR_NOTSUPP = 10004,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_NOTSUPP = 10004,
NFSERR_TOOSMALL = 10005,
NFSERR_SERVERFAULT = 10006,
NFSERR_BADTYPE = 10007,
- NFSERR_JUKEBOX = 10008,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_JUKEBOX = 10008,
NFSERR_SAME = 10009,
NFSERR_DENIED = 10010,
NFSERR_EXPIRED = 10011,
- NFSERR_LOCKED = 10012,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_LOCKED = 10012,
NFSERR_GRACE = 10013,
NFSERR_FHEXPIRED = 10014,
NFSERR_SHARE_DENIED = 10015,
- NFSERR_WRONGSEC = 10016,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_WRONGSEC = 10016,
NFSERR_CLID_INUSE = 10017,
NFSERR_RESOURCE = 10018,
NFSERR_MOVED = 10019,
- NFSERR_NOFILEHANDLE = 10020,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_NOFILEHANDLE = 10020,
NFSERR_MINOR_VERS_MISMATCH = 10021,
NFSERR_STALE_CLIENTID = 10022,
NFSERR_STALE_STATEID = 10023,
- NFSERR_OLD_STATEID = 10024,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_OLD_STATEID = 10024,
NFSERR_BAD_STATEID = 10025,
NFSERR_BAD_SEQID = 10026,
NFSERR_NOT_SAME = 10027,
- NFSERR_LOCK_RANGE = 10028,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_LOCK_RANGE = 10028,
NFSERR_SYMLINK = 10029,
NFSERR_RESTOREFH = 10030,
NFSERR_LEASE_MOVED = 10031,
- NFSERR_ATTRNOTSUPP = 10032,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_ATTRNOTSUPP = 10032,
NFSERR_NO_GRACE = 10033,
NFSERR_RECLAIM_BAD = 10034,
NFSERR_RECLAIM_CONFLICT = 10035,
- NFSERR_BAD_XDR = 10036,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_BAD_XDR = 10036,
NFSERR_LOCKS_HELD = 10037,
NFSERR_OPENMODE = 10038,
NFSERR_BADOWNER = 10039,
- NFSERR_BADCHAR = 10040,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_BADCHAR = 10040,
NFSERR_BADNAME = 10041,
NFSERR_BAD_RANGE = 10042,
NFSERR_LOCK_NOTSUPP = 10043,
- NFSERR_OP_ILLEGAL = 10044,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_OP_ILLEGAL = 10044,
NFSERR_DEADLOCK = 10045,
NFSERR_FILE_OPEN = 10046,
NFSERR_ADMIN_REVOKED = 10047,
- NFSERR_CB_PATH_DOWN = 10048,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFSERR_CB_PATH_DOWN = 10048,
};
enum nfs_ftype {
NFNON = 0,
- NFREG = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFREG = 1,
NFDIR = 2,
NFBLK = 3,
NFCHR = 4,
- NFLNK = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NFLNK = 5,
NFSOCK = 6,
NFBAD = 7,
NFFIFO = 8
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#endif
diff --git a/libc/kernel/uapi/linux/nfs4.h b/libc/kernel/uapi/linux/nfs4.h
index b0dd9256b..884141a47 100644
--- a/libc/kernel/uapi/linux/nfs4.h
+++ b/libc/kernel/uapi/linux/nfs4.h
@@ -19,7 +19,7 @@
#ifndef _UAPI_LINUX_NFS4_H
#define _UAPI_LINUX_NFS4_H
#include <linux/types.h>
-#define NFS4_BITMAP_SIZE 2
+#define NFS4_BITMAP_SIZE 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_VERIFIER_SIZE 8
#define NFS4_STATEID_SEQID_SIZE 4
@@ -92,14 +92,19 @@
#define ACL4_SUPPORT_AUDIT_ACL 0x04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ACL4_SUPPORT_ALARM_ACL 0x08
+#define NFS4_ACL_AUTO_INHERIT 0x00000001
+#define NFS4_ACL_PROTECTED 0x00000002
+#define NFS4_ACL_DEFAULTED 0x00000004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_FILE_INHERIT_ACE 0x00000001
#define NFS4_ACE_DIRECTORY_INHERIT_ACE 0x00000002
#define NFS4_ACE_NO_PROPAGATE_INHERIT_ACE 0x00000004
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_INHERIT_ONLY_ACE 0x00000008
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_SUCCESSFUL_ACCESS_ACE_FLAG 0x00000010
#define NFS4_ACE_FAILED_ACCESS_ACE_FLAG 0x00000020
#define NFS4_ACE_IDENTIFIER_GROUP 0x00000040
+#define NFS4_ACE_INHERITED_ACE 0x00000080
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_READ_DATA 0x00000001
#define NFS4_ACE_LIST_DIRECTORY 0x00000001
@@ -116,56 +121,51 @@
#define NFS4_ACE_READ_ATTRIBUTES 0x00000080
#define NFS4_ACE_WRITE_ATTRIBUTES 0x00000100
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFS4_ACE_WRITE_RETENTION 0x00000200
+#define NFS4_ACE_WRITE_RETENTION_HOLD 0x00000400
#define NFS4_ACE_DELETE 0x00010000
#define NFS4_ACE_READ_ACL 0x00020000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_WRITE_ACL 0x00040000
#define NFS4_ACE_WRITE_OWNER 0x00080000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_SYNCHRONIZE 0x00100000
#define NFS4_ACE_GENERIC_READ 0x00120081
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_GENERIC_WRITE 0x00160106
#define NFS4_ACE_GENERIC_EXECUTE 0x001200A0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_ACE_MASK_ALL 0x001F01FF
#define EXCHGID4_FLAG_SUPP_MOVED_REFER 0x00000001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXCHGID4_FLAG_SUPP_MOVED_MIGR 0x00000002
#define EXCHGID4_FLAG_BIND_PRINC_STATEID 0x00000100
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXCHGID4_FLAG_USE_NON_PNFS 0x00010000
#define EXCHGID4_FLAG_USE_PNFS_MDS 0x00020000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXCHGID4_FLAG_USE_PNFS_DS 0x00040000
#define EXCHGID4_FLAG_MASK_PNFS 0x00070000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXCHGID4_FLAG_UPD_CONFIRMED_REC_A 0x40000000
#define EXCHGID4_FLAG_CONFIRMED_R 0x80000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXCHGID4_FLAG_MASK_A 0x40070103
#define EXCHGID4_FLAG_MASK_R 0x80070103
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEQ4_STATUS_CB_PATH_DOWN 0x00000001
#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING 0x00000002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED 0x00000004
#define SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED 0x00000008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED 0x00000010
#define SEQ4_STATUS_ADMIN_STATE_REVOKED 0x00000020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEQ4_STATUS_RECALLABLE_STATE_REVOKED 0x00000040
#define SEQ4_STATUS_LEASE_MOVED 0x00000080
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEQ4_STATUS_RESTART_RECLAIM_NEEDED 0x00000100
#define SEQ4_STATUS_CB_PATH_DOWN_SESSION 0x00000200
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEQ4_STATUS_BACKCHANNEL_FAULT 0x00000400
#define NFS4_SECINFO_STYLE4_CURRENT_FH 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_SECINFO_STYLE4_PARENT 1
#define NFS4_MAX_UINT64 (~(__u64) 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS4_MAX_OPS 8
#define NFS4_MAX_BACK_CHANNEL_OPS 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-enum nfs4_acl_whotype {
- NFS4_ACL_WHO_NAMED = 0,
- NFS4_ACL_WHO_OWNER,
- NFS4_ACL_WHO_GROUP,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- NFS4_ACL_WHO_EVERYONE,
-};
#endif
diff --git a/libc/kernel/uapi/linux/nfsacl.h b/libc/kernel/uapi/linux/nfsacl.h
index a38d32b95..3964cf2f0 100644
--- a/libc/kernel/uapi/linux/nfsacl.h
+++ b/libc/kernel/uapi/linux/nfsacl.h
@@ -32,5 +32,7 @@
#define NFS_DFACL 0x0004
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFS_DFACLCNT 0x0008
+#define NFS_ACL_MASK 0x000f
#define NFS_ACL_DEFAULT 0x1000
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/nfsd/debug.h b/libc/kernel/uapi/linux/nfsd/debug.h
index c6a2b4ded..3182121ba 100644
--- a/libc/kernel/uapi/linux/nfsd/debug.h
+++ b/libc/kernel/uapi/linux/nfsd/debug.h
@@ -19,23 +19,21 @@
#ifndef _UAPILINUX_NFSD_DEBUG_H
#define _UAPILINUX_NFSD_DEBUG_H
#include <linux/sunrpc/debug.h>
-#ifdef RPC_DEBUG
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define NFSD_DEBUG 1
-#endif
#define NFSDDBG_SOCK 0x0001
-#define NFSDDBG_FH 0x0002
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFSDDBG_FH 0x0002
#define NFSDDBG_EXPORT 0x0004
#define NFSDDBG_SVC 0x0008
#define NFSDDBG_PROC 0x0010
-#define NFSDDBG_FILEOP 0x0020
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFSDDBG_FILEOP 0x0020
#define NFSDDBG_AUTH 0x0040
#define NFSDDBG_REPCACHE 0x0080
#define NFSDDBG_XDR 0x0100
-#define NFSDDBG_LOCKD 0x0200
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NFSDDBG_LOCKD 0x0200
+#define NFSDDBG_PNFS 0x0400
#define NFSDDBG_ALL 0x7FFF
#define NFSDDBG_NOCHANGE 0xFFFF
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/nfsd/export.h b/libc/kernel/uapi/linux/nfsd/export.h
index 4d7bfadec..c5342e945 100644
--- a/libc/kernel/uapi/linux/nfsd/export.h
+++ b/libc/kernel/uapi/linux/nfsd/export.h
@@ -42,7 +42,8 @@
#define NFSEXP_NOACL 0x8000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NFSEXP_V4ROOT 0x10000
-#define NFSEXP_ALLFLAGS 0x1FE7F
+#define NFSEXP_PNFS 0x20000
+#define NFSEXP_ALLFLAGS 0x3FE7F
#define NFSEXP_SECINFO_FLAGS (NFSEXP_READONLY | NFSEXP_ROOTSQUASH | NFSEXP_ALLSQUASH | NFSEXP_INSECURE_PORT)
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/nl80211.h b/libc/kernel/uapi/linux/nl80211.h
index ae6d6d8bb..54539712f 100644
--- a/libc/kernel/uapi/linux/nl80211.h
+++ b/libc/kernel/uapi/linux/nl80211.h
@@ -21,498 +21,533 @@
#include <linux/types.h>
#define NL80211_GENL_NAME "nl80211"
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_MULTICAST_GROUP_CONFIG "config"
+#define NL80211_MULTICAST_GROUP_SCAN "scan"
+#define NL80211_MULTICAST_GROUP_REG "regulatory"
+#define NL80211_MULTICAST_GROUP_MLME "mlme"
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_MULTICAST_GROUP_VENDOR "vendor"
+#define NL80211_MULTICAST_GROUP_TESTMODE "testmode"
enum nl80211_commands {
NL80211_CMD_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_WIPHY,
NL80211_CMD_SET_WIPHY,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NEW_WIPHY,
NL80211_CMD_DEL_WIPHY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_INTERFACE,
NL80211_CMD_SET_INTERFACE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NEW_INTERFACE,
NL80211_CMD_DEL_INTERFACE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_KEY,
NL80211_CMD_SET_KEY,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NEW_KEY,
NL80211_CMD_DEL_KEY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_BEACON,
NL80211_CMD_SET_BEACON,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_START_AP,
NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_STOP_AP,
NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_STATION,
NL80211_CMD_SET_STATION,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NEW_STATION,
NL80211_CMD_DEL_STATION,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_MPATH,
NL80211_CMD_SET_MPATH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NEW_MPATH,
NL80211_CMD_DEL_MPATH,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_BSS,
NL80211_CMD_SET_REG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_REQ_SET_REG,
NL80211_CMD_GET_MESH_CONFIG,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_MESH_CONFIG,
NL80211_CMD_SET_MGMT_EXTRA_IE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_REG,
NL80211_CMD_GET_SCAN,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_TRIGGER_SCAN,
NL80211_CMD_NEW_SCAN_RESULTS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SCAN_ABORTED,
NL80211_CMD_REG_CHANGE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_AUTHENTICATE,
NL80211_CMD_ASSOCIATE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_DEAUTHENTICATE,
NL80211_CMD_DISASSOCIATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_MICHAEL_MIC_FAILURE,
NL80211_CMD_REG_BEACON_HINT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_JOIN_IBSS,
NL80211_CMD_LEAVE_IBSS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_TESTMODE,
NL80211_CMD_CONNECT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_ROAM,
NL80211_CMD_DISCONNECT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_WIPHY_NETNS,
NL80211_CMD_GET_SURVEY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NEW_SURVEY_RESULTS,
NL80211_CMD_SET_PMKSA,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_DEL_PMKSA,
NL80211_CMD_FLUSH_PMKSA,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_REMAIN_ON_CHANNEL,
NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_TX_BITRATE_MASK,
NL80211_CMD_REGISTER_FRAME,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME,
NL80211_CMD_FRAME,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_ACTION = NL80211_CMD_FRAME,
NL80211_CMD_FRAME_TX_STATUS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS,
NL80211_CMD_SET_POWER_SAVE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_POWER_SAVE,
NL80211_CMD_SET_CQM,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NOTIFY_CQM,
NL80211_CMD_SET_CHANNEL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_WDS_PEER,
NL80211_CMD_FRAME_WAIT_CANCEL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_JOIN_MESH,
NL80211_CMD_LEAVE_MESH,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_UNPROT_DEAUTHENTICATE,
NL80211_CMD_UNPROT_DISASSOCIATE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_NEW_PEER_CANDIDATE,
NL80211_CMD_GET_WOWLAN,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_WOWLAN,
NL80211_CMD_START_SCHED_SCAN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_STOP_SCHED_SCAN,
NL80211_CMD_SCHED_SCAN_RESULTS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SCHED_SCAN_STOPPED,
NL80211_CMD_SET_REKEY_OFFLOAD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_PMKSA_CANDIDATE,
NL80211_CMD_TDLS_OPER,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_TDLS_MGMT,
NL80211_CMD_UNEXPECTED_FRAME,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_PROBE_CLIENT,
NL80211_CMD_REGISTER_BEACONS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_UNEXPECTED_4ADDR_FRAME,
NL80211_CMD_SET_NOACK_MAP,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_CH_SWITCH_NOTIFY,
NL80211_CMD_START_P2P_DEVICE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_STOP_P2P_DEVICE,
NL80211_CMD_CONN_FAILED,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_MCAST_RATE,
NL80211_CMD_SET_MAC_ACL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_RADAR_DETECT,
NL80211_CMD_GET_PROTOCOL_FEATURES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_UPDATE_FT_IES,
NL80211_CMD_FT_EVENT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_CRIT_PROTOCOL_START,
NL80211_CMD_CRIT_PROTOCOL_STOP,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_GET_COALESCE,
NL80211_CMD_SET_COALESCE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_CHANNEL_SWITCH,
NL80211_CMD_VENDOR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_SET_QOS_MAP,
NL80211_CMD_ADD_TX_TS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CMD_DEL_TX_TS,
+ NL80211_CMD_GET_MPP,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_CMD_JOIN_OCB,
+ NL80211_CMD_LEAVE_OCB,
+ NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
+ NL80211_CMD_TDLS_CHANNEL_SWITCH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,
+ NL80211_CMD_WIPHY_REG_CHANGE,
__NL80211_CMD_AFTER_LAST,
NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define NL80211_CMD_SET_BSS NL80211_CMD_SET_BSS
#define NL80211_CMD_SET_MGMT_EXTRA_IE NL80211_CMD_SET_MGMT_EXTRA_IE
#define NL80211_CMD_REG_CHANGE NL80211_CMD_REG_CHANGE
-#define NL80211_CMD_AUTHENTICATE NL80211_CMD_AUTHENTICATE
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_CMD_AUTHENTICATE NL80211_CMD_AUTHENTICATE
#define NL80211_CMD_ASSOCIATE NL80211_CMD_ASSOCIATE
#define NL80211_CMD_DEAUTHENTICATE NL80211_CMD_DEAUTHENTICATE
#define NL80211_CMD_DISASSOCIATE NL80211_CMD_DISASSOCIATE
-#define NL80211_CMD_REG_BEACON_HINT NL80211_CMD_REG_BEACON_HINT
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_CMD_REG_BEACON_HINT NL80211_CMD_REG_BEACON_HINT
#define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
#define NL80211_CMD_GET_MESH_PARAMS NL80211_CMD_GET_MESH_CONFIG
#define NL80211_CMD_SET_MESH_PARAMS NL80211_CMD_SET_MESH_CONFIG
-#define NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE NL80211_MESH_SETUP_IE
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_MESH_SETUP_VENDOR_PATH_SEL_IE NL80211_MESH_SETUP_IE
enum nl80211_attrs {
NL80211_ATTR_UNSPEC,
NL80211_ATTR_WIPHY,
- NL80211_ATTR_WIPHY_NAME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WIPHY_NAME,
NL80211_ATTR_IFINDEX,
NL80211_ATTR_IFNAME,
NL80211_ATTR_IFTYPE,
- NL80211_ATTR_MAC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_MAC,
NL80211_ATTR_KEY_DATA,
NL80211_ATTR_KEY_IDX,
NL80211_ATTR_KEY_CIPHER,
- NL80211_ATTR_KEY_SEQ,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_KEY_SEQ,
NL80211_ATTR_KEY_DEFAULT,
NL80211_ATTR_BEACON_INTERVAL,
NL80211_ATTR_DTIM_PERIOD,
- NL80211_ATTR_BEACON_HEAD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_BEACON_HEAD,
NL80211_ATTR_BEACON_TAIL,
NL80211_ATTR_STA_AID,
NL80211_ATTR_STA_FLAGS,
- NL80211_ATTR_STA_LISTEN_INTERVAL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_STA_LISTEN_INTERVAL,
NL80211_ATTR_STA_SUPPORTED_RATES,
NL80211_ATTR_STA_VLAN,
NL80211_ATTR_STA_INFO,
- NL80211_ATTR_WIPHY_BANDS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WIPHY_BANDS,
NL80211_ATTR_MNTR_FLAGS,
NL80211_ATTR_MESH_ID,
NL80211_ATTR_STA_PLINK_ACTION,
- NL80211_ATTR_MPATH_NEXT_HOP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_MPATH_NEXT_HOP,
NL80211_ATTR_MPATH_INFO,
NL80211_ATTR_BSS_CTS_PROT,
NL80211_ATTR_BSS_SHORT_PREAMBLE,
- NL80211_ATTR_BSS_SHORT_SLOT_TIME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_BSS_SHORT_SLOT_TIME,
NL80211_ATTR_HT_CAPABILITY,
NL80211_ATTR_SUPPORTED_IFTYPES,
NL80211_ATTR_REG_ALPHA2,
- NL80211_ATTR_REG_RULES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_REG_RULES,
NL80211_ATTR_MESH_CONFIG,
NL80211_ATTR_BSS_BASIC_RATES,
NL80211_ATTR_WIPHY_TXQ_PARAMS,
- NL80211_ATTR_WIPHY_FREQ,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WIPHY_FREQ,
NL80211_ATTR_WIPHY_CHANNEL_TYPE,
NL80211_ATTR_KEY_DEFAULT_MGMT,
NL80211_ATTR_MGMT_SUBTYPE,
- NL80211_ATTR_IE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_IE,
NL80211_ATTR_MAX_NUM_SCAN_SSIDS,
NL80211_ATTR_SCAN_FREQUENCIES,
NL80211_ATTR_SCAN_SSIDS,
- NL80211_ATTR_GENERATION,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_GENERATION,
NL80211_ATTR_BSS,
NL80211_ATTR_REG_INITIATOR,
NL80211_ATTR_REG_TYPE,
- NL80211_ATTR_SUPPORTED_COMMANDS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_SUPPORTED_COMMANDS,
NL80211_ATTR_FRAME,
NL80211_ATTR_SSID,
NL80211_ATTR_AUTH_TYPE,
- NL80211_ATTR_REASON_CODE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_REASON_CODE,
NL80211_ATTR_KEY_TYPE,
NL80211_ATTR_MAX_SCAN_IE_LEN,
NL80211_ATTR_CIPHER_SUITES,
- NL80211_ATTR_FREQ_BEFORE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_FREQ_BEFORE,
NL80211_ATTR_FREQ_AFTER,
NL80211_ATTR_FREQ_FIXED,
NL80211_ATTR_WIPHY_RETRY_SHORT,
- NL80211_ATTR_WIPHY_RETRY_LONG,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WIPHY_RETRY_LONG,
NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
NL80211_ATTR_WIPHY_RTS_THRESHOLD,
NL80211_ATTR_TIMED_OUT,
- NL80211_ATTR_USE_MFP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_USE_MFP,
NL80211_ATTR_STA_FLAGS2,
NL80211_ATTR_CONTROL_PORT,
NL80211_ATTR_TESTDATA,
- NL80211_ATTR_PRIVACY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_PRIVACY,
NL80211_ATTR_DISCONNECTED_BY_AP,
NL80211_ATTR_STATUS_CODE,
NL80211_ATTR_CIPHER_SUITES_PAIRWISE,
- NL80211_ATTR_CIPHER_SUITE_GROUP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_CIPHER_SUITE_GROUP,
NL80211_ATTR_WPA_VERSIONS,
NL80211_ATTR_AKM_SUITES,
NL80211_ATTR_REQ_IE,
- NL80211_ATTR_RESP_IE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_RESP_IE,
NL80211_ATTR_PREV_BSSID,
NL80211_ATTR_KEY,
NL80211_ATTR_KEYS,
- NL80211_ATTR_PID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_PID,
NL80211_ATTR_4ADDR,
NL80211_ATTR_SURVEY_INFO,
NL80211_ATTR_PMKID,
- NL80211_ATTR_MAX_NUM_PMKIDS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_MAX_NUM_PMKIDS,
NL80211_ATTR_DURATION,
NL80211_ATTR_COOKIE,
NL80211_ATTR_WIPHY_COVERAGE_CLASS,
- NL80211_ATTR_TX_RATES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_TX_RATES,
NL80211_ATTR_FRAME_MATCH,
NL80211_ATTR_ACK,
NL80211_ATTR_PS_STATE,
- NL80211_ATTR_CQM,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_CQM,
NL80211_ATTR_LOCAL_STATE_CHANGE,
NL80211_ATTR_AP_ISOLATE,
NL80211_ATTR_WIPHY_TX_POWER_SETTING,
- NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WIPHY_TX_POWER_LEVEL,
NL80211_ATTR_TX_FRAME_TYPES,
NL80211_ATTR_RX_FRAME_TYPES,
NL80211_ATTR_FRAME_TYPE,
- NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT,
NL80211_ATTR_SUPPORT_IBSS_RSN,
NL80211_ATTR_WIPHY_ANTENNA_TX,
- NL80211_ATTR_WIPHY_ANTENNA_RX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WIPHY_ANTENNA_RX,
NL80211_ATTR_MCAST_RATE,
NL80211_ATTR_OFFCHANNEL_TX_OK,
NL80211_ATTR_BSS_HT_OPMODE,
- NL80211_ATTR_KEY_DEFAULT_TYPES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_KEY_DEFAULT_TYPES,
NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
NL80211_ATTR_MESH_SETUP,
NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
- NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,
NL80211_ATTR_SUPPORT_MESH_AUTH,
NL80211_ATTR_STA_PLINK_STATE,
NL80211_ATTR_WOWLAN_TRIGGERS,
- NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED,
NL80211_ATTR_SCHED_SCAN_INTERVAL,
NL80211_ATTR_INTERFACE_COMBINATIONS,
NL80211_ATTR_SOFTWARE_IFTYPES,
- NL80211_ATTR_REKEY_DATA,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_REKEY_DATA,
NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,
NL80211_ATTR_SCAN_SUPP_RATES,
- NL80211_ATTR_HIDDEN_SSID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_HIDDEN_SSID,
NL80211_ATTR_IE_PROBE_RESP,
NL80211_ATTR_IE_ASSOC_RESP,
NL80211_ATTR_STA_WME,
- NL80211_ATTR_SUPPORT_AP_UAPSD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_SUPPORT_AP_UAPSD,
NL80211_ATTR_ROAM_SUPPORT,
NL80211_ATTR_SCHED_SCAN_MATCH,
NL80211_ATTR_MAX_MATCH_SETS,
- NL80211_ATTR_PMKSA_CANDIDATE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_PMKSA_CANDIDATE,
NL80211_ATTR_TX_NO_CCK_RATE,
NL80211_ATTR_TDLS_ACTION,
NL80211_ATTR_TDLS_DIALOG_TOKEN,
- NL80211_ATTR_TDLS_OPERATION,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_TDLS_OPERATION,
NL80211_ATTR_TDLS_SUPPORT,
NL80211_ATTR_TDLS_EXTERNAL_SETUP,
NL80211_ATTR_DEVICE_AP_SME,
- NL80211_ATTR_DONT_WAIT_FOR_ACK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_DONT_WAIT_FOR_ACK,
NL80211_ATTR_FEATURE_FLAGS,
NL80211_ATTR_PROBE_RESP_OFFLOAD,
NL80211_ATTR_PROBE_RESP,
- NL80211_ATTR_DFS_REGION,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_DFS_REGION,
NL80211_ATTR_DISABLE_HT,
NL80211_ATTR_HT_CAPABILITY_MASK,
NL80211_ATTR_NOACK_MAP,
- NL80211_ATTR_INACTIVITY_TIMEOUT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_INACTIVITY_TIMEOUT,
NL80211_ATTR_RX_SIGNAL_DBM,
NL80211_ATTR_BG_SCAN_PERIOD,
NL80211_ATTR_WDEV,
- NL80211_ATTR_USER_REG_HINT_TYPE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_USER_REG_HINT_TYPE,
NL80211_ATTR_CONN_FAILED_REASON,
NL80211_ATTR_SAE_DATA,
NL80211_ATTR_VHT_CAPABILITY,
- NL80211_ATTR_SCAN_FLAGS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_SCAN_FLAGS,
NL80211_ATTR_CHANNEL_WIDTH,
NL80211_ATTR_CENTER_FREQ1,
NL80211_ATTR_CENTER_FREQ2,
- NL80211_ATTR_P2P_CTWINDOW,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_P2P_CTWINDOW,
NL80211_ATTR_P2P_OPPPS,
NL80211_ATTR_LOCAL_MESH_POWER_MODE,
NL80211_ATTR_ACL_POLICY,
- NL80211_ATTR_MAC_ADDRS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_MAC_ADDRS,
NL80211_ATTR_MAC_ACL_MAX,
NL80211_ATTR_RADAR_EVENT,
NL80211_ATTR_EXT_CAPA,
- NL80211_ATTR_EXT_CAPA_MASK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_EXT_CAPA_MASK,
NL80211_ATTR_STA_CAPABILITY,
NL80211_ATTR_STA_EXT_CAPABILITY,
NL80211_ATTR_PROTOCOL_FEATURES,
- NL80211_ATTR_SPLIT_WIPHY_DUMP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_SPLIT_WIPHY_DUMP,
NL80211_ATTR_DISABLE_VHT,
NL80211_ATTR_VHT_CAPABILITY_MASK,
NL80211_ATTR_MDID,
- NL80211_ATTR_IE_RIC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_IE_RIC,
NL80211_ATTR_CRIT_PROT_ID,
NL80211_ATTR_MAX_CRIT_PROT_DURATION,
NL80211_ATTR_PEER_AID,
- NL80211_ATTR_COALESCE_RULE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_COALESCE_RULE,
NL80211_ATTR_CH_SWITCH_COUNT,
NL80211_ATTR_CH_SWITCH_BLOCK_TX,
NL80211_ATTR_CSA_IES,
- NL80211_ATTR_CSA_C_OFF_BEACON,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_CSA_C_OFF_BEACON,
NL80211_ATTR_CSA_C_OFF_PRESP,
NL80211_ATTR_RXMGMT_FLAGS,
NL80211_ATTR_STA_SUPPORTED_CHANNELS,
- NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,
NL80211_ATTR_HANDLE_DFS,
NL80211_ATTR_SUPPORT_5_MHZ,
NL80211_ATTR_SUPPORT_10_MHZ,
- NL80211_ATTR_OPMODE_NOTIF,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_OPMODE_NOTIF,
NL80211_ATTR_VENDOR_ID,
NL80211_ATTR_VENDOR_SUBCMD,
NL80211_ATTR_VENDOR_DATA,
- NL80211_ATTR_VENDOR_EVENTS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_VENDOR_EVENTS,
NL80211_ATTR_QOS_MAP,
NL80211_ATTR_MAC_HINT,
NL80211_ATTR_WIPHY_FREQ_HINT,
- NL80211_ATTR_MAX_AP_ASSOC_STA,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_MAX_AP_ASSOC_STA,
NL80211_ATTR_TDLS_PEER_CAPABILITY,
- NL80211_ATTR_IFACE_SOCKET_OWNER,
+ NL80211_ATTR_SOCKET_OWNER,
NL80211_ATTR_CSA_C_OFFSETS_TX,
- NL80211_ATTR_MAX_CSA_COUNTERS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_MAX_CSA_COUNTERS,
NL80211_ATTR_TDLS_INITIATOR,
NL80211_ATTR_USE_RRM,
NL80211_ATTR_WIPHY_DYN_ACK,
- NL80211_ATTR_TSID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_TSID,
NL80211_ATTR_USER_PRIO,
NL80211_ATTR_ADMITTED_TIME,
NL80211_ATTR_SMPS_MODE,
- __NL80211_ATTR_AFTER_LAST,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_OPER_CLASS,
+ NL80211_ATTR_MAC_MASK,
+ NL80211_ATTR_WIPHY_SELF_MANAGED_REG,
+ NL80211_ATTR_EXT_FEATURES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_SURVEY_RADIO_STATS,
+ NL80211_ATTR_NETNS_FD,
+ NL80211_ATTR_SCHED_SCAN_DELAY,
+ NL80211_ATTR_REG_INDOOR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
+ NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
+ NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
+ NL80211_ATTR_SCHED_SCAN_PLANS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NL80211_ATTR_AFTER_LAST,
+ NUM_NL80211_ATTR = __NL80211_ATTR_AFTER_LAST,
NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_SCAN_GENERATION NL80211_ATTR_GENERATION
#define NL80211_ATTR_MESH_PARAMS NL80211_ATTR_MESH_CONFIG
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_ATTR_IFACE_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
#define NL80211_CMD_CONNECT NL80211_CMD_CONNECT
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_HT_CAPABILITY NL80211_ATTR_HT_CAPABILITY
#define NL80211_ATTR_BSS_BASIC_RATES NL80211_ATTR_BSS_BASIC_RATES
#define NL80211_ATTR_WIPHY_TXQ_PARAMS NL80211_ATTR_WIPHY_TXQ_PARAMS
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_WIPHY_FREQ NL80211_ATTR_WIPHY_FREQ
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_WIPHY_CHANNEL_TYPE NL80211_ATTR_WIPHY_CHANNEL_TYPE
#define NL80211_ATTR_MGMT_SUBTYPE NL80211_ATTR_MGMT_SUBTYPE
#define NL80211_ATTR_IE NL80211_ATTR_IE
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_REG_INITIATOR NL80211_ATTR_REG_INITIATOR
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_REG_TYPE NL80211_ATTR_REG_TYPE
#define NL80211_ATTR_FRAME NL80211_ATTR_FRAME
#define NL80211_ATTR_SSID NL80211_ATTR_SSID
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_AUTH_TYPE NL80211_ATTR_AUTH_TYPE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_REASON_CODE NL80211_ATTR_REASON_CODE
#define NL80211_ATTR_CIPHER_SUITES_PAIRWISE NL80211_ATTR_CIPHER_SUITES_PAIRWISE
#define NL80211_ATTR_CIPHER_SUITE_GROUP NL80211_ATTR_CIPHER_SUITE_GROUP
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_WPA_VERSIONS NL80211_ATTR_WPA_VERSIONS
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_AKM_SUITES NL80211_ATTR_AKM_SUITES
#define NL80211_ATTR_KEY NL80211_ATTR_KEY
#define NL80211_ATTR_KEYS NL80211_ATTR_KEYS
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_ATTR_FEATURE_FLAGS NL80211_ATTR_FEATURE_FLAGS
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_MAX_SUPP_RATES 32
#define NL80211_MAX_SUPP_HT_RATES 77
-#define NL80211_MAX_SUPP_REG_RULES 32
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_MAX_SUPP_REG_RULES 64
#define NL80211_TKIP_DATA_OFFSET_ENCR_KEY 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY 16
#define NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY 24
#define NL80211_HT_CAPABILITY_LEN 26
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_VHT_CAPABILITY_LEN 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_MAX_NR_CIPHER_SUITES 5
#define NL80211_MAX_NR_AKM_SUITES 2
#define NL80211_MIN_REMAIN_ON_CHANNEL_TIME 10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_SCAN_RSSI_THOLD_OFF - 300
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_CQM_TXE_MAX_INTVL 1800
enum nl80211_iftype {
NL80211_IFTYPE_UNSPECIFIED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_IFTYPE_ADHOC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_IFTYPE_STATION,
NL80211_IFTYPE_AP,
NL80211_IFTYPE_AP_VLAN,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_IFTYPE_WDS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_IFTYPE_MONITOR,
NL80211_IFTYPE_MESH_POINT,
NL80211_IFTYPE_P2P_CLIENT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_IFTYPE_P2P_GO,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_IFTYPE_P2P_DEVICE,
+ NL80211_IFTYPE_OCB,
NUM_NL80211_IFTYPES,
NL80211_IFTYPE_MAX = NUM_NL80211_IFTYPES - 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -553,136 +588,156 @@ enum nl80211_rate_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_RATE_INFO_80P80_MHZ_WIDTH,
NL80211_RATE_INFO_160_MHZ_WIDTH,
+ NL80211_RATE_INFO_10_MHZ_WIDTH,
+ NL80211_RATE_INFO_5_MHZ_WIDTH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_RATE_INFO_AFTER_LAST,
NL80211_RATE_INFO_MAX = __NL80211_RATE_INFO_AFTER_LAST - 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_sta_bss_param {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_STA_BSS_PARAM_INVALID,
NL80211_STA_BSS_PARAM_CTS_PROT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_BSS_PARAM_SHORT_PREAMBLE,
NL80211_STA_BSS_PARAM_SHORT_SLOT_TIME,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_BSS_PARAM_DTIM_PERIOD,
NL80211_STA_BSS_PARAM_BEACON_INTERVAL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_STA_BSS_PARAM_AFTER_LAST,
NL80211_STA_BSS_PARAM_MAX = __NL80211_STA_BSS_PARAM_AFTER_LAST - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_sta_info {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_STA_INFO_INVALID,
NL80211_STA_INFO_INACTIVE_TIME,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_RX_BYTES,
NL80211_STA_INFO_TX_BYTES,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_LLID,
NL80211_STA_INFO_PLID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_PLINK_STATE,
NL80211_STA_INFO_SIGNAL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_TX_BITRATE,
NL80211_STA_INFO_RX_PACKETS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_TX_PACKETS,
NL80211_STA_INFO_TX_RETRIES,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_TX_FAILED,
NL80211_STA_INFO_SIGNAL_AVG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_RX_BITRATE,
NL80211_STA_INFO_BSS_PARAM,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_CONNECTED_TIME,
NL80211_STA_INFO_STA_FLAGS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_BEACON_LOSS,
NL80211_STA_INFO_T_OFFSET,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_LOCAL_PM,
NL80211_STA_INFO_PEER_PM,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_NONPEER_PM,
NL80211_STA_INFO_RX_BYTES64,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_TX_BYTES64,
NL80211_STA_INFO_CHAIN_SIGNAL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_STA_INFO_CHAIN_SIGNAL_AVG,
NL80211_STA_INFO_EXPECTED_THROUGHPUT,
+ NL80211_STA_INFO_RX_DROP_MISC,
+ NL80211_STA_INFO_BEACON_RX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_STA_INFO_BEACON_SIGNAL_AVG,
+ NL80211_STA_INFO_TID_STATS,
__NL80211_STA_INFO_AFTER_LAST,
NL80211_STA_INFO_MAX = __NL80211_STA_INFO_AFTER_LAST - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
-enum nl80211_mpath_flags {
+enum nl80211_tid_stats {
+ __NL80211_TID_STATS_INVALID,
+ NL80211_TID_STATS_RX_MSDU,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_TID_STATS_TX_MSDU,
+ NL80211_TID_STATS_TX_MSDU_RETRIES,
+ NL80211_TID_STATS_TX_MSDU_FAILED,
+ NUM_NL80211_TID_STATS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_TID_STATS_MAX = NUM_NL80211_TID_STATS - 1
+};
+enum nl80211_mpath_flags {
NL80211_MPATH_FLAG_ACTIVE = 1 << 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MPATH_FLAG_RESOLVING = 1 << 1,
NL80211_MPATH_FLAG_SN_VALID = 1 << 2,
NL80211_MPATH_FLAG_FIXED = 1 << 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MPATH_FLAG_RESOLVED = 1 << 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_mpath_info {
__NL80211_MPATH_INFO_INVALID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MPATH_INFO_FRAME_QLEN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MPATH_INFO_SN,
NL80211_MPATH_INFO_METRIC,
NL80211_MPATH_INFO_EXPTIME,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MPATH_INFO_FLAGS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MPATH_INFO_DISCOVERY_TIMEOUT,
NL80211_MPATH_INFO_DISCOVERY_RETRIES,
__NL80211_MPATH_INFO_AFTER_LAST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MPATH_INFO_MAX = __NL80211_MPATH_INFO_AFTER_LAST - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_band_attr {
__NL80211_BAND_ATTR_INVALID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BAND_ATTR_FREQS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BAND_ATTR_RATES,
NL80211_BAND_ATTR_HT_MCS_SET,
NL80211_BAND_ATTR_HT_CAPA,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BAND_ATTR_HT_AMPDU_FACTOR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BAND_ATTR_HT_AMPDU_DENSITY,
NL80211_BAND_ATTR_VHT_MCS_SET,
NL80211_BAND_ATTR_VHT_CAPA,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_BAND_ATTR_AFTER_LAST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BAND_ATTR_MAX = __NL80211_BAND_ATTR_AFTER_LAST - 1
};
#define NL80211_BAND_ATTR_HT_CAPA NL80211_BAND_ATTR_HT_CAPA
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_frequency_attr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_FREQUENCY_ATTR_INVALID,
NL80211_FREQUENCY_ATTR_FREQ,
NL80211_FREQUENCY_ATTR_DISABLED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_FREQUENCY_ATTR_NO_IR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_FREQUENCY_ATTR_NO_IBSS,
NL80211_FREQUENCY_ATTR_RADAR,
NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_FREQUENCY_ATTR_DFS_STATE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_FREQUENCY_ATTR_DFS_TIME,
NL80211_FREQUENCY_ATTR_NO_HT40_MINUS,
NL80211_FREQUENCY_ATTR_NO_HT40_PLUS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_FREQUENCY_ATTR_NO_80MHZ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_FREQUENCY_ATTR_NO_160MHZ,
NL80211_FREQUENCY_ATTR_DFS_CAC_TIME,
NL80211_FREQUENCY_ATTR_INDOOR_ONLY,
+ NL80211_FREQUENCY_ATTR_IR_CONCURRENT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- NL80211_FREQUENCY_ATTR_GO_CONCURRENT,
NL80211_FREQUENCY_ATTR_NO_20MHZ,
NL80211_FREQUENCY_ATTR_NO_10MHZ,
__NL80211_FREQUENCY_ATTR_AFTER_LAST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_FREQUENCY_ATTR_MAX = __NL80211_FREQUENCY_ATTR_AFTER_LAST - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NL80211_FREQUENCY_ATTR_MAX_TX_POWER NL80211_FREQUENCY_ATTR_MAX_TX_POWER
#define NL80211_FREQUENCY_ATTR_PASSIVE_SCAN NL80211_FREQUENCY_ATTR_NO_IR
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_FREQUENCY_ATTR_NO_IBSS NL80211_FREQUENCY_ATTR_NO_IR
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_FREQUENCY_ATTR_NO_IR NL80211_FREQUENCY_ATTR_NO_IR
+#define NL80211_FREQUENCY_ATTR_GO_CONCURRENT NL80211_FREQUENCY_ATTR_IR_CONCURRENT
enum nl80211_bitrate_attr {
__NL80211_BITRATE_ATTR_INVALID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -746,554 +801,589 @@ enum nl80211_reg_rule_flags {
__NL80211_RRF_NO_IBSS = 1 << 8,
NL80211_RRF_AUTO_BW = 1 << 11,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_RRF_IR_CONCURRENT = 1 << 12,
+ NL80211_RRF_NO_HT40MINUS = 1 << 13,
+ NL80211_RRF_NO_HT40PLUS = 1 << 14,
+ NL80211_RRF_NO_80MHZ = 1 << 15,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_RRF_NO_160MHZ = 1 << 16,
};
#define NL80211_RRF_PASSIVE_SCAN NL80211_RRF_NO_IR
#define NL80211_RRF_NO_IBSS NL80211_RRF_NO_IR
-#define NL80211_RRF_NO_IR NL80211_RRF_NO_IR
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_RRF_NO_IR NL80211_RRF_NO_IR
+#define NL80211_RRF_NO_HT40 (NL80211_RRF_NO_HT40MINUS | NL80211_RRF_NO_HT40PLUS)
+#define NL80211_RRF_GO_CONCURRENT NL80211_RRF_IR_CONCURRENT
#define NL80211_RRF_NO_IR_ALL (NL80211_RRF_NO_IR | __NL80211_RRF_NO_IBSS)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_dfs_regions {
NL80211_DFS_UNSET = 0,
NL80211_DFS_FCC = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_DFS_ETSI = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_DFS_JP = 3,
};
enum nl80211_user_reg_hint_type {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_USER_REG_HINT_USER = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_USER_REG_HINT_CELL_BASE = 1,
NL80211_USER_REG_HINT_INDOOR = 2,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_survey_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_SURVEY_INFO_INVALID,
NL80211_SURVEY_INFO_FREQUENCY,
NL80211_SURVEY_INFO_NOISE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_SURVEY_INFO_IN_USE,
- NL80211_SURVEY_INFO_CHANNEL_TIME,
- NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY,
- NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- NL80211_SURVEY_INFO_CHANNEL_TIME_RX,
- NL80211_SURVEY_INFO_CHANNEL_TIME_TX,
+ NL80211_SURVEY_INFO_TIME,
+ NL80211_SURVEY_INFO_TIME_BUSY,
+ NL80211_SURVEY_INFO_TIME_EXT_BUSY,
+ NL80211_SURVEY_INFO_TIME_RX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_SURVEY_INFO_TIME_TX,
+ NL80211_SURVEY_INFO_TIME_SCAN,
__NL80211_SURVEY_INFO_AFTER_LAST,
NL80211_SURVEY_INFO_MAX = __NL80211_SURVEY_INFO_AFTER_LAST - 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+#define NL80211_SURVEY_INFO_CHANNEL_TIME NL80211_SURVEY_INFO_TIME
+#define NL80211_SURVEY_INFO_CHANNEL_TIME_BUSY NL80211_SURVEY_INFO_TIME_BUSY
+#define NL80211_SURVEY_INFO_CHANNEL_TIME_EXT_BUSY NL80211_SURVEY_INFO_TIME_EXT_BUSY
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_SURVEY_INFO_CHANNEL_TIME_RX NL80211_SURVEY_INFO_TIME_RX
+#define NL80211_SURVEY_INFO_CHANNEL_TIME_TX NL80211_SURVEY_INFO_TIME_TX
enum nl80211_mntr_flags {
__NL80211_MNTR_FLAG_INVALID,
- NL80211_MNTR_FLAG_FCSFAIL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MNTR_FLAG_FCSFAIL,
NL80211_MNTR_FLAG_PLCPFAIL,
NL80211_MNTR_FLAG_CONTROL,
NL80211_MNTR_FLAG_OTHER_BSS,
- NL80211_MNTR_FLAG_COOK_FRAMES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MNTR_FLAG_COOK_FRAMES,
NL80211_MNTR_FLAG_ACTIVE,
__NL80211_MNTR_FLAG_AFTER_LAST,
NL80211_MNTR_FLAG_MAX = __NL80211_MNTR_FLAG_AFTER_LAST - 1
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_mesh_power_mode {
NL80211_MESH_POWER_UNKNOWN,
NL80211_MESH_POWER_ACTIVE,
- NL80211_MESH_POWER_LIGHT_SLEEP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESH_POWER_LIGHT_SLEEP,
NL80211_MESH_POWER_DEEP_SLEEP,
__NL80211_MESH_POWER_AFTER_LAST,
NL80211_MESH_POWER_MAX = __NL80211_MESH_POWER_AFTER_LAST - 1
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_meshconf_params {
__NL80211_MESHCONF_INVALID,
NL80211_MESHCONF_RETRY_TIMEOUT,
- NL80211_MESHCONF_CONFIRM_TIMEOUT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_CONFIRM_TIMEOUT,
NL80211_MESHCONF_HOLDING_TIMEOUT,
NL80211_MESHCONF_MAX_PEER_LINKS,
NL80211_MESHCONF_MAX_RETRIES,
- NL80211_MESHCONF_TTL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_TTL,
NL80211_MESHCONF_AUTO_OPEN_PLINKS,
NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES,
NL80211_MESHCONF_PATH_REFRESH_TIME,
- NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT,
NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT,
NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL,
NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
- NL80211_MESHCONF_HWMP_ROOTMODE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_HWMP_ROOTMODE,
NL80211_MESHCONF_ELEMENT_TTL,
NL80211_MESHCONF_HWMP_RANN_INTERVAL,
NL80211_MESHCONF_GATE_ANNOUNCEMENTS,
- NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL,
NL80211_MESHCONF_FORWARDING,
NL80211_MESHCONF_RSSI_THRESHOLD,
NL80211_MESHCONF_SYNC_OFFSET_MAX_NEIGHBOR,
- NL80211_MESHCONF_HT_OPMODE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_HT_OPMODE,
NL80211_MESHCONF_HWMP_PATH_TO_ROOT_TIMEOUT,
NL80211_MESHCONF_HWMP_ROOT_INTERVAL,
NL80211_MESHCONF_HWMP_CONFIRMATION_INTERVAL,
- NL80211_MESHCONF_POWER_MODE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_POWER_MODE,
NL80211_MESHCONF_AWAKE_WINDOW,
NL80211_MESHCONF_PLINK_TIMEOUT,
__NL80211_MESHCONF_ATTR_AFTER_LAST,
- NL80211_MESHCONF_ATTR_MAX = __NL80211_MESHCONF_ATTR_AFTER_LAST - 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESHCONF_ATTR_MAX = __NL80211_MESHCONF_ATTR_AFTER_LAST - 1
};
enum nl80211_mesh_setup_params {
__NL80211_MESH_SETUP_INVALID,
- NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESH_SETUP_ENABLE_VENDOR_PATH_SEL,
NL80211_MESH_SETUP_ENABLE_VENDOR_METRIC,
NL80211_MESH_SETUP_IE,
NL80211_MESH_SETUP_USERSPACE_AUTH,
- NL80211_MESH_SETUP_USERSPACE_AMPE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_MESH_SETUP_USERSPACE_AMPE,
NL80211_MESH_SETUP_ENABLE_VENDOR_SYNC,
NL80211_MESH_SETUP_USERSPACE_MPM,
NL80211_MESH_SETUP_AUTH_PROTOCOL,
- __NL80211_MESH_SETUP_ATTR_AFTER_LAST,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NL80211_MESH_SETUP_ATTR_AFTER_LAST,
NL80211_MESH_SETUP_ATTR_MAX = __NL80211_MESH_SETUP_ATTR_AFTER_LAST - 1
};
enum nl80211_txq_attr {
- __NL80211_TXQ_ATTR_INVALID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NL80211_TXQ_ATTR_INVALID,
NL80211_TXQ_ATTR_AC,
NL80211_TXQ_ATTR_TXOP,
NL80211_TXQ_ATTR_CWMIN,
- NL80211_TXQ_ATTR_CWMAX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_TXQ_ATTR_CWMAX,
NL80211_TXQ_ATTR_AIFS,
__NL80211_TXQ_ATTR_AFTER_LAST,
NL80211_TXQ_ATTR_MAX = __NL80211_TXQ_ATTR_AFTER_LAST - 1
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_ac {
NL80211_AC_VO,
NL80211_AC_VI,
- NL80211_AC_BE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_AC_BE,
NL80211_AC_BK,
NL80211_NUM_ACS
};
-#define NL80211_TXQ_ATTR_QUEUE NL80211_TXQ_ATTR_AC
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_TXQ_ATTR_QUEUE NL80211_TXQ_ATTR_AC
#define NL80211_TXQ_Q_VO NL80211_AC_VO
#define NL80211_TXQ_Q_VI NL80211_AC_VI
#define NL80211_TXQ_Q_BE NL80211_AC_BE
-#define NL80211_TXQ_Q_BK NL80211_AC_BK
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_TXQ_Q_BK NL80211_AC_BK
enum nl80211_channel_type {
NL80211_CHAN_NO_HT,
NL80211_CHAN_HT20,
- NL80211_CHAN_HT40MINUS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_CHAN_HT40MINUS,
NL80211_CHAN_HT40PLUS
};
enum nl80211_chan_width {
- NL80211_CHAN_WIDTH_20_NOHT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_CHAN_WIDTH_20_NOHT,
NL80211_CHAN_WIDTH_20,
NL80211_CHAN_WIDTH_40,
NL80211_CHAN_WIDTH_80,
- NL80211_CHAN_WIDTH_80P80,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_CHAN_WIDTH_80P80,
NL80211_CHAN_WIDTH_160,
NL80211_CHAN_WIDTH_5,
NL80211_CHAN_WIDTH_10,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_bss_scan_width {
NL80211_BSS_CHAN_WIDTH_20,
NL80211_BSS_CHAN_WIDTH_10,
- NL80211_BSS_CHAN_WIDTH_5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_BSS_CHAN_WIDTH_5,
};
enum nl80211_bss {
__NL80211_BSS_INVALID,
- NL80211_BSS_BSSID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_BSS_BSSID,
NL80211_BSS_FREQUENCY,
NL80211_BSS_TSF,
NL80211_BSS_BEACON_INTERVAL,
- NL80211_BSS_CAPABILITY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_BSS_CAPABILITY,
NL80211_BSS_INFORMATION_ELEMENTS,
NL80211_BSS_SIGNAL_MBM,
NL80211_BSS_SIGNAL_UNSPEC,
- NL80211_BSS_STATUS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_BSS_STATUS,
NL80211_BSS_SEEN_MS_AGO,
NL80211_BSS_BEACON_IES,
NL80211_BSS_CHAN_WIDTH,
- NL80211_BSS_BEACON_TSF,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_BSS_BEACON_TSF,
NL80211_BSS_PRESP_DATA,
+ NL80211_BSS_LAST_SEEN_BOOTTIME,
__NL80211_BSS_AFTER_LAST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BSS_MAX = __NL80211_BSS_AFTER_LAST - 1
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_bss_status {
NL80211_BSS_STATUS_AUTHENTICATED,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BSS_STATUS_ASSOCIATED,
NL80211_BSS_STATUS_IBSS_JOINED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_auth_type {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_AUTHTYPE_OPEN_SYSTEM,
NL80211_AUTHTYPE_SHARED_KEY,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_AUTHTYPE_FT,
NL80211_AUTHTYPE_NETWORK_EAP,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_AUTHTYPE_SAE,
__NL80211_AUTHTYPE_NUM,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_AUTHTYPE_MAX = __NL80211_AUTHTYPE_NUM - 1,
NL80211_AUTHTYPE_AUTOMATIC
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_key_type {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEYTYPE_GROUP,
NL80211_KEYTYPE_PAIRWISE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEYTYPE_PEERKEY,
NUM_NL80211_KEYTYPES
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_mfp {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_MFP_NO,
NL80211_MFP_REQUIRED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_wpa_versions {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WPA_VERSION_1 = 1 << 0,
NL80211_WPA_VERSION_2 = 1 << 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_key_default_types {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_KEY_DEFAULT_TYPE_INVALID,
NL80211_KEY_DEFAULT_TYPE_UNICAST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEY_DEFAULT_TYPE_MULTICAST,
NUM_NL80211_KEY_DEFAULT_TYPES
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_key_attributes {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_KEY_INVALID,
NL80211_KEY_DATA,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEY_IDX,
NL80211_KEY_CIPHER,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEY_SEQ,
NL80211_KEY_DEFAULT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEY_DEFAULT_MGMT,
NL80211_KEY_TYPE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEY_DEFAULT_TYPES,
__NL80211_KEY_AFTER_LAST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_KEY_MAX = __NL80211_KEY_AFTER_LAST - 1
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_tx_rate_attributes {
__NL80211_TXRATE_INVALID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_TXRATE_LEGACY,
NL80211_TXRATE_HT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_TXRATE_VHT,
NL80211_TXRATE_GI,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_TXRATE_AFTER_LAST,
NL80211_TXRATE_MAX = __NL80211_TXRATE_AFTER_LAST - 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NL80211_TXRATE_MCS NL80211_TXRATE_HT
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_VHT_NSS_MAX 8
struct nl80211_txrate_vht {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 mcs[NL80211_VHT_NSS_MAX];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_txrate_gi {
NL80211_TXRATE_DEFAULT_GI,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_TXRATE_FORCE_SGI,
NL80211_TXRATE_FORCE_LGI,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_band {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BAND_2GHZ,
NL80211_BAND_5GHZ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_BAND_60GHZ,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_ps_state {
NL80211_PS_DISABLED,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_PS_ENABLED,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_attr_cqm {
__NL80211_ATTR_CQM_INVALID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_ATTR_CQM_RSSI_THOLD,
NL80211_ATTR_CQM_RSSI_HYST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT,
NL80211_ATTR_CQM_PKT_LOSS_EVENT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_ATTR_CQM_TXE_RATE,
NL80211_ATTR_CQM_TXE_PKTS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_ATTR_CQM_TXE_INTVL,
+ NL80211_ATTR_CQM_BEACON_LOSS_EVENT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_ATTR_CQM_AFTER_LAST,
NL80211_ATTR_CQM_MAX = __NL80211_ATTR_CQM_AFTER_LAST - 1
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_cqm_rssi_threshold_event {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
NL80211_CQM_RSSI_BEACON_LOSS_EVENT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_tx_power_setting {
NL80211_TX_POWER_AUTOMATIC,
NL80211_TX_POWER_LIMITED,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_TX_POWER_FIXED,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum nl80211_packet_pattern_attr {
__NL80211_PKTPAT_INVALID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_PKTPAT_MASK,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_PKTPAT_PATTERN,
NL80211_PKTPAT_OFFSET,
NUM_NL80211_PKTPAT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
MAX_NL80211_PKTPAT = NUM_NL80211_PKTPAT - 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct nl80211_pattern_support {
__u32 max_patterns;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 min_pattern_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_pattern_len;
__u32 max_pkt_offset;
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define __NL80211_WOWLAN_PKTPAT_INVALID __NL80211_PKTPAT_INVALID
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NL80211_WOWLAN_PKTPAT_MASK NL80211_PKTPAT_MASK
#define NL80211_WOWLAN_PKTPAT_PATTERN NL80211_PKTPAT_PATTERN
#define NL80211_WOWLAN_PKTPAT_OFFSET NL80211_PKTPAT_OFFSET
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define NUM_NL80211_WOWLAN_PKTPAT NUM_NL80211_PKTPAT
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MAX_NL80211_WOWLAN_PKTPAT MAX_NL80211_PKTPAT
#define nl80211_wowlan_pattern_support nl80211_pattern_support
enum nl80211_wowlan_triggers {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NL80211_WOWLAN_TRIG_INVALID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_ANY,
NL80211_WOWLAN_TRIG_DISCONNECT,
NL80211_WOWLAN_TRIG_MAGIC_PKT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_PKT_PATTERN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_GTK_REKEY_SUPPORTED,
NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE,
NL80211_WOWLAN_TRIG_EAP_IDENT_REQUEST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_4WAY_HANDSHAKE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_RFKILL_RELEASE,
NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211,
NL80211_WOWLAN_TRIG_WAKEUP_PKT_80211_LEN,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_WAKEUP_PKT_8023_LEN,
NL80211_WOWLAN_TRIG_TCP_CONNECTION,
NL80211_WOWLAN_TRIG_WAKEUP_TCP_MATCH,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_WAKEUP_TCP_CONNLOST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_WOWLAN_TRIG_WAKEUP_TCP_NOMORETOKENS,
+ NL80211_WOWLAN_TRIG_NET_DETECT,
+ NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS,
NUM_NL80211_WOWLAN_TRIG,
- MAX_NL80211_WOWLAN_TRIG = NUM_NL80211_WOWLAN_TRIG - 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MAX_NL80211_WOWLAN_TRIG = NUM_NL80211_WOWLAN_TRIG - 1
};
struct nl80211_wowlan_tcp_data_seq {
__u32 start, offset, len;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct nl80211_wowlan_tcp_data_token {
__u32 offset, len;
__u8 token_stream[];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct nl80211_wowlan_tcp_data_token_feature {
__u32 min_len, max_len, bufsize;
};
-enum nl80211_wowlan_tcp_attrs {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nl80211_wowlan_tcp_attrs {
__NL80211_WOWLAN_TCP_INVALID,
NL80211_WOWLAN_TCP_SRC_IPV4,
NL80211_WOWLAN_TCP_DST_IPV4,
- NL80211_WOWLAN_TCP_DST_MAC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_WOWLAN_TCP_DST_MAC,
NL80211_WOWLAN_TCP_SRC_PORT,
NL80211_WOWLAN_TCP_DST_PORT,
NL80211_WOWLAN_TCP_DATA_PAYLOAD,
- NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ,
NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
NL80211_WOWLAN_TCP_DATA_INTERVAL,
NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
- NL80211_WOWLAN_TCP_WAKE_MASK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_WOWLAN_TCP_WAKE_MASK,
NUM_NL80211_WOWLAN_TCP,
MAX_NL80211_WOWLAN_TCP = NUM_NL80211_WOWLAN_TCP - 1
};
-struct nl80211_coalesce_rule_support {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct nl80211_coalesce_rule_support {
__u32 max_rules;
struct nl80211_pattern_support pat;
__u32 max_delay;
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
enum nl80211_attr_coalesce_rule {
__NL80211_COALESCE_RULE_INVALID,
NL80211_ATTR_COALESCE_RULE_DELAY,
- NL80211_ATTR_COALESCE_RULE_CONDITION,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_ATTR_COALESCE_RULE_CONDITION,
NL80211_ATTR_COALESCE_RULE_PKT_PATTERN,
NUM_NL80211_ATTR_COALESCE_RULE,
NL80211_ATTR_COALESCE_RULE_MAX = NUM_NL80211_ATTR_COALESCE_RULE - 1
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_coalesce_condition {
NL80211_COALESCE_CONDITION_MATCH,
NL80211_COALESCE_CONDITION_NO_MATCH
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_iface_limit_attrs {
NL80211_IFACE_LIMIT_UNSPEC,
NL80211_IFACE_LIMIT_MAX,
- NL80211_IFACE_LIMIT_TYPES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_IFACE_LIMIT_TYPES,
NUM_NL80211_IFACE_LIMIT,
MAX_NL80211_IFACE_LIMIT = NUM_NL80211_IFACE_LIMIT - 1
};
-enum nl80211_if_combination_attrs {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nl80211_if_combination_attrs {
NL80211_IFACE_COMB_UNSPEC,
NL80211_IFACE_COMB_LIMITS,
NL80211_IFACE_COMB_MAXNUM,
- NL80211_IFACE_COMB_STA_AP_BI_MATCH,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_IFACE_COMB_STA_AP_BI_MATCH,
NL80211_IFACE_COMB_NUM_CHANNELS,
NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
- NUM_NL80211_IFACE_COMB,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NUM_NL80211_IFACE_COMB,
MAX_NL80211_IFACE_COMB = NUM_NL80211_IFACE_COMB - 1
};
enum nl80211_plink_state {
- NL80211_PLINK_LISTEN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_PLINK_LISTEN,
NL80211_PLINK_OPN_SNT,
NL80211_PLINK_OPN_RCVD,
NL80211_PLINK_CNF_RCVD,
- NL80211_PLINK_ESTAB,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_PLINK_ESTAB,
NL80211_PLINK_HOLDING,
NL80211_PLINK_BLOCKED,
NUM_NL80211_PLINK_STATES,
- MAX_NL80211_PLINK_STATES = NUM_NL80211_PLINK_STATES - 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ MAX_NL80211_PLINK_STATES = NUM_NL80211_PLINK_STATES - 1
};
enum plink_actions {
NL80211_PLINK_ACTION_NO_ACTION,
- NL80211_PLINK_ACTION_OPEN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_PLINK_ACTION_OPEN,
NL80211_PLINK_ACTION_BLOCK,
NUM_NL80211_PLINK_ACTIONS,
};
-#define NL80211_KCK_LEN 16
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_KCK_LEN 16
#define NL80211_KEK_LEN 16
#define NL80211_REPLAY_CTR_LEN 8
enum nl80211_rekey_data {
- __NL80211_REKEY_DATA_INVALID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NL80211_REKEY_DATA_INVALID,
NL80211_REKEY_DATA_KEK,
NL80211_REKEY_DATA_KCK,
NL80211_REKEY_DATA_REPLAY_CTR,
- NUM_NL80211_REKEY_DATA,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NUM_NL80211_REKEY_DATA,
MAX_NL80211_REKEY_DATA = NUM_NL80211_REKEY_DATA - 1
};
enum nl80211_hidden_ssid {
- NL80211_HIDDEN_SSID_NOT_IN_USE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_HIDDEN_SSID_NOT_IN_USE,
NL80211_HIDDEN_SSID_ZERO_LEN,
NL80211_HIDDEN_SSID_ZERO_CONTENTS
};
-enum nl80211_sta_wme_attr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nl80211_sta_wme_attr {
__NL80211_STA_WME_INVALID,
NL80211_STA_WME_UAPSD_QUEUES,
NL80211_STA_WME_MAX_SP,
- __NL80211_STA_WME_AFTER_LAST,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NL80211_STA_WME_AFTER_LAST,
NL80211_STA_WME_MAX = __NL80211_STA_WME_AFTER_LAST - 1
};
enum nl80211_pmksa_candidate_attr {
- __NL80211_PMKSA_CANDIDATE_INVALID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NL80211_PMKSA_CANDIDATE_INVALID,
NL80211_PMKSA_CANDIDATE_INDEX,
NL80211_PMKSA_CANDIDATE_BSSID,
NL80211_PMKSA_CANDIDATE_PREAUTH,
- NUM_NL80211_PMKSA_CANDIDATE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NUM_NL80211_PMKSA_CANDIDATE,
MAX_NL80211_PMKSA_CANDIDATE = NUM_NL80211_PMKSA_CANDIDATE - 1
};
enum nl80211_tdls_operation {
- NL80211_TDLS_DISCOVERY_REQ,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_TDLS_DISCOVERY_REQ,
NL80211_TDLS_SETUP,
NL80211_TDLS_TEARDOWN,
NL80211_TDLS_ENABLE_LINK,
- NL80211_TDLS_DISABLE_LINK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_TDLS_DISABLE_LINK,
};
enum nl80211_feature_flags {
NL80211_FEATURE_SK_TX_STATUS = 1 << 0,
- NL80211_FEATURE_HT_IBSS = 1 << 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_HT_IBSS = 1 << 1,
NL80211_FEATURE_INACTIVITY_TIMER = 1 << 2,
NL80211_FEATURE_CELL_BASE_REG_HINTS = 1 << 3,
NL80211_FEATURE_P2P_DEVICE_NEEDS_CHANNEL = 1 << 4,
- NL80211_FEATURE_SAE = 1 << 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_SAE = 1 << 5,
NL80211_FEATURE_LOW_PRIORITY_SCAN = 1 << 6,
NL80211_FEATURE_SCAN_FLUSH = 1 << 7,
NL80211_FEATURE_AP_SCAN = 1 << 8,
- NL80211_FEATURE_VIF_TXPOWER = 1 << 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_VIF_TXPOWER = 1 << 9,
NL80211_FEATURE_NEED_OBSS_SCAN = 1 << 10,
NL80211_FEATURE_P2P_GO_CTWIN = 1 << 11,
NL80211_FEATURE_P2P_GO_OPPPS = 1 << 12,
- NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1 << 14,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_ADVERTISE_CHAN_LIMITS = 1 << 14,
NL80211_FEATURE_FULL_AP_CLIENT_STATE = 1 << 15,
NL80211_FEATURE_USERSPACE_MPM = 1 << 16,
NL80211_FEATURE_ACTIVE_MONITOR = 1 << 17,
- NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE = 1 << 18,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE = 1 << 18,
NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES = 1 << 19,
NL80211_FEATURE_WFA_TPC_IE_IN_PROBES = 1 << 20,
NL80211_FEATURE_QUIET = 1 << 21,
- NL80211_FEATURE_TX_POWER_INSERTION = 1 << 22,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_TX_POWER_INSERTION = 1 << 22,
NL80211_FEATURE_ACKTO_ESTIMATION = 1 << 23,
NL80211_FEATURE_STATIC_SMPS = 1 << 24,
NL80211_FEATURE_DYNAMIC_SMPS = 1 << 25,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_SUPPORTS_WMM_ADMISSION = 1 << 26,
+ NL80211_FEATURE_MAC_ON_CREATE = 1 << 27,
+ NL80211_FEATURE_TDLS_CHANNEL_SWITCH = 1 << 28,
+ NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR = 1 << 29,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR = 1 << 30,
+ NL80211_FEATURE_ND_RANDOM_MAC_ADDR = 1 << 31,
+};
+enum nl80211_ext_feature_index {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_EXT_FEATURE_VHT_IBSS,
+ NUM_NL80211_EXT_FEATURES,
+ MAX_NL80211_EXT_FEATURES = NUM_NL80211_EXT_FEATURES - 1
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum nl80211_probe_resp_offload_support_attr {
@@ -1313,63 +1403,73 @@ enum nl80211_scan_flags {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_SCAN_FLAG_FLUSH = 1 << 1,
NL80211_SCAN_FLAG_AP = 1 << 2,
+ NL80211_SCAN_FLAG_RANDOM_ADDR = 1 << 3,
};
-enum nl80211_acl_policy {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nl80211_acl_policy {
NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED,
NL80211_ACL_POLICY_DENY_UNLESS_LISTED,
};
-enum nl80211_smps_mode {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum nl80211_smps_mode {
NL80211_SMPS_OFF,
NL80211_SMPS_STATIC,
NL80211_SMPS_DYNAMIC,
- __NL80211_SMPS_AFTER_LAST,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NL80211_SMPS_AFTER_LAST,
NL80211_SMPS_MAX = __NL80211_SMPS_AFTER_LAST - 1
};
enum nl80211_radar_event {
- NL80211_RADAR_DETECTED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_RADAR_DETECTED,
NL80211_RADAR_CAC_FINISHED,
NL80211_RADAR_CAC_ABORTED,
NL80211_RADAR_NOP_FINISHED,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_dfs_state {
NL80211_DFS_USABLE,
NL80211_DFS_UNAVAILABLE,
- NL80211_DFS_AVAILABLE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_DFS_AVAILABLE,
};
enum nl80211_protocol_features {
NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP = 1 << 0,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_crit_proto_id {
NL80211_CRIT_PROTO_UNSPEC,
NL80211_CRIT_PROTO_DHCP,
- NL80211_CRIT_PROTO_EAPOL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_CRIT_PROTO_EAPOL,
NL80211_CRIT_PROTO_APIPA,
NUM_NL80211_CRIT_PROTO
};
-#define NL80211_CRIT_PROTO_MAX_DURATION 5000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_CRIT_PROTO_MAX_DURATION 5000
enum nl80211_rxmgmt_flags {
NL80211_RXMGMT_FLAG_ANSWERED = 1 << 0,
};
-#define NL80211_VENDOR_ID_IS_LINUX 0x80000000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NL80211_VENDOR_ID_IS_LINUX 0x80000000
struct nl80211_vendor_cmd_info {
__u32 vendor_id;
__u32 subcmd;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum nl80211_tdls_peer_capability {
NL80211_TDLS_PEER_HT = 1 << 0,
NL80211_TDLS_PEER_VHT = 1 << 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
NL80211_TDLS_PEER_WMM = 1 << 2,
+};
+enum nl80211_sched_scan_plan {
+ __NL80211_SCHED_SCAN_PLAN_INVALID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NL80211_SCHED_SCAN_PLAN_INTERVAL,
+ NL80211_SCHED_SCAN_PLAN_ITERATIONS,
+ __NL80211_SCHED_SCAN_PLAN_AFTER_LAST,
+ NL80211_SCHED_SCAN_PLAN_MAX = __NL80211_SCHED_SCAN_PLAN_AFTER_LAST - 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif
diff --git a/libc/kernel/uapi/linux/nvme_ioctl.h b/libc/kernel/uapi/linux/nvme_ioctl.h
new file mode 100644
index 000000000..d64376753
--- /dev/null
+++ b/libc/kernel/uapi/linux/nvme_ioctl.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_NVME_IOCTL_H
+#define _UAPI_LINUX_NVME_IOCTL_H
+#include <linux/types.h>
+struct nvme_user_io {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 opcode;
+ __u8 flags;
+ __u16 control;
+ __u16 nblocks;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 rsvd;
+ __u64 metadata;
+ __u64 addr;
+ __u64 slba;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 dsmgmt;
+ __u32 reftag;
+ __u16 apptag;
+ __u16 appmask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct nvme_passthru_cmd {
+ __u8 opcode;
+ __u8 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 result;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define nvme_admin_cmd nvme_passthru_cmd
+#define NVME_IOCTL_ID _IO('N', 0x40)
+#define NVME_IOCTL_ADMIN_CMD _IOWR('N', 0x41, struct nvme_admin_cmd)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NVME_IOCTL_SUBMIT_IO _IOW('N', 0x42, struct nvme_user_io)
+#define NVME_IOCTL_IO_CMD _IOWR('N', 0x43, struct nvme_passthru_cmd)
+#define NVME_IOCTL_RESET _IO('N', 0x44)
+#define NVME_IOCTL_SUBSYS_RESET _IO('N', 0x45)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/openvswitch.h b/libc/kernel/uapi/linux/openvswitch.h
index 663e37fd9..61923ccff 100644
--- a/libc/kernel/uapi/linux/openvswitch.h
+++ b/libc/kernel/uapi/linux/openvswitch.h
@@ -101,52 +101,67 @@ enum ovs_packet_attr {
OVS_PACKET_ATTR_ACTIONS,
OVS_PACKET_ATTR_USERDATA,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_PACKET_ATTR_EGRESS_TUN_KEY,
+ OVS_PACKET_ATTR_UNUSED1,
+ OVS_PACKET_ATTR_UNUSED2,
+ OVS_PACKET_ATTR_PROBE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_PACKET_ATTR_MRU,
__OVS_PACKET_ATTR_MAX
};
#define OVS_PACKET_ATTR_MAX (__OVS_PACKET_ATTR_MAX - 1)
-#define OVS_VPORT_FAMILY "ovs_vport"
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define OVS_VPORT_FAMILY "ovs_vport"
#define OVS_VPORT_MCGROUP "ovs_vport"
#define OVS_VPORT_VERSION 0x1
enum ovs_vport_cmd {
- OVS_VPORT_CMD_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_VPORT_CMD_UNSPEC,
OVS_VPORT_CMD_NEW,
OVS_VPORT_CMD_DEL,
OVS_VPORT_CMD_GET,
- OVS_VPORT_CMD_SET
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_VPORT_CMD_SET
};
enum ovs_vport_type {
OVS_VPORT_TYPE_UNSPEC,
- OVS_VPORT_TYPE_NETDEV,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_VPORT_TYPE_NETDEV,
OVS_VPORT_TYPE_INTERNAL,
OVS_VPORT_TYPE_GRE,
OVS_VPORT_TYPE_VXLAN,
- OVS_VPORT_TYPE_GENEVE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_VPORT_TYPE_GENEVE,
__OVS_VPORT_TYPE_MAX
};
#define OVS_VPORT_TYPE_MAX (__OVS_VPORT_TYPE_MAX - 1)
-enum ovs_vport_attr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ovs_vport_attr {
OVS_VPORT_ATTR_UNSPEC,
OVS_VPORT_ATTR_PORT_NO,
OVS_VPORT_ATTR_TYPE,
- OVS_VPORT_ATTR_NAME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_VPORT_ATTR_NAME,
OVS_VPORT_ATTR_OPTIONS,
OVS_VPORT_ATTR_UPCALL_PID,
OVS_VPORT_ATTR_STATS,
- __OVS_VPORT_ATTR_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __OVS_VPORT_ATTR_MAX
};
#define OVS_VPORT_ATTR_MAX (__OVS_VPORT_ATTR_MAX - 1)
enum {
- OVS_TUNNEL_ATTR_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_VXLAN_EXT_UNSPEC,
+ OVS_VXLAN_EXT_GBP,
+ __OVS_VXLAN_EXT_MAX,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define OVS_VXLAN_EXT_MAX (__OVS_VXLAN_EXT_MAX - 1)
+enum {
+ OVS_TUNNEL_ATTR_UNSPEC,
OVS_TUNNEL_ATTR_DST_PORT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_TUNNEL_ATTR_EXTENSION,
__OVS_TUNNEL_ATTR_MAX
};
#define OVS_TUNNEL_ATTR_MAX (__OVS_TUNNEL_ATTR_MAX - 1)
@@ -196,161 +211,223 @@ enum ovs_key_attr {
OVS_KEY_ATTR_DP_HASH,
OVS_KEY_ATTR_RECIRC_ID,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_KEY_ATTR_MPLS,
+ OVS_KEY_ATTR_CT_STATE,
+ OVS_KEY_ATTR_CT_ZONE,
+ OVS_KEY_ATTR_CT_MARK,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_KEY_ATTR_CT_LABELS,
__OVS_KEY_ATTR_MAX
};
#define OVS_KEY_ATTR_MAX (__OVS_KEY_ATTR_MAX - 1)
-enum ovs_tunnel_key_attr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ovs_tunnel_key_attr {
OVS_TUNNEL_KEY_ATTR_ID,
OVS_TUNNEL_KEY_ATTR_IPV4_SRC,
OVS_TUNNEL_KEY_ATTR_IPV4_DST,
- OVS_TUNNEL_KEY_ATTR_TOS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_TUNNEL_KEY_ATTR_TOS,
OVS_TUNNEL_KEY_ATTR_TTL,
OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT,
OVS_TUNNEL_KEY_ATTR_CSUM,
- OVS_TUNNEL_KEY_ATTR_OAM,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_TUNNEL_KEY_ATTR_OAM,
OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS,
+ OVS_TUNNEL_KEY_ATTR_TP_SRC,
+ OVS_TUNNEL_KEY_ATTR_TP_DST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS,
+ OVS_TUNNEL_KEY_ATTR_IPV6_SRC,
+ OVS_TUNNEL_KEY_ATTR_IPV6_DST,
__OVS_TUNNEL_KEY_ATTR_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define OVS_TUNNEL_KEY_ATTR_MAX (__OVS_TUNNEL_KEY_ATTR_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum ovs_frag_type {
OVS_FRAG_TYPE_NONE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
OVS_FRAG_TYPE_FIRST,
OVS_FRAG_TYPE_LATER,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__OVS_FRAG_TYPE_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define OVS_FRAG_TYPE_MAX (__OVS_FRAG_TYPE_MAX - 1)
struct ovs_key_ethernet {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 eth_src[ETH_ALEN];
__u8 eth_dst[ETH_ALEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct ovs_key_mpls {
+ __be32 mpls_lse;
};
-struct ovs_key_ipv4 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ovs_key_ipv4 {
__be32 ipv4_src;
__be32 ipv4_dst;
__u8 ipv4_proto;
- __u8 ipv4_tos;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 ipv4_tos;
__u8 ipv4_ttl;
__u8 ipv4_frag;
};
-struct ovs_key_ipv6 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ovs_key_ipv6 {
__be32 ipv6_src[4];
__be32 ipv6_dst[4];
__be32 ipv6_label;
- __u8 ipv6_proto;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 ipv6_proto;
__u8 ipv6_tclass;
__u8 ipv6_hlimit;
__u8 ipv6_frag;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ovs_key_tcp {
__be16 tcp_src;
__be16 tcp_dst;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ovs_key_udp {
__be16 udp_src;
__be16 udp_dst;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ovs_key_sctp {
__be16 sctp_src;
__be16 sctp_dst;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ovs_key_icmp {
__u8 icmp_type;
__u8 icmp_code;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ovs_key_icmpv6 {
__u8 icmpv6_type;
__u8 icmpv6_code;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ovs_key_arp {
__be32 arp_sip;
__be32 arp_tip;
- __be16 arp_op;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __be16 arp_op;
__u8 arp_sha[ETH_ALEN];
__u8 arp_tha[ETH_ALEN];
};
-struct ovs_key_nd {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 nd_target[4];
+struct ovs_key_nd {
+ __be32 nd_target[4];
__u8 nd_sll[ETH_ALEN];
__u8 nd_tll[ETH_ALEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define OVS_CT_LABELS_LEN 16
+struct ovs_key_ct_labels {
+ __u8 ct_labels[OVS_CT_LABELS_LEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+#define OVS_CS_F_NEW 0x01
+#define OVS_CS_F_ESTABLISHED 0x02
+#define OVS_CS_F_RELATED 0x04
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define OVS_CS_F_REPLY_DIR 0x08
+#define OVS_CS_F_INVALID 0x10
+#define OVS_CS_F_TRACKED 0x20
enum ovs_flow_attr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
OVS_FLOW_ATTR_UNSPEC,
OVS_FLOW_ATTR_KEY,
OVS_FLOW_ATTR_ACTIONS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
OVS_FLOW_ATTR_STATS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
OVS_FLOW_ATTR_TCP_FLAGS,
OVS_FLOW_ATTR_USED,
OVS_FLOW_ATTR_CLEAR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
OVS_FLOW_ATTR_MASK,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_FLOW_ATTR_PROBE,
+ OVS_FLOW_ATTR_UFID,
+ OVS_FLOW_ATTR_UFID_FLAGS,
__OVS_FLOW_ATTR_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define OVS_FLOW_ATTR_MAX (__OVS_FLOW_ATTR_MAX - 1)
+#define OVS_UFID_F_OMIT_KEY (1 << 0)
+#define OVS_UFID_F_OMIT_MASK (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define OVS_UFID_F_OMIT_ACTIONS (1 << 2)
enum ovs_sample_attr {
OVS_SAMPLE_ATTR_UNSPEC,
OVS_SAMPLE_ATTR_PROBABILITY,
- OVS_SAMPLE_ATTR_ACTIONS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_SAMPLE_ATTR_ACTIONS,
__OVS_SAMPLE_ATTR_MAX,
};
#define OVS_SAMPLE_ATTR_MAX (__OVS_SAMPLE_ATTR_MAX - 1)
-enum ovs_userspace_attr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ovs_userspace_attr {
OVS_USERSPACE_ATTR_UNSPEC,
OVS_USERSPACE_ATTR_PID,
OVS_USERSPACE_ATTR_USERDATA,
- __OVS_USERSPACE_ATTR_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_USERSPACE_ATTR_EGRESS_TUN_PORT,
+ OVS_USERSPACE_ATTR_ACTIONS,
+ __OVS_USERSPACE_ATTR_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define OVS_USERSPACE_ATTR_MAX (__OVS_USERSPACE_ATTR_MAX - 1)
+struct ovs_action_push_mpls {
+ __be32 mpls_lse;
+ __be16 mpls_ethertype;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ovs_action_push_vlan {
__be16 vlan_tpid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 vlan_tci;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum ovs_hash_alg {
OVS_HASH_ALG_L4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ovs_action_hash {
uint32_t hash_alg;
uint32_t hash_basis;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum ovs_ct_attr {
+ OVS_CT_ATTR_UNSPEC,
+ OVS_CT_ATTR_COMMIT,
+ OVS_CT_ATTR_ZONE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_CT_ATTR_MARK,
+ OVS_CT_ATTR_LABELS,
+ OVS_CT_ATTR_HELPER,
+ __OVS_CT_ATTR_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+#define OVS_CT_ATTR_MAX (__OVS_CT_ATTR_MAX - 1)
enum ovs_action_attr {
OVS_ACTION_ATTR_UNSPEC,
- OVS_ACTION_ATTR_OUTPUT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_ACTION_ATTR_OUTPUT,
OVS_ACTION_ATTR_USERSPACE,
OVS_ACTION_ATTR_SET,
OVS_ACTION_ATTR_PUSH_VLAN,
- OVS_ACTION_ATTR_POP_VLAN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_ACTION_ATTR_POP_VLAN,
OVS_ACTION_ATTR_SAMPLE,
OVS_ACTION_ATTR_RECIRC,
OVS_ACTION_ATTR_HASH,
- __OVS_ACTION_ATTR_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ OVS_ACTION_ATTR_PUSH_MPLS,
+ OVS_ACTION_ATTR_POP_MPLS,
+ OVS_ACTION_ATTR_SET_MASKED,
+ OVS_ACTION_ATTR_CT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __OVS_ACTION_ATTR_MAX,
};
#define OVS_ACTION_ATTR_MAX (__OVS_ACTION_ATTR_MAX - 1)
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/pci_regs.h b/libc/kernel/uapi/linux/pci_regs.h
index d1918219d..9e5bfacc7 100644
--- a/libc/kernel/uapi/linux/pci_regs.h
+++ b/libc/kernel/uapi/linux/pci_regs.h
@@ -218,734 +218,783 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CAP_ID_SATA 0x12
#define PCI_CAP_ID_AF 0x13
-#define PCI_CAP_ID_MAX PCI_CAP_ID_AF
-#define PCI_CAP_LIST_NEXT 1
+#define PCI_CAP_ID_EA 0x14
+#define PCI_CAP_ID_MAX PCI_CAP_ID_EA
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_CAP_LIST_NEXT 1
#define PCI_CAP_FLAGS 2
#define PCI_CAP_SIZEOF 4
#define PCI_PM_PMC 2
-#define PCI_PM_CAP_VER_MASK 0x0007
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_PM_CAP_VER_MASK 0x0007
#define PCI_PM_CAP_PME_CLOCK 0x0008
#define PCI_PM_CAP_RESERVED 0x0010
#define PCI_PM_CAP_DSI 0x0020
-#define PCI_PM_CAP_AUX_POWER 0x01C0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_PM_CAP_AUX_POWER 0x01C0
#define PCI_PM_CAP_D1 0x0200
#define PCI_PM_CAP_D2 0x0400
#define PCI_PM_CAP_PME 0x0800
-#define PCI_PM_CAP_PME_MASK 0xF800
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_PM_CAP_PME_MASK 0xF800
#define PCI_PM_CAP_PME_D0 0x0800
#define PCI_PM_CAP_PME_D1 0x1000
#define PCI_PM_CAP_PME_D2 0x2000
-#define PCI_PM_CAP_PME_D3 0x4000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_PM_CAP_PME_D3 0x4000
#define PCI_PM_CAP_PME_D3cold 0x8000
#define PCI_PM_CAP_PME_SHIFT 11
#define PCI_PM_CTRL 4
-#define PCI_PM_CTRL_STATE_MASK 0x0003
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_PM_CTRL_STATE_MASK 0x0003
#define PCI_PM_CTRL_NO_SOFT_RESET 0x0008
#define PCI_PM_CTRL_PME_ENABLE 0x0100
#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00
-#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000
#define PCI_PM_CTRL_PME_STATUS 0x8000
#define PCI_PM_PPB_EXTENSIONS 6
#define PCI_PM_PPB_B2_B3 0x40
-#define PCI_PM_BPCC_ENABLE 0x80
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_PM_BPCC_ENABLE 0x80
#define PCI_PM_DATA_REGISTER 7
#define PCI_PM_SIZEOF 8
#define PCI_AGP_VERSION 2
-#define PCI_AGP_RFU 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_AGP_RFU 3
#define PCI_AGP_STATUS 4
#define PCI_AGP_STATUS_RQ_MASK 0xff000000
#define PCI_AGP_STATUS_SBA 0x0200
-#define PCI_AGP_STATUS_64BIT 0x0020
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_AGP_STATUS_64BIT 0x0020
#define PCI_AGP_STATUS_FW 0x0010
#define PCI_AGP_STATUS_RATE4 0x0004
#define PCI_AGP_STATUS_RATE2 0x0002
-#define PCI_AGP_STATUS_RATE1 0x0001
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_AGP_STATUS_RATE1 0x0001
#define PCI_AGP_COMMAND 8
#define PCI_AGP_COMMAND_RQ_MASK 0xff000000
#define PCI_AGP_COMMAND_SBA 0x0200
-#define PCI_AGP_COMMAND_AGP 0x0100
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_AGP_COMMAND_AGP 0x0100
#define PCI_AGP_COMMAND_64BIT 0x0020
#define PCI_AGP_COMMAND_FW 0x0010
#define PCI_AGP_COMMAND_RATE4 0x0004
-#define PCI_AGP_COMMAND_RATE2 0x0002
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_AGP_COMMAND_RATE2 0x0002
#define PCI_AGP_COMMAND_RATE1 0x0001
#define PCI_AGP_SIZEOF 12
#define PCI_VPD_ADDR 2
-#define PCI_VPD_ADDR_MASK 0x7fff
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_VPD_ADDR_MASK 0x7fff
#define PCI_VPD_ADDR_F 0x8000
#define PCI_VPD_DATA 4
#define PCI_CAP_VPD_SIZEOF 8
-#define PCI_SID_ESR 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_SID_ESR 2
#define PCI_SID_ESR_NSLOTS 0x1f
#define PCI_SID_ESR_FIC 0x20
#define PCI_SID_CHASSIS_NR 3
-#define PCI_MSI_FLAGS 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_MSI_FLAGS 2
#define PCI_MSI_FLAGS_ENABLE 0x0001
#define PCI_MSI_FLAGS_QMASK 0x000e
#define PCI_MSI_FLAGS_QSIZE 0x0070
-#define PCI_MSI_FLAGS_64BIT 0x0080
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_MSI_FLAGS_64BIT 0x0080
#define PCI_MSI_FLAGS_MASKBIT 0x0100
#define PCI_MSI_RFU 3
#define PCI_MSI_ADDRESS_LO 4
-#define PCI_MSI_ADDRESS_HI 8
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_MSI_ADDRESS_HI 8
#define PCI_MSI_DATA_32 8
#define PCI_MSI_MASK_32 12
#define PCI_MSI_PENDING_32 16
-#define PCI_MSI_DATA_64 12
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_MSI_DATA_64 12
#define PCI_MSI_MASK_64 16
#define PCI_MSI_PENDING_64 20
#define PCI_MSIX_FLAGS 2
-#define PCI_MSIX_FLAGS_QSIZE 0x07FF
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_MSIX_FLAGS_QSIZE 0x07FF
#define PCI_MSIX_FLAGS_MASKALL 0x4000
#define PCI_MSIX_FLAGS_ENABLE 0x8000
#define PCI_MSIX_TABLE 4
-#define PCI_MSIX_TABLE_BIR 0x00000007
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_MSIX_TABLE_BIR 0x00000007
#define PCI_MSIX_TABLE_OFFSET 0xfffffff8
#define PCI_MSIX_PBA 8
#define PCI_MSIX_PBA_BIR 0x00000007
-#define PCI_MSIX_PBA_OFFSET 0xfffffff8
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_MSIX_PBA_OFFSET 0xfffffff8
+#define PCI_MSIX_FLAGS_BIRMASK PCI_MSIX_PBA_BIR
#define PCI_CAP_MSIX_SIZEOF 12
#define PCI_MSIX_ENTRY_SIZE 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_MSIX_ENTRY_LOWER_ADDR 0
#define PCI_MSIX_ENTRY_UPPER_ADDR 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_MSIX_ENTRY_DATA 8
#define PCI_MSIX_ENTRY_VECTOR_CTRL 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_MSIX_ENTRY_CTRL_MASKBIT 1
#define PCI_CHSWP_CSR 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CHSWP_DHA 0x01
#define PCI_CHSWP_EIM 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CHSWP_PIE 0x04
#define PCI_CHSWP_LOO 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CHSWP_PI 0x30
#define PCI_CHSWP_EXT 0x40
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CHSWP_INS 0x80
#define PCI_AF_LENGTH 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_AF_CAP 3
#define PCI_AF_CAP_TP 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_AF_CAP_FLR 0x02
#define PCI_AF_CTRL 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_AF_CTRL_FLR 0x01
#define PCI_AF_STATUS 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_AF_STATUS_TP 0x01
#define PCI_CAP_AF_SIZEOF 6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_NUM_ENT 2
+#define PCI_EA_NUM_ENT_MASK 0x3f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_FIRST_ENT 4
+#define PCI_EA_FIRST_ENT_BRIDGE 8
+#define PCI_EA_ES 0x00000007
+#define PCI_EA_BEI 0x000000f0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_BEI_BAR0 0
+#define PCI_EA_BEI_BAR5 5
+#define PCI_EA_BEI_BRIDGE 6
+#define PCI_EA_BEI_ENI 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_BEI_ROM 8
+#define PCI_EA_BEI_VF_BAR0 9
+#define PCI_EA_BEI_VF_BAR5 14
+#define PCI_EA_BEI_RESERVED 15
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_PP 0x0000ff00
+#define PCI_EA_SP 0x00ff0000
+#define PCI_EA_P_MEM 0x00
+#define PCI_EA_P_MEM_PREFETCH 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_P_IO 0x02
+#define PCI_EA_P_VF_MEM_PREFETCH 0x03
+#define PCI_EA_P_VF_MEM 0x04
+#define PCI_EA_P_BRIDGE_MEM 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_P_BRIDGE_MEM_PREFETCH 0x06
+#define PCI_EA_P_BRIDGE_IO 0x07
+#define PCI_EA_P_MEM_RESERVED 0xfd
+#define PCI_EA_P_IO_RESERVED 0xfe
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_P_UNAVAILABLE 0xff
+#define PCI_EA_WRITABLE 0x40000000
+#define PCI_EA_ENABLE 0x80000000
+#define PCI_EA_BASE 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EA_MAX_OFFSET 8
+#define PCI_EA_IS_64 0x00000002
+#define PCI_EA_FIELD_MASK 0xfffffffc
#define PCI_X_CMD 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_DPERR_E 0x0001
#define PCI_X_CMD_ERO 0x0002
#define PCI_X_CMD_READ_512 0x0000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_READ_1K 0x0004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_READ_2K 0x0008
#define PCI_X_CMD_READ_4K 0x000c
#define PCI_X_CMD_MAX_READ 0x000c
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_SPLIT_1 0x0000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_SPLIT_2 0x0010
#define PCI_X_CMD_SPLIT_3 0x0020
#define PCI_X_CMD_SPLIT_4 0x0030
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_SPLIT_8 0x0040
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_SPLIT_12 0x0050
#define PCI_X_CMD_SPLIT_16 0x0060
#define PCI_X_CMD_SPLIT_32 0x0070
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_MAX_SPLIT 0x0070
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_CMD_VERSION(x) (((x) >> 12) & 3)
#define PCI_X_STATUS 4
#define PCI_X_STATUS_DEVFN 0x000000ff
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_STATUS_BUS 0x0000ff00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_STATUS_64BIT 0x00010000
#define PCI_X_STATUS_133MHZ 0x00020000
#define PCI_X_STATUS_SPL_DISC 0x00040000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_STATUS_UNX_SPL 0x00080000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_STATUS_COMPLEX 0x00100000
#define PCI_X_STATUS_MAX_READ 0x00600000
#define PCI_X_STATUS_MAX_SPLIT 0x03800000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_STATUS_MAX_CUM 0x1c000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_STATUS_SPL_ERR 0x20000000
#define PCI_X_STATUS_266MHZ 0x40000000
#define PCI_X_STATUS_533MHZ 0x80000000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_ECC_CSR 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CAP_PCIX_SIZEOF_V0 8
#define PCI_CAP_PCIX_SIZEOF_V1 24
#define PCI_CAP_PCIX_SIZEOF_V2 PCI_CAP_PCIX_SIZEOF_V1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_BRIDGE_SSTATUS 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_SSTATUS_64BIT 0x0001
#define PCI_X_SSTATUS_133MHZ 0x0002
#define PCI_X_SSTATUS_FREQ 0x03c0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_SSTATUS_VERS 0x3000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_SSTATUS_V1 0x1000
#define PCI_X_SSTATUS_V2 0x2000
#define PCI_X_SSTATUS_266MHZ 0x4000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_SSTATUS_533MHZ 0x8000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_X_BRIDGE_STATUS 4
#define PCI_SSVID_VENDOR_ID 4
#define PCI_SSVID_DEVICE_ID 6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_FLAGS 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_FLAGS_VERS 0x000f
#define PCI_EXP_FLAGS_TYPE 0x00f0
#define PCI_EXP_TYPE_ENDPOINT 0x0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_TYPE_LEG_END 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_TYPE_ROOT_PORT 0x4
#define PCI_EXP_TYPE_UPSTREAM 0x5
#define PCI_EXP_TYPE_DOWNSTREAM 0x6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_TYPE_PCI_BRIDGE 0x7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_TYPE_PCIE_BRIDGE 0x8
#define PCI_EXP_TYPE_RC_END 0x9
#define PCI_EXP_TYPE_RC_EC 0xa
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_FLAGS_SLOT 0x0100
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_FLAGS_IRQ 0x3e00
#define PCI_EXP_DEVCAP 4
#define PCI_EXP_DEVCAP_PAYLOAD 0x00000007
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP_PHANTOM 0x00000018
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP_EXT_TAG 0x00000020
#define PCI_EXP_DEVCAP_L0S 0x000001c0
#define PCI_EXP_DEVCAP_L1 0x00000e00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP_ATN_BUT 0x00001000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP_ATN_IND 0x00002000
#define PCI_EXP_DEVCAP_PWR_IND 0x00004000
#define PCI_EXP_DEVCAP_RBER 0x00008000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP_PWR_VAL 0x03fc0000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP_PWR_SCL 0x0c000000
#define PCI_EXP_DEVCAP_FLR 0x10000000
#define PCI_EXP_DEVCTL 8
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL_CERE 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL_NFERE 0x0002
#define PCI_EXP_DEVCTL_FERE 0x0004
#define PCI_EXP_DEVCTL_URRE 0x0008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL_RELAX_EN 0x0010
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0
#define PCI_EXP_DEVCTL_EXT_TAG 0x0100
#define PCI_EXP_DEVCTL_PHANTOM 0x0200
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL_AUX_PME 0x0400
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800
#define PCI_EXP_DEVCTL_READRQ 0x7000
-#define PCI_EXP_DEVCTL_BCR_FLR 0x8000
+#define PCI_EXP_DEVCTL_READRQ_128B 0x0000
+#define PCI_EXP_DEVCTL_READRQ_256B 0x1000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PCI_EXP_DEVCTL_READRQ_512B 0x2000
+#define PCI_EXP_DEVCTL_READRQ_1024B 0x3000
+#define PCI_EXP_DEVCTL_BCR_FLR 0x8000
#define PCI_EXP_DEVSTA 10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVSTA_CED 0x0001
#define PCI_EXP_DEVSTA_NFED 0x0002
#define PCI_EXP_DEVSTA_FED 0x0004
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVSTA_URD 0x0008
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVSTA_AUXPD 0x0010
#define PCI_EXP_DEVSTA_TRPND 0x0020
#define PCI_EXP_LNKCAP 12
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP_SLS 0x0000000f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP_SLS_2_5GB 0x00000001
#define PCI_EXP_LNKCAP_SLS_5_0GB 0x00000002
#define PCI_EXP_LNKCAP_MLW 0x000003f0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP_ASPMS 0x00000c00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP_L0SEL 0x00007000
#define PCI_EXP_LNKCAP_L1EL 0x00038000
#define PCI_EXP_LNKCAP_CLKPM 0x00040000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP_SDERC 0x00080000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP_DLLLARC 0x00100000
#define PCI_EXP_LNKCAP_LBNC 0x00200000
#define PCI_EXP_LNKCAP_PN 0xff000000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCTL 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCTL_ASPMC 0x0003
#define PCI_EXP_LNKCTL_ASPM_L0S 0x0001
#define PCI_EXP_LNKCTL_ASPM_L1 0x0002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCTL_RCB 0x0008
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCTL_LD 0x0010
#define PCI_EXP_LNKCTL_RL 0x0020
#define PCI_EXP_LNKCTL_CCC 0x0040
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCTL_ES 0x0080
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCTL_CLKREQ_EN 0x0100
#define PCI_EXP_LNKCTL_HAWD 0x0200
#define PCI_EXP_LNKCTL_LBMIE 0x0400
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCTL_LABIE 0x0800
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA 18
#define PCI_EXP_LNKSTA_CLS 0x000f
#define PCI_EXP_LNKSTA_CLS_2_5GB 0x0001
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA_CLS_5_0GB 0x0002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA_CLS_8_0GB 0x0003
#define PCI_EXP_LNKSTA_NLW 0x03f0
#define PCI_EXP_LNKSTA_NLW_X1 0x0010
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA_NLW_X2 0x0020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA_NLW_X4 0x0040
#define PCI_EXP_LNKSTA_NLW_X8 0x0080
#define PCI_EXP_LNKSTA_NLW_SHIFT 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA_LT 0x0800
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA_SLC 0x1000
#define PCI_EXP_LNKSTA_DLLLA 0x2000
#define PCI_EXP_LNKSTA_LBMS 0x4000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKSTA_LABS 0x8000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V1 20
#define PCI_EXP_SLTCAP 20
#define PCI_EXP_SLTCAP_ABP 0x00000001
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCAP_PCP 0x00000002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCAP_MRLSP 0x00000004
#define PCI_EXP_SLTCAP_AIP 0x00000008
#define PCI_EXP_SLTCAP_PIP 0x00000010
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCAP_HPS 0x00000020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCAP_HPC 0x00000040
#define PCI_EXP_SLTCAP_SPLV 0x00007f80
#define PCI_EXP_SLTCAP_SPLS 0x00018000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCAP_EIP 0x00020000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCAP_NCCS 0x00040000
#define PCI_EXP_SLTCAP_PSN 0xfff80000
#define PCI_EXP_SLTCTL 24
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_ABPE 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_PFDE 0x0002
#define PCI_EXP_SLTCTL_MRLSCE 0x0004
#define PCI_EXP_SLTCTL_PDCE 0x0008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_CCIE 0x0010
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_HPIE 0x0020
#define PCI_EXP_SLTCTL_AIC 0x00c0
#define PCI_EXP_SLTCTL_ATTN_IND_ON 0x0040
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_ATTN_IND_BLINK 0x0080
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_ATTN_IND_OFF 0x00c0
#define PCI_EXP_SLTCTL_PIC 0x0300
#define PCI_EXP_SLTCTL_PWR_IND_ON 0x0100
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_PWR_IND_BLINK 0x0200
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_PWR_IND_OFF 0x0300
#define PCI_EXP_SLTCTL_PCC 0x0400
#define PCI_EXP_SLTCTL_PWR_ON 0x0000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_PWR_OFF 0x0400
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL_EIC 0x0800
#define PCI_EXP_SLTCTL_DLLSCE 0x1000
#define PCI_EXP_SLTSTA 26
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTSTA_ABP 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTSTA_PFD 0x0002
#define PCI_EXP_SLTSTA_MRLSC 0x0004
#define PCI_EXP_SLTSTA_PDC 0x0008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTSTA_CC 0x0010
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTSTA_MRLSS 0x0020
#define PCI_EXP_SLTSTA_PDS 0x0040
#define PCI_EXP_SLTSTA_EIS 0x0080
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTSTA_DLLSC 0x0100
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_RTCTL 28
#define PCI_EXP_RTCTL_SECEE 0x0001
#define PCI_EXP_RTCTL_SENFEE 0x0002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_RTCTL_SEFEE 0x0004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_RTCTL_PMEIE 0x0008
#define PCI_EXP_RTCTL_CRSSVE 0x0010
#define PCI_EXP_RTCAP 30
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_RTCAP_CRSVIS 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_RTSTA 32
#define PCI_EXP_RTSTA_PME 0x00010000
#define PCI_EXP_RTSTA_PENDING 0x00020000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP2 36
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP2_ARI 0x00000020
#define PCI_EXP_DEVCAP2_LTR 0x00000800
#define PCI_EXP_DEVCAP2_OBFF_MASK 0x000c0000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP2_OBFF_MSG 0x00040000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCAP2_OBFF_WAKE 0x00080000
#define PCI_EXP_DEVCTL2 40
#define PCI_EXP_DEVCTL2_COMP_TIMEOUT 0x000f
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL2_ARI 0x0020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL2_IDO_REQ_EN 0x0100
#define PCI_EXP_DEVCTL2_IDO_CMP_EN 0x0200
#define PCI_EXP_DEVCTL2_LTR_EN 0x0400
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL2_OBFF_MSGA_EN 0x2000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_DEVCTL2_OBFF_MSGB_EN 0x4000
#define PCI_EXP_DEVCTL2_OBFF_WAKE_EN 0x6000
#define PCI_EXP_DEVSTA2 42
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 44
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP2 44
#define PCI_EXP_LNKCAP2_SLS_2_5GB 0x00000002
#define PCI_EXP_LNKCAP2_SLS_5_0GB 0x00000004
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP2_SLS_8_0GB 0x00000008
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_LNKCAP2_CROSSLINK 0x00000100
#define PCI_EXP_LNKCTL2 48
#define PCI_EXP_LNKSTA2 50
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCAP2 52
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXP_SLTCTL2 56
#define PCI_EXP_SLTSTA2 58
#define PCI_EXT_CAP_ID(header) (header & 0x0000ffff)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_VER(header) ((header >> 16) & 0xf)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc)
#define PCI_EXT_CAP_ID_ERR 0x01
#define PCI_EXT_CAP_ID_VC 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_DSN 0x03
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_PWR 0x04
#define PCI_EXT_CAP_ID_RCLD 0x05
#define PCI_EXT_CAP_ID_RCILC 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_RCEC 0x07
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_MFVC 0x08
#define PCI_EXT_CAP_ID_VC9 0x09
#define PCI_EXT_CAP_ID_RCRB 0x0A
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_VNDR 0x0B
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_CAC 0x0C
#define PCI_EXT_CAP_ID_ACS 0x0D
#define PCI_EXT_CAP_ID_ARI 0x0E
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_ATS 0x0F
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_SRIOV 0x10
#define PCI_EXT_CAP_ID_MRIOV 0x11
#define PCI_EXT_CAP_ID_MCAST 0x12
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_PRI 0x13
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_AMD_XXX 0x14
#define PCI_EXT_CAP_ID_REBAR 0x15
#define PCI_EXT_CAP_ID_DPA 0x16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_TPH 0x17
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_LTR 0x18
#define PCI_EXT_CAP_ID_SECPCI 0x19
#define PCI_EXT_CAP_ID_PMUX 0x1A
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_PASID 0x1B
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_ID_MAX PCI_EXT_CAP_ID_PASID
#define PCI_EXT_CAP_DSN_SIZEOF 12
#define PCI_EXT_CAP_MCAST_ENDPOINT_SIZEOF 40
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNCOR_STATUS 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_UND 0x00000001
#define PCI_ERR_UNC_DLP 0x00000010
#define PCI_ERR_UNC_SURPDN 0x00000020
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_POISON_TLP 0x00001000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_FCP 0x00002000
#define PCI_ERR_UNC_COMP_TIME 0x00004000
#define PCI_ERR_UNC_COMP_ABORT 0x00008000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_UNX_COMP 0x00010000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_RX_OVER 0x00020000
#define PCI_ERR_UNC_MALF_TLP 0x00040000
#define PCI_ERR_UNC_ECRC 0x00080000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_UNSUP 0x00100000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_ACSV 0x00200000
#define PCI_ERR_UNC_INTN 0x00400000
#define PCI_ERR_UNC_MCBTLP 0x00800000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_ATOMEG 0x01000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_UNC_TLPPRE 0x02000000
#define PCI_ERR_UNCOR_MASK 8
#define PCI_ERR_UNCOR_SEVER 12
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_COR_STATUS 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_COR_RCVR 0x00000001
#define PCI_ERR_COR_BAD_TLP 0x00000040
#define PCI_ERR_COR_BAD_DLLP 0x00000080
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_COR_REP_ROLL 0x00000100
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_COR_REP_TIMER 0x00001000
#define PCI_ERR_COR_ADV_NFAT 0x00002000
#define PCI_ERR_COR_INTERNAL 0x00004000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_COR_LOG_OVER 0x00008000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_COR_MASK 20
#define PCI_ERR_CAP 24
#define PCI_ERR_CAP_FEP(x) ((x) & 31)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_CAP_ECRC_GENC 0x00000020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_CAP_ECRC_GENE 0x00000040
#define PCI_ERR_CAP_ECRC_CHKC 0x00000080
#define PCI_ERR_CAP_ECRC_CHKE 0x00000100
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_HEADER_LOG 28
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_ROOT_COMMAND 44
#define PCI_ERR_ROOT_CMD_COR_EN 0x00000001
#define PCI_ERR_ROOT_CMD_NONFATAL_EN 0x00000002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_ROOT_CMD_FATAL_EN 0x00000004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_ROOT_STATUS 48
#define PCI_ERR_ROOT_COR_RCV 0x00000001
#define PCI_ERR_ROOT_MULTI_COR_RCV 0x00000002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_ROOT_UNCOR_RCV 0x00000004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_ROOT_MULTI_UNCOR_RCV 0x00000008
#define PCI_ERR_ROOT_FIRST_FATAL 0x00000010
#define PCI_ERR_ROOT_NONFATAL_RCV 0x00000020
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_ROOT_FATAL_RCV 0x00000040
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ERR_ROOT_ERR_SRC 52
#define PCI_VC_PORT_CAP1 4
#define PCI_VC_CAP1_EVCC 0x00000007
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_CAP1_LPEVCC 0x00000070
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_CAP1_ARB_SIZE 0x00000c00
#define PCI_VC_PORT_CAP2 8
#define PCI_VC_CAP2_32_PHASE 0x00000002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_CAP2_64_PHASE 0x00000004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_CAP2_128_PHASE 0x00000008
#define PCI_VC_CAP2_ARB_OFF 0xff000000
#define PCI_VC_PORT_CTRL 12
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_PORT_CTRL_LOAD_TABLE 0x00000001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_PORT_STATUS 14
#define PCI_VC_PORT_STATUS_TABLE 0x00000001
#define PCI_VC_RES_CAP 16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_CAP_32_PHASE 0x00000002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_CAP_64_PHASE 0x00000004
#define PCI_VC_RES_CAP_128_PHASE 0x00000008
#define PCI_VC_RES_CAP_128_PHASE_TB 0x00000010
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_CAP_256_PHASE 0x00000020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_CAP_ARB_OFF 0xff000000
#define PCI_VC_RES_CTRL 20
#define PCI_VC_RES_CTRL_LOAD_TABLE 0x00010000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_CTRL_ARB_SELECT 0x000e0000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_CTRL_ID 0x07000000
#define PCI_VC_RES_CTRL_ENABLE 0x80000000
#define PCI_VC_RES_STATUS 26
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_STATUS_TABLE 0x00000001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VC_RES_STATUS_NEGO 0x00000002
#define PCI_CAP_VC_BASE_SIZEOF 0x10
#define PCI_CAP_VC_PER_VC_SIZEOF 0x0C
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PWR_DSR 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PWR_DATA 8
#define PCI_PWR_DATA_BASE(x) ((x) & 0xff)
#define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3)
#define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7)
#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PWR_CAP 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PWR_CAP_BUDGET(x) ((x) & 1)
#define PCI_EXT_CAP_PWR_SIZEOF 16
#define PCI_VNDR_HEADER 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VNDR_HEADER_ID(x) ((x) & 0xffff)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VNDR_HEADER_REV(x) (((x) >> 16) & 0xf)
#define PCI_VNDR_HEADER_LEN(x) (((x) >> 20) & 0xfff)
#define HT_3BIT_CAP_MASK 0xE0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_SLAVE 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_HOST 0x20
#define HT_5BIT_CAP_MASK 0xF8
#define HT_CAPTYPE_IRQ 0x80
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_REMAPPING_40 0xA0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_REMAPPING_64 0xA2
#define HT_CAPTYPE_UNITID_CLUMP 0x90
#define HT_CAPTYPE_EXTCONF 0x98
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_MSI_MAPPING 0xA8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_MSI_FLAGS 0x02
#define HT_MSI_FLAGS_ENABLE 0x1
#define HT_MSI_FLAGS_FIXED 0x2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_MSI_FIXED_ADDR 0x00000000FEE00000ULL
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_MSI_ADDR_LO 0x04
#define HT_MSI_ADDR_LO_MASK 0xFFF00000
#define HT_MSI_ADDR_HI 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_DIRECT_ROUTE 0xB0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_VCSET 0xB8
#define HT_CAPTYPE_ERROR_RETRY 0xC0
#define HT_CAPTYPE_GEN3 0xD0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAPTYPE_PM 0xE0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define HT_CAP_SIZEOF_LONG 28
#define HT_CAP_SIZEOF_SHORT 24
#define PCI_ARI_CAP 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ARI_CAP_MFVC 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ARI_CAP_ACS 0x0002
#define PCI_ARI_CAP_NFN(x) (((x) >> 8) & 0xff)
#define PCI_ARI_CTRL 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ARI_CTRL_MFVC 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ARI_CTRL_ACS 0x0002
#define PCI_ARI_CTRL_FG(x) (((x) >> 4) & 7)
#define PCI_EXT_CAP_ARI_SIZEOF 8
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ATS_CAP 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ATS_CAP_QDEP(x) ((x) & 0x1f)
#define PCI_ATS_MAX_QDEP 32
#define PCI_ATS_CTRL 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ATS_CTRL_ENABLE 0x8000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ATS_CTRL_STU(x) ((x) & 0x1f)
#define PCI_ATS_MIN_STU 12
#define PCI_EXT_CAP_ATS_SIZEOF 8
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PRI_CTRL 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PRI_CTRL_ENABLE 0x01
#define PCI_PRI_CTRL_RESET 0x02
#define PCI_PRI_STATUS 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PRI_STATUS_RF 0x001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PRI_STATUS_UPRGI 0x002
#define PCI_PRI_STATUS_STOPPED 0x100
#define PCI_PRI_MAX_REQ 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PRI_ALLOC_REQ 0x0c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_PRI_SIZEOF 16
#define PCI_PASID_CAP 0x04
#define PCI_PASID_CAP_EXEC 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PASID_CAP_PRIV 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PASID_CTRL 0x06
#define PCI_PASID_CTRL_ENABLE 0x01
#define PCI_PASID_CTRL_EXEC 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_PASID_CTRL_PRIV 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_PASID_SIZEOF 8
#define PCI_SRIOV_CAP 0x04
#define PCI_SRIOV_CAP_VFM 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_CAP_INTR(x) ((x) >> 21)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_CTRL 0x08
#define PCI_SRIOV_CTRL_VFE 0x01
#define PCI_SRIOV_CTRL_VFM 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_CTRL_INTR 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_CTRL_MSE 0x08
#define PCI_SRIOV_CTRL_ARI 0x10
#define PCI_SRIOV_STATUS 0x0a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_STATUS_VFM 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_INITIAL_VF 0x0c
#define PCI_SRIOV_TOTAL_VF 0x0e
#define PCI_SRIOV_NUM_VF 0x10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_FUNC_LINK 0x12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_VF_OFFSET 0x14
#define PCI_SRIOV_VF_STRIDE 0x16
#define PCI_SRIOV_VF_DID 0x1a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_SUP_PGSIZE 0x1c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_SYS_PGSIZE 0x20
#define PCI_SRIOV_BAR 0x24
#define PCI_SRIOV_NUM_BARS 6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_VFM 0x3c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_VFM_BIR(x) ((x) & 7)
#define PCI_SRIOV_VFM_OFFSET(x) ((x) & ~7)
#define PCI_SRIOV_VFM_UA 0x0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_VFM_MI 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SRIOV_VFM_MO 0x2
#define PCI_SRIOV_VFM_AV 0x3
#define PCI_EXT_CAP_SRIOV_SIZEOF 64
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_LTR_MAX_SNOOP_LAT 0x4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_LTR_MAX_NOSNOOP_LAT 0x6
#define PCI_LTR_VALUE_MASK 0x000003ff
#define PCI_LTR_SCALE_MASK 0x00001c00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_LTR_SCALE_SHIFT 10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_EXT_CAP_LTR_SIZEOF 8
#define PCI_ACS_CAP 0x04
#define PCI_ACS_SV 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ACS_TB 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ACS_RR 0x04
#define PCI_ACS_CR 0x08
#define PCI_ACS_UF 0x10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ACS_EC 0x20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ACS_DT 0x40
#define PCI_ACS_EGRESS_BITS 0x05
#define PCI_ACS_CTRL 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_ACS_EGRESS_CTL_V 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_VSEC_HDR 4
#define PCI_VSEC_HDR_LEN_SHIFT 20
#define PCI_SATA_REGS 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SATA_REGS_MASK 0xF
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_SATA_REGS_INLINE 0xF
#define PCI_SATA_SIZEOF_SHORT 8
#define PCI_SATA_SIZEOF_LONG 16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_REBAR_CTRL 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_REBAR_CTRL_NBAR_MASK (7 << 5)
#define PCI_REBAR_CTRL_NBAR_SHIFT 5
#define PCI_DPA_CAP 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_DPA_CAP_SUBSTATE_MASK 0x1F
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_DPA_BASE_SIZEOF 16
#define PCI_TPH_CAP 4
#define PCI_TPH_CAP_LOC_MASK 0x600
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_TPH_LOC_NONE 0x000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_TPH_LOC_CAP 0x200
#define PCI_TPH_LOC_MSIX 0x400
#define PCI_TPH_CAP_ST_MASK 0x07FF0000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_TPH_CAP_ST_SHIFT 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PCI_TPH_BASE_SIZEOF 12
#endif
diff --git a/libc/kernel/uapi/linux/perf_event.h b/libc/kernel/uapi/linux/perf_event.h
index ccefa74ce..0478470d5 100644
--- a/libc/kernel/uapi/linux/perf_event.h
+++ b/libc/kernel/uapi/linux/perf_event.h
@@ -89,90 +89,120 @@ enum perf_sw_ids {
PERF_COUNT_SW_ALIGNMENT_FAULTS = 7,
PERF_COUNT_SW_EMULATION_FAULTS = 8,
PERF_COUNT_SW_DUMMY = 9,
- PERF_COUNT_SW_MAX,
+ PERF_COUNT_SW_BPF_OUTPUT = 10,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_COUNT_SW_MAX,
};
enum perf_event_sample_format {
PERF_SAMPLE_IP = 1U << 0,
- PERF_SAMPLE_TID = 1U << 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_TID = 1U << 1,
PERF_SAMPLE_TIME = 1U << 2,
PERF_SAMPLE_ADDR = 1U << 3,
PERF_SAMPLE_READ = 1U << 4,
- PERF_SAMPLE_CALLCHAIN = 1U << 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_CALLCHAIN = 1U << 5,
PERF_SAMPLE_ID = 1U << 6,
PERF_SAMPLE_CPU = 1U << 7,
PERF_SAMPLE_PERIOD = 1U << 8,
- PERF_SAMPLE_STREAM_ID = 1U << 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_STREAM_ID = 1U << 9,
PERF_SAMPLE_RAW = 1U << 10,
PERF_SAMPLE_BRANCH_STACK = 1U << 11,
PERF_SAMPLE_REGS_USER = 1U << 12,
- PERF_SAMPLE_STACK_USER = 1U << 13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_STACK_USER = 1U << 13,
PERF_SAMPLE_WEIGHT = 1U << 14,
PERF_SAMPLE_DATA_SRC = 1U << 15,
PERF_SAMPLE_IDENTIFIER = 1U << 16,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_SAMPLE_TRANSACTION = 1U << 17,
+ PERF_SAMPLE_REGS_INTR = 1U << 18,
+ PERF_SAMPLE_MAX = 1U << 19,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum perf_branch_sample_type_shift {
+ PERF_SAMPLE_BRANCH_USER_SHIFT = 0,
+ PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1,
+ PERF_SAMPLE_BRANCH_HV_SHIFT = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_BRANCH_ANY_SHIFT = 3,
+ PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4,
+ PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5,
+ PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7,
+ PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8,
+ PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9,
+ PERF_SAMPLE_BRANCH_COND_SHIFT = 10,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11,
+ PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12,
+ PERF_SAMPLE_BRANCH_CALL_SHIFT = 13,
+ PERF_SAMPLE_BRANCH_MAX_SHIFT
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- PERF_SAMPLE_MAX = 1U << 18,
};
enum perf_branch_sample_type {
- PERF_SAMPLE_BRANCH_USER = 1U << 0,
+ PERF_SAMPLE_BRANCH_USER = 1U << PERF_SAMPLE_BRANCH_USER_SHIFT,
+ PERF_SAMPLE_BRANCH_KERNEL = 1U << PERF_SAMPLE_BRANCH_KERNEL_SHIFT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- PERF_SAMPLE_BRANCH_KERNEL = 1U << 1,
- PERF_SAMPLE_BRANCH_HV = 1U << 2,
- PERF_SAMPLE_BRANCH_ANY = 1U << 3,
- PERF_SAMPLE_BRANCH_ANY_CALL = 1U << 4,
+ PERF_SAMPLE_BRANCH_HV = 1U << PERF_SAMPLE_BRANCH_HV_SHIFT,
+ PERF_SAMPLE_BRANCH_ANY = 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT,
+ PERF_SAMPLE_BRANCH_ANY_CALL = 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT,
+ PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << 5,
- PERF_SAMPLE_BRANCH_IND_CALL = 1U << 6,
- PERF_SAMPLE_BRANCH_ABORT_TX = 1U << 7,
- PERF_SAMPLE_BRANCH_IN_TX = 1U << 8,
+ PERF_SAMPLE_BRANCH_IND_CALL = 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT,
+ PERF_SAMPLE_BRANCH_ABORT_TX = 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT,
+ PERF_SAMPLE_BRANCH_IN_TX = 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT,
+ PERF_SAMPLE_BRANCH_NO_TX = 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- PERF_SAMPLE_BRANCH_NO_TX = 1U << 9,
- PERF_SAMPLE_BRANCH_COND = 1U << 10,
- PERF_SAMPLE_BRANCH_MAX = 1U << 11,
-};
+ PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT,
+ PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT,
+ PERF_SAMPLE_BRANCH_IND_JUMP = 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT,
+ PERF_SAMPLE_BRANCH_CALL = 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT,
+};
#define PERF_SAMPLE_BRANCH_PLM_ALL (PERF_SAMPLE_BRANCH_USER | PERF_SAMPLE_BRANCH_KERNEL | PERF_SAMPLE_BRANCH_HV)
enum perf_sample_regs_abi {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_SAMPLE_REGS_ABI_NONE = 0,
PERF_SAMPLE_REGS_ABI_32 = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_SAMPLE_REGS_ABI_64 = 2,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
PERF_TXN_ELISION = (1 << 0),
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_TXN_TRANSACTION = (1 << 1),
PERF_TXN_SYNC = (1 << 2),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_TXN_ASYNC = (1 << 3),
PERF_TXN_RETRY = (1 << 4),
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_TXN_CONFLICT = (1 << 5),
PERF_TXN_CAPACITY_WRITE = (1 << 6),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_TXN_CAPACITY_READ = (1 << 7),
PERF_TXN_MAX = (1 << 8),
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_TXN_ABORT_MASK = (0xffffffffULL << 32),
PERF_TXN_ABORT_SHIFT = 32,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum perf_event_read_format {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0,
PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_FORMAT_ID = 1U << 2,
PERF_FORMAT_GROUP = 1U << 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_FORMAT_MAX = 1U << 4,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_ATTR_SIZE_VER0 64
#define PERF_ATTR_SIZE_VER1 72
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_ATTR_SIZE_VER2 80
#define PERF_ATTR_SIZE_VER3 96
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PERF_ATTR_SIZE_VER4 104
+#define PERF_ATTR_SIZE_VER5 112
struct perf_event_attr {
__u32 type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -186,7 +216,7 @@ struct perf_event_attr {
__u64 sample_type;
__u64 read_format;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u64 disabled : 1, inherit : 1, pinned : 1, exclusive : 1, exclude_user : 1, exclude_kernel : 1, exclude_hv : 1, exclude_idle : 1, mmap : 1, comm : 1, freq : 1, inherit_stat : 1, enable_on_exec : 1, task : 1, watermark : 1, precise_ip : 2, mmap_data : 1, sample_id_all : 1, exclude_host : 1, exclude_guest : 1, exclude_callchain_kernel : 1, exclude_callchain_user : 1, mmap2 : 1, comm_exec : 1, __reserved_1 : 39;
+ __u64 disabled : 1, inherit : 1, pinned : 1, exclusive : 1, exclude_user : 1, exclude_kernel : 1, exclude_hv : 1, exclude_idle : 1, mmap : 1, comm : 1, freq : 1, inherit_stat : 1, enable_on_exec : 1, task : 1, watermark : 1, precise_ip : 2, mmap_data : 1, sample_id_all : 1, exclude_host : 1, exclude_guest : 1, exclude_callchain_kernel : 1, exclude_callchain_user : 1, mmap2 : 1, comm_exec : 1, use_clockid : 1, context_switch : 1, __reserved_1 : 37;
union {
__u32 wakeup_events;
__u32 wakeup_watermark;
@@ -207,19 +237,24 @@ struct perf_event_attr {
__u64 sample_regs_user;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 sample_stack_user;
+ __s32 clockid;
+ __u64 sample_regs_intr;
+ __u32 aux_watermark;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 __reserved_2;
};
#define perf_flags(attr) (* (& (attr)->read_format + 1))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_EVENT_IOC_ENABLE _IO('$', 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_EVENT_IOC_DISABLE _IO('$', 1)
#define PERF_EVENT_IOC_REFRESH _IO('$', 2)
#define PERF_EVENT_IOC_RESET _IO('$', 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_EVENT_IOC_SET_OUTPUT _IO('$', 5)
#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *)
#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *)
+#define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum perf_event_ioc_flags {
PERF_IOC_FLAG_GROUP = 1U << 0,
@@ -253,18 +288,28 @@ struct perf_event_mmap_page {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 data_head;
__u64 data_tail;
+ __u64 data_offset;
+ __u64 data_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 aux_head;
+ __u64 aux_tail;
+ __u64 aux_offset;
+ __u64 aux_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0)
#define PERF_RECORD_MISC_KERNEL (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_RECORD_MISC_USER (2 << 0)
#define PERF_RECORD_MISC_HYPERVISOR (3 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0)
#define PERF_RECORD_MISC_GUEST_USER (5 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12)
#define PERF_RECORD_MISC_MMAP_DATA (1 << 13)
#define PERF_RECORD_MISC_COMM_EXEC (1 << 13)
+#define PERF_RECORD_MISC_SWITCH_OUT (1 << 13)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_RECORD_MISC_EXACT_IP (1 << 14)
#define PERF_RECORD_MISC_EXT_RESERVED (1 << 15)
@@ -288,87 +333,96 @@ enum perf_event_type {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PERF_RECORD_SAMPLE = 9,
PERF_RECORD_MMAP2 = 10,
+ PERF_RECORD_AUX = 11,
+ PERF_RECORD_ITRACE_START = 12,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_RECORD_LOST_SAMPLES = 13,
+ PERF_RECORD_SWITCH = 14,
+ PERF_RECORD_SWITCH_CPU_WIDE = 15,
PERF_RECORD_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define PERF_MAX_STACK_DEPTH 127
enum perf_callchain_context {
PERF_CONTEXT_HV = (__u64) - 32,
- PERF_CONTEXT_KERNEL = (__u64) - 128,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_CONTEXT_KERNEL = (__u64) - 128,
PERF_CONTEXT_USER = (__u64) - 512,
PERF_CONTEXT_GUEST = (__u64) - 2048,
PERF_CONTEXT_GUEST_KERNEL = (__u64) - 2176,
- PERF_CONTEXT_GUEST_USER = (__u64) - 2560,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PERF_CONTEXT_GUEST_USER = (__u64) - 2560,
PERF_CONTEXT_MAX = (__u64) - 4095,
};
+#define PERF_AUX_FLAG_TRUNCATED 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PERF_AUX_FLAG_OVERWRITE 0x02
#define PERF_FLAG_FD_NO_GROUP (1UL << 0)
#define PERF_FLAG_FD_OUTPUT (1UL << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_FLAG_PID_CGROUP (1UL << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_FLAG_FD_CLOEXEC (1UL << 3)
union perf_mem_data_src {
__u64 val;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 mem_op : 5, mem_lvl : 14, mem_snoop : 5, mem_lock : 2, mem_dtlb : 7, mem_rsvd : 31;
};
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_OP_NA 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_OP_LOAD 0x02
#define PERF_MEM_OP_STORE 0x04
#define PERF_MEM_OP_PFETCH 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_OP_EXEC 0x10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_OP_SHIFT 0
#define PERF_MEM_LVL_NA 0x01
#define PERF_MEM_LVL_HIT 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LVL_MISS 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LVL_L1 0x08
#define PERF_MEM_LVL_LFB 0x10
#define PERF_MEM_LVL_L2 0x20
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LVL_L3 0x40
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LVL_LOC_RAM 0x80
#define PERF_MEM_LVL_REM_RAM1 0x100
#define PERF_MEM_LVL_REM_RAM2 0x200
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LVL_REM_CCE1 0x400
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LVL_REM_CCE2 0x800
#define PERF_MEM_LVL_IO 0x1000
#define PERF_MEM_LVL_UNC 0x2000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LVL_SHIFT 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_SNOOP_NA 0x01
#define PERF_MEM_SNOOP_NONE 0x02
#define PERF_MEM_SNOOP_HIT 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_SNOOP_MISS 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_SNOOP_HITM 0x10
#define PERF_MEM_SNOOP_SHIFT 19
#define PERF_MEM_LOCK_NA 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LOCK_LOCKED 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_LOCK_SHIFT 24
#define PERF_MEM_TLB_NA 0x01
#define PERF_MEM_TLB_HIT 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_TLB_MISS 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_TLB_L1 0x08
#define PERF_MEM_TLB_L2 0x10
#define PERF_MEM_TLB_WK 0x20
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_TLB_OS 0x40
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PERF_MEM_TLB_SHIFT 26
#define PERF_MEM_S(a,s) (((__u64) PERF_MEM_ ##a ##_ ##s) << PERF_MEM_ ##a ##_SHIFT)
struct perf_branch_entry {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 from;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 to;
- __u64 mispred : 1, predicted : 1, in_tx : 1, abort : 1, reserved : 60;
+ __u64 mispred : 1, predicted : 1, in_tx : 1, abort : 1, cycles : 16, reserved : 44;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/pkt_cls.h b/libc/kernel/uapi/linux/pkt_cls.h
index 8c87bae0b..99d98733b 100644
--- a/libc/kernel/uapi/linux/pkt_cls.h
+++ b/libc/kernel/uapi/linux/pkt_cls.h
@@ -21,368 +21,358 @@
#include <linux/types.h>
#include <linux/pkt_sched.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define _TC_MAKE32(x) ((x))
-#define _TC_MAKEMASK1(n) (_TC_MAKE32(1) << _TC_MAKE32(n))
-#define _TC_MAKEMASK(v,n) (_TC_MAKE32((_TC_MAKE32(1) << (v)) - 1) << _TC_MAKE32(n))
-#define _TC_MAKEVALUE(v,n) (_TC_MAKE32(v) << _TC_MAKE32(n))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define _TC_GETVALUE(v,n,m) ((_TC_MAKE32(v) & _TC_MAKE32(m)) >> _TC_MAKE32(n))
-#define TC_MUNGED _TC_MAKEMASK1(0)
-#define SET_TC_MUNGED(v) (TC_MUNGED | (v & ~TC_MUNGED))
-#define CLR_TC_MUNGED(v) (v & ~TC_MUNGED)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define TC_OK2MUNGE _TC_MAKEMASK1(1)
-#define SET_TC_OK2MUNGE(v) (TC_OK2MUNGE | (v & ~TC_OK2MUNGE))
-#define CLR_TC_OK2MUNGE(v) (v & ~TC_OK2MUNGE)
-#define S_TC_VERD _TC_MAKE32(2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define M_TC_VERD _TC_MAKEMASK(4, S_TC_VERD)
-#define G_TC_VERD(x) _TC_GETVALUE(x, S_TC_VERD, M_TC_VERD)
-#define V_TC_VERD(x) _TC_MAKEVALUE(x, S_TC_VERD)
-#define SET_TC_VERD(v,n) ((V_TC_VERD(n)) | (v & ~M_TC_VERD))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define S_TC_FROM _TC_MAKE32(6)
-#define M_TC_FROM _TC_MAKEMASK(2, S_TC_FROM)
-#define G_TC_FROM(x) _TC_GETVALUE(x, S_TC_FROM, M_TC_FROM)
-#define V_TC_FROM(x) _TC_MAKEVALUE(x, S_TC_FROM)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SET_TC_FROM(v,n) ((V_TC_FROM(n)) | (v & ~M_TC_FROM))
-#define AT_STACK 0x0
-#define AT_INGRESS 0x1
-#define AT_EGRESS 0x2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define TC_NCLS _TC_MAKEMASK1(8)
-#define SET_TC_NCLS(v) (TC_NCLS | (v & ~TC_NCLS))
-#define CLR_TC_NCLS(v) (v & ~TC_NCLS)
-#define S_TC_RTTL _TC_MAKE32(9)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define M_TC_RTTL _TC_MAKEMASK(3, S_TC_RTTL)
-#define G_TC_RTTL(x) _TC_GETVALUE(x, S_TC_RTTL, M_TC_RTTL)
-#define V_TC_RTTL(x) _TC_MAKEVALUE(x, S_TC_RTTL)
-#define SET_TC_RTTL(v,n) ((V_TC_RTTL(n)) | (v & ~M_TC_RTTL))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define S_TC_AT _TC_MAKE32(12)
-#define M_TC_AT _TC_MAKEMASK(2, S_TC_AT)
-#define G_TC_AT(x) _TC_GETVALUE(x, S_TC_AT, M_TC_AT)
-#define V_TC_AT(x) _TC_MAKEVALUE(x, S_TC_AT)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SET_TC_AT(v,n) ((V_TC_AT(n)) | (v & ~M_TC_AT))
enum {
TCA_ACT_UNSPEC,
TCA_ACT_KIND,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_ACT_OPTIONS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_ACT_INDEX,
TCA_ACT_STATS,
__TCA_ACT_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_ACT_MAX __TCA_ACT_MAX
#define TCA_OLD_COMPAT (TCA_ACT_MAX + 1)
#define TCA_ACT_MAX_PRIO 32
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_ACT_BIND 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_ACT_NOBIND 0
#define TCA_ACT_UNBIND 1
#define TCA_ACT_NOUNBIND 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_ACT_REPLACE 1
-#define TCA_ACT_NOREPLACE 0
-#define MAX_REC_LOOP 4
-#define MAX_RED_LOOP 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCA_ACT_NOREPLACE 0
#define TC_ACT_UNSPEC (- 1)
#define TC_ACT_OK 0
#define TC_ACT_RECLASSIFY 1
-#define TC_ACT_SHOT 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TC_ACT_SHOT 2
#define TC_ACT_PIPE 3
#define TC_ACT_STOLEN 4
#define TC_ACT_QUEUED 5
-#define TC_ACT_REPEAT 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TC_ACT_REPEAT 6
+#define TC_ACT_REDIRECT 7
#define TC_ACT_JUMP 0x10000000
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_ID_UNSPEC = 0,
TCA_ID_POLICE = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__TCA_ID_MAX = 255
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_ID_MAX __TCA_ID_MAX
struct tc_police {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
int action;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_POLICE_UNSPEC TC_ACT_UNSPEC
#define TC_POLICE_OK TC_ACT_OK
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY
#define TC_POLICE_SHOT TC_ACT_SHOT
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_POLICE_PIPE TC_ACT_PIPE
__u32 limit;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 burst;
__u32 mtu;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tc_ratespec rate;
struct tc_ratespec peakrate;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int refcnt;
int bindcnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 capab;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tcf_t {
__u64 install;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 lastuse;
__u64 expires;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tc_cnt {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int refcnt;
int bindcnt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define tc_gen __u32 index; __u32 capab; int action; int refcnt; int bindcnt
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
TCA_POLICE_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_POLICE_TBF,
TCA_POLICE_RATE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_POLICE_PEAKRATE,
TCA_POLICE_AVRATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_POLICE_RESULT,
__TCA_POLICE_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_POLICE_RESULT TCA_POLICE_RESULT
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1)
#define TC_U32_HTID(h) ((h) & 0xFFF00000)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_U32_USERHTID(h) (TC_U32_HTID(h) >> 20)
#define TC_U32_HASH(h) (((h) >> 12) & 0xFF)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_U32_NODE(h) ((h) & 0xFFF)
#define TC_U32_KEY(h) ((h) & 0xFFFFF)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_U32_UNSPEC 0
#define TC_U32_ROOT (0xFFF00000)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
TCA_U32_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_U32_CLASSID,
TCA_U32_HASH,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_U32_LINK,
TCA_U32_DIVISOR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_U32_SEL,
TCA_U32_POLICE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_U32_ACT,
TCA_U32_INDEV,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_U32_PCNT,
TCA_U32_MARK,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__TCA_U32_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_U32_MAX (__TCA_U32_MAX - 1)
struct tc_u32_key {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 mask;
__be32 val;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int off;
int offmask;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tc_u32_sel {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char flags;
unsigned char offshift;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char nkeys;
__be16 offmask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 off;
short offoff;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
short hoff;
__be32 hmask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tc_u32_key keys[0];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tc_u32_mark {
__u32 val;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 mask;
__u32 success;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tc_u32_pcnt {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 rcnt;
__u64 rhit;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 kcnts[0];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_U32_TERMINAL 1
#define TC_U32_OFFSET 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_U32_VAROFFSET 4
#define TC_U32_EAT 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TC_U32_MAXDEPTH 8
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_RSVP_UNSPEC,
TCA_RSVP_CLASSID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_RSVP_DST,
TCA_RSVP_SRC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_RSVP_PINFO,
TCA_RSVP_POLICE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_RSVP_ACT,
__TCA_RSVP_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tc_rsvp_gpi {
__u32 key;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 mask;
int offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct tc_rsvp_pinfo {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tc_rsvp_gpi dpi;
struct tc_rsvp_gpi spi;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 protocol;
__u8 tunnelid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 tunnelhdr;
__u8 pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_ROUTE4_UNSPEC,
TCA_ROUTE4_CLASSID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_ROUTE4_TO,
TCA_ROUTE4_FROM,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_ROUTE4_IIF,
TCA_ROUTE4_POLICE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_ROUTE4_ACT,
__TCA_ROUTE4_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
TCA_FW_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FW_CLASSID,
TCA_FW_POLICE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FW_INDEV,
TCA_FW_ACT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FW_MASK,
__TCA_FW_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCA_FW_MAX (__TCA_FW_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
TCA_TCINDEX_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_TCINDEX_HASH,
TCA_TCINDEX_MASK,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_TCINDEX_SHIFT,
TCA_TCINDEX_FALL_THROUGH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_TCINDEX_CLASSID,
TCA_TCINDEX_POLICE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_TCINDEX_ACT,
__TCA_TCINDEX_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
FLOW_KEY_SRC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_DST,
FLOW_KEY_PROTO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_PROTO_SRC,
FLOW_KEY_PROTO_DST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_IIF,
FLOW_KEY_PRIORITY,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_MARK,
FLOW_KEY_NFCT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_NFCT_SRC,
FLOW_KEY_NFCT_DST,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_NFCT_PROTO_SRC,
FLOW_KEY_NFCT_PROTO_DST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_RTCLASSID,
FLOW_KEY_SKUID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_SKGID,
FLOW_KEY_VLAN_TAG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_KEY_RXHASH,
__FLOW_KEY_MAX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
FLOW_MODE_MAP,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
FLOW_MODE_HASH,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
TCA_FLOW_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FLOW_KEYS,
TCA_FLOW_MODE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FLOW_BASECLASS,
TCA_FLOW_RSHIFT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FLOW_ADDEND,
TCA_FLOW_MASK,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FLOW_XOR,
TCA_FLOW_DIVISOR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FLOW_ACT,
TCA_FLOW_POLICE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FLOW_EMATCHES,
TCA_FLOW_PERTURB,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__TCA_FLOW_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1)
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_BASIC_UNSPEC,
TCA_BASIC_CLASSID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_BASIC_EMATCHES,
TCA_BASIC_ACT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_BASIC_POLICE,
__TCA_BASIC_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
TCA_CGROUP_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_CGROUP_ACT,
TCA_CGROUP_POLICE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_CGROUP_EMATCHES,
__TCA_CGROUP_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0)
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_BPF_UNSPEC,
TCA_BPF_ACT,
TCA_BPF_POLICE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_BPF_CLASSID,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_BPF_OPS_LEN,
TCA_BPF_OPS,
- __TCA_BPF_MAX,
+ TCA_BPF_FD,
+ TCA_BPF_NAME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_BPF_FLAGS,
+ __TCA_BPF_MAX,
};
#define TCA_BPF_MAX (__TCA_BPF_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ TCA_FLOWER_UNSPEC,
+ TCA_FLOWER_CLASSID,
+ TCA_FLOWER_INDEV,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FLOWER_ACT,
+ TCA_FLOWER_KEY_ETH_DST,
+ TCA_FLOWER_KEY_ETH_DST_MASK,
+ TCA_FLOWER_KEY_ETH_SRC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FLOWER_KEY_ETH_SRC_MASK,
+ TCA_FLOWER_KEY_ETH_TYPE,
+ TCA_FLOWER_KEY_IP_PROTO,
+ TCA_FLOWER_KEY_IPV4_SRC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FLOWER_KEY_IPV4_SRC_MASK,
+ TCA_FLOWER_KEY_IPV4_DST,
+ TCA_FLOWER_KEY_IPV4_DST_MASK,
+ TCA_FLOWER_KEY_IPV6_SRC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FLOWER_KEY_IPV6_SRC_MASK,
+ TCA_FLOWER_KEY_IPV6_DST,
+ TCA_FLOWER_KEY_IPV6_DST_MASK,
+ TCA_FLOWER_KEY_TCP_SRC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FLOWER_KEY_TCP_DST,
+ TCA_FLOWER_KEY_UDP_SRC,
+ TCA_FLOWER_KEY_UDP_DST,
+ __TCA_FLOWER_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1)
struct tcf_ematch_tree_hdr {
__u16 nmatches;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/pkt_sched.h b/libc/kernel/uapi/linux/pkt_sched.h
index 518f83f3f..14ffcd4cd 100644
--- a/libc/kernel/uapi/linux/pkt_sched.h
+++ b/libc/kernel/uapi/linux/pkt_sched.h
@@ -227,441 +227,446 @@ enum {
TCA_GRED_DPS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_GRED_MAX_P,
+ TCA_GRED_LIMIT,
__TCA_GRED_MAX,
};
-#define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
struct tc_gred_qopt {
__u32 limit;
__u32 qth_min;
- __u32 qth_max;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 qth_max;
__u32 DP;
__u32 backlog;
__u32 qave;
- __u32 forced;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 forced;
__u32 early;
__u32 other;
__u32 pdrop;
- __u8 Wlog;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 Wlog;
__u8 Plog;
__u8 Scell_log;
__u8 prio;
- __u32 packets;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 packets;
__u32 bytesin;
};
struct tc_gred_sopt {
- __u32 DPs;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 DPs;
__u32 def_DP;
__u8 grio;
__u8 flags;
- __u16 pad1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 pad1;
};
enum {
TCA_CHOKE_UNSPEC,
- TCA_CHOKE_PARMS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_CHOKE_PARMS,
TCA_CHOKE_STAB,
TCA_CHOKE_MAX_P,
__TCA_CHOKE_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
struct tc_choke_qopt {
__u32 limit;
- __u32 qth_min;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 qth_min;
__u32 qth_max;
unsigned char Wlog;
unsigned char Plog;
- unsigned char Scell_log;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char Scell_log;
unsigned char flags;
};
struct tc_choke_xstats {
- __u32 early;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 early;
__u32 pdrop;
__u32 other;
__u32 marked;
- __u32 matched;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 matched;
};
#define TC_HTB_NUMPRIO 8
#define TC_HTB_MAXDEPTH 8
-#define TC_HTB_PROTOVER 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TC_HTB_PROTOVER 3
struct tc_htb_opt {
struct tc_ratespec rate;
struct tc_ratespec ceil;
- __u32 buffer;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 buffer;
__u32 cbuffer;
__u32 quantum;
__u32 level;
- __u32 prio;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 prio;
};
struct tc_htb_glob {
__u32 version;
- __u32 rate2quantum;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rate2quantum;
__u32 defcls;
__u32 debug;
__u32 direct_pkts;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
TCA_HTB_UNSPEC,
TCA_HTB_PARMS,
- TCA_HTB_INIT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_HTB_INIT,
TCA_HTB_CTAB,
TCA_HTB_RTAB,
TCA_HTB_DIRECT_QLEN,
- TCA_HTB_RATE64,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_HTB_RATE64,
TCA_HTB_CEIL64,
__TCA_HTB_MAX,
};
-#define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
struct tc_htb_xstats {
__u32 lends;
__u32 borrows;
- __u32 giants;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 giants;
__u32 tokens;
__u32 ctokens;
};
-struct tc_hfsc_qopt {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_hfsc_qopt {
__u16 defcls;
};
struct tc_service_curve {
- __u32 m1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 m1;
__u32 d;
__u32 m2;
};
-struct tc_hfsc_stats {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_hfsc_stats {
__u64 work;
__u64 rtwork;
__u32 period;
- __u32 level;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 level;
};
enum {
TCA_HFSC_UNSPEC,
- TCA_HFSC_RSC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_HFSC_RSC,
TCA_HFSC_FSC,
TCA_HFSC_USC,
__TCA_HFSC_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
#define TC_CBQ_MAXPRIO 8
#define TC_CBQ_MAXLEVEL 8
-#define TC_CBQ_DEF_EWMA 5
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TC_CBQ_DEF_EWMA 5
struct tc_cbq_lssopt {
unsigned char change;
unsigned char flags;
-#define TCF_CBQ_LSS_BOUNDED 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCF_CBQ_LSS_BOUNDED 1
#define TCF_CBQ_LSS_ISOLATED 2
unsigned char ewma_log;
unsigned char level;
-#define TCF_CBQ_LSS_FLAGS 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCF_CBQ_LSS_FLAGS 1
#define TCF_CBQ_LSS_EWMA 2
#define TCF_CBQ_LSS_MAXIDLE 4
#define TCF_CBQ_LSS_MINIDLE 8
-#define TCF_CBQ_LSS_OFFTIME 0x10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCF_CBQ_LSS_OFFTIME 0x10
#define TCF_CBQ_LSS_AVPKT 0x20
__u32 maxidle;
__u32 minidle;
- __u32 offtime;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 offtime;
__u32 avpkt;
};
struct tc_cbq_wrropt {
- unsigned char flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char flags;
unsigned char priority;
unsigned char cpriority;
unsigned char __reserved;
- __u32 allot;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 allot;
__u32 weight;
};
struct tc_cbq_ovl {
- unsigned char strategy;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char strategy;
#define TC_CBQ_OVL_CLASSIC 0
#define TC_CBQ_OVL_DELAY 1
#define TC_CBQ_OVL_LOWPRIO 2
-#define TC_CBQ_OVL_DROP 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TC_CBQ_OVL_DROP 3
#define TC_CBQ_OVL_RCLASSIC 4
unsigned char priority2;
__u16 pad;
- __u32 penalty;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 penalty;
};
struct tc_cbq_police {
unsigned char police;
- unsigned char __res1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char __res1;
unsigned short __res2;
};
struct tc_cbq_fopt {
- __u32 split;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 split;
__u32 defmap;
__u32 defchange;
};
-struct tc_cbq_xstats {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_cbq_xstats {
__u32 borrows;
__u32 overactions;
__s32 avgidle;
- __s32 undertime;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 undertime;
};
enum {
TCA_CBQ_UNSPEC,
- TCA_CBQ_LSSOPT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_CBQ_LSSOPT,
TCA_CBQ_WRROPT,
TCA_CBQ_FOPT,
TCA_CBQ_OVL_STRATEGY,
- TCA_CBQ_RATE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_CBQ_RATE,
TCA_CBQ_RTAB,
TCA_CBQ_POLICE,
__TCA_CBQ_MAX,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1)
enum {
TCA_DSMARK_UNSPEC,
- TCA_DSMARK_INDICES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_DSMARK_INDICES,
TCA_DSMARK_DEFAULT_INDEX,
TCA_DSMARK_SET_TC_INDEX,
TCA_DSMARK_MASK,
- TCA_DSMARK_VALUE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_DSMARK_VALUE,
__TCA_DSMARK_MAX,
};
#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
TCA_ATM_UNSPEC,
TCA_ATM_FD,
TCA_ATM_PTR,
- TCA_ATM_HDR,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_ATM_HDR,
TCA_ATM_EXCESS,
TCA_ATM_ADDR,
TCA_ATM_STATE,
- __TCA_ATM_MAX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TCA_ATM_MAX,
};
#define TCA_ATM_MAX (__TCA_ATM_MAX - 1)
enum {
- TCA_NETEM_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_NETEM_UNSPEC,
TCA_NETEM_CORR,
TCA_NETEM_DELAY_DIST,
TCA_NETEM_REORDER,
- TCA_NETEM_CORRUPT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_NETEM_CORRUPT,
TCA_NETEM_LOSS,
TCA_NETEM_RATE,
TCA_NETEM_ECN,
- TCA_NETEM_RATE64,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_NETEM_RATE64,
__TCA_NETEM_MAX,
};
#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
-struct tc_netem_qopt {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_netem_qopt {
__u32 latency;
__u32 limit;
__u32 loss;
- __u32 gap;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 gap;
__u32 duplicate;
__u32 jitter;
};
-struct tc_netem_corr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_netem_corr {
__u32 delay_corr;
__u32 loss_corr;
__u32 dup_corr;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct tc_netem_reorder {
__u32 probability;
__u32 correlation;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct tc_netem_corrupt {
__u32 probability;
__u32 correlation;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct tc_netem_rate {
__u32 rate;
__s32 packet_overhead;
- __u32 cell_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cell_size;
__s32 cell_overhead;
};
enum {
- NETEM_LOSS_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NETEM_LOSS_UNSPEC,
NETEM_LOSS_GI,
NETEM_LOSS_GE,
__NETEM_LOSS_MAX
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
struct tc_netem_gimodel {
__u32 p13;
- __u32 p31;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 p31;
__u32 p32;
__u32 p14;
__u32 p23;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct tc_netem_gemodel {
__u32 p;
__u32 r;
- __u32 h;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 h;
__u32 k1;
};
#define NETEM_DIST_SCALE 8192
-#define NETEM_DIST_MAX 16384
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define NETEM_DIST_MAX 16384
enum {
TCA_DRR_UNSPEC,
TCA_DRR_QUANTUM,
- __TCA_DRR_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TCA_DRR_MAX
};
#define TCA_DRR_MAX (__TCA_DRR_MAX - 1)
struct tc_drr_stats {
- __u32 deficit;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 deficit;
};
#define TC_QOPT_BITMASK 15
#define TC_QOPT_MAX_QUEUE 16
-struct tc_mqprio_qopt {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_mqprio_qopt {
__u8 num_tc;
__u8 prio_tc_map[TC_QOPT_BITMASK + 1];
__u8 hw;
- __u16 count[TC_QOPT_MAX_QUEUE];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 count[TC_QOPT_MAX_QUEUE];
__u16 offset[TC_QOPT_MAX_QUEUE];
};
enum {
- TCA_SFB_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_SFB_UNSPEC,
TCA_SFB_PARMS,
__TCA_SFB_MAX,
};
-#define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
struct tc_sfb_qopt {
__u32 rehash_interval;
__u32 warmup_time;
- __u32 max;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 max;
__u32 bin_size;
__u32 increment;
__u32 decrement;
- __u32 limit;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 limit;
__u32 penalty_rate;
__u32 penalty_burst;
};
-struct tc_sfb_xstats {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_sfb_xstats {
__u32 earlydrop;
__u32 penaltydrop;
__u32 bucketdrop;
- __u32 queuedrop;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 queuedrop;
__u32 childdrop;
__u32 marked;
__u32 maxqlen;
- __u32 maxprob;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 maxprob;
__u32 avgprob;
};
#define SFB_MAX_PROB 0xFFFF
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
TCA_QFQ_UNSPEC,
TCA_QFQ_WEIGHT,
TCA_QFQ_LMAX,
- __TCA_QFQ_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TCA_QFQ_MAX
};
#define TCA_QFQ_MAX (__TCA_QFQ_MAX - 1)
struct tc_qfq_stats {
- __u32 weight;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 weight;
__u32 lmax;
};
enum {
- TCA_CODEL_UNSPEC,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_CODEL_UNSPEC,
TCA_CODEL_TARGET,
TCA_CODEL_LIMIT,
TCA_CODEL_INTERVAL,
- TCA_CODEL_ECN,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_CODEL_ECN,
+ TCA_CODEL_CE_THRESHOLD,
__TCA_CODEL_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_CODEL_MAX (__TCA_CODEL_MAX - 1)
struct tc_codel_xstats {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 maxpacket;
__u32 count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 lastcount;
__u32 ldelay;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 drop_next;
__u32 drop_overlimit;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ecn_mark;
__u32 dropping;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ce_mark;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
TCA_FQ_CODEL_UNSPEC,
TCA_FQ_CODEL_TARGET,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FQ_CODEL_LIMIT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FQ_CODEL_INTERVAL,
TCA_FQ_CODEL_ECN,
TCA_FQ_CODEL_FLOWS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_FQ_CODEL_QUANTUM,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FQ_CODEL_CE_THRESHOLD,
__TCA_FQ_CODEL_MAX
};
#define TCA_FQ_CODEL_MAX (__TCA_FQ_CODEL_MAX - 1)
@@ -679,110 +684,112 @@ struct tc_fq_codel_qd_stats {
__u32 new_flow_count;
__u32 new_flows_len;
__u32 old_flows_len;
-};
+ __u32 ce_mark;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct tc_fq_codel_cl_stats {
__s32 deficit;
__u32 ldelay;
- __u32 count;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 count;
__u32 lastcount;
__u32 dropping;
__s32 drop_next;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct tc_fq_codel_xstats {
__u32 type;
union {
- struct tc_fq_codel_qd_stats qdisc_stats;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct tc_fq_codel_qd_stats qdisc_stats;
struct tc_fq_codel_cl_stats class_stats;
};
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
TCA_FQ_UNSPEC,
TCA_FQ_PLIMIT,
TCA_FQ_FLOW_PLIMIT,
- TCA_FQ_QUANTUM,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FQ_QUANTUM,
TCA_FQ_INITIAL_QUANTUM,
TCA_FQ_RATE_ENABLE,
TCA_FQ_FLOW_DEFAULT_RATE,
- TCA_FQ_FLOW_MAX_RATE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_FQ_FLOW_MAX_RATE,
TCA_FQ_BUCKETS_LOG,
TCA_FQ_FLOW_REFILL_DELAY,
+ TCA_FQ_ORPHAN_MASK,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__TCA_FQ_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_FQ_MAX (__TCA_FQ_MAX - 1)
struct tc_fq_qd_stats {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 gc_flows;
__u64 highprio_packets;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 tcp_retrans;
__u64 throttled;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 flows_plimit;
__u64 pkts_too_long;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 allocation_errors;
__s64 time_next_delayed_flow;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flows;
__u32 inactive_flows;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 throttled_flows;
__u32 pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_HHF_UNSPEC,
TCA_HHF_BACKLOG_LIMIT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_HHF_QUANTUM,
TCA_HHF_HH_FLOWS_LIMIT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_HHF_RESET_TIMEOUT,
TCA_HHF_ADMIT_BYTES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_HHF_EVICT_TIMEOUT,
TCA_HHF_NON_HH_WEIGHT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__TCA_HHF_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_HHF_MAX (__TCA_HHF_MAX - 1)
struct tc_hhf_xstats {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 drop_overlimit;
__u32 hh_overlimit;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 hh_tot_count;
__u32 hh_cur_count;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_PIE_UNSPEC,
TCA_PIE_TARGET,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_PIE_LIMIT,
TCA_PIE_TUPDATE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_PIE_ALPHA,
TCA_PIE_BETA,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_PIE_ECN,
TCA_PIE_BYTEMODE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__TCA_PIE_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_PIE_MAX (__TCA_PIE_MAX - 1)
struct tc_pie_xstats {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 prob;
__u32 delay;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 avg_dq_rate;
__u32 packets_in;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 dropped;
__u32 overlimit;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 maxq;
__u32 ecn_mark;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/pr.h b/libc/kernel/uapi/linux/pr.h
new file mode 100644
index 000000000..91dedfeae
--- /dev/null
+++ b/libc/kernel/uapi/linux/pr.h
@@ -0,0 +1,68 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_PR_H
+#define _UAPI_PR_H
+enum pr_type {
+ PR_WRITE_EXCLUSIVE = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PR_EXCLUSIVE_ACCESS = 2,
+ PR_WRITE_EXCLUSIVE_REG_ONLY = 3,
+ PR_EXCLUSIVE_ACCESS_REG_ONLY = 4,
+ PR_WRITE_EXCLUSIVE_ALL_REGS = 5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PR_EXCLUSIVE_ACCESS_ALL_REGS = 6,
+};
+struct pr_reservation {
+ __u64 key;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 type;
+ __u32 flags;
+};
+struct pr_registration {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 old_key;
+ __u64 new_key;
+ __u32 flags;
+ __u32 __pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct pr_preempt {
+ __u64 old_key;
+ __u64 new_key;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 type;
+ __u32 flags;
+};
+struct pr_clear {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 key;
+ __u32 flags;
+ __u32 __pad;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PR_FL_IGNORE_KEY (1 << 0)
+#define IOC_PR_REGISTER _IOW('p', 200, struct pr_registration)
+#define IOC_PR_RESERVE _IOW('p', 201, struct pr_reservation)
+#define IOC_PR_RELEASE _IOW('p', 202, struct pr_reservation)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IOC_PR_PREEMPT _IOW('p', 203, struct pr_preempt)
+#define IOC_PR_PREEMPT_ABORT _IOW('p', 204, struct pr_preempt)
+#define IOC_PR_CLEAR _IOW('p', 205, struct pr_clear)
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/prctl.h b/libc/kernel/uapi/linux/prctl.h
index 07898cc9f..d10c0f686 100644
--- a/libc/kernel/uapi/linux/prctl.h
+++ b/libc/kernel/uapi/linux/prctl.h
@@ -143,4 +143,18 @@ struct prctl_mm_map {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PR_SET_THP_DISABLE 41
#define PR_GET_THP_DISABLE 42
+#define PR_MPX_ENABLE_MANAGEMENT 43
+#define PR_MPX_DISABLE_MANAGEMENT 44
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PR_SET_FP_MODE 45
+#define PR_GET_FP_MODE 46
+#define PR_FP_MODE_FR (1 << 0)
+#define PR_FP_MODE_FRE (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PR_CAP_AMBIENT 47
+#define PR_CAP_AMBIENT_IS_SET 1
+#define PR_CAP_AMBIENT_RAISE 2
+#define PR_CAP_AMBIENT_LOWER 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PR_CAP_AMBIENT_CLEAR_ALL 4
#endif
diff --git a/libc/kernel/uapi/linux/psci.h b/libc/kernel/uapi/linux/psci.h
index b523abeae..fa685166e 100644
--- a/libc/kernel/uapi/linux/psci.h
+++ b/libc/kernel/uapi/linux/psci.h
@@ -43,37 +43,49 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_0_2_FN64_MIGRATE PSCI_0_2_FN64(5)
#define PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU PSCI_0_2_FN64(7)
+#define PSCI_1_0_FN_PSCI_FEATURES PSCI_0_2_FN(10)
+#define PSCI_1_0_FN_SYSTEM_SUSPEND PSCI_0_2_FN(14)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PSCI_1_0_FN64_SYSTEM_SUSPEND PSCI_0_2_FN64(14)
#define PSCI_0_2_POWER_STATE_ID_MASK 0xffff
#define PSCI_0_2_POWER_STATE_ID_SHIFT 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_0_2_POWER_STATE_TYPE_SHIFT 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_0_2_POWER_STATE_TYPE_MASK (0x1 << PSCI_0_2_POWER_STATE_TYPE_SHIFT)
#define PSCI_0_2_POWER_STATE_AFFL_SHIFT 24
#define PSCI_0_2_POWER_STATE_AFFL_MASK (0x3 << PSCI_0_2_POWER_STATE_AFFL_SHIFT)
+#define PSCI_1_0_EXT_POWER_STATE_ID_MASK 0xfffffff
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PSCI_1_0_EXT_POWER_STATE_ID_SHIFT 0
+#define PSCI_1_0_EXT_POWER_STATE_TYPE_SHIFT 30
+#define PSCI_1_0_EXT_POWER_STATE_TYPE_MASK (0x1 << PSCI_1_0_EXT_POWER_STATE_TYPE_SHIFT)
#define PSCI_0_2_AFFINITY_LEVEL_ON 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_0_2_AFFINITY_LEVEL_OFF 1
#define PSCI_0_2_AFFINITY_LEVEL_ON_PENDING 2
#define PSCI_0_2_TOS_UP_MIGRATE 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_0_2_TOS_UP_NO_MIGRATE 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_0_2_TOS_MP 2
#define PSCI_VERSION_MAJOR_SHIFT 16
#define PSCI_VERSION_MINOR_MASK ((1U << PSCI_VERSION_MAJOR_SHIFT) - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_VERSION_MAJOR_MASK ~PSCI_VERSION_MINOR_MASK
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PSCI_VERSION_MAJOR(ver) (((ver) & PSCI_VERSION_MAJOR_MASK) >> PSCI_VERSION_MAJOR_SHIFT)
#define PSCI_VERSION_MINOR(ver) ((ver) & PSCI_VERSION_MINOR_MASK)
-#define PSCI_RET_SUCCESS 0
+#define PSCI_1_0_FEATURES_CPU_SUSPEND_PF_SHIFT 1
+#define PSCI_1_0_FEATURES_CPU_SUSPEND_PF_MASK (0x1 << PSCI_1_0_FEATURES_CPU_SUSPEND_PF_SHIFT)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PSCI_RET_SUCCESS 0
#define PSCI_RET_NOT_SUPPORTED - 1
#define PSCI_RET_INVALID_PARAMS - 2
#define PSCI_RET_DENIED - 3
-#define PSCI_RET_ALREADY_ON - 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PSCI_RET_ALREADY_ON - 4
#define PSCI_RET_ON_PENDING - 5
#define PSCI_RET_INTERNAL_FAILURE - 6
#define PSCI_RET_NOT_PRESENT - 7
-#define PSCI_RET_DISABLED - 8
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PSCI_RET_DISABLED - 8
+#define PSCI_RET_INVALID_ADDRESS - 9
#endif
diff --git a/libc/kernel/uapi/linux/ptrace.h b/libc/kernel/uapi/linux/ptrace.h
index a3244e9b3..7550276fc 100644
--- a/libc/kernel/uapi/linux/ptrace.h
+++ b/libc/kernel/uapi/linux/ptrace.h
@@ -57,29 +57,32 @@ struct ptrace_peeksiginfo_args {
#define PTRACE_GETSIGMASK 0x420a
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PTRACE_SETSIGMASK 0x420b
+#define PTRACE_SECCOMP_GET_FILTER 0x420c
#define PTRACE_PEEKSIGINFO_SHARED (1 << 0)
#define PTRACE_EVENT_FORK 1
-#define PTRACE_EVENT_VFORK 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PTRACE_EVENT_VFORK 2
#define PTRACE_EVENT_CLONE 3
#define PTRACE_EVENT_EXEC 4
#define PTRACE_EVENT_VFORK_DONE 5
-#define PTRACE_EVENT_EXIT 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PTRACE_EVENT_EXIT 6
#define PTRACE_EVENT_SECCOMP 7
#define PTRACE_EVENT_STOP 128
#define PTRACE_O_TRACESYSGOOD 1
-#define PTRACE_O_TRACEFORK (1 << PTRACE_EVENT_FORK)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PTRACE_O_TRACEFORK (1 << PTRACE_EVENT_FORK)
#define PTRACE_O_TRACEVFORK (1 << PTRACE_EVENT_VFORK)
#define PTRACE_O_TRACECLONE (1 << PTRACE_EVENT_CLONE)
#define PTRACE_O_TRACEEXEC (1 << PTRACE_EVENT_EXEC)
-#define PTRACE_O_TRACEVFORKDONE (1 << PTRACE_EVENT_VFORK_DONE)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PTRACE_O_TRACEVFORKDONE (1 << PTRACE_EVENT_VFORK_DONE)
#define PTRACE_O_TRACEEXIT (1 << PTRACE_EVENT_EXIT)
#define PTRACE_O_TRACESECCOMP (1 << PTRACE_EVENT_SECCOMP)
#define PTRACE_O_EXITKILL (1 << 20)
-#define PTRACE_O_MASK (0x000000ff | PTRACE_O_EXITKILL)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PTRACE_O_SUSPEND_SECCOMP (1 << 21)
+#define PTRACE_O_MASK (0x000000ff | PTRACE_O_EXITKILL | PTRACE_O_SUSPEND_SECCOMP)
#include <asm/ptrace.h>
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/quota.h b/libc/kernel/uapi/linux/quota.h
index d5fc70793..2c5485fd1 100644
--- a/libc/kernel/uapi/linux/quota.h
+++ b/libc/kernel/uapi/linux/quota.h
@@ -21,75 +21,85 @@
#include <linux/errno.h>
#include <linux/types.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define __DQUOT_VERSION__ "dquot_6.5.2"
-#define MAXQUOTAS 2
+#define __DQUOT_VERSION__ "dquot_6.6.0"
+#define MAXQUOTAS 3
#define USRQUOTA 0
#define GRPQUOTA 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define INITQFNAMES { "user", "group", "undefined", \
+#define PRJQUOTA 2
+#define INITQFNAMES { "user", "group", "project", "undefined", \
};
#define SUBCMDMASK 0x00ff
#define SUBCMDSHIFT 8
-#define QCMD(cmd,type) (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define QCMD(cmd,type) (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
#define Q_SYNC 0x800001
#define Q_QUOTAON 0x800002
#define Q_QUOTAOFF 0x800003
-#define Q_GETFMT 0x800004
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define Q_GETFMT 0x800004
#define Q_GETINFO 0x800005
#define Q_SETINFO 0x800006
#define Q_GETQUOTA 0x800007
-#define Q_SETQUOTA 0x800008
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define Q_SETQUOTA 0x800008
#define QFMT_VFS_OLD 1
#define QFMT_VFS_V0 2
#define QFMT_OCFS2 3
-#define QFMT_VFS_V1 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define QFMT_VFS_V1 4
#define QIF_DQBLKSIZE_BITS 10
#define QIF_DQBLKSIZE (1 << QIF_DQBLKSIZE_BITS)
enum {
- QIF_BLIMITS_B = 0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ QIF_BLIMITS_B = 0,
QIF_SPACE_B,
QIF_ILIMITS_B,
QIF_INODES_B,
- QIF_BTIME_B,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ QIF_BTIME_B,
QIF_ITIME_B,
};
#define QIF_BLIMITS (1 << QIF_BLIMITS_B)
-#define QIF_SPACE (1 << QIF_SPACE_B)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define QIF_SPACE (1 << QIF_SPACE_B)
#define QIF_ILIMITS (1 << QIF_ILIMITS_B)
#define QIF_INODES (1 << QIF_INODES_B)
#define QIF_BTIME (1 << QIF_BTIME_B)
-#define QIF_ITIME (1 << QIF_ITIME_B)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define QIF_ITIME (1 << QIF_ITIME_B)
#define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS)
#define QIF_USAGE (QIF_SPACE | QIF_INODES)
#define QIF_TIMES (QIF_BTIME | QIF_ITIME)
-#define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES)
struct if_dqblk {
__u64 dqb_bhardlimit;
__u64 dqb_bsoftlimit;
- __u64 dqb_curspace;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 dqb_curspace;
__u64 dqb_ihardlimit;
__u64 dqb_isoftlimit;
__u64 dqb_curinodes;
- __u64 dqb_btime;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 dqb_btime;
__u64 dqb_itime;
__u32 dqb_valid;
};
-#define IIF_BGRACE 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IIF_BGRACE 1
#define IIF_IGRACE 2
#define IIF_FLAGS 4
#define IIF_ALL (IIF_BGRACE | IIF_IGRACE | IIF_FLAGS)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ DQF_ROOT_SQUASH_B = 0,
+ DQF_SYS_FILE_B = 16,
+ DQF_PRIVATE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define DQF_ROOT_SQUASH (1 << DQF_ROOT_SQUASH_B)
+#define DQF_SYS_FILE (1 << DQF_SYS_FILE_B)
struct if_dqinfo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 dqi_bgrace;
diff --git a/libc/kernel/uapi/linux/raid/md_p.h b/libc/kernel/uapi/linux/raid/md_p.h
index bdf8e7ccb..b24e5d675 100644
--- a/libc/kernel/uapi/linux/raid/md_p.h
+++ b/libc/kernel/uapi/linux/raid/md_p.h
@@ -49,21 +49,31 @@
#define MD_DISK_ACTIVE 1
#define MD_DISK_SYNC 2
#define MD_DISK_REMOVED 3
+#define MD_DISK_CLUSTER_ADD 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MD_DISK_CANDIDATE 5
#define MD_DISK_WRITEMOSTLY 9
+#define MD_DISK_JOURNAL 18
+#define MD_DISK_ROLE_SPARE 0xffff
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MD_DISK_ROLE_FAULTY 0xfffe
+#define MD_DISK_ROLE_JOURNAL 0xfffd
+#define MD_DISK_ROLE_MAX 0xff00
typedef struct mdp_device_descriptor_s {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 number;
__u32 major;
__u32 minor;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 raid_disk;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 state;
__u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5];
} mdp_disk_t;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MD_SB_MAGIC 0xa92b4efc
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MD_SB_CLEAN 0
#define MD_SB_ERRORS 1
+#define MD_SB_CLUSTERED 5
#define MD_SB_BITMAP_PRESENT 8
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct mdp_superblock_s {
@@ -163,37 +173,94 @@ struct mdp_superblock_1 {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le64 data_size;
__le64 super_offset;
- __le64 recovery_offset;
- __le32 dev_number;
+ union {
+ __le64 recovery_offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le64 journal_tail;
+ };
+ __le32 dev_number;
__le32 cnt_corrected_read;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 device_uuid[16];
__u8 devflags;
#define WriteMostly1 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bblog_shift;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le16 bblog_size;
__le32 bblog_offset;
__le64 utime;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le64 events;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le64 resync_offset;
__le32 sb_csum;
__le32 max_dev;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 pad3[64 - 32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le16 dev_roles[0];
};
#define MD_FEATURE_BITMAP_OFFSET 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MD_FEATURE_RECOVERY_OFFSET 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MD_FEATURE_RESHAPE_ACTIVE 4
#define MD_FEATURE_BAD_BLOCKS 8
#define MD_FEATURE_REPLACEMENT 16
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MD_FEATURE_RESHAPE_BACKWARDS 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define MD_FEATURE_NEW_OFFSET 64
#define MD_FEATURE_RECOVERY_BITMAP 128
-#define MD_FEATURE_ALL (MD_FEATURE_BITMAP_OFFSET | MD_FEATURE_RECOVERY_OFFSET | MD_FEATURE_RESHAPE_ACTIVE | MD_FEATURE_BAD_BLOCKS | MD_FEATURE_REPLACEMENT | MD_FEATURE_RESHAPE_BACKWARDS | MD_FEATURE_NEW_OFFSET | MD_FEATURE_RECOVERY_BITMAP)
+#define MD_FEATURE_CLUSTERED 256
+#define MD_FEATURE_JOURNAL 512
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define MD_FEATURE_ALL (MD_FEATURE_BITMAP_OFFSET | MD_FEATURE_RECOVERY_OFFSET | MD_FEATURE_RESHAPE_ACTIVE | MD_FEATURE_BAD_BLOCKS | MD_FEATURE_REPLACEMENT | MD_FEATURE_RESHAPE_BACKWARDS | MD_FEATURE_NEW_OFFSET | MD_FEATURE_RECOVERY_BITMAP | MD_FEATURE_CLUSTERED | MD_FEATURE_JOURNAL)
+struct r5l_payload_header {
+ __le16 type;
+ __le16 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((__packed__));
+enum r5l_payload_type {
+ R5LOG_PAYLOAD_DATA = 0,
+ R5LOG_PAYLOAD_PARITY = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ R5LOG_PAYLOAD_FLUSH = 2,
+};
+struct r5l_payload_data_parity {
+ struct r5l_payload_header header;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 size;
+ __le64 location;
+ __le32 checksum[];
+} __attribute__((__packed__));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum r5l_payload_data_parity_flag {
+ R5LOG_PAYLOAD_FLAG_DISCARD = 1,
+ R5LOG_PAYLOAD_FLAG_RESHAPED = 2,
+ R5LOG_PAYLOAD_FLAG_RESHAPING = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct r5l_payload_flush {
+ struct r5l_payload_header header;
+ __le32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le64 flush_stripes[];
+} __attribute__((__packed__));
+enum r5l_payload_flush_flag {
+ R5LOG_PAYLOAD_FLAG_FLUSH_STRIPE = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct r5l_meta_block {
+ __le32 magic;
+ __le32 checksum;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 version;
+ __u8 __zero_pading_1;
+ __le16 __zero_pading_2;
+ __le32 meta_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le64 seq;
+ __le64 position;
+ struct r5l_payload_header payloads[];
+} __attribute__((__packed__));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define R5LOG_VERSION 0x1
+#define R5LOG_MAGIC 0x6433c509
#endif
diff --git a/libc/kernel/uapi/linux/raid/md_u.h b/libc/kernel/uapi/linux/raid/md_u.h
index 7a9fa6104..66ab2ba07 100644
--- a/libc/kernel/uapi/linux/raid/md_u.h
+++ b/libc/kernel/uapi/linux/raid/md_u.h
@@ -48,68 +48,69 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define STOP_ARRAY_RO _IO(MD_MAJOR, 0x33)
#define RESTART_ARRAY_RW _IO(MD_MAJOR, 0x34)
+#define CLUSTERED_DISK_NACK _IO(MD_MAJOR, 0x35)
#define MdpMinorShift 6
-typedef struct mdu_version_s {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct mdu_version_s {
int major;
int minor;
int patchlevel;
-} mdu_version_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} mdu_version_t;
typedef struct mdu_array_info_s {
int major_version;
int minor_version;
- int patch_version;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int patch_version;
int ctime;
int level;
int size;
- int nr_disks;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int nr_disks;
int raid_disks;
int md_minor;
int not_persistent;
- int utime;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int utime;
int state;
int active_disks;
int working_disks;
- int failed_disks;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int failed_disks;
int spare_disks;
int layout;
int chunk_size;
-} mdu_array_info_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} mdu_array_info_t;
#define LEVEL_MULTIPATH (- 4)
#define LEVEL_LINEAR (- 1)
#define LEVEL_FAULTY (- 5)
-#define LEVEL_NONE (- 1000000)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LEVEL_NONE (- 1000000)
typedef struct mdu_disk_info_s {
int number;
int major;
- int minor;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int minor;
int raid_disk;
int state;
} mdu_disk_info_t;
-typedef struct mdu_start_info_s {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct mdu_start_info_s {
int major;
int minor;
int raid_disk;
- int state;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int state;
} mdu_start_info_t;
typedef struct mdu_bitmap_file_s {
char pathname[4096];
-} mdu_bitmap_file_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} mdu_bitmap_file_t;
typedef struct mdu_param_s {
int personality;
int chunk_size;
- int max_fault;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int max_fault;
} mdu_param_t;
#endif
diff --git a/libc/kernel/uapi/linux/rds.h b/libc/kernel/uapi/linux/rds.h
index 66cb905ba..ac2f77fc1 100644
--- a/libc/kernel/uapi/linux/rds.h
+++ b/libc/kernel/uapi/linux/rds.h
@@ -21,203 +21,211 @@
#include <linux/types.h>
#define RDS_IB_ABI_VERSION 0x301
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SOL_RDS 276
#define RDS_CANCEL_SENT_TO 1
#define RDS_GET_MR 2
#define RDS_FREE_MR 3
-#define RDS_RECVERR 5
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RDS_RECVERR 5
#define RDS_CONG_MONITOR 6
#define RDS_GET_MR_FOR_DEST 7
+#define SO_RDS_TRANSPORT 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RDS_TRANS_IB 0
+#define RDS_TRANS_IWARP 1
+#define RDS_TRANS_TCP 2
+#define RDS_TRANS_COUNT 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RDS_TRANS_NONE (~0)
#define RDS_CMSG_RDMA_ARGS 1
#define RDS_CMSG_RDMA_DEST 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_CMSG_RDMA_MAP 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_CMSG_RDMA_STATUS 4
#define RDS_CMSG_CONG_UPDATE 5
#define RDS_CMSG_ATOMIC_FADD 6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_CMSG_ATOMIC_CSWP 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_CMSG_MASKED_ATOMIC_FADD 8
#define RDS_CMSG_MASKED_ATOMIC_CSWP 9
#define RDS_INFO_FIRST 10000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_COUNTERS 10000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_CONNECTIONS 10001
#define RDS_INFO_SEND_MESSAGES 10003
#define RDS_INFO_RETRANS_MESSAGES 10004
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_RECV_MESSAGES 10005
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_SOCKETS 10006
#define RDS_INFO_TCP_SOCKETS 10007
#define RDS_INFO_IB_CONNECTIONS 10008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_CONNECTION_STATS 10009
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_IWARP_CONNECTIONS 10010
#define RDS_INFO_LAST 10010
struct rds_info_counter {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint8_t name[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t value;
} __attribute__((packed));
#define RDS_INFO_CONNECTION_FLAG_SENDING 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_CONNECTION_FLAG_CONNECTING 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_CONNECTION_FLAG_CONNECTED 0x04
#define TRANSNAMSIZ 16
struct rds_info_connection {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t next_tx_seq;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t next_rx_seq;
__be32 laddr;
__be32 faddr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint8_t transport[TRANSNAMSIZ];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint8_t flags;
} __attribute__((packed));
#define RDS_INFO_MESSAGE_FLAG_ACK 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_INFO_MESSAGE_FLAG_FAST_ACK 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct rds_info_message {
uint64_t seq;
uint32_t len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 laddr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 faddr;
__be16 lport;
__be16 fport;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint8_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct rds_info_socket {
uint32_t sndbuf;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 bound_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 connected_addr;
__be16 bound_port;
__be16 connected_port;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t rcvbuf;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t inum;
} __attribute__((packed));
struct rds_info_tcp_socket {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 local_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 local_port;
__be32 peer_addr;
__be16 peer_port;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t hdr_rem;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t data_rem;
uint32_t last_sent_nxt;
uint32_t last_expected_una;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t last_seen_una;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
#define RDS_IB_GID_LEN 16
struct rds_info_rdma_connection {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 src_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 dst_addr;
uint8_t src_gid[RDS_IB_GID_LEN];
uint8_t dst_gid[RDS_IB_GID_LEN];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t max_send_wr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t max_recv_wr;
uint32_t max_send_sge;
uint32_t rdma_mr_max;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t rdma_mr_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define RDS_CONG_MONITOR_SIZE 64
#define RDS_CONG_MONITOR_BIT(port) (((unsigned int) port) % RDS_CONG_MONITOR_SIZE)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_CONG_MONITOR_MASK(port) (1ULL << RDS_CONG_MONITOR_BIT(port))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef uint64_t rds_rdma_cookie_t;
struct rds_iovec {
uint64_t addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t bytes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct rds_get_mr_args {
struct rds_iovec vec;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t cookie_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t flags;
};
struct rds_get_mr_for_dest_args {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct sockaddr_storage dest_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct rds_iovec vec;
uint64_t cookie_addr;
uint64_t flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct rds_free_mr_args {
rds_rdma_cookie_t cookie;
uint64_t flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct rds_rdma_args {
rds_rdma_cookie_t cookie;
struct rds_iovec remote_vec;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t local_vec_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t nr_local;
uint64_t flags;
uint64_t user_token;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct rds_atomic_args {
rds_rdma_cookie_t cookie;
uint64_t local_addr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t remote_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct {
uint64_t compare;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t swap;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} cswp;
struct {
uint64_t add;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} fadd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
uint64_t compare;
uint64_t swap;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t compare_mask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t swap_mask;
} m_cswp;
struct {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t add;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t nocarry_mask;
} m_fadd;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t user_token;
};
struct rds_rdma_notify {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint64_t user_token;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int32_t status;
};
#define RDS_RDMA_SUCCESS 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_RDMA_REMOTE_ERROR 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_RDMA_CANCELED 2
#define RDS_RDMA_DROPPED 3
#define RDS_RDMA_OTHER_ERROR 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_RDMA_READWRITE 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_RDMA_FENCE 0x0002
#define RDS_RDMA_INVALIDATE 0x0004
#define RDS_RDMA_USE_ONCE 0x0008
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_RDMA_DONTWAIT 0x0010
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDS_RDMA_NOTIFY_ME 0x0020
#define RDS_RDMA_SILENT 0x0040
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/rtnetlink.h b/libc/kernel/uapi/linux/rtnetlink.h
index f0779cf8d..81b709b70 100644
--- a/libc/kernel/uapi/linux/rtnetlink.h
+++ b/libc/kernel/uapi/linux/rtnetlink.h
@@ -144,95 +144,105 @@ enum {
#define RTM_DELMDB RTM_DELMDB
RTM_GETMDB = 86,
#define RTM_GETMDB RTM_GETMDB
- __RTM_MAX,
+ RTM_NEWNSID = 88,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTM_NEWNSID RTM_NEWNSID
+ RTM_DELNSID = 89,
+#define RTM_DELNSID RTM_DELNSID
+ RTM_GETNSID = 90,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTM_GETNSID RTM_GETNSID
+ __RTM_MAX,
#define RTM_MAX (((__RTM_MAX + 3) & ~3) - 1)
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTM_NR_MSGTYPES (RTM_MAX + 1 - RTM_BASE)
#define RTM_NR_FAMILIES (RTM_NR_MSGTYPES >> 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTM_FAM(cmd) (((cmd) - RTM_BASE) >> 2)
struct rtattr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short rta_len;
unsigned short rta_type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
-#define RTA_ALIGNTO 4
+#define RTA_ALIGNTO 4U
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTA_ALIGN(len) (((len) + RTA_ALIGNTO - 1) & ~(RTA_ALIGNTO - 1))
#define RTA_OK(rta,len) ((len) >= (int) sizeof(struct rtattr) && (rta)->rta_len >= sizeof(struct rtattr) && (rta)->rta_len <= (len))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len), (struct rtattr *) (((char *) (rta)) + RTA_ALIGN((rta)->rta_len)))
#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len))
#define RTA_DATA(rta) ((void *) (((char *) (rta)) + RTA_LENGTH(0)))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTA_PAYLOAD(rta) ((int) ((rta)->rta_len) - RTA_LENGTH(0))
struct rtmsg {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char rtm_family;
unsigned char rtm_dst_len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char rtm_src_len;
unsigned char rtm_tos;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char rtm_table;
unsigned char rtm_protocol;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char rtm_scope;
unsigned char rtm_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned rtm_flags;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
RTN_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTN_UNICAST,
RTN_LOCAL,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTN_BROADCAST,
RTN_ANYCAST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTN_MULTICAST,
RTN_BLACKHOLE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTN_UNREACHABLE,
RTN_PROHIBIT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTN_THROW,
RTN_NAT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTN_XRESOLVE,
__RTN_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define RTN_MAX (__RTN_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_UNSPEC 0
#define RTPROT_REDIRECT 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_KERNEL 2
#define RTPROT_BOOT 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_STATIC 4
#define RTPROT_GATED 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_RA 9
#define RTPROT_MRT 10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_ZEBRA 11
#define RTPROT_BIRD 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_DNROUTED 13
#define RTPROT_XORP 14
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_NTK 15
#define RTPROT_DHCP 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTPROT_MROUTED 17
+#define RTPROT_BABEL 42
enum rt_scope_t {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RT_SCOPE_UNIVERSE = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RT_SCOPE_SITE = 200,
RT_SCOPE_LINK = 253,
RT_SCOPE_HOST = 254,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RT_SCOPE_NOWHERE = 255
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define RTM_F_NOTIFY 0x100
#define RTM_F_CLONED 0x200
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTM_F_EQUALIZE 0x400
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTM_F_PREFIX 0x800
+#define RTM_F_LOOKUP_TABLE 0x1000
enum rt_class_t {
RT_TABLE_UNSPEC = 0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -267,23 +277,33 @@ enum rtattr_type_t {
RTA_MARK,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTA_MFC_STATS,
+ RTA_VIA,
+ RTA_NEWDST,
+ RTA_PREF,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ RTA_ENCAP_TYPE,
+ RTA_ENCAP,
__RTA_MAX
};
-#define RTA_MAX (__RTA_MAX - 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTA_MAX (__RTA_MAX - 1)
#define RTM_RTA(r) ((struct rtattr *) (((char *) (r)) + NLMSG_ALIGN(sizeof(struct rtmsg))))
#define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct rtmsg))
struct rtnexthop {
- unsigned short rtnh_len;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short rtnh_len;
unsigned char rtnh_flags;
unsigned char rtnh_hops;
int rtnh_ifindex;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define RTNH_F_DEAD 1
#define RTNH_F_PERVASIVE 2
#define RTNH_F_ONLINK 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTNH_F_OFFLOAD 8
+#define RTNH_F_LINKDOWN 16
+#define RTNH_COMPARE_MASK (RTNH_F_DEAD | RTNH_F_LINKDOWN)
#define RTNH_ALIGNTO 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNH_ALIGN(len) (((len) + RTNH_ALIGNTO - 1) & ~(RTNH_ALIGNTO - 1))
@@ -293,6 +313,11 @@ struct rtnexthop {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNH_SPACE(len) RTNH_ALIGN(RTNH_LENGTH(len))
#define RTNH_DATA(rtnh) ((struct rtattr *) (((char *) (rtnh)) + RTNH_LENGTH(0)))
+struct rtvia {
+ __kernel_sa_family_t rtvia_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 rtvia_addr[0];
+};
struct rta_cacheinfo {
__u32 rta_clntref;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -348,233 +373,244 @@ enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTAX_QUICKACK,
#define RTAX_QUICKACK RTAX_QUICKACK
+ RTAX_CC_ALGO,
+#define RTAX_CC_ALGO RTAX_CC_ALGO
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__RTAX_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTAX_MAX (__RTAX_MAX - 1)
-#define RTAX_FEATURE_ECN 0x00000001
-#define RTAX_FEATURE_SACK 0x00000002
-#define RTAX_FEATURE_TIMESTAMP 0x00000004
+#define RTAX_FEATURE_ECN (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTAX_FEATURE_SACK (1 << 1)
+#define RTAX_FEATURE_TIMESTAMP (1 << 2)
+#define RTAX_FEATURE_ALLFRAG (1 << 3)
+#define RTAX_FEATURE_MASK (RTAX_FEATURE_ECN | RTAX_FEATURE_SACK | RTAX_FEATURE_TIMESTAMP | RTAX_FEATURE_ALLFRAG)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define RTAX_FEATURE_ALLFRAG 0x00000008
struct rta_session {
__u8 proto;
__u8 pad1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 pad2;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct {
__u16 sport;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 dport;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} ports;
struct {
__u8 type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 code;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 ident;
} icmpt;
__u32 spi;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} u;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct rta_mfc_stats {
__u64 mfcs_packets;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 mfcs_bytes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 mfcs_wrong_if;
};
struct rtgenmsg {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char rtgen_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ifinfomsg {
unsigned char ifi_family;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char __ifi_pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short ifi_type;
int ifi_index;
unsigned ifi_flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned ifi_change;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct prefixmsg {
unsigned char prefix_family;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char prefix_pad1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short prefix_pad2;
int prefix_ifindex;
unsigned char prefix_type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char prefix_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char prefix_flags;
unsigned char prefix_pad3;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
PREFIX_UNSPEC,
PREFIX_ADDRESS,
PREFIX_CACHEINFO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__PREFIX_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define PREFIX_MAX (__PREFIX_MAX - 1)
struct prefix_cacheinfo {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 preferred_time;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 valid_time;
};
struct tcmsg {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char tcm_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char tcm__pad1;
unsigned short tcm__pad2;
int tcm_ifindex;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcm_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcm_parent;
__u32 tcm_info;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_UNSPEC,
TCA_KIND,
TCA_OPTIONS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_STATS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_XSTATS,
TCA_RATE,
TCA_FCNT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_STATS2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCA_STAB,
__TCA_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_MAX (__TCA_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_RTA(r) ((struct rtattr *) (((char *) (r)) + NLMSG_ALIGN(sizeof(struct tcmsg))))
#define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct tcmsg))
struct nduseroptmsg {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char nduseropt_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char nduseropt_pad1;
unsigned short nduseropt_opts_len;
int nduseropt_ifindex;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 nduseropt_icmp_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 nduseropt_icmp_code;
unsigned short nduseropt_pad2;
unsigned int nduseropt_pad3;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
NDUSEROPT_UNSPEC,
NDUSEROPT_SRCADDR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__NDUSEROPT_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define NDUSEROPT_MAX (__NDUSEROPT_MAX - 1)
#define RTMGRP_LINK 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_NOTIFY 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_NEIGH 4
#define RTMGRP_TC 8
#define RTMGRP_IPV4_IFADDR 0x10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_IPV4_MROUTE 0x20
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_IPV4_ROUTE 0x40
#define RTMGRP_IPV4_RULE 0x80
#define RTMGRP_IPV6_IFADDR 0x100
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_IPV6_MROUTE 0x200
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_IPV6_ROUTE 0x400
#define RTMGRP_IPV6_IFINFO 0x800
#define RTMGRP_DECnet_IFADDR 0x1000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_DECnet_ROUTE 0x4000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTMGRP_IPV6_PREFIX 0x20000
enum rtnetlink_groups {
RTNLGRP_NONE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_NONE RTNLGRP_NONE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_LINK,
#define RTNLGRP_LINK RTNLGRP_LINK
RTNLGRP_NOTIFY,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_NOTIFY RTNLGRP_NOTIFY
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_NEIGH,
#define RTNLGRP_NEIGH RTNLGRP_NEIGH
RTNLGRP_TC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_TC RTNLGRP_TC
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_IPV4_IFADDR,
#define RTNLGRP_IPV4_IFADDR RTNLGRP_IPV4_IFADDR
RTNLGRP_IPV4_MROUTE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_IPV4_MROUTE RTNLGRP_IPV4_MROUTE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_IPV4_ROUTE,
#define RTNLGRP_IPV4_ROUTE RTNLGRP_IPV4_ROUTE
RTNLGRP_IPV4_RULE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_IPV4_RULE RTNLGRP_IPV4_RULE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_IPV6_IFADDR,
#define RTNLGRP_IPV6_IFADDR RTNLGRP_IPV6_IFADDR
RTNLGRP_IPV6_MROUTE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_IPV6_MROUTE RTNLGRP_IPV6_MROUTE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_IPV6_ROUTE,
#define RTNLGRP_IPV6_ROUTE RTNLGRP_IPV6_ROUTE
RTNLGRP_IPV6_IFINFO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_IPV6_IFINFO RTNLGRP_IPV6_IFINFO
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_DECnet_IFADDR,
#define RTNLGRP_DECnet_IFADDR RTNLGRP_DECnet_IFADDR
RTNLGRP_NOP2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_DECnet_ROUTE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_DECnet_ROUTE RTNLGRP_DECnet_ROUTE
RTNLGRP_DECnet_RULE,
#define RTNLGRP_DECnet_RULE RTNLGRP_DECnet_RULE
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_NOP4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_IPV6_PREFIX,
#define RTNLGRP_IPV6_PREFIX RTNLGRP_IPV6_PREFIX
RTNLGRP_IPV6_RULE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_IPV6_RULE RTNLGRP_IPV6_RULE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_ND_USEROPT,
#define RTNLGRP_ND_USEROPT RTNLGRP_ND_USEROPT
RTNLGRP_PHONET_IFADDR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_PHONET_IFADDR RTNLGRP_PHONET_IFADDR
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_PHONET_ROUTE,
#define RTNLGRP_PHONET_ROUTE RTNLGRP_PHONET_ROUTE
RTNLGRP_DCB,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_DCB RTNLGRP_DCB
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_IPV4_NETCONF,
#define RTNLGRP_IPV4_NETCONF RTNLGRP_IPV4_NETCONF
RTNLGRP_IPV6_NETCONF,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_IPV6_NETCONF RTNLGRP_IPV6_NETCONF
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RTNLGRP_MDB,
#define RTNLGRP_MDB RTNLGRP_MDB
- __RTNLGRP_MAX
+ RTNLGRP_MPLS_ROUTE,
+#define RTNLGRP_MPLS_ROUTE RTNLGRP_MPLS_ROUTE
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ RTNLGRP_NSID,
+#define RTNLGRP_NSID RTNLGRP_NSID
+ __RTNLGRP_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTNLGRP_MAX (__RTNLGRP_MAX - 1)
struct tcamsg {
unsigned char tca_family;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char tca__pad1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short tca__pad2;
};
#define TA_RTA(r) ((struct rtattr *) (((char *) (r)) + NLMSG_ALIGN(sizeof(struct tcamsg))))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TA_PAYLOAD(n) NLMSG_PAYLOAD(n, sizeof(struct tcamsg))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCA_ACT_TAB 1
#define TCAA_MAX 1
#define RTEXT_FILTER_VF (1 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RTEXT_FILTER_BRVLAN (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define RTEXT_FILTER_BRVLAN_COMPRESSED (1 << 2)
+#define RTEXT_FILTER_SKIP_STATS (1 << 3)
#endif
diff --git a/libc/kernel/uapi/linux/scif_ioctl.h b/libc/kernel/uapi/linux/scif_ioctl.h
new file mode 100644
index 000000000..6bb51ce7a
--- /dev/null
+++ b/libc/kernel/uapi/linux/scif_ioctl.h
@@ -0,0 +1,111 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef SCIF_IOCTL_H
+#define SCIF_IOCTL_H
+#include <linux/types.h>
+struct scif_port_id {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 node;
+ __u16 port;
+};
+struct scifioctl_connect {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct scif_port_id self;
+ struct scif_port_id peer;
+};
+struct scifioctl_accept {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 flags;
+ struct scif_port_id peer;
+ __u64 endpt;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct scifioctl_msg {
+ __u64 msg;
+ __s32 len;
+ __s32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 out_len;
+};
+struct scifioctl_reg {
+ __u64 addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 len;
+ __s64 offset;
+ __s32 prot;
+ __s32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s64 out_offset;
+};
+struct scifioctl_unreg {
+ __s64 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 len;
+};
+struct scifioctl_copy {
+ __s64 loffset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 len;
+ __s64 roffset;
+ __u64 addr;
+ __s32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct scifioctl_fence_mark {
+ __s32 flags;
+ __u64 mark;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct scifioctl_fence_signal {
+ __s64 loff;
+ __u64 lval;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s64 roff;
+ __u64 rval;
+ __s32 flags;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct scifioctl_node_ids {
+ __u64 nodes;
+ __u64 self;
+ __s32 len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define SCIF_BIND _IOWR('s', 1, __u64)
+#define SCIF_LISTEN _IOW('s', 2, __s32)
+#define SCIF_CONNECT _IOWR('s', 3, struct scifioctl_connect)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SCIF_ACCEPTREQ _IOWR('s', 4, struct scifioctl_accept)
+#define SCIF_ACCEPTREG _IOWR('s', 5, __u64)
+#define SCIF_SEND _IOWR('s', 6, struct scifioctl_msg)
+#define SCIF_RECV _IOWR('s', 7, struct scifioctl_msg)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SCIF_REG _IOWR('s', 8, struct scifioctl_reg)
+#define SCIF_UNREG _IOWR('s', 9, struct scifioctl_unreg)
+#define SCIF_READFROM _IOWR('s', 10, struct scifioctl_copy)
+#define SCIF_WRITETO _IOWR('s', 11, struct scifioctl_copy)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SCIF_VREADFROM _IOWR('s', 12, struct scifioctl_copy)
+#define SCIF_VWRITETO _IOWR('s', 13, struct scifioctl_copy)
+#define SCIF_GET_NODEIDS _IOWR('s', 14, struct scifioctl_node_ids)
+#define SCIF_FENCE_MARK _IOWR('s', 15, struct scifioctl_fence_mark)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SCIF_FENCE_WAIT _IOWR('s', 16, __s32)
+#define SCIF_FENCE_SIGNAL _IOWR('s', 17, struct scifioctl_fence_signal)
+#endif
diff --git a/libc/kernel/uapi/linux/screen_info.h b/libc/kernel/uapi/linux/screen_info.h
index cfe22fd89..e210fbb8c 100644
--- a/libc/kernel/uapi/linux/screen_info.h
+++ b/libc/kernel/uapi/linux/screen_info.h
@@ -62,27 +62,29 @@ struct screen_info {
__u16 vesa_attributes;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 capabilities;
- __u8 _reserved[6];
+ __u32 ext_lfb_base;
+ __u8 _reserved[2];
} __attribute__((packed));
-#define VIDEO_TYPE_MDA 0x10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIDEO_TYPE_MDA 0x10
#define VIDEO_TYPE_CGA 0x11
#define VIDEO_TYPE_EGAM 0x20
#define VIDEO_TYPE_EGAC 0x21
-#define VIDEO_TYPE_VGAC 0x22
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIDEO_TYPE_VGAC 0x22
#define VIDEO_TYPE_VLFB 0x23
#define VIDEO_TYPE_PICA_S3 0x30
#define VIDEO_TYPE_MIPS_G364 0x31
-#define VIDEO_TYPE_SGI 0x33
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIDEO_TYPE_SGI 0x33
#define VIDEO_TYPE_TGAC 0x40
#define VIDEO_TYPE_SUN 0x50
#define VIDEO_TYPE_SUNPCI 0x51
-#define VIDEO_TYPE_PMAC 0x60
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIDEO_TYPE_PMAC 0x60
#define VIDEO_TYPE_EFI 0x70
#define VIDEO_FLAGS_NOCURSOR (1 << 0)
#define VIDEO_CAPABILITY_SKIP_QUIRKS (1 << 0)
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIDEO_CAPABILITY_64BIT_BASE (1 << 1)
+#endif
diff --git a/libc/kernel/uapi/linux/securebits.h b/libc/kernel/uapi/linux/securebits.h
index a644d5a02..ee9e61b74 100644
--- a/libc/kernel/uapi/linux/securebits.h
+++ b/libc/kernel/uapi/linux/securebits.h
@@ -36,6 +36,11 @@
#define SECBIT_KEEP_CAPS (issecure_mask(SECURE_KEEP_CAPS))
#define SECBIT_KEEP_CAPS_LOCKED (issecure_mask(SECURE_KEEP_CAPS_LOCKED))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SECURE_ALL_BITS (issecure_mask(SECURE_NOROOT) | issecure_mask(SECURE_NO_SETUID_FIXUP) | issecure_mask(SECURE_KEEP_CAPS))
+#define SECURE_NO_CAP_AMBIENT_RAISE 6
+#define SECURE_NO_CAP_AMBIENT_RAISE_LOCKED 7
+#define SECBIT_NO_CAP_AMBIENT_RAISE (issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE))
+#define SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED (issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE_LOCKED))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SECURE_ALL_BITS (issecure_mask(SECURE_NOROOT) | issecure_mask(SECURE_NO_SETUID_FIXUP) | issecure_mask(SECURE_KEEP_CAPS) | issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE))
#define SECURE_ALL_LOCKS (SECURE_ALL_BITS << 1)
#endif
diff --git a/libc/kernel/uapi/linux/sem.h b/libc/kernel/uapi/linux/sem.h
index 04909d57e..4f3632b0e 100644
--- a/libc/kernel/uapi/linux/sem.h
+++ b/libc/kernel/uapi/linux/sem.h
@@ -76,10 +76,10 @@ struct seminfo {
int semaem;
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define SEMMNI 128
-#define SEMMSL 250
+#define SEMMNI 32000
+#define SEMMSL 32000
#define SEMMNS (SEMMNI * SEMMSL)
-#define SEMOPM 32
+#define SEMOPM 500
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SEMVMX 32767
#define SEMAEM SEMVMX
diff --git a/libc/kernel/uapi/linux/serial.h b/libc/kernel/uapi/linux/serial.h
index 300176b23..494dc9a30 100644
--- a/libc/kernel/uapi/linux/serial.h
+++ b/libc/kernel/uapi/linux/serial.h
@@ -71,6 +71,11 @@ struct serial_struct {
#define SERIAL_IO_HUB6 1
#define SERIAL_IO_MEM 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SERIAL_IO_MEM32 3
+#define SERIAL_IO_AU 4
+#define SERIAL_IO_TSI 5
+#define SERIAL_IO_MEM32BE 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_CLEAR_FIFO 0x01
#define UART_USE_FIFO 0x02
#define UART_STARTECH 0x04
diff --git a/libc/kernel/uapi/linux/serial_core.h b/libc/kernel/uapi/linux/serial_core.h
index e310f8ddd..dcda90335 100644
--- a/libc/kernel/uapi/linux/serial_core.h
+++ b/libc/kernel/uapi/linux/serial_core.h
@@ -56,95 +56,103 @@
#define PORT_ALTR_16550_F64 27
#define PORT_ALTR_16550_F128 28
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define PORT_MAX_8250 28
+#define PORT_RT2880 29
+#define PORT_16550A_FSL64 30
+#define PORT_MAX_8250 30
#define PORT_PXA 31
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_AMBA 32
#define PORT_CLPS711X 33
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_SA1100 34
#define PORT_UART00 35
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_21285 37
#define PORT_SUNZILOG 38
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_SUNSAB 39
#define PORT_DZ 46
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_ZS 47
#define PORT_MUX 48
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_ATMEL 49
#define PORT_MAC_ZILOG 50
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_PMAC_ZILOG 51
#define PORT_SCI 52
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_SCIF 53
#define PORT_IRDA 54
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_S3C2410 55
#define PORT_IP22ZILOG 56
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_LH7A40X 57
#define PORT_CPM 58
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_MPC52xx 59
#define PORT_ICOM 60
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_S3C2440 61
#define PORT_IMX 62
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_MPSC 63
#define PORT_TXX9 64
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_VR41XX_SIU 65
#define PORT_VR41XX_DSIU 66
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_S3C2400 67
#define PORT_M32R_SIO 68
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_JSM 69
#define PORT_PNX8XXX 70
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_NETX 71
#define PORT_SUNHV 72
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_S3C2412 73
#define PORT_UARTLITE 74
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_BFIN 75
#define PORT_KS8695 76
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_SB1250_DUART 77
#define PORT_MCF 78
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_BFIN_SPORT 79
#define PORT_MN10300 80
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_MN10300_CTS 81
#define PORT_SC26XX 82
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_SCIFA 83
#define PORT_S3C6400 84
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_NWPSERIAL 85
#define PORT_MAX3100 86
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_TIMBUART 87
#define PORT_MSM 88
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_BCM63XX 89
#define PORT_APBUART 90
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_ALTERA_JTAGUART 91
#define PORT_ALTERA_UART 92
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_SCIFB 93
#define PORT_MAX310X 94
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_MFD 95
#define PORT_OMAP 96
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_VT8500 97
#define PORT_XUARTPS 98
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_AR933X 99
#define PORT_EFMUART 100
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_ARC 101
#define PORT_RP2 102
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_LPUART 103
#define PORT_HSCIF 104
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_ASC 105
#define PORT_TILEGX 106
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_MEN_Z135 107
#define PORT_SC16IS7XX 108
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define PORT_MESON 109
+#define PORT_DIGICOLOR 110
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define PORT_SPRD 111
+#define PORT_CRIS 112
+#define PORT_STM32 113
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/serial_reg.h b/libc/kernel/uapi/linux/serial_reg.h
index f68c54b88..570bbed61 100644
--- a/libc/kernel/uapi/linux/serial_reg.h
+++ b/libc/kernel/uapi/linux/serial_reg.h
@@ -197,21 +197,6 @@
#define UART_FCR_PXAR16 0x80
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_FCR_PXAR32 0xc0
-#define UART_FCR_HSU_64_1B 0x00
-#define UART_FCR_HSU_64_16B 0x40
-#define UART_FCR_HSU_64_32B 0x80
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define UART_FCR_HSU_64_56B 0xc0
-#define UART_FCR_HSU_16_1B 0x00
-#define UART_FCR_HSU_16_4B 0x40
-#define UART_FCR_HSU_16_8B 0x80
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define UART_FCR_HSU_16_14B 0xc0
-#define UART_FCR_HSU_64B_FIFO 0x20
-#define UART_FCR_HSU_16B_FIFO 0x00
-#define UART_FCR_HALF_EMPT_TXI 0x00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define UART_FCR_FULL_EMPT_TXI 0x08
#define UART_ASR 0x01
#define UART_RFL 0x03
#define UART_TFL 0x04
@@ -277,18 +262,23 @@
#define SERIAL_RSA_BAUD_BASE (921600)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SERIAL_RSA_BAUD_BASE_LO (SERIAL_RSA_BAUD_BASE / 8)
+#define OMAP1_UART1_BASE 0xfffb0000
+#define OMAP1_UART2_BASE 0xfffb0800
+#define OMAP1_UART3_BASE 0xfffb9800
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_OMAP_MDR1 0x08
#define UART_OMAP_MDR2 0x09
#define UART_OMAP_SCR 0x10
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_OMAP_SSR 0x11
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_OMAP_EBLR 0x12
#define UART_OMAP_OSC_12M_SEL 0x13
#define UART_OMAP_MVER 0x14
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_OMAP_SYSC 0x15
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_OMAP_SYSS 0x16
#define UART_OMAP_WER 0x17
+#define UART_OMAP_TX_LVL 0x1a
#define UART_OMAP_MDR1_16X_MODE 0x00
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UART_OMAP_MDR1_SIR_MODE 0x01
diff --git a/libc/kernel/uapi/linux/snmp.h b/libc/kernel/uapi/linux/snmp.h
index ab163cc1a..e8ddf614f 100644
--- a/libc/kernel/uapi/linux/snmp.h
+++ b/libc/kernel/uapi/linux/snmp.h
@@ -154,180 +154,198 @@ enum {
UDP_MIB_RCVBUFERRORS,
UDP_MIB_SNDBUFERRORS,
UDP_MIB_CSUMERRORS,
- __UDP_MIB_MAX
+ UDP_MIB_IGNOREDMULTI,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __UDP_MIB_MAX
};
enum {
LINUX_MIB_NUM = 0,
- LINUX_MIB_SYNCOOKIESSENT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_SYNCOOKIESSENT,
LINUX_MIB_SYNCOOKIESRECV,
LINUX_MIB_SYNCOOKIESFAILED,
LINUX_MIB_EMBRYONICRSTS,
- LINUX_MIB_PRUNECALLED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_PRUNECALLED,
LINUX_MIB_RCVPRUNED,
LINUX_MIB_OFOPRUNED,
LINUX_MIB_OUTOFWINDOWICMPS,
- LINUX_MIB_LOCKDROPPEDICMPS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_LOCKDROPPEDICMPS,
LINUX_MIB_ARPFILTER,
LINUX_MIB_TIMEWAITED,
LINUX_MIB_TIMEWAITRECYCLED,
- LINUX_MIB_TIMEWAITKILLED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TIMEWAITKILLED,
LINUX_MIB_PAWSPASSIVEREJECTED,
LINUX_MIB_PAWSACTIVEREJECTED,
LINUX_MIB_PAWSESTABREJECTED,
- LINUX_MIB_DELAYEDACKS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_DELAYEDACKS,
LINUX_MIB_DELAYEDACKLOCKED,
LINUX_MIB_DELAYEDACKLOST,
LINUX_MIB_LISTENOVERFLOWS,
- LINUX_MIB_LISTENDROPS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_LISTENDROPS,
LINUX_MIB_TCPPREQUEUED,
LINUX_MIB_TCPDIRECTCOPYFROMBACKLOG,
LINUX_MIB_TCPDIRECTCOPYFROMPREQUEUE,
- LINUX_MIB_TCPPREQUEUEDROPPED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPPREQUEUEDROPPED,
LINUX_MIB_TCPHPHITS,
LINUX_MIB_TCPHPHITSTOUSER,
LINUX_MIB_TCPPUREACKS,
- LINUX_MIB_TCPHPACKS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPHPACKS,
LINUX_MIB_TCPRENORECOVERY,
LINUX_MIB_TCPSACKRECOVERY,
LINUX_MIB_TCPSACKRENEGING,
- LINUX_MIB_TCPFACKREORDER,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPFACKREORDER,
LINUX_MIB_TCPSACKREORDER,
LINUX_MIB_TCPRENOREORDER,
LINUX_MIB_TCPTSREORDER,
- LINUX_MIB_TCPFULLUNDO,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPFULLUNDO,
LINUX_MIB_TCPPARTIALUNDO,
LINUX_MIB_TCPDSACKUNDO,
LINUX_MIB_TCPLOSSUNDO,
- LINUX_MIB_TCPLOSTRETRANSMIT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPLOSTRETRANSMIT,
LINUX_MIB_TCPRENOFAILURES,
LINUX_MIB_TCPSACKFAILURES,
LINUX_MIB_TCPLOSSFAILURES,
- LINUX_MIB_TCPFASTRETRANS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPFASTRETRANS,
LINUX_MIB_TCPFORWARDRETRANS,
LINUX_MIB_TCPSLOWSTARTRETRANS,
LINUX_MIB_TCPTIMEOUTS,
- LINUX_MIB_TCPLOSSPROBES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPLOSSPROBES,
LINUX_MIB_TCPLOSSPROBERECOVERY,
LINUX_MIB_TCPRENORECOVERYFAIL,
LINUX_MIB_TCPSACKRECOVERYFAIL,
- LINUX_MIB_TCPSCHEDULERFAILED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPSCHEDULERFAILED,
LINUX_MIB_TCPRCVCOLLAPSED,
LINUX_MIB_TCPDSACKOLDSENT,
LINUX_MIB_TCPDSACKOFOSENT,
- LINUX_MIB_TCPDSACKRECV,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPDSACKRECV,
LINUX_MIB_TCPDSACKOFORECV,
LINUX_MIB_TCPABORTONDATA,
LINUX_MIB_TCPABORTONCLOSE,
- LINUX_MIB_TCPABORTONMEMORY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPABORTONMEMORY,
LINUX_MIB_TCPABORTONTIMEOUT,
LINUX_MIB_TCPABORTONLINGER,
LINUX_MIB_TCPABORTFAILED,
- LINUX_MIB_TCPMEMORYPRESSURES,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPMEMORYPRESSURES,
LINUX_MIB_TCPSACKDISCARD,
LINUX_MIB_TCPDSACKIGNOREDOLD,
LINUX_MIB_TCPDSACKIGNOREDNOUNDO,
- LINUX_MIB_TCPSPURIOUSRTOS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPSPURIOUSRTOS,
LINUX_MIB_TCPMD5NOTFOUND,
LINUX_MIB_TCPMD5UNEXPECTED,
LINUX_MIB_SACKSHIFTED,
- LINUX_MIB_SACKMERGED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_SACKMERGED,
LINUX_MIB_SACKSHIFTFALLBACK,
LINUX_MIB_TCPBACKLOGDROP,
LINUX_MIB_TCPMINTTLDROP,
- LINUX_MIB_TCPDEFERACCEPTDROP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPDEFERACCEPTDROP,
LINUX_MIB_IPRPFILTER,
LINUX_MIB_TCPTIMEWAITOVERFLOW,
LINUX_MIB_TCPREQQFULLDOCOOKIES,
- LINUX_MIB_TCPREQQFULLDROP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPREQQFULLDROP,
LINUX_MIB_TCPRETRANSFAIL,
LINUX_MIB_TCPRCVCOALESCE,
LINUX_MIB_TCPOFOQUEUE,
- LINUX_MIB_TCPOFODROP,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPOFODROP,
LINUX_MIB_TCPOFOMERGE,
LINUX_MIB_TCPCHALLENGEACK,
LINUX_MIB_TCPSYNCHALLENGE,
- LINUX_MIB_TCPFASTOPENACTIVE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPFASTOPENACTIVE,
LINUX_MIB_TCPFASTOPENACTIVEFAIL,
LINUX_MIB_TCPFASTOPENPASSIVE,
LINUX_MIB_TCPFASTOPENPASSIVEFAIL,
- LINUX_MIB_TCPFASTOPENLISTENOVERFLOW,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPFASTOPENLISTENOVERFLOW,
LINUX_MIB_TCPFASTOPENCOOKIEREQD,
LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES,
LINUX_MIB_BUSYPOLLRXPACKETS,
- LINUX_MIB_TCPAUTOCORKING,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPAUTOCORKING,
LINUX_MIB_TCPFROMZEROWINDOWADV,
LINUX_MIB_TCPTOZEROWINDOWADV,
LINUX_MIB_TCPWANTZEROWINDOWADV,
- LINUX_MIB_TCPSYNRETRANS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPSYNRETRANS,
LINUX_MIB_TCPORIGDATASENT,
+ LINUX_MIB_TCPHYSTARTTRAINDETECT,
+ LINUX_MIB_TCPHYSTARTTRAINCWND,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPHYSTARTDELAYDETECT,
+ LINUX_MIB_TCPHYSTARTDELAYCWND,
+ LINUX_MIB_TCPACKSKIPPEDSYNRECV,
+ LINUX_MIB_TCPACKSKIPPEDPAWS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPACKSKIPPEDSEQ,
+ LINUX_MIB_TCPACKSKIPPEDFINWAIT2,
+ LINUX_MIB_TCPACKSKIPPEDTIMEWAIT,
+ LINUX_MIB_TCPACKSKIPPEDCHALLENGE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LINUX_MIB_TCPWINPROBE,
+ LINUX_MIB_TCPKEEPALIVE,
+ LINUX_MIB_TCPMTUPFAIL,
+ LINUX_MIB_TCPMTUPSUCCESS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__LINUX_MIB_MAX
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMNUM = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMINERROR,
LINUX_MIB_XFRMINBUFFERERROR,
LINUX_MIB_XFRMINHDRERROR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMINNOSTATES,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMINSTATEPROTOERROR,
LINUX_MIB_XFRMINSTATEMODEERROR,
LINUX_MIB_XFRMINSTATESEQERROR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMINSTATEEXPIRED,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMINSTATEMISMATCH,
LINUX_MIB_XFRMINSTATEINVALID,
LINUX_MIB_XFRMINTMPLMISMATCH,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMINNOPOLS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMINPOLBLOCK,
LINUX_MIB_XFRMINPOLERROR,
LINUX_MIB_XFRMOUTERROR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMOUTBUNDLEGENERROR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMOUTBUNDLECHECKERROR,
LINUX_MIB_XFRMOUTNOSTATES,
LINUX_MIB_XFRMOUTSTATEPROTOERROR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMOUTSTATEMODEERROR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMOUTSTATESEQERROR,
LINUX_MIB_XFRMOUTSTATEEXPIRED,
LINUX_MIB_XFRMOUTPOLBLOCK,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMOUTPOLDEAD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMOUTPOLERROR,
LINUX_MIB_XFRMFWDHDRERROR,
LINUX_MIB_XFRMOUTSTATEINVALID,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
LINUX_MIB_XFRMACQUIREERROR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__LINUX_MIB_XFRMMAX
};
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/sock_diag.h b/libc/kernel/uapi/linux/sock_diag.h
index 052779e2d..4d9e44015 100644
--- a/libc/kernel/uapi/linux/sock_diag.h
+++ b/libc/kernel/uapi/linux/sock_diag.h
@@ -39,5 +39,16 @@ enum {
SK_MEMINFO_BACKLOG,
SK_MEMINFO_VARS,
};
-#endif
+enum sknetlink_groups {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SKNLGRP_NONE,
+ SKNLGRP_INET_TCP_DESTROY,
+ SKNLGRP_INET_UDP_DESTROY,
+ SKNLGRP_INET6_TCP_DESTROY,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SKNLGRP_INET6_UDP_DESTROY,
+ __SKNLGRP_MAX,
+};
+#define SKNLGRP_MAX (__SKNLGRP_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/stm.h b/libc/kernel/uapi/linux/stm.h
new file mode 100644
index 000000000..3677551ac
--- /dev/null
+++ b/libc/kernel/uapi/linux/stm.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_STM_H
+#define _UAPI_LINUX_STM_H
+#include <linux/types.h>
+struct stp_policy_id {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 size;
+ __u16 master;
+ __u16 channel;
+ __u16 width;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 __reserved_0;
+ __u32 __reserved_1;
+ char id[0];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define STP_POLICY_ID_SET _IOWR('%', 0, struct stp_policy_id)
+#define STP_POLICY_ID_GET _IOR('%', 1, struct stp_policy_id)
+#define STP_SET_OPTIONS _IOW('%', 2, __u64)
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/sysctl.h b/libc/kernel/uapi/linux/sysctl.h
index 2cac5f344..a3e6878ff 100644
--- a/libc/kernel/uapi/linux/sysctl.h
+++ b/libc/kernel/uapi/linux/sysctl.h
@@ -151,810 +151,811 @@ enum {
KERN_NMI_WATCHDOG = 75,
KERN_PANIC_ON_NMI = 76,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ KERN_PANIC_ON_WARN = 77,
};
enum {
VM_UNUSED1 = 1,
- VM_UNUSED2 = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_UNUSED2 = 2,
VM_UNUSED3 = 3,
VM_UNUSED4 = 4,
VM_OVERCOMMIT_MEMORY = 5,
- VM_UNUSED5 = 6,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_UNUSED5 = 6,
VM_UNUSED7 = 7,
VM_UNUSED8 = 8,
VM_UNUSED9 = 9,
- VM_PAGE_CLUSTER = 10,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_PAGE_CLUSTER = 10,
VM_DIRTY_BACKGROUND = 11,
VM_DIRTY_RATIO = 12,
VM_DIRTY_WB_CS = 13,
- VM_DIRTY_EXPIRE_CS = 14,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_DIRTY_EXPIRE_CS = 14,
VM_NR_PDFLUSH_THREADS = 15,
VM_OVERCOMMIT_RATIO = 16,
VM_PAGEBUF = 17,
- VM_HUGETLB_PAGES = 18,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_HUGETLB_PAGES = 18,
VM_SWAPPINESS = 19,
VM_LOWMEM_RESERVE_RATIO = 20,
VM_MIN_FREE_KBYTES = 21,
- VM_MAX_MAP_COUNT = 22,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_MAX_MAP_COUNT = 22,
VM_LAPTOP_MODE = 23,
VM_BLOCK_DUMP = 24,
VM_HUGETLB_GROUP = 25,
- VM_VFS_CACHE_PRESSURE = 26,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_VFS_CACHE_PRESSURE = 26,
VM_LEGACY_VA_LAYOUT = 27,
VM_SWAP_TOKEN_TIMEOUT = 28,
VM_DROP_PAGECACHE = 29,
- VM_PERCPU_PAGELIST_FRACTION = 30,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_PERCPU_PAGELIST_FRACTION = 30,
VM_ZONE_RECLAIM_MODE = 31,
VM_MIN_UNMAPPED = 32,
VM_PANIC_ON_OOM = 33,
- VM_VDSO_ENABLED = 34,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VM_VDSO_ENABLED = 34,
VM_MIN_SLAB = 35,
};
enum {
- NET_CORE = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CORE = 1,
NET_ETHER = 2,
NET_802 = 3,
NET_UNIX = 4,
- NET_IPV4 = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4 = 5,
NET_IPX = 6,
NET_ATALK = 7,
NET_NETROM = 8,
- NET_AX25 = 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_AX25 = 9,
NET_BRIDGE = 10,
NET_ROSE = 11,
NET_IPV6 = 12,
- NET_X25 = 13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_X25 = 13,
NET_TR = 14,
NET_DECNET = 15,
NET_ECONET = 16,
- NET_SCTP = 17,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_SCTP = 17,
NET_LLC = 18,
NET_NETFILTER = 19,
NET_DCCP = 20,
- NET_IRDA = 412,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IRDA = 412,
};
enum {
RANDOM_POOLSIZE = 1,
- RANDOM_ENTROPY_COUNT = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ RANDOM_ENTROPY_COUNT = 2,
RANDOM_READ_THRESH = 3,
RANDOM_WRITE_THRESH = 4,
RANDOM_BOOT_ID = 5,
- RANDOM_UUID = 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ RANDOM_UUID = 6
};
enum {
PTY_MAX = 1,
- PTY_NR = 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ PTY_NR = 2
};
enum {
BUS_ISA_MEM_BASE = 1,
- BUS_ISA_PORT_BASE = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ BUS_ISA_PORT_BASE = 2,
BUS_ISA_PORT_SHIFT = 3
};
enum {
- NET_CORE_WMEM_MAX = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CORE_WMEM_MAX = 1,
NET_CORE_RMEM_MAX = 2,
NET_CORE_WMEM_DEFAULT = 3,
NET_CORE_RMEM_DEFAULT = 4,
- NET_CORE_MAX_BACKLOG = 6,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CORE_MAX_BACKLOG = 6,
NET_CORE_FASTROUTE = 7,
NET_CORE_MSG_COST = 8,
NET_CORE_MSG_BURST = 9,
- NET_CORE_OPTMEM_MAX = 10,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CORE_OPTMEM_MAX = 10,
NET_CORE_HOT_LIST_LENGTH = 11,
NET_CORE_DIVERT_VERSION = 12,
NET_CORE_NO_CONG_THRESH = 13,
- NET_CORE_NO_CONG = 14,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CORE_NO_CONG = 14,
NET_CORE_LO_CONG = 15,
NET_CORE_MOD_CONG = 16,
NET_CORE_DEV_WEIGHT = 17,
- NET_CORE_SOMAXCONN = 18,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CORE_SOMAXCONN = 18,
NET_CORE_BUDGET = 19,
NET_CORE_AEVENT_ETIME = 20,
NET_CORE_AEVENT_RSEQTH = 21,
- NET_CORE_WARNINGS = 22,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CORE_WARNINGS = 22,
};
enum {
NET_UNIX_DESTROY_DELAY = 1,
- NET_UNIX_DELETE_DELAY = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_UNIX_DELETE_DELAY = 2,
NET_UNIX_MAX_DGRAM_QLEN = 3,
};
enum {
- NET_NF_CONNTRACK_MAX = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_MAX = 1,
NET_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT = 2,
NET_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV = 3,
NET_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED = 4,
- NET_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT = 5,
NET_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT = 6,
NET_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK = 7,
NET_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT = 8,
- NET_NF_CONNTRACK_TCP_TIMEOUT_CLOSE = 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_TCP_TIMEOUT_CLOSE = 9,
NET_NF_CONNTRACK_UDP_TIMEOUT = 10,
NET_NF_CONNTRACK_UDP_TIMEOUT_STREAM = 11,
NET_NF_CONNTRACK_ICMP_TIMEOUT = 12,
- NET_NF_CONNTRACK_GENERIC_TIMEOUT = 13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_GENERIC_TIMEOUT = 13,
NET_NF_CONNTRACK_BUCKETS = 14,
NET_NF_CONNTRACK_LOG_INVALID = 15,
NET_NF_CONNTRACK_TCP_TIMEOUT_MAX_RETRANS = 16,
- NET_NF_CONNTRACK_TCP_LOOSE = 17,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_TCP_LOOSE = 17,
NET_NF_CONNTRACK_TCP_BE_LIBERAL = 18,
NET_NF_CONNTRACK_TCP_MAX_RETRANS = 19,
NET_NF_CONNTRACK_SCTP_TIMEOUT_CLOSED = 20,
- NET_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_WAIT = 21,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_WAIT = 21,
NET_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_ECHOED = 22,
NET_NF_CONNTRACK_SCTP_TIMEOUT_ESTABLISHED = 23,
NET_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_SENT = 24,
- NET_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_RECD = 25,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_RECD = 25,
NET_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_ACK_SENT = 26,
NET_NF_CONNTRACK_COUNT = 27,
NET_NF_CONNTRACK_ICMPV6_TIMEOUT = 28,
- NET_NF_CONNTRACK_FRAG6_TIMEOUT = 29,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NF_CONNTRACK_FRAG6_TIMEOUT = 29,
NET_NF_CONNTRACK_FRAG6_LOW_THRESH = 30,
NET_NF_CONNTRACK_FRAG6_HIGH_THRESH = 31,
NET_NF_CONNTRACK_CHECKSUM = 32,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
NET_IPV4_FORWARD = 8,
NET_IPV4_DYNADDR = 9,
- NET_IPV4_CONF = 16,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_CONF = 16,
NET_IPV4_NEIGH = 17,
NET_IPV4_ROUTE = 18,
NET_IPV4_FIB_HASH = 19,
- NET_IPV4_NETFILTER = 20,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NETFILTER = 20,
NET_IPV4_TCP_TIMESTAMPS = 33,
NET_IPV4_TCP_WINDOW_SCALING = 34,
NET_IPV4_TCP_SACK = 35,
- NET_IPV4_TCP_RETRANS_COLLAPSE = 36,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_TCP_RETRANS_COLLAPSE = 36,
NET_IPV4_DEFAULT_TTL = 37,
NET_IPV4_AUTOCONFIG = 38,
NET_IPV4_NO_PMTU_DISC = 39,
- NET_IPV4_TCP_SYN_RETRIES = 40,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_TCP_SYN_RETRIES = 40,
NET_IPV4_IPFRAG_HIGH_THRESH = 41,
NET_IPV4_IPFRAG_LOW_THRESH = 42,
NET_IPV4_IPFRAG_TIME = 43,
- NET_IPV4_TCP_MAX_KA_PROBES = 44,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_TCP_MAX_KA_PROBES = 44,
NET_IPV4_TCP_KEEPALIVE_TIME = 45,
NET_IPV4_TCP_KEEPALIVE_PROBES = 46,
NET_IPV4_TCP_RETRIES1 = 47,
- NET_IPV4_TCP_RETRIES2 = 48,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_TCP_RETRIES2 = 48,
NET_IPV4_TCP_FIN_TIMEOUT = 49,
NET_IPV4_IP_MASQ_DEBUG = 50,
NET_TCP_SYNCOOKIES = 51,
- NET_TCP_STDURG = 52,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_STDURG = 52,
NET_TCP_RFC1337 = 53,
NET_TCP_SYN_TAILDROP = 54,
NET_TCP_MAX_SYN_BACKLOG = 55,
- NET_IPV4_LOCAL_PORT_RANGE = 56,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_LOCAL_PORT_RANGE = 56,
NET_IPV4_ICMP_ECHO_IGNORE_ALL = 57,
NET_IPV4_ICMP_ECHO_IGNORE_BROADCASTS = 58,
NET_IPV4_ICMP_SOURCEQUENCH_RATE = 59,
- NET_IPV4_ICMP_DESTUNREACH_RATE = 60,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_ICMP_DESTUNREACH_RATE = 60,
NET_IPV4_ICMP_TIMEEXCEED_RATE = 61,
NET_IPV4_ICMP_PARAMPROB_RATE = 62,
NET_IPV4_ICMP_ECHOREPLY_RATE = 63,
- NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES = 64,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_ICMP_IGNORE_BOGUS_ERROR_RESPONSES = 64,
NET_IPV4_IGMP_MAX_MEMBERSHIPS = 65,
NET_TCP_TW_RECYCLE = 66,
NET_IPV4_ALWAYS_DEFRAG = 67,
- NET_IPV4_TCP_KEEPALIVE_INTVL = 68,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_TCP_KEEPALIVE_INTVL = 68,
NET_IPV4_INET_PEER_THRESHOLD = 69,
NET_IPV4_INET_PEER_MINTTL = 70,
NET_IPV4_INET_PEER_MAXTTL = 71,
- NET_IPV4_INET_PEER_GC_MINTIME = 72,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_INET_PEER_GC_MINTIME = 72,
NET_IPV4_INET_PEER_GC_MAXTIME = 73,
NET_TCP_ORPHAN_RETRIES = 74,
NET_TCP_ABORT_ON_OVERFLOW = 75,
- NET_TCP_SYNACK_RETRIES = 76,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_SYNACK_RETRIES = 76,
NET_TCP_MAX_ORPHANS = 77,
NET_TCP_MAX_TW_BUCKETS = 78,
NET_TCP_FACK = 79,
- NET_TCP_REORDERING = 80,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_REORDERING = 80,
NET_TCP_ECN = 81,
NET_TCP_DSACK = 82,
NET_TCP_MEM = 83,
- NET_TCP_WMEM = 84,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_WMEM = 84,
NET_TCP_RMEM = 85,
NET_TCP_APP_WIN = 86,
NET_TCP_ADV_WIN_SCALE = 87,
- NET_IPV4_NONLOCAL_BIND = 88,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NONLOCAL_BIND = 88,
NET_IPV4_ICMP_RATELIMIT = 89,
NET_IPV4_ICMP_RATEMASK = 90,
NET_TCP_TW_REUSE = 91,
- NET_TCP_FRTO = 92,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_FRTO = 92,
NET_TCP_LOW_LATENCY = 93,
NET_IPV4_IPFRAG_SECRET_INTERVAL = 94,
NET_IPV4_IGMP_MAX_MSF = 96,
- NET_TCP_NO_METRICS_SAVE = 97,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_NO_METRICS_SAVE = 97,
NET_TCP_DEFAULT_WIN_SCALE = 105,
NET_TCP_MODERATE_RCVBUF = 106,
NET_TCP_TSO_WIN_DIVISOR = 107,
- NET_TCP_BIC_BETA = 108,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_BIC_BETA = 108,
NET_IPV4_ICMP_ERRORS_USE_INBOUND_IFADDR = 109,
NET_TCP_CONG_CONTROL = 110,
NET_TCP_ABC = 111,
- NET_IPV4_IPFRAG_MAX_DIST = 112,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_IPFRAG_MAX_DIST = 112,
NET_TCP_MTU_PROBING = 113,
NET_TCP_BASE_MSS = 114,
NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS = 115,
- NET_TCP_DMA_COPYBREAK = 116,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_DMA_COPYBREAK = 116,
NET_TCP_SLOW_START_AFTER_IDLE = 117,
NET_CIPSOV4_CACHE_ENABLE = 118,
NET_CIPSOV4_CACHE_BUCKET_SIZE = 119,
- NET_CIPSOV4_RBM_OPTFMT = 120,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_CIPSOV4_RBM_OPTFMT = 120,
NET_CIPSOV4_RBM_STRICTVALID = 121,
NET_TCP_AVAIL_CONG_CONTROL = 122,
NET_TCP_ALLOWED_CONG_CONTROL = 123,
- NET_TCP_MAX_SSTHRESH = 124,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_TCP_MAX_SSTHRESH = 124,
NET_TCP_FRTO_RESPONSE = 125,
};
enum {
- NET_IPV4_ROUTE_FLUSH = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_ROUTE_FLUSH = 1,
NET_IPV4_ROUTE_MIN_DELAY = 2,
NET_IPV4_ROUTE_MAX_DELAY = 3,
NET_IPV4_ROUTE_GC_THRESH = 4,
- NET_IPV4_ROUTE_MAX_SIZE = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_ROUTE_MAX_SIZE = 5,
NET_IPV4_ROUTE_GC_MIN_INTERVAL = 6,
NET_IPV4_ROUTE_GC_TIMEOUT = 7,
NET_IPV4_ROUTE_GC_INTERVAL = 8,
- NET_IPV4_ROUTE_REDIRECT_LOAD = 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_ROUTE_REDIRECT_LOAD = 9,
NET_IPV4_ROUTE_REDIRECT_NUMBER = 10,
NET_IPV4_ROUTE_REDIRECT_SILENCE = 11,
NET_IPV4_ROUTE_ERROR_COST = 12,
- NET_IPV4_ROUTE_ERROR_BURST = 13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_ROUTE_ERROR_BURST = 13,
NET_IPV4_ROUTE_GC_ELASTICITY = 14,
NET_IPV4_ROUTE_MTU_EXPIRES = 15,
NET_IPV4_ROUTE_MIN_PMTU = 16,
- NET_IPV4_ROUTE_MIN_ADVMSS = 17,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_ROUTE_MIN_ADVMSS = 17,
NET_IPV4_ROUTE_SECRET_INTERVAL = 18,
NET_IPV4_ROUTE_GC_MIN_INTERVAL_MS = 19,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_PROTO_CONF_ALL = - 2,
NET_PROTO_CONF_DEFAULT = - 3
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_IPV4_CONF_FORWARDING = 1,
NET_IPV4_CONF_MC_FORWARDING = 2,
NET_IPV4_CONF_PROXY_ARP = 3,
- NET_IPV4_CONF_ACCEPT_REDIRECTS = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_CONF_ACCEPT_REDIRECTS = 4,
NET_IPV4_CONF_SECURE_REDIRECTS = 5,
NET_IPV4_CONF_SEND_REDIRECTS = 6,
NET_IPV4_CONF_SHARED_MEDIA = 7,
- NET_IPV4_CONF_RP_FILTER = 8,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_CONF_RP_FILTER = 8,
NET_IPV4_CONF_ACCEPT_SOURCE_ROUTE = 9,
NET_IPV4_CONF_BOOTP_RELAY = 10,
NET_IPV4_CONF_LOG_MARTIANS = 11,
- NET_IPV4_CONF_TAG = 12,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_CONF_TAG = 12,
NET_IPV4_CONF_ARPFILTER = 13,
NET_IPV4_CONF_MEDIUM_ID = 14,
NET_IPV4_CONF_NOXFRM = 15,
- NET_IPV4_CONF_NOPOLICY = 16,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_CONF_NOPOLICY = 16,
NET_IPV4_CONF_FORCE_IGMP_VERSION = 17,
NET_IPV4_CONF_ARP_ANNOUNCE = 18,
NET_IPV4_CONF_ARP_IGNORE = 19,
- NET_IPV4_CONF_PROMOTE_SECONDARIES = 20,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_CONF_PROMOTE_SECONDARIES = 20,
NET_IPV4_CONF_ARP_ACCEPT = 21,
NET_IPV4_CONF_ARP_NOTIFY = 22,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_IPV4_NF_CONNTRACK_MAX = 1,
NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT = 2,
NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV = 3,
- NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED = 4,
NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT = 5,
NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT = 6,
NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK = 7,
- NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT = 8,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT = 8,
NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE = 9,
NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT = 10,
NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT_STREAM = 11,
- NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT = 12,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT = 12,
NET_IPV4_NF_CONNTRACK_GENERIC_TIMEOUT = 13,
NET_IPV4_NF_CONNTRACK_BUCKETS = 14,
NET_IPV4_NF_CONNTRACK_LOG_INVALID = 15,
- NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_MAX_RETRANS = 16,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_MAX_RETRANS = 16,
NET_IPV4_NF_CONNTRACK_TCP_LOOSE = 17,
NET_IPV4_NF_CONNTRACK_TCP_BE_LIBERAL = 18,
NET_IPV4_NF_CONNTRACK_TCP_MAX_RETRANS = 19,
- NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_CLOSED = 20,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_CLOSED = 20,
NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_WAIT = 21,
NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_COOKIE_ECHOED = 22,
NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_ESTABLISHED = 23,
- NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_SENT = 24,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_SENT = 24,
NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_RECD = 25,
NET_IPV4_NF_CONNTRACK_SCTP_TIMEOUT_SHUTDOWN_ACK_SENT = 26,
NET_IPV4_NF_CONNTRACK_COUNT = 27,
- NET_IPV4_NF_CONNTRACK_CHECKSUM = 28,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV4_NF_CONNTRACK_CHECKSUM = 28,
};
enum {
NET_IPV6_CONF = 16,
- NET_IPV6_NEIGH = 17,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_NEIGH = 17,
NET_IPV6_ROUTE = 18,
NET_IPV6_ICMP = 19,
NET_IPV6_BINDV6ONLY = 20,
- NET_IPV6_IP6FRAG_HIGH_THRESH = 21,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_IP6FRAG_HIGH_THRESH = 21,
NET_IPV6_IP6FRAG_LOW_THRESH = 22,
NET_IPV6_IP6FRAG_TIME = 23,
NET_IPV6_IP6FRAG_SECRET_INTERVAL = 24,
- NET_IPV6_MLD_MAX_MSF = 25,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_MLD_MAX_MSF = 25,
};
enum {
NET_IPV6_ROUTE_FLUSH = 1,
- NET_IPV6_ROUTE_GC_THRESH = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_ROUTE_GC_THRESH = 2,
NET_IPV6_ROUTE_MAX_SIZE = 3,
NET_IPV6_ROUTE_GC_MIN_INTERVAL = 4,
NET_IPV6_ROUTE_GC_TIMEOUT = 5,
- NET_IPV6_ROUTE_GC_INTERVAL = 6,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_ROUTE_GC_INTERVAL = 6,
NET_IPV6_ROUTE_GC_ELASTICITY = 7,
NET_IPV6_ROUTE_MTU_EXPIRES = 8,
NET_IPV6_ROUTE_MIN_ADVMSS = 9,
- NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS = 10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS = 10
};
enum {
NET_IPV6_FORWARDING = 1,
- NET_IPV6_HOP_LIMIT = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_HOP_LIMIT = 2,
NET_IPV6_MTU = 3,
NET_IPV6_ACCEPT_RA = 4,
NET_IPV6_ACCEPT_REDIRECTS = 5,
- NET_IPV6_AUTOCONF = 6,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_AUTOCONF = 6,
NET_IPV6_DAD_TRANSMITS = 7,
NET_IPV6_RTR_SOLICITS = 8,
NET_IPV6_RTR_SOLICIT_INTERVAL = 9,
- NET_IPV6_RTR_SOLICIT_DELAY = 10,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_RTR_SOLICIT_DELAY = 10,
NET_IPV6_USE_TEMPADDR = 11,
NET_IPV6_TEMP_VALID_LFT = 12,
NET_IPV6_TEMP_PREFERED_LFT = 13,
- NET_IPV6_REGEN_MAX_RETRY = 14,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_REGEN_MAX_RETRY = 14,
NET_IPV6_MAX_DESYNC_FACTOR = 15,
NET_IPV6_MAX_ADDRESSES = 16,
NET_IPV6_FORCE_MLD_VERSION = 17,
- NET_IPV6_ACCEPT_RA_DEFRTR = 18,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_ACCEPT_RA_DEFRTR = 18,
NET_IPV6_ACCEPT_RA_PINFO = 19,
NET_IPV6_ACCEPT_RA_RTR_PREF = 20,
NET_IPV6_RTR_PROBE_INTERVAL = 21,
- NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN = 22,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IPV6_ACCEPT_RA_RT_INFO_MAX_PLEN = 22,
NET_IPV6_PROXY_NDP = 23,
NET_IPV6_ACCEPT_SOURCE_ROUTE = 25,
NET_IPV6_ACCEPT_RA_FROM_LOCAL = 26,
- __NET_IPV6_MAX
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __NET_IPV6_MAX
};
enum {
NET_IPV6_ICMP_RATELIMIT = 1
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
NET_NEIGH_MCAST_SOLICIT = 1,
NET_NEIGH_UCAST_SOLICIT = 2,
- NET_NEIGH_APP_SOLICIT = 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NEIGH_APP_SOLICIT = 3,
NET_NEIGH_RETRANS_TIME = 4,
NET_NEIGH_REACHABLE_TIME = 5,
NET_NEIGH_DELAY_PROBE_TIME = 6,
- NET_NEIGH_GC_STALE_TIME = 7,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NEIGH_GC_STALE_TIME = 7,
NET_NEIGH_UNRES_QLEN = 8,
NET_NEIGH_PROXY_QLEN = 9,
NET_NEIGH_ANYCAST_DELAY = 10,
- NET_NEIGH_PROXY_DELAY = 11,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NEIGH_PROXY_DELAY = 11,
NET_NEIGH_LOCKTIME = 12,
NET_NEIGH_GC_INTERVAL = 13,
NET_NEIGH_GC_THRESH1 = 14,
- NET_NEIGH_GC_THRESH2 = 15,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NEIGH_GC_THRESH2 = 15,
NET_NEIGH_GC_THRESH3 = 16,
NET_NEIGH_RETRANS_TIME_MS = 17,
NET_NEIGH_REACHABLE_TIME_MS = 18,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
NET_DCCP_DEFAULT = 1,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_IPX_PPROP_BROADCASTING = 1,
NET_IPX_FORWARDING = 2
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_LLC2 = 1,
NET_LLC_STATION = 2,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_LLC2_TIMEOUT = 1,
};
enum {
- NET_LLC_STATION_ACK_TIMEOUT = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_LLC_STATION_ACK_TIMEOUT = 1,
};
enum {
NET_LLC2_ACK_TIMEOUT = 1,
- NET_LLC2_P_TIMEOUT = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_LLC2_P_TIMEOUT = 2,
NET_LLC2_REJ_TIMEOUT = 3,
NET_LLC2_BUSY_TIMEOUT = 4,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_ATALK_AARP_EXPIRY_TIME = 1,
NET_ATALK_AARP_TICK_TIME = 2,
NET_ATALK_AARP_RETRANSMIT_LIMIT = 3,
- NET_ATALK_AARP_RESOLVE_TIME = 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_ATALK_AARP_RESOLVE_TIME = 4
};
enum {
NET_NETROM_DEFAULT_PATH_QUALITY = 1,
- NET_NETROM_OBSOLESCENCE_COUNT_INITIALISER = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NETROM_OBSOLESCENCE_COUNT_INITIALISER = 2,
NET_NETROM_NETWORK_TTL_INITIALISER = 3,
NET_NETROM_TRANSPORT_TIMEOUT = 4,
NET_NETROM_TRANSPORT_MAXIMUM_TRIES = 5,
- NET_NETROM_TRANSPORT_ACKNOWLEDGE_DELAY = 6,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NETROM_TRANSPORT_ACKNOWLEDGE_DELAY = 6,
NET_NETROM_TRANSPORT_BUSY_DELAY = 7,
NET_NETROM_TRANSPORT_REQUESTED_WINDOW_SIZE = 8,
NET_NETROM_TRANSPORT_NO_ACTIVITY_TIMEOUT = 9,
- NET_NETROM_ROUTING_CONTROL = 10,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_NETROM_ROUTING_CONTROL = 10,
NET_NETROM_LINK_FAILS_COUNT = 11,
NET_NETROM_RESET = 12
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_AX25_IP_DEFAULT_MODE = 1,
NET_AX25_DEFAULT_MODE = 2,
NET_AX25_BACKOFF_TYPE = 3,
- NET_AX25_CONNECT_MODE = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_AX25_CONNECT_MODE = 4,
NET_AX25_STANDARD_WINDOW = 5,
NET_AX25_EXTENDED_WINDOW = 6,
NET_AX25_T1_TIMEOUT = 7,
- NET_AX25_T2_TIMEOUT = 8,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_AX25_T2_TIMEOUT = 8,
NET_AX25_T3_TIMEOUT = 9,
NET_AX25_IDLE_TIMEOUT = 10,
NET_AX25_N2 = 11,
- NET_AX25_PACLEN = 12,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_AX25_PACLEN = 12,
NET_AX25_PROTOCOL = 13,
NET_AX25_DAMA_SLAVE_TIMEOUT = 14
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_ROSE_RESTART_REQUEST_TIMEOUT = 1,
NET_ROSE_CALL_REQUEST_TIMEOUT = 2,
NET_ROSE_RESET_REQUEST_TIMEOUT = 3,
- NET_ROSE_CLEAR_REQUEST_TIMEOUT = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_ROSE_CLEAR_REQUEST_TIMEOUT = 4,
NET_ROSE_ACK_HOLD_BACK_TIMEOUT = 5,
NET_ROSE_ROUTING_CONTROL = 6,
NET_ROSE_LINK_FAIL_TIMEOUT = 7,
- NET_ROSE_MAX_VCS = 8,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_ROSE_MAX_VCS = 8,
NET_ROSE_WINDOW_SIZE = 9,
NET_ROSE_NO_ACTIVITY_TIMEOUT = 10
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_X25_RESTART_REQUEST_TIMEOUT = 1,
NET_X25_CALL_REQUEST_TIMEOUT = 2,
NET_X25_RESET_REQUEST_TIMEOUT = 3,
- NET_X25_CLEAR_REQUEST_TIMEOUT = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_X25_CLEAR_REQUEST_TIMEOUT = 4,
NET_X25_ACK_HOLD_BACK_TIMEOUT = 5,
NET_X25_FORWARD = 6
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_TR_RIF_TIMEOUT = 1
};
enum {
- NET_DECNET_NODE_TYPE = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_DECNET_NODE_TYPE = 1,
NET_DECNET_NODE_ADDRESS = 2,
NET_DECNET_NODE_NAME = 3,
NET_DECNET_DEFAULT_DEVICE = 4,
- NET_DECNET_TIME_WAIT = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_DECNET_TIME_WAIT = 5,
NET_DECNET_DN_COUNT = 6,
NET_DECNET_DI_COUNT = 7,
NET_DECNET_DR_COUNT = 8,
- NET_DECNET_DST_GC_INTERVAL = 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_DECNET_DST_GC_INTERVAL = 9,
NET_DECNET_CONF = 10,
NET_DECNET_NO_FC_MAX_CWND = 11,
NET_DECNET_MEM = 12,
- NET_DECNET_RMEM = 13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_DECNET_RMEM = 13,
NET_DECNET_WMEM = 14,
NET_DECNET_DEBUG_LEVEL = 255
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_DECNET_CONF_LOOPBACK = - 2,
NET_DECNET_CONF_DDCMP = - 3,
NET_DECNET_CONF_PPP = - 4,
- NET_DECNET_CONF_X25 = - 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_DECNET_CONF_X25 = - 5,
NET_DECNET_CONF_GRE = - 6,
NET_DECNET_CONF_ETHER = - 7
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_DECNET_CONF_DEV_PRIORITY = 1,
NET_DECNET_CONF_DEV_T1 = 2,
NET_DECNET_CONF_DEV_T2 = 3,
- NET_DECNET_CONF_DEV_T3 = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_DECNET_CONF_DEV_T3 = 4,
NET_DECNET_CONF_DEV_FORWARDING = 5,
NET_DECNET_CONF_DEV_BLKSIZE = 6,
NET_DECNET_CONF_DEV_STATE = 7
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
NET_SCTP_RTO_INITIAL = 1,
NET_SCTP_RTO_MIN = 2,
- NET_SCTP_RTO_MAX = 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_SCTP_RTO_MAX = 3,
NET_SCTP_RTO_ALPHA = 4,
NET_SCTP_RTO_BETA = 5,
NET_SCTP_VALID_COOKIE_LIFE = 6,
- NET_SCTP_ASSOCIATION_MAX_RETRANS = 7,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_SCTP_ASSOCIATION_MAX_RETRANS = 7,
NET_SCTP_PATH_MAX_RETRANS = 8,
NET_SCTP_MAX_INIT_RETRANSMITS = 9,
NET_SCTP_HB_INTERVAL = 10,
- NET_SCTP_PRESERVE_ENABLE = 11,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_SCTP_PRESERVE_ENABLE = 11,
NET_SCTP_MAX_BURST = 12,
NET_SCTP_ADDIP_ENABLE = 13,
NET_SCTP_PRSCTP_ENABLE = 14,
- NET_SCTP_SNDBUF_POLICY = 15,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_SCTP_SNDBUF_POLICY = 15,
NET_SCTP_SACK_TIMEOUT = 16,
NET_SCTP_RCVBUF_POLICY = 17,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
NET_BRIDGE_NF_CALL_ARPTABLES = 1,
NET_BRIDGE_NF_CALL_IPTABLES = 2,
NET_BRIDGE_NF_CALL_IP6TABLES = 3,
- NET_BRIDGE_NF_FILTER_VLAN_TAGGED = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_BRIDGE_NF_FILTER_VLAN_TAGGED = 4,
NET_BRIDGE_NF_FILTER_PPPOE_TAGGED = 5,
};
enum {
- NET_IRDA_DISCOVERY = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IRDA_DISCOVERY = 1,
NET_IRDA_DEVNAME = 2,
NET_IRDA_DEBUG = 3,
NET_IRDA_FAST_POLL = 4,
- NET_IRDA_DISCOVERY_SLOTS = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IRDA_DISCOVERY_SLOTS = 5,
NET_IRDA_DISCOVERY_TIMEOUT = 6,
NET_IRDA_SLOT_TIMEOUT = 7,
NET_IRDA_MAX_BAUD_RATE = 8,
- NET_IRDA_MIN_TX_TURN_TIME = 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IRDA_MIN_TX_TURN_TIME = 9,
NET_IRDA_MAX_TX_DATA_SIZE = 10,
NET_IRDA_MAX_TX_WINDOW = 11,
NET_IRDA_MAX_NOREPLY_TIME = 12,
- NET_IRDA_WARN_NOREPLY_TIME = 13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ NET_IRDA_WARN_NOREPLY_TIME = 13,
NET_IRDA_LAP_KEEPALIVE_TIME = 14,
};
enum {
- FS_NRINODE = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_NRINODE = 1,
FS_STATINODE = 2,
FS_MAXINODE = 3,
FS_NRDQUOT = 4,
- FS_MAXDQUOT = 5,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_MAXDQUOT = 5,
FS_NRFILE = 6,
FS_MAXFILE = 7,
FS_DENTRY = 8,
- FS_NRSUPER = 9,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_NRSUPER = 9,
FS_MAXSUPER = 10,
FS_OVERFLOWUID = 11,
FS_OVERFLOWGID = 12,
- FS_LEASES = 13,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_LEASES = 13,
FS_DIR_NOTIFY = 14,
FS_LEASE_TIME = 15,
FS_DQSTATS = 16,
- FS_XFS = 17,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_XFS = 17,
FS_AIO_NR = 18,
FS_AIO_MAX_NR = 19,
FS_INOTIFY = 20,
- FS_OCFS2 = 988,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_OCFS2 = 988,
};
enum {
FS_DQ_LOOKUPS = 1,
- FS_DQ_DROPS = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_DQ_DROPS = 2,
FS_DQ_READS = 3,
FS_DQ_WRITES = 4,
FS_DQ_CACHE_HITS = 5,
- FS_DQ_ALLOCATED = 6,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FS_DQ_ALLOCATED = 6,
FS_DQ_FREE = 7,
FS_DQ_SYNCS = 8,
FS_DQ_WARNINGS = 9,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
DEV_CDROM = 1,
DEV_HWMON = 2,
- DEV_PARPORT = 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_PARPORT = 3,
DEV_RAID = 4,
DEV_MAC_HID = 5,
DEV_SCSI = 6,
- DEV_IPMI = 7,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_IPMI = 7,
};
enum {
DEV_CDROM_INFO = 1,
- DEV_CDROM_AUTOCLOSE = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_CDROM_AUTOCLOSE = 2,
DEV_CDROM_AUTOEJECT = 3,
DEV_CDROM_DEBUG = 4,
DEV_CDROM_LOCK = 5,
- DEV_CDROM_CHECK_MEDIA = 6
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_CDROM_CHECK_MEDIA = 6
};
enum {
DEV_PARPORT_DEFAULT = - 3
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
DEV_RAID_SPEED_LIMIT_MIN = 1,
DEV_RAID_SPEED_LIMIT_MAX = 2
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
DEV_PARPORT_DEFAULT_TIMESLICE = 1,
DEV_PARPORT_DEFAULT_SPINTIME = 2
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
DEV_PARPORT_SPINTIME = 1,
DEV_PARPORT_BASE_ADDR = 2,
- DEV_PARPORT_IRQ = 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_PARPORT_IRQ = 3,
DEV_PARPORT_DMA = 4,
DEV_PARPORT_MODES = 5,
DEV_PARPORT_DEVICES = 6,
- DEV_PARPORT_AUTOPROBE = 16
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_PARPORT_AUTOPROBE = 16
};
enum {
DEV_PARPORT_DEVICES_ACTIVE = - 3,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum {
DEV_PARPORT_DEVICE_TIMESLICE = 1,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
DEV_MAC_HID_KEYBOARD_SENDS_LINUX_KEYCODES = 1,
DEV_MAC_HID_KEYBOARD_LOCK_KEYCODES = 2,
DEV_MAC_HID_MOUSE_BUTTON_EMULATION = 3,
- DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE = 4,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE = 4,
DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE = 5,
DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES = 6
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
DEV_SCSI_LOGGING_LEVEL = 1,
};
enum {
- DEV_IPMI_POWEROFF_POWERCYCLE = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ DEV_IPMI_POWEROFF_POWERCYCLE = 1,
};
enum {
ABI_DEFHANDLER_COFF = 1,
- ABI_DEFHANDLER_ELF = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ABI_DEFHANDLER_ELF = 2,
ABI_DEFHANDLER_LCALL7 = 3,
ABI_DEFHANDLER_LIBCSO = 4,
ABI_TRACE = 5,
- ABI_FAKE_UTSNAME = 6,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ABI_FAKE_UTSNAME = 6,
};
#endif
diff --git a/libc/kernel/uapi/linux/target_core_user.h b/libc/kernel/uapi/linux/target_core_user.h
index 7e0cf43ac..343414c1b 100644
--- a/libc/kernel/uapi/linux/target_core_user.h
+++ b/libc/kernel/uapi/linux/target_core_user.h
@@ -21,8 +21,8 @@
#include <linux/types.h>
#include <linux/uio.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define TCMU_VERSION "1.0"
-#define TCMU_MAILBOX_VERSION 1
+#define TCMU_VERSION "2.0"
+#define TCMU_MAILBOX_VERSION 2
#define ALIGN_SIZE 64
struct tcmu_mailbox {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -42,50 +42,58 @@ enum tcmu_opcode {
struct tcmu_cmd_entry_hdr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 len_op;
+ __u16 cmd_id;
+ __u8 kflags;
+#define TCMU_UFLAG_UNKNOWN_OP 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 uflags;
} __packed;
#define TCMU_OP_MASK 0x7
#define TCMU_SENSE_BUFFERSIZE 96
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tcmu_cmd_entry {
struct tcmu_cmd_entry_hdr hdr;
- uint16_t cmd_id;
- uint16_t __pad1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint32_t iov_cnt;
+ uint32_t iov_bidi_cnt;
+ uint32_t iov_dif_cnt;
uint64_t cdb_off;
- uint64_t iov_cnt;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint64_t __pad1;
+ uint64_t __pad2;
struct iovec iov[0];
} req;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
uint8_t scsi_status;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint8_t __pad1;
uint16_t __pad2;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
uint32_t __pad3;
char sense_buffer[TCMU_SENSE_BUFFERSIZE];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} rsp;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __packed;
#define TCMU_OP_ALIGN_SIZE sizeof(uint64_t)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum tcmu_genl_cmd {
TCMU_CMD_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCMU_CMD_ADDED_DEVICE,
TCMU_CMD_REMOVED_DEVICE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__TCMU_CMD_MAX,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCMU_CMD_MAX (__TCMU_CMD_MAX - 1)
enum tcmu_genl_attr {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCMU_ATTR_UNSPEC,
TCMU_ATTR_DEVICE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCMU_ATTR_MINOR,
__TCMU_ATTR_MAX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCMU_ATTR_MAX (__TCMU_ATTR_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/tc_act/tc_bpf.h b/libc/kernel/uapi/linux/tc_act/tc_bpf.h
new file mode 100644
index 000000000..6b5912870
--- /dev/null
+++ b/libc/kernel/uapi/linux/tc_act/tc_bpf.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __LINUX_TC_BPF_H
+#define __LINUX_TC_BPF_H
+#include <linux/pkt_cls.h>
+#define TCA_ACT_BPF 13
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct tc_act_bpf {
+ tc_gen;
+};
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_ACT_BPF_UNSPEC,
+ TCA_ACT_BPF_TM,
+ TCA_ACT_BPF_PARMS,
+ TCA_ACT_BPF_OPS_LEN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_ACT_BPF_OPS,
+ TCA_ACT_BPF_FD,
+ TCA_ACT_BPF_NAME,
+ __TCA_ACT_BPF_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define TCA_ACT_BPF_MAX (__TCA_ACT_BPF_MAX - 1)
+#endif
diff --git a/libc/kernel/uapi/linux/tc_act/tc_connmark.h b/libc/kernel/uapi/linux/tc_act/tc_connmark.h
new file mode 100644
index 000000000..6dd64f0df
--- /dev/null
+++ b/libc/kernel/uapi/linux/tc_act/tc_connmark.h
@@ -0,0 +1,39 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __UAPI_TC_CONNMARK_H
+#define __UAPI_TC_CONNMARK_H
+#include <linux/types.h>
+#include <linux/pkt_cls.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCA_ACT_CONNMARK 14
+struct tc_connmark {
+ tc_gen;
+ __u16 zone;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ TCA_CONNMARK_UNSPEC,
+ TCA_CONNMARK_PARMS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_CONNMARK_TM,
+ __TCA_CONNMARK_MAX
+};
+#define TCA_CONNMARK_MAX (__TCA_CONNMARK_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/tc_act/tc_vlan.h b/libc/kernel/uapi/linux/tc_act/tc_vlan.h
new file mode 100644
index 000000000..f9b4d2988
--- /dev/null
+++ b/libc/kernel/uapi/linux/tc_act/tc_vlan.h
@@ -0,0 +1,43 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __LINUX_TC_VLAN_H
+#define __LINUX_TC_VLAN_H
+#include <linux/pkt_cls.h>
+#define TCA_ACT_VLAN 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCA_VLAN_ACT_POP 1
+#define TCA_VLAN_ACT_PUSH 2
+struct tc_vlan {
+ tc_gen;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int v_action;
+};
+enum {
+ TCA_VLAN_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TCA_VLAN_TM,
+ TCA_VLAN_PARMS,
+ TCA_VLAN_PUSH_VLAN_ID,
+ TCA_VLAN_PUSH_VLAN_PROTOCOL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TCA_VLAN_MAX,
+};
+#define TCA_VLAN_MAX (__TCA_VLAN_MAX - 1)
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/tcp.h b/libc/kernel/uapi/linux/tcp.h
index 3347bc1ff..ce3617806 100644
--- a/libc/kernel/uapi/linux/tcp.h
+++ b/libc/kernel/uapi/linux/tcp.h
@@ -96,93 +96,101 @@ enum {
#define TCP_TIMESTAMP 24
#define TCP_NOTSENT_LOWAT 25
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define TCP_CC_INFO 26
+#define TCP_SAVE_SYN 27
+#define TCP_SAVED_SYN 28
struct tcp_repair_opt {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 opt_code;
__u32 opt_val;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCP_NO_QUEUE,
TCP_RECV_QUEUE,
TCP_SEND_QUEUE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCP_QUEUES_NR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define TCPI_OPT_TIMESTAMPS 1
#define TCPI_OPT_SACK 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCPI_OPT_WSCALE 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCPI_OPT_ECN 8
#define TCPI_OPT_ECN_SEEN 16
#define TCPI_OPT_SYN_DATA 32
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum tcp_ca_state {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCP_CA_Open = 0,
#define TCPF_CA_Open (1 << TCP_CA_Open)
TCP_CA_Disorder = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCPF_CA_Disorder (1 << TCP_CA_Disorder)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCP_CA_CWR = 2,
#define TCPF_CA_CWR (1 << TCP_CA_CWR)
TCP_CA_Recovery = 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TCPF_CA_Recovery (1 << TCP_CA_Recovery)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
TCP_CA_Loss = 4
#define TCPF_CA_Loss (1 << TCP_CA_Loss)
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tcp_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 tcpi_state;
__u8 tcpi_ca_state;
__u8 tcpi_retransmits;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 tcpi_probes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 tcpi_backoff;
__u8 tcpi_options;
__u8 tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_rto;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_ato;
__u32 tcpi_snd_mss;
__u32 tcpi_rcv_mss;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_unacked;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_sacked;
__u32 tcpi_lost;
__u32 tcpi_retrans;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_fackets;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_last_data_sent;
__u32 tcpi_last_ack_sent;
__u32 tcpi_last_data_recv;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_last_ack_recv;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_pmtu;
__u32 tcpi_rcv_ssthresh;
__u32 tcpi_rtt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_rttvar;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_snd_ssthresh;
__u32 tcpi_snd_cwnd;
__u32 tcpi_advmss;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_reordering;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 tcpi_rcv_rtt;
__u32 tcpi_rcv_space;
__u32 tcpi_total_retrans;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 tcpi_pacing_rate;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 tcpi_max_pacing_rate;
+ __u64 tcpi_bytes_acked;
+ __u64 tcpi_bytes_received;
+ __u32 tcpi_segs_out;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 tcpi_segs_in;
};
#define TCP_MD5SIG_MAXKEYLEN 80
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct tcp_md5sig {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct __kernel_sockaddr_storage tcpm_addr;
__u16 __tcpm_pad1;
__u16 tcpm_keylen;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 __tcpm_pad2;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 tcpm_key[TCP_MD5SIG_MAXKEYLEN];
};
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/thermal.h b/libc/kernel/uapi/linux/thermal.h
new file mode 100644
index 000000000..e4e24e089
--- /dev/null
+++ b/libc/kernel/uapi/linux/thermal.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_THERMAL_H
+#define _UAPI_LINUX_THERMAL_H
+#define THERMAL_NAME_LENGTH 20
+#define THERMAL_GENL_FAMILY_NAME "thermal_event"
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define THERMAL_GENL_VERSION 0x01
+#define THERMAL_GENL_MCAST_GROUP_NAME "thermal_mc_grp"
+enum events {
+ THERMAL_AUX0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ THERMAL_AUX1,
+ THERMAL_CRITICAL,
+ THERMAL_DEV_FAULT,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ THERMAL_GENL_ATTR_UNSPEC,
+ THERMAL_GENL_ATTR_EVENT,
+ __THERMAL_GENL_ATTR_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define THERMAL_GENL_ATTR_MAX (__THERMAL_GENL_ATTR_MAX - 1)
+enum {
+ THERMAL_GENL_CMD_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ THERMAL_GENL_CMD_EVENT,
+ __THERMAL_GENL_CMD_MAX,
+};
+#define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/tipc_netlink.h b/libc/kernel/uapi/linux/tipc_netlink.h
new file mode 100644
index 000000000..9d4796ff2
--- /dev/null
+++ b/libc/kernel/uapi/linux/tipc_netlink.h
@@ -0,0 +1,235 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _LINUX_TIPC_NETLINK_H_
+#define _LINUX_TIPC_NETLINK_H_
+#define TIPC_GENL_V2_NAME "TIPCv2"
+#define TIPC_GENL_V2_VERSION 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ TIPC_NL_UNSPEC,
+ TIPC_NL_LEGACY,
+ TIPC_NL_BEARER_DISABLE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NL_BEARER_ENABLE,
+ TIPC_NL_BEARER_GET,
+ TIPC_NL_BEARER_SET,
+ TIPC_NL_SOCK_GET,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NL_PUBL_GET,
+ TIPC_NL_LINK_GET,
+ TIPC_NL_LINK_SET,
+ TIPC_NL_LINK_RESET_STATS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NL_MEDIA_GET,
+ TIPC_NL_MEDIA_SET,
+ TIPC_NL_NODE_GET,
+ TIPC_NL_NET_GET,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NL_NET_SET,
+ TIPC_NL_NAME_TABLE_GET,
+ __TIPC_NL_CMD_MAX,
+ TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ TIPC_NLA_UNSPEC,
+ TIPC_NLA_BEARER,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_SOCK,
+ TIPC_NLA_PUBL,
+ TIPC_NLA_LINK,
+ TIPC_NLA_MEDIA,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_NODE,
+ TIPC_NLA_NET,
+ TIPC_NLA_NAME_TABLE,
+ __TIPC_NLA_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_MAX = __TIPC_NLA_MAX - 1
+};
+enum {
+ TIPC_NLA_BEARER_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_BEARER_NAME,
+ TIPC_NLA_BEARER_PROP,
+ TIPC_NLA_BEARER_DOMAIN,
+ TIPC_NLA_BEARER_UDP_OPTS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TIPC_NLA_BEARER_MAX,
+ TIPC_NLA_BEARER_MAX = __TIPC_NLA_BEARER_MAX - 1
+};
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_UDP_UNSPEC,
+ TIPC_NLA_UDP_LOCAL,
+ TIPC_NLA_UDP_REMOTE,
+ __TIPC_NLA_UDP_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_UDP_MAX = __TIPC_NLA_UDP_MAX - 1
+};
+enum {
+ TIPC_NLA_SOCK_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_SOCK_ADDR,
+ TIPC_NLA_SOCK_REF,
+ TIPC_NLA_SOCK_CON,
+ TIPC_NLA_SOCK_HAS_PUBL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TIPC_NLA_SOCK_MAX,
+ TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1
+};
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_LINK_UNSPEC,
+ TIPC_NLA_LINK_NAME,
+ TIPC_NLA_LINK_DEST,
+ TIPC_NLA_LINK_MTU,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_LINK_BROADCAST,
+ TIPC_NLA_LINK_UP,
+ TIPC_NLA_LINK_ACTIVE,
+ TIPC_NLA_LINK_PROP,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_LINK_STATS,
+ TIPC_NLA_LINK_RX,
+ TIPC_NLA_LINK_TX,
+ __TIPC_NLA_LINK_MAX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_LINK_MAX = __TIPC_NLA_LINK_MAX - 1
+};
+enum {
+ TIPC_NLA_MEDIA_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_MEDIA_NAME,
+ TIPC_NLA_MEDIA_PROP,
+ __TIPC_NLA_MEDIA_MAX,
+ TIPC_NLA_MEDIA_MAX = __TIPC_NLA_MEDIA_MAX - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ TIPC_NLA_NODE_UNSPEC,
+ TIPC_NLA_NODE_ADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_NODE_UP,
+ __TIPC_NLA_NODE_MAX,
+ TIPC_NLA_NODE_MAX = __TIPC_NLA_NODE_MAX - 1
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ TIPC_NLA_NET_UNSPEC,
+ TIPC_NLA_NET_ID,
+ TIPC_NLA_NET_ADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TIPC_NLA_NET_MAX,
+ TIPC_NLA_NET_MAX = __TIPC_NLA_NET_MAX - 1
+};
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_NAME_TABLE_UNSPEC,
+ TIPC_NLA_NAME_TABLE_PUBL,
+ __TIPC_NLA_NAME_TABLE_MAX,
+ TIPC_NLA_NAME_TABLE_MAX = __TIPC_NLA_NAME_TABLE_MAX - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ TIPC_NLA_PUBL_UNSPEC,
+ TIPC_NLA_PUBL_TYPE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_PUBL_LOWER,
+ TIPC_NLA_PUBL_UPPER,
+ TIPC_NLA_PUBL_SCOPE,
+ TIPC_NLA_PUBL_NODE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_PUBL_REF,
+ TIPC_NLA_PUBL_KEY,
+ __TIPC_NLA_PUBL_MAX,
+ TIPC_NLA_PUBL_MAX = __TIPC_NLA_PUBL_MAX - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum {
+ TIPC_NLA_CON_UNSPEC,
+ TIPC_NLA_CON_FLAG,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_CON_NODE,
+ TIPC_NLA_CON_SOCK,
+ TIPC_NLA_CON_TYPE,
+ TIPC_NLA_CON_INST,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TIPC_NLA_CON_MAX,
+ TIPC_NLA_CON_MAX = __TIPC_NLA_CON_MAX - 1
+};
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_PROP_UNSPEC,
+ TIPC_NLA_PROP_PRIO,
+ TIPC_NLA_PROP_TOL,
+ TIPC_NLA_PROP_WIN,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __TIPC_NLA_PROP_MAX,
+ TIPC_NLA_PROP_MAX = __TIPC_NLA_PROP_MAX - 1
+};
+enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_UNSPEC,
+ TIPC_NLA_STATS_RX_INFO,
+ TIPC_NLA_STATS_RX_FRAGMENTS,
+ TIPC_NLA_STATS_RX_FRAGMENTED,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_RX_BUNDLES,
+ TIPC_NLA_STATS_RX_BUNDLED,
+ TIPC_NLA_STATS_TX_INFO,
+ TIPC_NLA_STATS_TX_FRAGMENTS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_TX_FRAGMENTED,
+ TIPC_NLA_STATS_TX_BUNDLES,
+ TIPC_NLA_STATS_TX_BUNDLED,
+ TIPC_NLA_STATS_MSG_PROF_TOT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_MSG_LEN_CNT,
+ TIPC_NLA_STATS_MSG_LEN_TOT,
+ TIPC_NLA_STATS_MSG_LEN_P0,
+ TIPC_NLA_STATS_MSG_LEN_P1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_MSG_LEN_P2,
+ TIPC_NLA_STATS_MSG_LEN_P3,
+ TIPC_NLA_STATS_MSG_LEN_P4,
+ TIPC_NLA_STATS_MSG_LEN_P5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_MSG_LEN_P6,
+ TIPC_NLA_STATS_RX_STATES,
+ TIPC_NLA_STATS_RX_PROBES,
+ TIPC_NLA_STATS_RX_NACKS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_RX_DEFERRED,
+ TIPC_NLA_STATS_TX_STATES,
+ TIPC_NLA_STATS_TX_PROBES,
+ TIPC_NLA_STATS_TX_NACKS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_TX_ACKS,
+ TIPC_NLA_STATS_RETRANSMITTED,
+ TIPC_NLA_STATS_DUPLICATES,
+ TIPC_NLA_STATS_LINK_CONGS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ TIPC_NLA_STATS_MAX_QUEUE,
+ TIPC_NLA_STATS_AVG_QUEUE,
+ __TIPC_NLA_STATS_MAX,
+ TIPC_NLA_STATS_MAX = __TIPC_NLA_STATS_MAX - 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#endif
diff --git a/libc/kernel/uapi/linux/toshiba.h b/libc/kernel/uapi/linux/toshiba.h
index 04e8ee517..9d3449c78 100644
--- a/libc/kernel/uapi/linux/toshiba.h
+++ b/libc/kernel/uapi/linux/toshiba.h
@@ -21,15 +21,19 @@
#define TOSH_PROC "/proc/toshiba"
#define TOSH_DEVICE "/dev/toshiba"
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define TOSH_SMM _IOWR('t', 0x90, int)
+#define TOSHIBA_ACPI_PROC "/proc/acpi/toshiba"
+#define TOSHIBA_ACPI_DEVICE "/dev/toshiba_acpi"
typedef struct {
unsigned int eax;
- unsigned int ebx __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int ebx __attribute__((packed));
unsigned int ecx __attribute__((packed));
unsigned int edx __attribute__((packed));
unsigned int esi __attribute__((packed));
- unsigned int edi __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int edi __attribute__((packed));
} SMMRegisters;
+#define TOSH_SMM _IOWR('t', 0x90, SMMRegisters)
+#define TOSHIBA_ACPI_SCI _IOWR('t', 0x91, SMMRegisters)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/tty.h b/libc/kernel/uapi/linux/tty.h
index 05347a371..c26e836ee 100644
--- a/libc/kernel/uapi/linux/tty.h
+++ b/libc/kernel/uapi/linux/tty.h
@@ -51,4 +51,5 @@
#define N_TRACESINK 23
#define N_TRACEROUTER 24
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define N_NCI 25
#endif
diff --git a/libc/kernel/uapi/linux/tty_flags.h b/libc/kernel/uapi/linux/tty_flags.h
index bcc5f6004..12fae792e 100644
--- a/libc/kernel/uapi/linux/tty_flags.h
+++ b/libc/kernel/uapi/linux/tty_flags.h
@@ -38,57 +38,61 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNCB_BUGGY_UART 14
#define ASYNCB_AUTOPROBE 15
-#define ASYNCB_LAST_USER 15
-#define ASYNCB_INITIALIZED 31
+#define ASYNCB_MAGIC_MULTIPLIER 16
+#define ASYNCB_LAST_USER 16
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ASYNCB_INITIALIZED 31
#define ASYNCB_SUSPENDED 30
#define ASYNCB_NORMAL_ACTIVE 29
#define ASYNCB_BOOT_AUTOCONF 28
-#define ASYNCB_CLOSING 27
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ASYNCB_CLOSING 27
#define ASYNCB_CTS_FLOW 26
#define ASYNCB_CHECK_CD 25
#define ASYNCB_SHARE_IRQ 24
-#define ASYNCB_CONS_FLOW 23
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ASYNCB_CONS_FLOW 23
#define ASYNCB_FIRST_KERNEL 22
#define ASYNC_HUP_NOTIFY (1U << ASYNCB_HUP_NOTIFY)
#define ASYNC_SUSPENDED (1U << ASYNCB_SUSPENDED)
-#define ASYNC_FOURPORT (1U << ASYNCB_FOURPORT)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ASYNC_FOURPORT (1U << ASYNCB_FOURPORT)
#define ASYNC_SAK (1U << ASYNCB_SAK)
#define ASYNC_SPLIT_TERMIOS (1U << ASYNCB_SPLIT_TERMIOS)
#define ASYNC_SPD_HI (1U << ASYNCB_SPD_HI)
-#define ASYNC_SPD_VHI (1U << ASYNCB_SPD_VHI)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ASYNC_SPD_VHI (1U << ASYNCB_SPD_VHI)
#define ASYNC_SKIP_TEST (1U << ASYNCB_SKIP_TEST)
#define ASYNC_AUTO_IRQ (1U << ASYNCB_AUTO_IRQ)
#define ASYNC_SESSION_LOCKOUT (1U << ASYNCB_SESSION_LOCKOUT)
-#define ASYNC_PGRP_LOCKOUT (1U << ASYNCB_PGRP_LOCKOUT)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ASYNC_PGRP_LOCKOUT (1U << ASYNCB_PGRP_LOCKOUT)
#define ASYNC_CALLOUT_NOHUP (1U << ASYNCB_CALLOUT_NOHUP)
#define ASYNC_HARDPPS_CD (1U << ASYNCB_HARDPPS_CD)
#define ASYNC_SPD_SHI (1U << ASYNCB_SPD_SHI)
-#define ASYNC_LOW_LATENCY (1U << ASYNCB_LOW_LATENCY)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define ASYNC_LOW_LATENCY (1U << ASYNCB_LOW_LATENCY)
#define ASYNC_BUGGY_UART (1U << ASYNCB_BUGGY_UART)
#define ASYNC_AUTOPROBE (1U << ASYNCB_AUTOPROBE)
+#define ASYNC_MAGIC_MULTIPLIER (1U << ASYNCB_MAGIC_MULTIPLIER)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNC_FLAGS ((1U << (ASYNCB_LAST_USER + 1)) - 1)
+#define ASYNC_DEPRECATED (ASYNC_SESSION_LOCKOUT | ASYNC_PGRP_LOCKOUT | ASYNC_CALLOUT_NOHUP | ASYNC_AUTOPROBE)
#define ASYNC_USR_MASK (ASYNC_SPD_MASK | ASYNC_CALLOUT_NOHUP | ASYNC_LOW_LATENCY)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNC_SPD_CUST (ASYNC_SPD_HI | ASYNC_SPD_VHI)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNC_SPD_WARP (ASYNC_SPD_HI | ASYNC_SPD_SHI)
#define ASYNC_SPD_MASK (ASYNC_SPD_HI | ASYNC_SPD_VHI | ASYNC_SPD_SHI)
#define ASYNC_INITIALIZED (1U << ASYNCB_INITIALIZED)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNC_NORMAL_ACTIVE (1U << ASYNCB_NORMAL_ACTIVE)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNC_BOOT_AUTOCONF (1U << ASYNCB_BOOT_AUTOCONF)
#define ASYNC_CLOSING (1U << ASYNCB_CLOSING)
#define ASYNC_CTS_FLOW (1U << ASYNCB_CTS_FLOW)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNC_CHECK_CD (1U << ASYNCB_CHECK_CD)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ASYNC_SHARE_IRQ (1U << ASYNCB_SHARE_IRQ)
#define ASYNC_CONS_FLOW (1U << ASYNCB_CONS_FLOW)
#define ASYNC_INTERNAL_FLAGS (~((1U << ASYNCB_FIRST_KERNEL) - 1))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/udp.h b/libc/kernel/uapi/linux/udp.h
index e1d546cb7..a3e9e9711 100644
--- a/libc/kernel/uapi/linux/udp.h
+++ b/libc/kernel/uapi/linux/udp.h
@@ -19,7 +19,7 @@
#ifndef _UAPI_LINUX_UDP_H
#define _UAPI_LINUX_UDP_H
#include <linux/types.h>
-struct udphdr {
+struct __kernel_udphdr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 source;
__be16 dest;
diff --git a/libc/kernel/uapi/linux/uinput.h b/libc/kernel/uapi/linux/uinput.h
index 845affc85..018d8a852 100644
--- a/libc/kernel/uapi/linux/uinput.h
+++ b/libc/kernel/uapi/linux/uinput.h
@@ -58,8 +58,8 @@ struct uinput_ff_erase {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UI_BEGIN_FF_ERASE _IOWR(UINPUT_IOCTL_BASE, 202, struct uinput_ff_erase)
#define UI_END_FF_ERASE _IOW(UINPUT_IOCTL_BASE, 203, struct uinput_ff_erase)
-#define UI_GET_SYSNAME(len) _IOC(_IOC_READ, UINPUT_IOCTL_BASE, 300, len)
-#define UI_GET_VERSION _IOR(UINPUT_IOCTL_BASE, 301, unsigned int)
+#define UI_GET_SYSNAME(len) _IOC(_IOC_READ, UINPUT_IOCTL_BASE, 44, len)
+#define UI_GET_VERSION _IOR(UINPUT_IOCTL_BASE, 45, unsigned int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EV_UINPUT 0x0101
#define UI_FF_UPLOAD 1
diff --git a/libc/kernel/uapi/linux/usb/cdc.h b/libc/kernel/uapi/linux/usb/cdc.h
index 81123cb86..4f02fcfac 100644
--- a/libc/kernel/uapi/linux/usb/cdc.h
+++ b/libc/kernel/uapi/linux/usb/cdc.h
@@ -16,8 +16,8 @@
***
****************************************************************************
****************************************************************************/
-#ifndef __LINUX_USB_CDC_H
-#define __LINUX_USB_CDC_H
+#ifndef __UAPI_LINUX_USB_CDC_H
+#define __UAPI_LINUX_USB_CDC_H
#include <linux/types.h>
#define USB_CDC_SUBCLASS_ACM 0x02
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/usb/ch9.h b/libc/kernel/uapi/linux/usb/ch9.h
index c2dd92d6d..8b96af903 100644
--- a/libc/kernel/uapi/linux/usb/ch9.h
+++ b/libc/kernel/uapi/linux/usb/ch9.h
@@ -307,235 +307,272 @@ struct usb_otg_descriptor {
__u8 bmAttributes;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
+struct usb_otg20_descriptor {
+ __u8 bLength;
+ __u8 bDescriptorType;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bmAttributes;
+ __le16 bcdOTG;
+} __attribute__((packed));
#define USB_OTG_SRP (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_OTG_HNP (1 << 1)
+#define USB_OTG_ADP (1 << 2)
struct usb_debug_descriptor {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bLength;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bDescriptorType;
__u8 bDebugInEndpoint;
__u8 bDebugOutEndpoint;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct usb_interface_assoc_descriptor {
__u8 bLength;
__u8 bDescriptorType;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bFirstInterface;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bInterfaceCount;
__u8 bFunctionClass;
__u8 bFunctionSubClass;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bFunctionProtocol;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 iFunction;
} __attribute__((packed));
struct usb_security_descriptor {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bLength;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bDescriptorType;
__le16 wTotalLength;
__u8 bNumEncryptionTypes;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct usb_key_descriptor {
__u8 bLength;
__u8 bDescriptorType;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 tTKID[3];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bReserved;
__u8 bKeyData[0];
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct usb_encryption_descriptor {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bLength;
__u8 bDescriptorType;
__u8 bEncryptionType;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_ENC_TYPE_UNSECURE 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_ENC_TYPE_WIRED 1
#define USB_ENC_TYPE_CCM_1 2
#define USB_ENC_TYPE_RSA_1 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bEncryptionValue;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bAuthKeyIndex;
} __attribute__((packed));
struct usb_bos_descriptor {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bLength;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bDescriptorType;
__le16 wTotalLength;
__u8 bNumDeviceCaps;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_DT_BOS_SIZE 5
struct usb_dev_cap_header {
__u8 bLength;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bDescriptorType;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bDevCapabilityType;
} __attribute__((packed));
#define USB_CAP_TYPE_WIRELESS_USB 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct usb_wireless_cap_descriptor {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bLength;
__u8 bDescriptorType;
__u8 bDevCapabilityType;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bmAttributes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_WIRELESS_P2P_DRD (1 << 1)
#define USB_WIRELESS_BEACON_MASK (3 << 2)
#define USB_WIRELESS_BEACON_SELF (1 << 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_WIRELESS_BEACON_DIRECTED (2 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_WIRELESS_BEACON_NONE (3 << 2)
__le16 wPHYRates;
#define USB_WIRELESS_PHY_53 (1 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_WIRELESS_PHY_80 (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_WIRELESS_PHY_107 (1 << 2)
#define USB_WIRELESS_PHY_160 (1 << 3)
#define USB_WIRELESS_PHY_200 (1 << 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_WIRELESS_PHY_320 (1 << 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_WIRELESS_PHY_400 (1 << 6)
#define USB_WIRELESS_PHY_480 (1 << 7)
__u8 bmTFITXPowerInfo;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bmFFITXPowerInfo;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le16 bmBandGroup;
__u8 bReserved;
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_CAP_TYPE_EXT 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct usb_ext_cap_descriptor {
__u8 bLength;
__u8 bDescriptorType;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bDevCapabilityType;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le32 bmAttributes;
#define USB_LPM_SUPPORT (1 << 1)
#define USB_BESL_SUPPORT (1 << 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_BESL_BASELINE_VALID (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_BESL_DEEP_VALID (1 << 4)
#define USB_GET_BESL_BASELINE(p) (((p) & (0xf << 8)) >> 8)
#define USB_GET_BESL_DEEP(p) (((p) & (0xf << 12)) >> 12)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_DT_USB_EXT_CAP_SIZE 7
#define USB_SS_CAP_TYPE 3
struct usb_ss_cap_descriptor {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bLength;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bDescriptorType;
__u8 bDevCapabilityType;
__u8 bmAttributes;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_LTM_SUPPORT (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le16 wSpeedSupported;
#define USB_LOW_SPEED_OPERATION (1)
#define USB_FULL_SPEED_OPERATION (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_HIGH_SPEED_OPERATION (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USB_5GBPS_OPERATION (1 << 3)
__u8 bFunctionalitySupport;
__u8 bU1devExitLat;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__le16 bU2DevExitLat;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
#define USB_DT_USB_SS_CAP_SIZE 10
#define CONTAINER_ID_TYPE 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct usb_ss_container_id_descriptor {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bLength;
__u8 bDescriptorType;
__u8 bDevCapabilityType;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 bReserved;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 ContainerID[16];
} __attribute__((packed));
#define USB_DT_USB_SS_CONTN_ID_SIZE 20
+#define USB_SSP_CAP_TYPE 0xa
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct usb_ssp_cap_descriptor {
+ __u8 bLength;
+ __u8 bDescriptorType;
+ __u8 bDevCapabilityType;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bReserved;
+ __le32 bmAttributes;
+#define USB_SSP_SUBLINK_SPEED_ATTRIBS (0x1f << 0)
+#define USB_SSP_SUBLINK_SPEED_IDS (0xf << 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 wFunctionalitySupport;
+#define USB_SSP_MIN_SUBLINK_SPEED_ATTRIBUTE_ID (0xf)
+#define USB_SSP_MIN_RX_LANE_COUNT (0xf << 8)
+#define USB_SSP_MIN_TX_LANE_COUNT (0xf << 12)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le16 wReserved;
+ __le32 bmSublinkSpeedAttr[1];
+#define USB_SSP_SUBLINK_SPEED_SSID (0xf)
+#define USB_SSP_SUBLINK_SPEED_LSE (0x3 << 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USB_SSP_SUBLINK_SPEED_ST (0x3 << 6)
+#define USB_SSP_SUBLINK_SPEED_RSVD (0x3f << 8)
+#define USB_SSP_SUBLINK_SPEED_LP (0x3 << 14)
+#define USB_SSP_SUBLINK_SPEED_LSM (0xff << 16)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
struct usb_wireless_ep_comp_descriptor {
__u8 bLength;
__u8 bDescriptorType;
- __u8 bMaxBurst;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bMaxBurst;
__u8 bMaxSequence;
__le16 wMaxStreamDelay;
__le16 wOverTheAirPacketSize;
- __u8 bOverTheAirInterval;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bOverTheAirInterval;
__u8 bmCompAttributes;
#define USB_ENDPOINT_SWITCH_MASK 0x03
#define USB_ENDPOINT_SWITCH_NO 0
-#define USB_ENDPOINT_SWITCH_SWITCH 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USB_ENDPOINT_SWITCH_SWITCH 1
#define USB_ENDPOINT_SWITCH_SCALE 2
} __attribute__((packed));
struct usb_handshake {
- __u8 bMessageNumber;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bMessageNumber;
__u8 bStatus;
__u8 tTKID[3];
__u8 bReserved;
- __u8 CDID[16];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 CDID[16];
__u8 nonce[16];
__u8 MIC[8];
} __attribute__((packed));
-struct usb_connection_context {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct usb_connection_context {
__u8 CHID[16];
__u8 CDID[16];
__u8 CK[16];
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
enum usb_device_speed {
USB_SPEED_UNKNOWN = 0,
USB_SPEED_LOW,
- USB_SPEED_FULL,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ USB_SPEED_FULL,
USB_SPEED_HIGH,
USB_SPEED_WIRELESS,
USB_SPEED_SUPER,
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum usb_device_state {
USB_STATE_NOTATTACHED = 0,
USB_STATE_ATTACHED,
- USB_STATE_POWERED,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ USB_STATE_POWERED,
USB_STATE_RECONNECTING,
USB_STATE_UNAUTHENTICATED,
USB_STATE_DEFAULT,
- USB_STATE_ADDRESS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ USB_STATE_ADDRESS,
USB_STATE_CONFIGURED,
USB_STATE_SUSPENDED
};
-enum usb3_link_state {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum usb3_link_state {
USB3_LPM_U0 = 0,
USB3_LPM_U1,
USB3_LPM_U2,
- USB3_LPM_U3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ USB3_LPM_U3
};
#define USB3_LPM_DISABLED 0x0
#define USB3_LPM_U1_MAX_TIMEOUT 0x7F
-#define USB3_LPM_U2_MAX_TIMEOUT 0xFE
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USB3_LPM_U2_MAX_TIMEOUT 0xFE
#define USB3_LPM_DEVICE_INITIATED 0xFF
struct usb_set_sel_req {
__u8 u1_sel;
- __u8 u1_pel;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 u1_pel;
__le16 u2_sel;
__le16 u2_pel;
} __attribute__((packed));
-#define USB3_LPM_MAX_U1_SEL_PEL 0xFF
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USB3_LPM_MAX_U1_SEL_PEL 0xFF
#define USB3_LPM_MAX_U2_SEL_PEL 0xFFFF
#define USB_SELF_POWER_VBUS_MAX_DRAW 100
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/usb/functionfs.h b/libc/kernel/uapi/linux/usb/functionfs.h
index f3f4da4ca..4d0972072 100644
--- a/libc/kernel/uapi/linux/usb/functionfs.h
+++ b/libc/kernel/uapi/linux/usb/functionfs.h
@@ -36,95 +36,96 @@ enum functionfs_flags {
FUNCTIONFS_HAS_MS_OS_DESC = 8,
FUNCTIONFS_VIRTUAL_ADDR = 16,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FUNCTIONFS_EVENTFD = 32,
};
struct usb_endpoint_descriptor_no_audio {
__u8 bLength;
- __u8 bDescriptorType;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bDescriptorType;
__u8 bEndpointAddress;
__u8 bmAttributes;
__le16 wMaxPacketSize;
- __u8 bInterval;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bInterval;
} __attribute__((packed));
struct usb_functionfs_descs_head_v2 {
__le32 magic;
- __le32 length;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 length;
__le32 flags;
} __attribute__((packed));
struct usb_functionfs_descs_head {
- __le32 magic;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 magic;
__le32 length;
__le32 fs_count;
__le32 hs_count;
-} __attribute__((packed, deprecated));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed, deprecated));
struct usb_os_desc_header {
__u8 interface;
__le32 dwLength;
- __le16 bcdVersion;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le16 bcdVersion;
__le16 wIndex;
union {
struct {
- __u8 bCount;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bCount;
__u8 Reserved;
};
__le16 wCount;
- };
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
} __attribute__((packed));
struct usb_ext_compat_desc {
__u8 bFirstInterfaceNumber;
- __u8 Reserved1;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 Reserved1;
__u8 CompatibleID[8];
__u8 SubCompatibleID[8];
__u8 Reserved2[6];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct usb_ext_prop_desc {
__le32 dwSize;
__le32 dwPropertyDataType;
- __le16 wPropertyNameLength;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le16 wPropertyNameLength;
} __attribute__((packed));
struct usb_functionfs_strings_head {
__le32 magic;
- __le32 length;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 length;
__le32 str_count;
__le32 lang_count;
} __attribute__((packed));
-enum usb_functionfs_event_type {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum usb_functionfs_event_type {
FUNCTIONFS_BIND,
FUNCTIONFS_UNBIND,
FUNCTIONFS_ENABLE,
- FUNCTIONFS_DISABLE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ FUNCTIONFS_DISABLE,
FUNCTIONFS_SETUP,
FUNCTIONFS_SUSPEND,
FUNCTIONFS_RESUME
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct usb_functionfs_event {
union {
struct usb_ctrlrequest setup;
- } __attribute__((packed)) u;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } __attribute__((packed)) u;
__u8 type;
__u8 _pad[3];
} __attribute__((packed));
-#define FUNCTIONFS_FIFO_STATUS _IO('g', 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FUNCTIONFS_FIFO_STATUS _IO('g', 1)
#define FUNCTIONFS_FIFO_FLUSH _IO('g', 2)
#define FUNCTIONFS_CLEAR_HALT _IO('g', 3)
#define FUNCTIONFS_INTERFACE_REVMAP _IO('g', 128)
-#define FUNCTIONFS_ENDPOINT_REVMAP _IO('g', 129)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define FUNCTIONFS_ENDPOINT_REVMAP _IO('g', 129)
#define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, struct usb_endpoint_descriptor)
#endif
diff --git a/libc/kernel/uapi/linux/usbdevice_fs.h b/libc/kernel/uapi/linux/usbdevice_fs.h
index 0aa2062d4..285b003fa 100644
--- a/libc/kernel/uapi/linux/usbdevice_fs.h
+++ b/libc/kernel/uapi/linux/usbdevice_fs.h
@@ -118,61 +118,62 @@ struct usbdevfs_hub_portinfo {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define USBDEVFS_CAP_NO_PACKET_SIZE_LIM 0x04
#define USBDEVFS_CAP_BULK_SCATTER_GATHER 0x08
+#define USBDEVFS_CAP_REAP_AFTER_DISCONNECT 0x10
#define USBDEVFS_DISCONNECT_CLAIM_IF_DRIVER 0x01
-#define USBDEVFS_DISCONNECT_CLAIM_EXCEPT_DRIVER 0x02
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_DISCONNECT_CLAIM_EXCEPT_DRIVER 0x02
struct usbdevfs_disconnect_claim {
unsigned int interface;
unsigned int flags;
- char driver[USBDEVFS_MAXDRIVERNAME + 1];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char driver[USBDEVFS_MAXDRIVERNAME + 1];
};
struct usbdevfs_streams {
unsigned int num_streams;
- unsigned int num_eps;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int num_eps;
unsigned char eps[0];
};
#define USBDEVFS_CONTROL _IOWR('U', 0, struct usbdevfs_ctrltransfer)
-#define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32)
#define USBDEVFS_BULK _IOWR('U', 2, struct usbdevfs_bulktransfer)
#define USBDEVFS_BULK32 _IOWR('U', 2, struct usbdevfs_bulktransfer32)
#define USBDEVFS_RESETEP _IOR('U', 3, unsigned int)
-#define USBDEVFS_SETINTERFACE _IOR('U', 4, struct usbdevfs_setinterface)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_SETINTERFACE _IOR('U', 4, struct usbdevfs_setinterface)
#define USBDEVFS_SETCONFIGURATION _IOR('U', 5, unsigned int)
#define USBDEVFS_GETDRIVER _IOW('U', 8, struct usbdevfs_getdriver)
#define USBDEVFS_SUBMITURB _IOR('U', 10, struct usbdevfs_urb)
-#define USBDEVFS_SUBMITURB32 _IOR('U', 10, struct usbdevfs_urb32)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_SUBMITURB32 _IOR('U', 10, struct usbdevfs_urb32)
#define USBDEVFS_DISCARDURB _IO('U', 11)
#define USBDEVFS_REAPURB _IOW('U', 12, void *)
#define USBDEVFS_REAPURB32 _IOW('U', 12, __u32)
-#define USBDEVFS_REAPURBNDELAY _IOW('U', 13, void *)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_REAPURBNDELAY _IOW('U', 13, void *)
#define USBDEVFS_REAPURBNDELAY32 _IOW('U', 13, __u32)
#define USBDEVFS_DISCSIGNAL _IOR('U', 14, struct usbdevfs_disconnectsignal)
#define USBDEVFS_DISCSIGNAL32 _IOR('U', 14, struct usbdevfs_disconnectsignal32)
-#define USBDEVFS_CLAIMINTERFACE _IOR('U', 15, unsigned int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_CLAIMINTERFACE _IOR('U', 15, unsigned int)
#define USBDEVFS_RELEASEINTERFACE _IOR('U', 16, unsigned int)
#define USBDEVFS_CONNECTINFO _IOW('U', 17, struct usbdevfs_connectinfo)
#define USBDEVFS_IOCTL _IOWR('U', 18, struct usbdevfs_ioctl)
-#define USBDEVFS_IOCTL32 _IOWR('U', 18, struct usbdevfs_ioctl32)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_IOCTL32 _IOWR('U', 18, struct usbdevfs_ioctl32)
#define USBDEVFS_HUB_PORTINFO _IOR('U', 19, struct usbdevfs_hub_portinfo)
#define USBDEVFS_RESET _IO('U', 20)
#define USBDEVFS_CLEAR_HALT _IOR('U', 21, unsigned int)
-#define USBDEVFS_DISCONNECT _IO('U', 22)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_DISCONNECT _IO('U', 22)
#define USBDEVFS_CONNECT _IO('U', 23)
#define USBDEVFS_CLAIM_PORT _IOR('U', 24, unsigned int)
#define USBDEVFS_RELEASE_PORT _IOR('U', 25, unsigned int)
-#define USBDEVFS_GET_CAPABILITIES _IOR('U', 26, __u32)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define USBDEVFS_GET_CAPABILITIES _IOR('U', 26, __u32)
#define USBDEVFS_DISCONNECT_CLAIM _IOR('U', 27, struct usbdevfs_disconnect_claim)
#define USBDEVFS_ALLOC_STREAMS _IOR('U', 28, struct usbdevfs_streams)
#define USBDEVFS_FREE_STREAMS _IOR('U', 29, struct usbdevfs_streams)
-#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/userfaultfd.h b/libc/kernel/uapi/linux/userfaultfd.h
new file mode 100644
index 000000000..e4e0998da
--- /dev/null
+++ b/libc/kernel/uapi/linux/userfaultfd.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _LINUX_USERFAULTFD_H
+#define _LINUX_USERFAULTFD_H
+#include <linux/types.h>
+#define UFFD_API ((__u64) 0xAA)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define UFFD_API_FEATURES (0)
+#define UFFD_API_IOCTLS ((__u64) 1 << _UFFDIO_REGISTER | (__u64) 1 << _UFFDIO_UNREGISTER | (__u64) 1 << _UFFDIO_API)
+#define UFFD_API_RANGE_IOCTLS ((__u64) 1 << _UFFDIO_WAKE | (__u64) 1 << _UFFDIO_COPY | (__u64) 1 << _UFFDIO_ZEROPAGE)
+#define _UFFDIO_REGISTER (0x00)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _UFFDIO_UNREGISTER (0x01)
+#define _UFFDIO_WAKE (0x02)
+#define _UFFDIO_COPY (0x03)
+#define _UFFDIO_ZEROPAGE (0x04)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _UFFDIO_API (0x3F)
+#define UFFDIO 0xAA
+#define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, struct uffdio_api)
+#define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, struct uffdio_register)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, struct uffdio_range)
+#define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, struct uffdio_range)
+#define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, struct uffdio_copy)
+#define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, struct uffdio_zeropage)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct uffd_msg {
+ __u8 event;
+ __u8 reserved1;
+ __u16 reserved2;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved3;
+ union {
+ struct {
+ __u64 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 address;
+ } pagefault;
+ struct {
+ __u64 reserved1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 reserved2;
+ __u64 reserved3;
+ } reserved;
+ } arg;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __packed;
+#define UFFD_EVENT_PAGEFAULT 0x12
+#define UFFD_PAGEFAULT_FLAG_WRITE (1 << 0)
+#define UFFD_PAGEFAULT_FLAG_WP (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct uffdio_api {
+ __u64 api;
+ __u64 features;
+ __u64 ioctls;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct uffdio_range {
+ __u64 start;
+ __u64 len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct uffdio_register {
+ struct uffdio_range range;
+#define UFFDIO_REGISTER_MODE_MISSING ((__u64) 1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define UFFDIO_REGISTER_MODE_WP ((__u64) 1 << 1)
+ __u64 mode;
+ __u64 ioctls;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct uffdio_copy {
+ __u64 dst;
+ __u64 src;
+ __u64 len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define UFFDIO_COPY_MODE_DONTWAKE ((__u64) 1 << 0)
+ __u64 mode;
+ __s64 copy;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct uffdio_zeropage {
+ struct uffdio_range range;
+#define UFFDIO_ZEROPAGE_MODE_DONTWAKE ((__u64) 1 << 0)
+ __u64 mode;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s64 zeropage;
+};
+#endif
diff --git a/libc/kernel/uapi/linux/userio.h b/libc/kernel/uapi/linux/userio.h
new file mode 100644
index 000000000..81bed0862
--- /dev/null
+++ b/libc/kernel/uapi/linux/userio.h
@@ -0,0 +1,34 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _USERIO_H
+#define _USERIO_H
+#include <linux/types.h>
+enum userio_cmd_type {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ USERIO_CMD_REGISTER = 0,
+ USERIO_CMD_SET_PORT_TYPE = 1,
+ USERIO_CMD_SEND_INTERRUPT = 2
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct userio_cmd {
+ __u8 type;
+ __u8 data;
+} __attribute__((__packed__));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/v4l2-common.h b/libc/kernel/uapi/linux/v4l2-common.h
index a379a7eec..1ed177034 100644
--- a/libc/kernel/uapi/linux/v4l2-common.h
+++ b/libc/kernel/uapi/linux/v4l2-common.h
@@ -23,33 +23,34 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_SEL_TGT_CROP_DEFAULT 0x0001
#define V4L2_SEL_TGT_CROP_BOUNDS 0x0002
+#define V4L2_SEL_TGT_NATIVE_SIZE 0x0003
#define V4L2_SEL_TGT_COMPOSE 0x0100
-#define V4L2_SEL_TGT_COMPOSE_DEFAULT 0x0101
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_SEL_TGT_COMPOSE_DEFAULT 0x0101
#define V4L2_SEL_TGT_COMPOSE_BOUNDS 0x0102
#define V4L2_SEL_TGT_COMPOSE_PADDED 0x0103
#define V4L2_SEL_TGT_CROP_ACTIVE V4L2_SEL_TGT_CROP
-#define V4L2_SEL_TGT_COMPOSE_ACTIVE V4L2_SEL_TGT_COMPOSE
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_SEL_TGT_COMPOSE_ACTIVE V4L2_SEL_TGT_COMPOSE
#define V4L2_SUBDEV_SEL_TGT_CROP_ACTUAL V4L2_SEL_TGT_CROP
#define V4L2_SUBDEV_SEL_TGT_COMPOSE_ACTUAL V4L2_SEL_TGT_COMPOSE
#define V4L2_SUBDEV_SEL_TGT_CROP_BOUNDS V4L2_SEL_TGT_CROP_BOUNDS
-#define V4L2_SUBDEV_SEL_TGT_COMPOSE_BOUNDS V4L2_SEL_TGT_COMPOSE_BOUNDS
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_SUBDEV_SEL_TGT_COMPOSE_BOUNDS V4L2_SEL_TGT_COMPOSE_BOUNDS
#define V4L2_SEL_FLAG_GE (1 << 0)
#define V4L2_SEL_FLAG_LE (1 << 1)
#define V4L2_SEL_FLAG_KEEP_CONFIG (1 << 2)
-#define V4L2_SUBDEV_SEL_FLAG_SIZE_GE V4L2_SEL_FLAG_GE
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_SUBDEV_SEL_FLAG_SIZE_GE V4L2_SEL_FLAG_GE
#define V4L2_SUBDEV_SEL_FLAG_SIZE_LE V4L2_SEL_FLAG_LE
#define V4L2_SUBDEV_SEL_FLAG_KEEP_CONFIG V4L2_SEL_FLAG_KEEP_CONFIG
struct v4l2_edid {
- __u32 pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 pad;
__u32 start_block;
__u32 blocks;
__u32 reserved[5];
- __u8 * edid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 * edid;
};
#endif
diff --git a/libc/kernel/uapi/linux/v4l2-controls.h b/libc/kernel/uapi/linux/v4l2-controls.h
index 024aa4d62..8267d370e 100644
--- a/libc/kernel/uapi/linux/v4l2-controls.h
+++ b/libc/kernel/uapi/linux/v4l2-controls.h
@@ -127,868 +127,872 @@ enum v4l2_colorfx {
#define V4L2_CID_USER_TI_VPE_BASE (V4L2_CID_USER_BASE + 0x1050)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_USER_SAA7134_BASE (V4L2_CID_USER_BASE + 0x1060)
+#define V4L2_CID_USER_ADV7180_BASE (V4L2_CID_USER_BASE + 0x1070)
+#define V4L2_CID_USER_TC358743_BASE (V4L2_CID_USER_BASE + 0x1080)
#define V4L2_CID_MPEG_BASE (V4L2_CTRL_CLASS_MPEG | 0x900)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_CLASS (V4L2_CTRL_CLASS_MPEG | 1)
#define V4L2_CID_MPEG_STREAM_TYPE (V4L2_CID_MPEG_BASE + 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_stream_type {
V4L2_MPEG_STREAM_TYPE_MPEG2_PS = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_STREAM_TYPE_MPEG2_TS = 1,
V4L2_MPEG_STREAM_TYPE_MPEG1_SS = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_STREAM_TYPE_MPEG2_DVD = 3,
V4L2_MPEG_STREAM_TYPE_MPEG1_VCD = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_STREAM_TYPE_MPEG2_SVCD = 5,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_STREAM_PID_PMT (V4L2_CID_MPEG_BASE + 1)
#define V4L2_CID_MPEG_STREAM_PID_AUDIO (V4L2_CID_MPEG_BASE + 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_STREAM_PID_VIDEO (V4L2_CID_MPEG_BASE + 3)
#define V4L2_CID_MPEG_STREAM_PID_PCR (V4L2_CID_MPEG_BASE + 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_STREAM_PES_ID_AUDIO (V4L2_CID_MPEG_BASE + 5)
#define V4L2_CID_MPEG_STREAM_PES_ID_VIDEO (V4L2_CID_MPEG_BASE + 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_STREAM_VBI_FMT (V4L2_CID_MPEG_BASE + 7)
enum v4l2_mpeg_stream_vbi_fmt {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_STREAM_VBI_FMT_NONE = 0,
V4L2_MPEG_STREAM_VBI_FMT_IVTV = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ (V4L2_CID_MPEG_BASE + 100)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_audio_sampling_freq {
V4L2_MPEG_AUDIO_SAMPLING_FREQ_44100 = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000 = 1,
V4L2_MPEG_AUDIO_SAMPLING_FREQ_32000 = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_AUDIO_ENCODING (V4L2_CID_MPEG_BASE + 101)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_audio_encoding {
V4L2_MPEG_AUDIO_ENCODING_LAYER_1 = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_ENCODING_LAYER_2 = 1,
V4L2_MPEG_AUDIO_ENCODING_LAYER_3 = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_ENCODING_AAC = 3,
V4L2_MPEG_AUDIO_ENCODING_AC3 = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_AUDIO_L1_BITRATE (V4L2_CID_MPEG_BASE + 102)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_audio_l1_bitrate {
V4L2_MPEG_AUDIO_L1_BITRATE_32K = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L1_BITRATE_64K = 1,
V4L2_MPEG_AUDIO_L1_BITRATE_96K = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L1_BITRATE_128K = 3,
V4L2_MPEG_AUDIO_L1_BITRATE_160K = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L1_BITRATE_192K = 5,
V4L2_MPEG_AUDIO_L1_BITRATE_224K = 6,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L1_BITRATE_256K = 7,
V4L2_MPEG_AUDIO_L1_BITRATE_288K = 8,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L1_BITRATE_320K = 9,
V4L2_MPEG_AUDIO_L1_BITRATE_352K = 10,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L1_BITRATE_384K = 11,
V4L2_MPEG_AUDIO_L1_BITRATE_416K = 12,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L1_BITRATE_448K = 13,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_AUDIO_L2_BITRATE (V4L2_CID_MPEG_BASE + 103)
enum v4l2_mpeg_audio_l2_bitrate {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L2_BITRATE_32K = 0,
V4L2_MPEG_AUDIO_L2_BITRATE_48K = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L2_BITRATE_56K = 2,
V4L2_MPEG_AUDIO_L2_BITRATE_64K = 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L2_BITRATE_80K = 4,
V4L2_MPEG_AUDIO_L2_BITRATE_96K = 5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L2_BITRATE_112K = 6,
V4L2_MPEG_AUDIO_L2_BITRATE_128K = 7,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L2_BITRATE_160K = 8,
V4L2_MPEG_AUDIO_L2_BITRATE_192K = 9,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L2_BITRATE_224K = 10,
V4L2_MPEG_AUDIO_L2_BITRATE_256K = 11,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L2_BITRATE_320K = 12,
V4L2_MPEG_AUDIO_L2_BITRATE_384K = 13,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_AUDIO_L3_BITRATE (V4L2_CID_MPEG_BASE + 104)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_audio_l3_bitrate {
V4L2_MPEG_AUDIO_L3_BITRATE_32K = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L3_BITRATE_40K = 1,
V4L2_MPEG_AUDIO_L3_BITRATE_48K = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L3_BITRATE_56K = 3,
V4L2_MPEG_AUDIO_L3_BITRATE_64K = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L3_BITRATE_80K = 5,
V4L2_MPEG_AUDIO_L3_BITRATE_96K = 6,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L3_BITRATE_112K = 7,
V4L2_MPEG_AUDIO_L3_BITRATE_128K = 8,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L3_BITRATE_160K = 9,
V4L2_MPEG_AUDIO_L3_BITRATE_192K = 10,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L3_BITRATE_224K = 11,
V4L2_MPEG_AUDIO_L3_BITRATE_256K = 12,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_L3_BITRATE_320K = 13,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_AUDIO_MODE (V4L2_CID_MPEG_BASE + 105)
enum v4l2_mpeg_audio_mode {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_MODE_STEREO = 0,
V4L2_MPEG_AUDIO_MODE_JOINT_STEREO = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_MODE_DUAL = 2,
V4L2_MPEG_AUDIO_MODE_MONO = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_AUDIO_MODE_EXTENSION (V4L2_CID_MPEG_BASE + 106)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_audio_mode_extension {
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4 = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_8 = 1,
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_12 = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_16 = 3,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_AUDIO_EMPHASIS (V4L2_CID_MPEG_BASE + 107)
enum v4l2_mpeg_audio_emphasis {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_EMPHASIS_NONE = 0,
V4L2_MPEG_AUDIO_EMPHASIS_50_DIV_15_uS = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17 = 2,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_AUDIO_CRC (V4L2_CID_MPEG_BASE + 108)
enum v4l2_mpeg_audio_crc {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_CRC_NONE = 0,
V4L2_MPEG_AUDIO_CRC_CRC16 = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_AUDIO_MUTE (V4L2_CID_MPEG_BASE + 109)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_AUDIO_AAC_BITRATE (V4L2_CID_MPEG_BASE + 110)
#define V4L2_CID_MPEG_AUDIO_AC3_BITRATE (V4L2_CID_MPEG_BASE + 111)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_audio_ac3_bitrate {
V4L2_MPEG_AUDIO_AC3_BITRATE_32K = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_40K = 1,
V4L2_MPEG_AUDIO_AC3_BITRATE_48K = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_56K = 3,
V4L2_MPEG_AUDIO_AC3_BITRATE_64K = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_80K = 5,
V4L2_MPEG_AUDIO_AC3_BITRATE_96K = 6,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_112K = 7,
V4L2_MPEG_AUDIO_AC3_BITRATE_128K = 8,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_160K = 9,
V4L2_MPEG_AUDIO_AC3_BITRATE_192K = 10,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_224K = 11,
V4L2_MPEG_AUDIO_AC3_BITRATE_256K = 12,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_320K = 13,
V4L2_MPEG_AUDIO_AC3_BITRATE_384K = 14,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_448K = 15,
V4L2_MPEG_AUDIO_AC3_BITRATE_512K = 16,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_AC3_BITRATE_576K = 17,
V4L2_MPEG_AUDIO_AC3_BITRATE_640K = 18,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_AUDIO_DEC_PLAYBACK (V4L2_CID_MPEG_BASE + 112)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_audio_dec_playback {
V4L2_MPEG_AUDIO_DEC_PLAYBACK_AUTO = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_DEC_PLAYBACK_STEREO = 1,
V4L2_MPEG_AUDIO_DEC_PLAYBACK_LEFT = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_DEC_PLAYBACK_RIGHT = 3,
V4L2_MPEG_AUDIO_DEC_PLAYBACK_MONO = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_AUDIO_DEC_PLAYBACK_SWAPPED_STEREO = 5,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_AUDIO_DEC_MULTILINGUAL_PLAYBACK (V4L2_CID_MPEG_BASE + 113)
#define V4L2_CID_MPEG_VIDEO_ENCODING (V4L2_CID_MPEG_BASE + 200)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_encoding {
V4L2_MPEG_VIDEO_ENCODING_MPEG_1 = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_ENCODING_MPEG_2 = 1,
V4L2_MPEG_VIDEO_ENCODING_MPEG_4_AVC = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_ASPECT (V4L2_CID_MPEG_BASE + 201)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_aspect {
V4L2_MPEG_VIDEO_ASPECT_1x1 = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_ASPECT_4x3 = 1,
V4L2_MPEG_VIDEO_ASPECT_16x9 = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_ASPECT_221x100 = 3,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_B_FRAMES (V4L2_CID_MPEG_BASE + 202)
#define V4L2_CID_MPEG_VIDEO_GOP_SIZE (V4L2_CID_MPEG_BASE + 203)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_GOP_CLOSURE (V4L2_CID_MPEG_BASE + 204)
#define V4L2_CID_MPEG_VIDEO_PULLDOWN (V4L2_CID_MPEG_BASE + 205)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_BITRATE_MODE (V4L2_CID_MPEG_BASE + 206)
enum v4l2_mpeg_video_bitrate_mode {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_BITRATE_MODE_VBR = 0,
V4L2_MPEG_VIDEO_BITRATE_MODE_CBR = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_BITRATE (V4L2_CID_MPEG_BASE + 207)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_BITRATE_PEAK (V4L2_CID_MPEG_BASE + 208)
#define V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION (V4L2_CID_MPEG_BASE + 209)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_MUTE (V4L2_CID_MPEG_BASE + 210)
#define V4L2_CID_MPEG_VIDEO_MUTE_YUV (V4L2_CID_MPEG_BASE + 211)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE (V4L2_CID_MPEG_BASE + 212)
#define V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER (V4L2_CID_MPEG_BASE + 213)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB (V4L2_CID_MPEG_BASE + 214)
#define V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE (V4L2_CID_MPEG_BASE + 215)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_HEADER_MODE (V4L2_CID_MPEG_BASE + 216)
enum v4l2_mpeg_video_header_mode {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE = 0,
V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_MAX_REF_PIC (V4L2_CID_MPEG_BASE + 217)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE (V4L2_CID_MPEG_BASE + 218)
#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES (V4L2_CID_MPEG_BASE + 219)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB (V4L2_CID_MPEG_BASE + 220)
#define V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE (V4L2_CID_MPEG_BASE + 221)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_multi_slice_mode {
V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_MB = 1,
V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_VBV_SIZE (V4L2_CID_MPEG_BASE + 222)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_DEC_PTS (V4L2_CID_MPEG_BASE + 223)
#define V4L2_CID_MPEG_VIDEO_DEC_FRAME (V4L2_CID_MPEG_BASE + 224)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VBV_DELAY (V4L2_CID_MPEG_BASE + 225)
#define V4L2_CID_MPEG_VIDEO_REPEAT_SEQ_HEADER (V4L2_CID_MPEG_BASE + 226)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE (V4L2_CID_MPEG_BASE + 227)
#define V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE (V4L2_CID_MPEG_BASE + 228)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP (V4L2_CID_MPEG_BASE + 300)
#define V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP (V4L2_CID_MPEG_BASE + 301)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP (V4L2_CID_MPEG_BASE + 302)
#define V4L2_CID_MPEG_VIDEO_H263_MIN_QP (V4L2_CID_MPEG_BASE + 303)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H263_MAX_QP (V4L2_CID_MPEG_BASE + 304)
#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP (V4L2_CID_MPEG_BASE + 350)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP (V4L2_CID_MPEG_BASE + 351)
#define V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP (V4L2_CID_MPEG_BASE + 352)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_MIN_QP (V4L2_CID_MPEG_BASE + 353)
#define V4L2_CID_MPEG_VIDEO_H264_MAX_QP (V4L2_CID_MPEG_BASE + 354)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM (V4L2_CID_MPEG_BASE + 355)
#define V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE (V4L2_CID_MPEG_BASE + 356)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE (V4L2_CID_MPEG_BASE + 357)
enum v4l2_mpeg_video_h264_entropy_mode {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC = 0,
V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_I_PERIOD (V4L2_CID_MPEG_BASE + 358)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_LEVEL (V4L2_CID_MPEG_BASE + 359)
enum v4l2_mpeg_video_h264_level {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_1_0 = 0,
V4L2_MPEG_VIDEO_H264_LEVEL_1B = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_1_1 = 2,
V4L2_MPEG_VIDEO_H264_LEVEL_1_2 = 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_1_3 = 4,
V4L2_MPEG_VIDEO_H264_LEVEL_2_0 = 5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_2_1 = 6,
V4L2_MPEG_VIDEO_H264_LEVEL_2_2 = 7,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_3_0 = 8,
V4L2_MPEG_VIDEO_H264_LEVEL_3_1 = 9,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_3_2 = 10,
V4L2_MPEG_VIDEO_H264_LEVEL_4_0 = 11,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_4_1 = 12,
V4L2_MPEG_VIDEO_H264_LEVEL_4_2 = 13,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LEVEL_5_0 = 14,
V4L2_MPEG_VIDEO_H264_LEVEL_5_1 = 15,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA (V4L2_CID_MPEG_BASE + 360)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA (V4L2_CID_MPEG_BASE + 361)
#define V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE (V4L2_CID_MPEG_BASE + 362)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_h264_loop_filter_mode {
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED = 1,
V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_PROFILE (V4L2_CID_MPEG_BASE + 363)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_h264_profile {
V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE = 1,
V4L2_MPEG_VIDEO_H264_PROFILE_MAIN = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_EXTENDED = 3,
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10 = 5,
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422 = 6,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_PREDICTIVE = 7,
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10_INTRA = 8,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_422_INTRA = 9,
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_444_INTRA = 10,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_CAVLC_444_INTRA = 11,
V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_BASELINE = 12,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH = 13,
V4L2_MPEG_VIDEO_H264_PROFILE_SCALABLE_HIGH_INTRA = 14,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH = 15,
V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH = 16,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT (V4L2_CID_MPEG_BASE + 364)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH (V4L2_CID_MPEG_BASE + 365)
#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE (V4L2_CID_MPEG_BASE + 366)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC (V4L2_CID_MPEG_BASE + 367)
enum v4l2_mpeg_video_h264_vui_sar_idc {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_UNSPECIFIED = 0,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1 = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_12x11 = 2,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_10x11 = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_16x11 = 4,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_40x33 = 5,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_24x11 = 6,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_20x11 = 7,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_32x11 = 8,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_80x33 = 9,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_18x11 = 10,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_15x11 = 11,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_64x33 = 12,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_160x99 = 13,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_4x3 = 14,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_3x2 = 15,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_2x1 = 16,
V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_EXTENDED = 17,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING (V4L2_CID_MPEG_BASE + 368)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_CURRENT_FRAME_0 (V4L2_CID_MPEG_BASE + 369)
#define V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE (V4L2_CID_MPEG_BASE + 370)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_h264_sei_fp_arrangement_type {
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_CHECKERBOARD = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_COLUMN = 1,
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_ROW = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_SIDE_BY_SIDE = 3,
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TOP_BOTTOM = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TEMPORAL = 5,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_FMO (V4L2_CID_MPEG_BASE + 371)
#define V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE (V4L2_CID_MPEG_BASE + 372)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_h264_fmo_map_type {
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_INTERLEAVED_SLICES = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_SCATTERED_SLICES = 1,
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_FOREGROUND_WITH_LEFT_OVER = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_BOX_OUT = 3,
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_RASTER_SCAN = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_WIPE_SCAN = 5,
V4L2_MPEG_VIDEO_H264_FMO_MAP_TYPE_EXPLICIT = 6,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_FMO_SLICE_GROUP (V4L2_CID_MPEG_BASE + 373)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_DIRECTION (V4L2_CID_MPEG_BASE + 374)
enum v4l2_mpeg_video_h264_fmo_change_dir {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_RIGHT = 0,
V4L2_MPEG_VIDEO_H264_FMO_CHANGE_DIR_LEFT = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_FMO_CHANGE_RATE (V4L2_CID_MPEG_BASE + 375)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_FMO_RUN_LENGTH (V4L2_CID_MPEG_BASE + 376)
#define V4L2_CID_MPEG_VIDEO_H264_ASO (V4L2_CID_MPEG_BASE + 377)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_ASO_SLICE_ORDER (V4L2_CID_MPEG_BASE + 378)
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING (V4L2_CID_MPEG_BASE + 379)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE (V4L2_CID_MPEG_BASE + 380)
enum v4l2_mpeg_video_h264_hierarchical_coding_type {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B = 0,
V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER (V4L2_CID_MPEG_BASE + 381)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP (V4L2_CID_MPEG_BASE + 382)
#define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (V4L2_CID_MPEG_BASE + 400)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP (V4L2_CID_MPEG_BASE + 401)
#define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP (V4L2_CID_MPEG_BASE + 402)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_MPEG4_MIN_QP (V4L2_CID_MPEG_BASE + 403)
#define V4L2_CID_MPEG_VIDEO_MPEG4_MAX_QP (V4L2_CID_MPEG_BASE + 404)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL (V4L2_CID_MPEG_BASE + 405)
enum v4l2_mpeg_video_mpeg4_level {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_MPEG4_LEVEL_0 = 0,
V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_MPEG4_LEVEL_1 = 2,
V4L2_MPEG_VIDEO_MPEG4_LEVEL_2 = 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_MPEG4_LEVEL_3 = 4,
V4L2_MPEG_VIDEO_MPEG4_LEVEL_3B = 5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_MPEG4_LEVEL_4 = 6,
V4L2_MPEG_VIDEO_MPEG4_LEVEL_5 = 7,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE (V4L2_CID_MPEG_BASE + 406)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_video_mpeg4_profile {
V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE = 1,
V4L2_MPEG_VIDEO_MPEG4_PROFILE_CORE = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE_SCALABLE = 3,
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_MPEG4_QPEL (V4L2_CID_MPEG_BASE + 407)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS (V4L2_CID_MPEG_BASE + 500)
enum v4l2_vp8_num_partitions {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CID_MPEG_VIDEO_VPX_1_PARTITION = 0,
V4L2_CID_MPEG_VIDEO_VPX_2_PARTITIONS = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CID_MPEG_VIDEO_VPX_4_PARTITIONS = 2,
V4L2_CID_MPEG_VIDEO_VPX_8_PARTITIONS = 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_VIDEO_VPX_IMD_DISABLE_4X4 (V4L2_CID_MPEG_BASE + 501)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VPX_NUM_REF_FRAMES (V4L2_CID_MPEG_BASE + 502)
enum v4l2_vp8_num_ref_frames {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CID_MPEG_VIDEO_VPX_1_REF_FRAME = 0,
V4L2_CID_MPEG_VIDEO_VPX_2_REF_FRAME = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CID_MPEG_VIDEO_VPX_3_REF_FRAME = 2,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_LEVEL (V4L2_CID_MPEG_BASE + 503)
#define V4L2_CID_MPEG_VIDEO_VPX_FILTER_SHARPNESS (V4L2_CID_MPEG_BASE + 504)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_REF_PERIOD (V4L2_CID_MPEG_BASE + 505)
#define V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL (V4L2_CID_MPEG_BASE + 506)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_vp8_golden_frame_sel {
V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_PREV = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_USE_REF_PERIOD = 1,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VPX_MIN_QP (V4L2_CID_MPEG_BASE + 507)
#define V4L2_CID_MPEG_VIDEO_VPX_MAX_QP (V4L2_CID_MPEG_BASE + 508)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP (V4L2_CID_MPEG_BASE + 509)
#define V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP (V4L2_CID_MPEG_BASE + 510)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_VIDEO_VPX_PROFILE (V4L2_CID_MPEG_BASE + 511)
#define V4L2_CID_MPEG_CX2341X_BASE (V4L2_CTRL_CLASS_MPEG | 0x1000)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE + 0)
enum v4l2_mpeg_cx2341x_video_spatial_filter_mode {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL = 0,
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE + 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE + 2)
enum v4l2_mpeg_cx2341x_video_luma_spatial_filter_type {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF = 0,
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_VERT = 2,
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_HV_SEPARABLE = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE = 4,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE + 3)
enum v4l2_mpeg_cx2341x_video_chroma_spatial_filter_type {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF = 0,
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE (V4L2_CID_MPEG_CX2341X_BASE + 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_cx2341x_video_temporal_filter_mode {
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO = 1,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER (V4L2_CID_MPEG_CX2341X_BASE + 5)
#define V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE (V4L2_CID_MPEG_CX2341X_BASE + 6)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_cx2341x_video_median_filter_type {
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR = 1,
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_VERT = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_HOR_VERT = 3,
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE + 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE + 8)
#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM (V4L2_CID_MPEG_CX2341X_BASE + 9)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP (V4L2_CID_MPEG_CX2341X_BASE + 10)
#define V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS (V4L2_CID_MPEG_CX2341X_BASE + 11)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_MFC51_BASE (V4L2_CTRL_CLASS_MPEG | 0x1100)
#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY (V4L2_CID_MPEG_MFC51_BASE + 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE (V4L2_CID_MPEG_MFC51_BASE + 1)
#define V4L2_CID_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE (V4L2_CID_MPEG_MFC51_BASE + 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_mfc51_video_frame_skip_mode {
V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_DISABLED = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_LEVEL_LIMIT = 1,
V4L2_MPEG_MFC51_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE (V4L2_CID_MPEG_MFC51_BASE + 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_mpeg_mfc51_video_force_frame_type {
V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_DISABLED = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_I_FRAME = 1,
V4L2_MPEG_MFC51_VIDEO_FORCE_FRAME_TYPE_NOT_CODED = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING (V4L2_CID_MPEG_MFC51_BASE + 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_MFC51_VIDEO_PADDING_YUV (V4L2_CID_MPEG_MFC51_BASE + 5)
#define V4L2_CID_MPEG_MFC51_VIDEO_RC_FIXED_TARGET_BIT (V4L2_CID_MPEG_MFC51_BASE + 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_MFC51_VIDEO_RC_REACTION_COEFF (V4L2_CID_MPEG_MFC51_BASE + 7)
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_ACTIVITY (V4L2_CID_MPEG_MFC51_BASE + 50)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_DARK (V4L2_CID_MPEG_MFC51_BASE + 51)
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_SMOOTH (V4L2_CID_MPEG_MFC51_BASE + 52)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_ADAPTIVE_RC_STATIC (V4L2_CID_MPEG_MFC51_BASE + 53)
#define V4L2_CID_MPEG_MFC51_VIDEO_H264_NUM_REF_PIC_FOR_P (V4L2_CID_MPEG_MFC51_BASE + 54)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900)
#define V4L2_CID_CAMERA_CLASS (V4L2_CTRL_CLASS_CAMERA | 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_EXPOSURE_AUTO (V4L2_CID_CAMERA_CLASS_BASE + 1)
enum v4l2_exposure_auto_type {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_EXPOSURE_AUTO = 0,
V4L2_EXPOSURE_MANUAL = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
V4L2_EXPOSURE_APERTURE_PRIORITY = 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_EXPOSURE_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE + 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_EXPOSURE_AUTO_PRIORITY (V4L2_CID_CAMERA_CLASS_BASE + 3)
#define V4L2_CID_PAN_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE + 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_TILT_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE + 5)
#define V4L2_CID_PAN_RESET (V4L2_CID_CAMERA_CLASS_BASE + 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_TILT_RESET (V4L2_CID_CAMERA_CLASS_BASE + 7)
#define V4L2_CID_PAN_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE + 8)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_TILT_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE + 9)
#define V4L2_CID_FOCUS_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE + 10)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FOCUS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE + 11)
#define V4L2_CID_FOCUS_AUTO (V4L2_CID_CAMERA_CLASS_BASE + 12)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_ZOOM_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE + 13)
#define V4L2_CID_ZOOM_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE + 14)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_ZOOM_CONTINUOUS (V4L2_CID_CAMERA_CLASS_BASE + 15)
#define V4L2_CID_PRIVACY (V4L2_CID_CAMERA_CLASS_BASE + 16)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_IRIS_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE + 17)
#define V4L2_CID_IRIS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE + 18)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_AUTO_EXPOSURE_BIAS (V4L2_CID_CAMERA_CLASS_BASE + 19)
#define V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE (V4L2_CID_CAMERA_CLASS_BASE + 20)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_auto_n_preset_white_balance {
V4L2_WHITE_BALANCE_MANUAL = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_WHITE_BALANCE_AUTO = 1,
V4L2_WHITE_BALANCE_INCANDESCENT = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_WHITE_BALANCE_FLUORESCENT = 3,
V4L2_WHITE_BALANCE_FLUORESCENT_H = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_WHITE_BALANCE_HORIZON = 5,
V4L2_WHITE_BALANCE_DAYLIGHT = 6,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_WHITE_BALANCE_FLASH = 7,
V4L2_WHITE_BALANCE_CLOUDY = 8,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_WHITE_BALANCE_SHADE = 9,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_WIDE_DYNAMIC_RANGE (V4L2_CID_CAMERA_CLASS_BASE + 21)
#define V4L2_CID_IMAGE_STABILIZATION (V4L2_CID_CAMERA_CLASS_BASE + 22)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_ISO_SENSITIVITY (V4L2_CID_CAMERA_CLASS_BASE + 23)
#define V4L2_CID_ISO_SENSITIVITY_AUTO (V4L2_CID_CAMERA_CLASS_BASE + 24)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_iso_sensitivity_auto_type {
V4L2_ISO_SENSITIVITY_MANUAL = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_ISO_SENSITIVITY_AUTO = 1,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_EXPOSURE_METERING (V4L2_CID_CAMERA_CLASS_BASE + 25)
enum v4l2_exposure_metering {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_EXPOSURE_METERING_AVERAGE = 0,
V4L2_EXPOSURE_METERING_CENTER_WEIGHTED = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_EXPOSURE_METERING_SPOT = 2,
V4L2_EXPOSURE_METERING_MATRIX = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_SCENE_MODE (V4L2_CID_CAMERA_CLASS_BASE + 26)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_scene_mode {
V4L2_SCENE_MODE_NONE = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_SCENE_MODE_BACKLIGHT = 1,
V4L2_SCENE_MODE_BEACH_SNOW = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_SCENE_MODE_CANDLE_LIGHT = 3,
V4L2_SCENE_MODE_DAWN_DUSK = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_SCENE_MODE_FALL_COLORS = 5,
V4L2_SCENE_MODE_FIREWORKS = 6,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_SCENE_MODE_LANDSCAPE = 7,
V4L2_SCENE_MODE_NIGHT = 8,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_SCENE_MODE_PARTY_INDOOR = 9,
V4L2_SCENE_MODE_PORTRAIT = 10,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_SCENE_MODE_SPORTS = 11,
V4L2_SCENE_MODE_SUNSET = 12,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_SCENE_MODE_TEXT = 13,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_3A_LOCK (V4L2_CID_CAMERA_CLASS_BASE + 27)
#define V4L2_LOCK_EXPOSURE (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_LOCK_WHITE_BALANCE (1 << 1)
#define V4L2_LOCK_FOCUS (1 << 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_AUTO_FOCUS_START (V4L2_CID_CAMERA_CLASS_BASE + 28)
#define V4L2_CID_AUTO_FOCUS_STOP (V4L2_CID_CAMERA_CLASS_BASE + 29)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_AUTO_FOCUS_STATUS (V4L2_CID_CAMERA_CLASS_BASE + 30)
#define V4L2_AUTO_FOCUS_STATUS_IDLE (0 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_AUTO_FOCUS_STATUS_BUSY (1 << 0)
#define V4L2_AUTO_FOCUS_STATUS_REACHED (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_AUTO_FOCUS_STATUS_FAILED (1 << 2)
#define V4L2_CID_AUTO_FOCUS_RANGE (V4L2_CID_CAMERA_CLASS_BASE + 31)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_auto_focus_range {
V4L2_AUTO_FOCUS_RANGE_AUTO = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_AUTO_FOCUS_RANGE_NORMAL = 1,
V4L2_AUTO_FOCUS_RANGE_MACRO = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_AUTO_FOCUS_RANGE_INFINITY = 3,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_PAN_SPEED (V4L2_CID_CAMERA_CLASS_BASE + 32)
#define V4L2_CID_TILT_SPEED (V4L2_CID_CAMERA_CLASS_BASE + 33)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FM_TX_CLASS_BASE (V4L2_CTRL_CLASS_FM_TX | 0x900)
#define V4L2_CID_FM_TX_CLASS (V4L2_CTRL_CLASS_FM_TX | 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_TX_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 1)
#define V4L2_CID_RDS_TX_PI (V4L2_CID_FM_TX_CLASS_BASE + 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_TX_PTY (V4L2_CID_FM_TX_CLASS_BASE + 3)
#define V4L2_CID_RDS_TX_PS_NAME (V4L2_CID_FM_TX_CLASS_BASE + 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_TX_RADIO_TEXT (V4L2_CID_FM_TX_CLASS_BASE + 6)
#define V4L2_CID_RDS_TX_MONO_STEREO (V4L2_CID_FM_TX_CLASS_BASE + 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_TX_ARTIFICIAL_HEAD (V4L2_CID_FM_TX_CLASS_BASE + 8)
#define V4L2_CID_RDS_TX_COMPRESSED (V4L2_CID_FM_TX_CLASS_BASE + 9)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_TX_DYNAMIC_PTY (V4L2_CID_FM_TX_CLASS_BASE + 10)
#define V4L2_CID_RDS_TX_TRAFFIC_ANNOUNCEMENT (V4L2_CID_FM_TX_CLASS_BASE + 11)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_TX_TRAFFIC_PROGRAM (V4L2_CID_FM_TX_CLASS_BASE + 12)
#define V4L2_CID_RDS_TX_MUSIC_SPEECH (V4L2_CID_FM_TX_CLASS_BASE + 13)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_TX_ALT_FREQS_ENABLE (V4L2_CID_FM_TX_CLASS_BASE + 14)
#define V4L2_CID_RDS_TX_ALT_FREQS (V4L2_CID_FM_TX_CLASS_BASE + 15)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_AUDIO_LIMITER_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 64)
#define V4L2_CID_AUDIO_LIMITER_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 65)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_AUDIO_LIMITER_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 66)
#define V4L2_CID_AUDIO_COMPRESSION_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 80)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_AUDIO_COMPRESSION_GAIN (V4L2_CID_FM_TX_CLASS_BASE + 81)
#define V4L2_CID_AUDIO_COMPRESSION_THRESHOLD (V4L2_CID_FM_TX_CLASS_BASE + 82)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_AUDIO_COMPRESSION_ATTACK_TIME (V4L2_CID_FM_TX_CLASS_BASE + 83)
#define V4L2_CID_AUDIO_COMPRESSION_RELEASE_TIME (V4L2_CID_FM_TX_CLASS_BASE + 84)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_PILOT_TONE_ENABLED (V4L2_CID_FM_TX_CLASS_BASE + 96)
#define V4L2_CID_PILOT_TONE_DEVIATION (V4L2_CID_FM_TX_CLASS_BASE + 97)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_PILOT_TONE_FREQUENCY (V4L2_CID_FM_TX_CLASS_BASE + 98)
#define V4L2_CID_TUNE_PREEMPHASIS (V4L2_CID_FM_TX_CLASS_BASE + 112)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_preemphasis {
V4L2_PREEMPHASIS_DISABLED = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_PREEMPHASIS_50_uS = 1,
V4L2_PREEMPHASIS_75_uS = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_TUNE_POWER_LEVEL (V4L2_CID_FM_TX_CLASS_BASE + 113)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_TUNE_ANTENNA_CAPACITOR (V4L2_CID_FM_TX_CLASS_BASE + 114)
#define V4L2_CID_FLASH_CLASS_BASE (V4L2_CTRL_CLASS_FLASH | 0x900)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FLASH_CLASS (V4L2_CTRL_CLASS_FLASH | 1)
#define V4L2_CID_FLASH_LED_MODE (V4L2_CID_FLASH_CLASS_BASE + 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_flash_led_mode {
V4L2_FLASH_LED_MODE_NONE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_FLASH_LED_MODE_FLASH,
V4L2_FLASH_LED_MODE_TORCH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_CID_FLASH_STROBE_SOURCE (V4L2_CID_FLASH_CLASS_BASE + 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_flash_strobe_source {
V4L2_FLASH_STROBE_SOURCE_SOFTWARE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_FLASH_STROBE_SOURCE_EXTERNAL,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FLASH_STROBE (V4L2_CID_FLASH_CLASS_BASE + 3)
#define V4L2_CID_FLASH_STROBE_STOP (V4L2_CID_FLASH_CLASS_BASE + 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FLASH_STROBE_STATUS (V4L2_CID_FLASH_CLASS_BASE + 5)
#define V4L2_CID_FLASH_TIMEOUT (V4L2_CID_FLASH_CLASS_BASE + 6)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FLASH_INTENSITY (V4L2_CID_FLASH_CLASS_BASE + 7)
#define V4L2_CID_FLASH_TORCH_INTENSITY (V4L2_CID_FLASH_CLASS_BASE + 8)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FLASH_INDICATOR_INTENSITY (V4L2_CID_FLASH_CLASS_BASE + 9)
#define V4L2_CID_FLASH_FAULT (V4L2_CID_FLASH_CLASS_BASE + 10)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FLASH_FAULT_OVER_VOLTAGE (1 << 0)
#define V4L2_FLASH_FAULT_TIMEOUT (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FLASH_FAULT_OVER_TEMPERATURE (1 << 2)
#define V4L2_FLASH_FAULT_SHORT_CIRCUIT (1 << 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FLASH_FAULT_OVER_CURRENT (1 << 4)
#define V4L2_FLASH_FAULT_INDICATOR (1 << 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FLASH_FAULT_UNDER_VOLTAGE (1 << 6)
#define V4L2_FLASH_FAULT_INPUT_VOLTAGE (1 << 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FLASH_FAULT_LED_OVER_TEMPERATURE (1 << 8)
#define V4L2_CID_FLASH_CHARGE (V4L2_CID_FLASH_CLASS_BASE + 11)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FLASH_READY (V4L2_CID_FLASH_CLASS_BASE + 12)
#define V4L2_CID_JPEG_CLASS_BASE (V4L2_CTRL_CLASS_JPEG | 0x900)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_JPEG_CLASS (V4L2_CTRL_CLASS_JPEG | 1)
#define V4L2_CID_JPEG_CHROMA_SUBSAMPLING (V4L2_CID_JPEG_CLASS_BASE + 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_jpeg_chroma_subsampling {
V4L2_JPEG_CHROMA_SUBSAMPLING_444 = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_JPEG_CHROMA_SUBSAMPLING_422 = 1,
V4L2_JPEG_CHROMA_SUBSAMPLING_420 = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_JPEG_CHROMA_SUBSAMPLING_411 = 3,
V4L2_JPEG_CHROMA_SUBSAMPLING_410 = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY = 5,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_JPEG_RESTART_INTERVAL (V4L2_CID_JPEG_CLASS_BASE + 2)
#define V4L2_CID_JPEG_COMPRESSION_QUALITY (V4L2_CID_JPEG_CLASS_BASE + 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_JPEG_ACTIVE_MARKER (V4L2_CID_JPEG_CLASS_BASE + 4)
#define V4L2_JPEG_ACTIVE_MARKER_APP0 (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_JPEG_ACTIVE_MARKER_APP1 (1 << 1)
#define V4L2_JPEG_ACTIVE_MARKER_COM (1 << 16)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_JPEG_ACTIVE_MARKER_DQT (1 << 17)
#define V4L2_JPEG_ACTIVE_MARKER_DHT (1 << 18)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_IMAGE_SOURCE_CLASS_BASE (V4L2_CTRL_CLASS_IMAGE_SOURCE | 0x900)
#define V4L2_CID_IMAGE_SOURCE_CLASS (V4L2_CTRL_CLASS_IMAGE_SOURCE | 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_VBLANK (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 1)
#define V4L2_CID_HBLANK (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_ANALOGUE_GAIN (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 3)
#define V4L2_CID_TEST_PATTERN_RED (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_TEST_PATTERN_GREENR (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 5)
#define V4L2_CID_TEST_PATTERN_BLUE (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_TEST_PATTERN_GREENB (V4L2_CID_IMAGE_SOURCE_CLASS_BASE + 7)
#define V4L2_CID_IMAGE_PROC_CLASS_BASE (V4L2_CTRL_CLASS_IMAGE_PROC | 0x900)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_IMAGE_PROC_CLASS (V4L2_CTRL_CLASS_IMAGE_PROC | 1)
#define V4L2_CID_LINK_FREQ (V4L2_CID_IMAGE_PROC_CLASS_BASE + 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_PIXEL_RATE (V4L2_CID_IMAGE_PROC_CLASS_BASE + 2)
#define V4L2_CID_TEST_PATTERN (V4L2_CID_IMAGE_PROC_CLASS_BASE + 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DV_CLASS_BASE (V4L2_CTRL_CLASS_DV | 0x900)
#define V4L2_CID_DV_CLASS (V4L2_CTRL_CLASS_DV | 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DV_TX_HOTPLUG (V4L2_CID_DV_CLASS_BASE + 1)
#define V4L2_CID_DV_TX_RXSENSE (V4L2_CID_DV_CLASS_BASE + 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DV_TX_EDID_PRESENT (V4L2_CID_DV_CLASS_BASE + 3)
#define V4L2_CID_DV_TX_MODE (V4L2_CID_DV_CLASS_BASE + 4)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_dv_tx_mode {
V4L2_DV_TX_MODE_DVI_D = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_DV_TX_MODE_HDMI = 1,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DV_TX_RGB_RANGE (V4L2_CID_DV_CLASS_BASE + 5)
enum v4l2_dv_rgb_range {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_DV_RGB_RANGE_AUTO = 0,
V4L2_DV_RGB_RANGE_LIMITED = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_DV_RGB_RANGE_FULL = 2,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DV_RX_POWER_PRESENT (V4L2_CID_DV_CLASS_BASE + 100)
#define V4L2_CID_DV_RX_RGB_RANGE (V4L2_CID_DV_CLASS_BASE + 101)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_FM_RX_CLASS_BASE (V4L2_CTRL_CLASS_FM_RX | 0x900)
#define V4L2_CID_FM_RX_CLASS (V4L2_CTRL_CLASS_FM_RX | 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_TUNE_DEEMPHASIS (V4L2_CID_FM_RX_CLASS_BASE + 1)
enum v4l2_deemphasis {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_DEEMPHASIS_DISABLED = V4L2_PREEMPHASIS_DISABLED,
V4L2_DEEMPHASIS_50_uS = V4L2_PREEMPHASIS_50_uS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_DEEMPHASIS_75_uS = V4L2_PREEMPHASIS_75_uS,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_RECEPTION (V4L2_CID_FM_RX_CLASS_BASE + 2)
#define V4L2_CID_RDS_RX_PTY (V4L2_CID_FM_RX_CLASS_BASE + 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_RX_PS_NAME (V4L2_CID_FM_RX_CLASS_BASE + 4)
#define V4L2_CID_RDS_RX_RADIO_TEXT (V4L2_CID_FM_RX_CLASS_BASE + 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_RX_TRAFFIC_ANNOUNCEMENT (V4L2_CID_FM_RX_CLASS_BASE + 6)
#define V4L2_CID_RDS_RX_TRAFFIC_PROGRAM (V4L2_CID_FM_RX_CLASS_BASE + 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RDS_RX_MUSIC_SPEECH (V4L2_CID_FM_RX_CLASS_BASE + 8)
#define V4L2_CID_RF_TUNER_CLASS_BASE (V4L2_CTRL_CLASS_RF_TUNER | 0x900)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RF_TUNER_CLASS (V4L2_CTRL_CLASS_RF_TUNER | 1)
#define V4L2_CID_RF_TUNER_BANDWIDTH_AUTO (V4L2_CID_RF_TUNER_CLASS_BASE + 11)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RF_TUNER_BANDWIDTH (V4L2_CID_RF_TUNER_CLASS_BASE + 12)
+#define V4L2_CID_RF_TUNER_RF_GAIN (V4L2_CID_RF_TUNER_CLASS_BASE + 32)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RF_TUNER_LNA_GAIN_AUTO (V4L2_CID_RF_TUNER_CLASS_BASE + 41)
#define V4L2_CID_RF_TUNER_LNA_GAIN (V4L2_CID_RF_TUNER_CLASS_BASE + 42)
#define V4L2_CID_RF_TUNER_MIXER_GAIN_AUTO (V4L2_CID_RF_TUNER_CLASS_BASE + 51)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RF_TUNER_MIXER_GAIN (V4L2_CID_RF_TUNER_CLASS_BASE + 52)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_RF_TUNER_IF_GAIN_AUTO (V4L2_CID_RF_TUNER_CLASS_BASE + 61)
#define V4L2_CID_RF_TUNER_IF_GAIN (V4L2_CID_RF_TUNER_CLASS_BASE + 62)
#define V4L2_CID_RF_TUNER_PLL_LOCK (V4L2_CID_RF_TUNER_CLASS_BASE + 91)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DETECT_CLASS_BASE (V4L2_CTRL_CLASS_DETECT | 0x900)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DETECT_CLASS (V4L2_CTRL_CLASS_DETECT | 1)
#define V4L2_CID_DETECT_MD_MODE (V4L2_CID_DETECT_CLASS_BASE + 1)
enum v4l2_detect_md_mode {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_DETECT_MD_MODE_DISABLED = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_DETECT_MD_MODE_GLOBAL = 1,
V4L2_DETECT_MD_MODE_THRESHOLD_GRID = 2,
V4L2_DETECT_MD_MODE_REGION_GRID = 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_DETECT_MD_GLOBAL_THRESHOLD (V4L2_CID_DETECT_CLASS_BASE + 2)
#define V4L2_CID_DETECT_MD_THRESHOLD_GRID (V4L2_CID_DETECT_CLASS_BASE + 3)
#define V4L2_CID_DETECT_MD_REGION_GRID (V4L2_CID_DETECT_CLASS_BASE + 4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/v4l2-dv-timings.h b/libc/kernel/uapi/linux/v4l2-dv-timings.h
index a4f91ecfa..ac5fb64f2 100644
--- a/libc/kernel/uapi/linux/v4l2-dv-timings.h
+++ b/libc/kernel/uapi/linux/v4l2-dv-timings.h
@@ -27,63 +27,63 @@
#define V4L2_DV_BT_CEA_640X480P59_94 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(640, 480, 0, 0, 25175000, 16, 96, 48, 10, 2, 33, 0, 0, 0, V4L2_DV_BT_STD_DMT | V4L2_DV_BT_STD_CEA861, 0) \
}
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define V4L2_DV_BT_CEA_720X480I59_94 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 480, 1, 0, 13500000, 19, 62, 57, 4, 3, 15, 4, 3, 16, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_HALF_LINE) \
+#define V4L2_DV_BT_CEA_720X480I59_94 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 480, 1, 0, 13500000, 19, 62, 57, 4, 3, 15, 4, 3, 16, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_HALF_LINE | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_720X480P59_94 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 480, 0, 0, 27000000, 16, 62, 60, 9, 6, 30, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_720X480P59_94 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 480, 0, 0, 27000000, 16, 62, 60, 9, 6, 30, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_720X576I50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 576, 1, 0, 13500000, 12, 63, 69, 2, 3, 19, 2, 3, 20, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_HALF_LINE) \
+#define V4L2_DV_BT_CEA_720X576I50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 576, 1, 0, 13500000, 12, 63, 69, 2, 3, 19, 2, 3, 20, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_HALF_LINE | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_720X576P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 576, 0, 0, 27000000, 12, 64, 68, 5, 5, 39, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_720X576P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(720, 576, 0, 0, 27000000, 12, 64, 68, 5, 5, 39, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_BT_CEA_1280X720P24 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 59400000, 1760, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_DMT | V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
}
-#define V4L2_DV_BT_CEA_1280X720P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 2420, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_1280X720P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 2420, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1280X720P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 1760, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_1280X720P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 1760, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1280X720P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 440, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_1280X720P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 440, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define V4L2_DV_BT_CEA_1280X720P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 110, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_1280X720P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1280, 720, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 110, 40, 220, 5, 5, 20, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1920X1080P24 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 638, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_1920X1080P24 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 638, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1920X1080P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 528, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_1920X1080P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 528, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1920X1080P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 88, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_1920X1080P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 88, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define V4L2_DV_BT_CEA_1920X1080I50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 1, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 528, 44, 148, 2, 5, 15, 2, 5, 16, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_HALF_LINE) \
+#define V4L2_DV_BT_CEA_1920X1080I50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 1, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 528, 44, 148, 2, 5, 15, 2, 5, 16, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_HALF_LINE | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1920X1080P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 148500000, 528, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_1920X1080P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 148500000, 528, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1920X1080I60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 1, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 88, 44, 148, 2, 5, 15, 2, 5, 16, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_HALF_LINE) \
+#define V4L2_DV_BT_CEA_1920X1080I60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 1, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 74250000, 88, 44, 148, 2, 5, 15, 2, 5, 16, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_HALF_LINE | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_1920X1080P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 148500000, 88, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_DMT | V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_1920X1080P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(1920, 1080, 0, V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, 148500000, 88, 44, 148, 4, 5, 36, 0, 0, 0, V4L2_DV_BT_STD_DMT | V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define V4L2_DV_BT_CEA_3840X2160P24 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 1276, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_3840X2160P24 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 1276, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_3840X2160P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_3840X2160P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_3840X2160P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_3840X2160P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_3840X2160P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_3840X2160P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define V4L2_DV_BT_CEA_3840X2160P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_3840X2160P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_4096X2160P24 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 1020, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_4096X2160P24 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 1020, 88, 296, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_4096X2160P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_4096X2160P25 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_4096X2160P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_4096X2160P30 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 297000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define V4L2_DV_BT_CEA_4096X2160P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, 0) \
+#define V4L2_DV_BT_CEA_4096X2160P50 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
}
-#define V4L2_DV_BT_CEA_4096X2160P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS) \
+#define V4L2_DV_BT_CEA_4096X2160P60 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, 594000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
}
#define V4L2_DV_BT_DMT_640X350P85 {.type = V4L2_DV_BT_656_1120, V4L2_INIT_BT_TIMINGS(640, 350, 0, V4L2_DV_HSYNC_POS_POL, 31500000, 32, 64, 96, 32, 3, 60, 0, 0, 0, V4L2_DV_BT_STD_DMT, 0) \
}
diff --git a/libc/kernel/uapi/linux/v4l2-mediabus.h b/libc/kernel/uapi/linux/v4l2-mediabus.h
index 2c2b0e7d2..266ecdcae 100644
--- a/libc/kernel/uapi/linux/v4l2-mediabus.h
+++ b/libc/kernel/uapi/linux/v4l2-mediabus.h
@@ -18,114 +18,121 @@
****************************************************************************/
#ifndef __LINUX_V4L2_MEDIABUS_H
#define __LINUX_V4L2_MEDIABUS_H
+#include <linux/media-bus-format.h>
#include <linux/types.h>
-#include <linux/videodev2.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-enum v4l2_mbus_pixelcode {
- V4L2_MBUS_FMT_FIXED = 0x0001,
- V4L2_MBUS_FMT_RGB444_2X8_PADHI_BE = 0x1001,
- V4L2_MBUS_FMT_RGB444_2X8_PADHI_LE = 0x1002,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE = 0x1003,
- V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE = 0x1004,
- V4L2_MBUS_FMT_BGR565_2X8_BE = 0x1005,
- V4L2_MBUS_FMT_BGR565_2X8_LE = 0x1006,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007,
- V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008,
- V4L2_MBUS_FMT_RGB666_1X18 = 0x1009,
- V4L2_MBUS_FMT_RGB888_1X24 = 0x100a,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_RGB888_2X12_BE = 0x100b,
- V4L2_MBUS_FMT_RGB888_2X12_LE = 0x100c,
- V4L2_MBUS_FMT_ARGB8888_1X32 = 0x100d,
- V4L2_MBUS_FMT_Y8_1X8 = 0x2001,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_UV8_1X8 = 0x2015,
- V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002,
- V4L2_MBUS_FMT_VYUY8_1_5X8 = 0x2003,
- V4L2_MBUS_FMT_YUYV8_1_5X8 = 0x2004,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_YVYU8_1_5X8 = 0x2005,
- V4L2_MBUS_FMT_UYVY8_2X8 = 0x2006,
- V4L2_MBUS_FMT_VYUY8_2X8 = 0x2007,
- V4L2_MBUS_FMT_YUYV8_2X8 = 0x2008,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_YVYU8_2X8 = 0x2009,
- V4L2_MBUS_FMT_Y10_1X10 = 0x200a,
- V4L2_MBUS_FMT_UYVY10_2X10 = 0x2018,
- V4L2_MBUS_FMT_VYUY10_2X10 = 0x2019,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_YUYV10_2X10 = 0x200b,
- V4L2_MBUS_FMT_YVYU10_2X10 = 0x200c,
- V4L2_MBUS_FMT_Y12_1X12 = 0x2013,
- V4L2_MBUS_FMT_UYVY8_1X16 = 0x200f,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_VYUY8_1X16 = 0x2010,
- V4L2_MBUS_FMT_YUYV8_1X16 = 0x2011,
- V4L2_MBUS_FMT_YVYU8_1X16 = 0x2012,
- V4L2_MBUS_FMT_YDYUYDYV8_1X16 = 0x2014,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_UYVY10_1X20 = 0x201a,
- V4L2_MBUS_FMT_VYUY10_1X20 = 0x201b,
- V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d,
- V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_YUV10_1X30 = 0x2016,
- V4L2_MBUS_FMT_AYUV8_1X32 = 0x2017,
- V4L2_MBUS_FMT_UYVY12_2X12 = 0x201c,
- V4L2_MBUS_FMT_VYUY12_2X12 = 0x201d,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_YUYV12_2X12 = 0x201e,
- V4L2_MBUS_FMT_YVYU12_2X12 = 0x201f,
- V4L2_MBUS_FMT_UYVY12_1X24 = 0x2020,
- V4L2_MBUS_FMT_VYUY12_1X24 = 0x2021,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_YUYV12_1X24 = 0x2022,
- V4L2_MBUS_FMT_YVYU12_1X24 = 0x2023,
- V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001,
- V4L2_MBUS_FMT_SGBRG8_1X8 = 0x3013,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_SGRBG8_1X8 = 0x3002,
- V4L2_MBUS_FMT_SRGGB8_1X8 = 0x3014,
- V4L2_MBUS_FMT_SBGGR10_ALAW8_1X8 = 0x3015,
- V4L2_MBUS_FMT_SGBRG10_ALAW8_1X8 = 0x3016,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_SGRBG10_ALAW8_1X8 = 0x3017,
- V4L2_MBUS_FMT_SRGGB10_ALAW8_1X8 = 0x3018,
- V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 = 0x300b,
- V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8 = 0x300c,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 = 0x3009,
- V4L2_MBUS_FMT_SRGGB10_DPCM8_1X8 = 0x300d,
- V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE = 0x3003,
- V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE = 0x3004,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE = 0x3005,
- V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE = 0x3006,
- V4L2_MBUS_FMT_SBGGR10_1X10 = 0x3007,
- V4L2_MBUS_FMT_SGBRG10_1X10 = 0x300e,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_SGRBG10_1X10 = 0x300a,
- V4L2_MBUS_FMT_SRGGB10_1X10 = 0x300f,
- V4L2_MBUS_FMT_SBGGR12_1X12 = 0x3008,
- V4L2_MBUS_FMT_SGBRG12_1X12 = 0x3010,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_SGRBG12_1X12 = 0x3011,
- V4L2_MBUS_FMT_SRGGB12_1X12 = 0x3012,
- V4L2_MBUS_FMT_JPEG_1X8 = 0x4001,
- V4L2_MBUS_FMT_S5C_UYVY_JPEG_1X8 = 0x5001,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_MBUS_FMT_AHSV8888_1X32 = 0x6001,
-};
+#include <linux/videodev2.h>
struct v4l2_mbus_framefmt {
__u32 width;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 code;
__u32 field;
__u32 colorspace;
+ __u16 ycbcr_enc;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 reserved[7];
+ __u16 quantization;
+ __u16 xfer_func;
+ __u16 reserved[11];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_MBUS_FROM_MEDIA_BUS_FMT(name) V4L2_MBUS_FMT_ ##name = MEDIA_BUS_FMT_ ##name
+enum v4l2_mbus_pixelcode {
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(FIXED),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB444_2X8_PADHI_BE),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB444_2X8_PADHI_LE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB555_2X8_PADHI_BE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB555_2X8_PADHI_LE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(BGR565_2X8_BE),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(BGR565_2X8_LE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB565_2X8_BE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB565_2X8_LE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB666_1X18),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB888_1X24),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB888_2X12_BE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(RGB888_2X12_LE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(ARGB8888_1X32),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(Y8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UV8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UYVY8_1_5X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(VYUY8_1_5X8),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUYV8_1_5X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YVYU8_1_5X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UYVY8_2X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(VYUY8_2X8),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUYV8_2X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YVYU8_2X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(Y10_1X10),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UYVY10_2X10),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(VYUY10_2X10),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUYV10_2X10),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YVYU10_2X10),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(Y12_1X12),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UYVY8_1X16),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(VYUY8_1X16),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUYV8_1X16),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YVYU8_1X16),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YDYUYDYV8_1X16),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UYVY10_1X20),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(VYUY10_1X20),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUYV10_1X20),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YVYU10_1X20),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUV10_1X30),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(AYUV8_1X32),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UYVY12_2X12),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(VYUY12_2X12),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUYV12_2X12),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YVYU12_2X12),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(UYVY12_1X24),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(VYUY12_1X24),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YUYV12_1X24),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(YVYU12_1X24),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR8_1X8),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGBRG8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGRBG8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SRGGB8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR10_ALAW8_1X8),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGBRG10_ALAW8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGRBG10_ALAW8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SRGGB10_ALAW8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR10_DPCM8_1X8),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGBRG10_DPCM8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGRBG10_DPCM8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SRGGB10_DPCM8_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR10_2X8_PADHI_BE),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR10_2X8_PADHI_LE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR10_2X8_PADLO_BE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR10_2X8_PADLO_LE),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR10_1X10),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGBRG10_1X10),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGRBG10_1X10),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SRGGB10_1X10),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SBGGR12_1X12),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGBRG12_1X12),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SGRBG12_1X12),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(SRGGB12_1X12),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(JPEG_1X8),
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(S5C_UYVY_JPEG_1X8),
+ V4L2_MBUS_FROM_MEDIA_BUS_FMT(AHSV8888_1X32),
};
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/v4l2-subdev.h b/libc/kernel/uapi/linux/v4l2-subdev.h
index 653f846b4..57b4dd7a5 100644
--- a/libc/kernel/uapi/linux/v4l2-subdev.h
+++ b/libc/kernel/uapi/linux/v4l2-subdev.h
@@ -48,71 +48,74 @@ struct v4l2_subdev_mbus_code_enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
__u32 code;
- __u32 reserved[9];
-};
+ __u32 which;
+ __u32 reserved[8];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct v4l2_subdev_frame_size_enum {
__u32 index;
__u32 pad;
- __u32 code;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 code;
__u32 min_width;
__u32 max_width;
__u32 min_height;
- __u32 max_height;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 reserved[9];
+ __u32 max_height;
+ __u32 which;
+ __u32 reserved[8];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_subdev_frame_interval {
__u32 pad;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_fract interval;
__u32 reserved[9];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_subdev_frame_interval_enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
__u32 pad;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 code;
__u32 width;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 height;
struct v4l2_fract interval;
- __u32 reserved[9];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 which;
+ __u32 reserved[8];
+};
struct v4l2_subdev_selection {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 which;
__u32 pad;
__u32 target;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_rect r;
__u32 reserved[8];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define v4l2_subdev_edid v4l2_edid
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_G_FMT _IOWR('V', 4, struct v4l2_subdev_format)
#define VIDIOC_SUBDEV_S_FMT _IOWR('V', 5, struct v4l2_subdev_format)
#define VIDIOC_SUBDEV_G_FRAME_INTERVAL _IOWR('V', 21, struct v4l2_subdev_frame_interval)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_S_FRAME_INTERVAL _IOWR('V', 22, struct v4l2_subdev_frame_interval)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_ENUM_MBUS_CODE _IOWR('V', 2, struct v4l2_subdev_mbus_code_enum)
#define VIDIOC_SUBDEV_ENUM_FRAME_SIZE _IOWR('V', 74, struct v4l2_subdev_frame_size_enum)
#define VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL _IOWR('V', 75, struct v4l2_subdev_frame_interval_enum)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_G_CROP _IOWR('V', 59, struct v4l2_subdev_crop)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_S_CROP _IOWR('V', 60, struct v4l2_subdev_crop)
#define VIDIOC_SUBDEV_G_SELECTION _IOWR('V', 61, struct v4l2_subdev_selection)
#define VIDIOC_SUBDEV_S_SELECTION _IOWR('V', 62, struct v4l2_subdev_selection)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_G_EDID _IOWR('V', 40, struct v4l2_edid)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_S_EDID _IOWR('V', 41, struct v4l2_edid)
#define VIDIOC_SUBDEV_S_DV_TIMINGS _IOWR('V', 87, struct v4l2_dv_timings)
#define VIDIOC_SUBDEV_G_DV_TIMINGS _IOWR('V', 88, struct v4l2_dv_timings)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_ENUM_DV_TIMINGS _IOWR('V', 98, struct v4l2_enum_dv_timings)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_SUBDEV_QUERY_DV_TIMINGS _IOR('V', 99, struct v4l2_dv_timings)
#define VIDIOC_SUBDEV_DV_TIMINGS_CAP _IOWR('V', 100, struct v4l2_dv_timings_cap)
#endif
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/version.h b/libc/kernel/uapi/linux/version.h
index a6c6a2fd0..7bd77536e 100644
--- a/libc/kernel/uapi/linux/version.h
+++ b/libc/kernel/uapi/linux/version.h
@@ -16,5 +16,5 @@
***
****************************************************************************
****************************************************************************/
-#define LINUX_VERSION_CODE 201226
+#define LINUX_VERSION_CODE 263169
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
diff --git a/libc/kernel/uapi/linux/vfio.h b/libc/kernel/uapi/linux/vfio.h
index 32db70ea9..1ca071f8e 100644
--- a/libc/kernel/uapi/linux/vfio.h
+++ b/libc/kernel/uapi/linux/vfio.h
@@ -29,109 +29,114 @@
#define VFIO_DMA_CC_IOMMU 4
#define VFIO_EEH 5
#define VFIO_TYPE1_NESTING_IOMMU 6
-#define VFIO_TYPE (';')
+#define VFIO_SPAPR_TCE_v2_IOMMU 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VFIO_TYPE (';')
#define VFIO_BASE 100
#define VFIO_GET_API_VERSION _IO(VFIO_TYPE, VFIO_BASE + 0)
#define VFIO_CHECK_EXTENSION _IO(VFIO_TYPE, VFIO_BASE + 1)
-#define VFIO_SET_IOMMU _IO(VFIO_TYPE, VFIO_BASE + 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VFIO_SET_IOMMU _IO(VFIO_TYPE, VFIO_BASE + 2)
struct vfio_group_status {
__u32 argsz;
__u32 flags;
-#define VFIO_GROUP_FLAGS_VIABLE (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VFIO_GROUP_FLAGS_VIABLE (1 << 0)
#define VFIO_GROUP_FLAGS_CONTAINER_SET (1 << 1)
};
#define VFIO_GROUP_GET_STATUS _IO(VFIO_TYPE, VFIO_BASE + 3)
-#define VFIO_GROUP_SET_CONTAINER _IO(VFIO_TYPE, VFIO_BASE + 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VFIO_GROUP_SET_CONTAINER _IO(VFIO_TYPE, VFIO_BASE + 4)
#define VFIO_GROUP_UNSET_CONTAINER _IO(VFIO_TYPE, VFIO_BASE + 5)
#define VFIO_GROUP_GET_DEVICE_FD _IO(VFIO_TYPE, VFIO_BASE + 6)
struct vfio_device_info {
- __u32 argsz;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 argsz;
__u32 flags;
#define VFIO_DEVICE_FLAGS_RESET (1 << 0)
#define VFIO_DEVICE_FLAGS_PCI (1 << 1)
- __u32 num_regions;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VFIO_DEVICE_FLAGS_PLATFORM (1 << 2)
+#define VFIO_DEVICE_FLAGS_AMBA (1 << 3)
+ __u32 num_regions;
__u32 num_irqs;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define VFIO_DEVICE_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 7)
struct vfio_region_info {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 argsz;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
#define VFIO_REGION_INFO_FLAG_READ (1 << 0)
#define VFIO_REGION_INFO_FLAG_WRITE (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_REGION_INFO_FLAG_MMAP (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
__u32 resv;
__u64 size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define VFIO_DEVICE_GET_REGION_INFO _IO(VFIO_TYPE, VFIO_BASE + 8)
struct vfio_irq_info {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 argsz;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
#define VFIO_IRQ_INFO_EVENTFD (1 << 0)
#define VFIO_IRQ_INFO_MASKABLE (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_IRQ_INFO_AUTOMASKED (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_IRQ_INFO_NORESIZE (1 << 3)
__u32 index;
__u32 count;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_DEVICE_GET_IRQ_INFO _IO(VFIO_TYPE, VFIO_BASE + 9)
struct vfio_irq_set {
__u32 argsz;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_IRQ_SET_DATA_NONE (1 << 0)
#define VFIO_IRQ_SET_DATA_BOOL (1 << 1)
#define VFIO_IRQ_SET_DATA_EVENTFD (1 << 2)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_IRQ_SET_ACTION_MASK (1 << 3)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_IRQ_SET_ACTION_UNMASK (1 << 4)
#define VFIO_IRQ_SET_ACTION_TRIGGER (1 << 5)
__u32 index;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 start;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count;
__u8 data[];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_DEVICE_SET_IRQS _IO(VFIO_TYPE, VFIO_BASE + 10)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_IRQ_SET_DATA_TYPE_MASK (VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_DATA_BOOL | VFIO_IRQ_SET_DATA_EVENTFD)
#define VFIO_IRQ_SET_ACTION_TYPE_MASK (VFIO_IRQ_SET_ACTION_MASK | VFIO_IRQ_SET_ACTION_UNMASK | VFIO_IRQ_SET_ACTION_TRIGGER)
#define VFIO_DEVICE_RESET _IO(VFIO_TYPE, VFIO_BASE + 11)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
VFIO_PCI_BAR0_REGION_INDEX,
VFIO_PCI_BAR1_REGION_INDEX,
VFIO_PCI_BAR2_REGION_INDEX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
VFIO_PCI_BAR3_REGION_INDEX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
VFIO_PCI_BAR4_REGION_INDEX,
VFIO_PCI_BAR5_REGION_INDEX,
VFIO_PCI_ROM_REGION_INDEX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
VFIO_PCI_CONFIG_REGION_INDEX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
VFIO_PCI_VGA_REGION_INDEX,
VFIO_PCI_NUM_REGIONS
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
VFIO_PCI_INTX_IRQ_INDEX,
VFIO_PCI_MSI_IRQ_INDEX,
VFIO_PCI_MSIX_IRQ_INDEX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
VFIO_PCI_ERR_IRQ_INDEX,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VFIO_PCI_REQ_IRQ_INDEX,
VFIO_PCI_NUM_IRQS
};
struct vfio_pci_dependent_device {
@@ -192,19 +197,39 @@ struct vfio_iommu_type1_dma_unmap {
#define VFIO_IOMMU_ENABLE _IO(VFIO_TYPE, VFIO_BASE + 15)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_IOMMU_DISABLE _IO(VFIO_TYPE, VFIO_BASE + 16)
+struct vfio_iommu_spapr_tce_ddw_info {
+ __u64 pgsizes;
+ __u32 max_dynamic_windows_supported;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 levels;
+};
struct vfio_iommu_spapr_tce_info {
__u32 argsz;
- __u32 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
+#define VFIO_IOMMU_SPAPR_INFO_DDW (1 << 0)
__u32 dma32_window_start;
__u32 dma32_window_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct vfio_iommu_spapr_tce_ddw_info ddw;
};
#define VFIO_IOMMU_SPAPR_TCE_GET_INFO _IO(VFIO_TYPE, VFIO_BASE + 12)
+struct vfio_eeh_pe_err {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 type;
+ __u32 func;
+ __u64 addr;
+ __u64 mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct vfio_eeh_pe_op {
__u32 argsz;
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 op;
+ union {
+ struct vfio_eeh_pe_err err;
+ };
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define VFIO_EEH_PE_DISABLE 0
@@ -224,6 +249,36 @@ struct vfio_eeh_pe_op {
#define VFIO_EEH_PE_RESET_HOT 6
#define VFIO_EEH_PE_RESET_FUNDAMENTAL 7
#define VFIO_EEH_PE_CONFIGURE 8
+#define VFIO_EEH_PE_INJECT_ERR 9
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VFIO_EEH_PE_OP _IO(VFIO_TYPE, VFIO_BASE + 21)
+struct vfio_iommu_spapr_register_memory {
+ __u32 argsz;
+ __u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 vaddr;
+ __u64 size;
+};
+#define VFIO_IOMMU_SPAPR_REGISTER_MEMORY _IO(VFIO_TYPE, VFIO_BASE + 17)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VFIO_IOMMU_SPAPR_UNREGISTER_MEMORY _IO(VFIO_TYPE, VFIO_BASE + 18)
+struct vfio_iommu_spapr_tce_create {
+ __u32 argsz;
+ __u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 page_shift;
+ __u64 window_size;
+ __u32 levels;
+ __u64 start_addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define VFIO_IOMMU_SPAPR_TCE_CREATE _IO(VFIO_TYPE, VFIO_BASE + 19)
+struct vfio_iommu_spapr_tce_remove {
+ __u32 argsz;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flags;
+ __u64 start_addr;
+};
+#define VFIO_IOMMU_SPAPR_TCE_REMOVE _IO(VFIO_TYPE, VFIO_BASE + 20)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/vhost.h b/libc/kernel/uapi/linux/vhost.h
index 0a66e7aae..f5e8f4f52 100644
--- a/libc/kernel/uapi/linux/vhost.h
+++ b/libc/kernel/uapi/linux/vhost.h
@@ -76,6 +76,11 @@ struct vhost_memory {
#define VHOST_SET_VRING_BASE _IOW(VHOST_VIRTIO, 0x12, struct vhost_vring_state)
#define VHOST_GET_VRING_BASE _IOWR(VHOST_VIRTIO, 0x12, struct vhost_vring_state)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VHOST_VRING_LITTLE_ENDIAN 0
+#define VHOST_VRING_BIG_ENDIAN 1
+#define VHOST_SET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x13, struct vhost_vring_state)
+#define VHOST_GET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x14, struct vhost_vring_state)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VHOST_SET_VRING_KICK _IOW(VHOST_VIRTIO, 0x20, struct vhost_vring_file)
#define VHOST_SET_VRING_CALL _IOW(VHOST_VIRTIO, 0x21, struct vhost_vring_file)
#define VHOST_SET_VRING_ERR _IOW(VHOST_VIRTIO, 0x22, struct vhost_vring_file)
diff --git a/libc/kernel/uapi/linux/videodev2.h b/libc/kernel/uapi/linux/videodev2.h
index df3ebc35f..ab6a3cf05 100644
--- a/libc/kernel/uapi/linux/videodev2.h
+++ b/libc/kernel/uapi/linux/videodev2.h
@@ -66,680 +66,740 @@ enum v4l2_buf_type {
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE = 10,
V4L2_BUF_TYPE_SDR_CAPTURE = 11,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_BUF_TYPE_SDR_OUTPUT = 12,
V4L2_BUF_TYPE_PRIVATE = 0x80,
};
#define V4L2_TYPE_IS_MULTIPLANAR(type) ((type) == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
-#define V4L2_TYPE_IS_OUTPUT(type) ((type) == V4L2_BUF_TYPE_VIDEO_OUTPUT || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE || (type) == V4L2_BUF_TYPE_VIDEO_OVERLAY || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY || (type) == V4L2_BUF_TYPE_VBI_OUTPUT || (type) == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_TYPE_IS_OUTPUT(type) ((type) == V4L2_BUF_TYPE_VIDEO_OUTPUT || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE || (type) == V4L2_BUF_TYPE_VIDEO_OVERLAY || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY || (type) == V4L2_BUF_TYPE_VBI_OUTPUT || (type) == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT || (type) == V4L2_BUF_TYPE_SDR_OUTPUT)
enum v4l2_tuner_type {
V4L2_TUNER_RADIO = 1,
V4L2_TUNER_ANALOG_TV = 2,
- V4L2_TUNER_DIGITAL_TV = 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- V4L2_TUNER_ADC = 4,
+ V4L2_TUNER_DIGITAL_TV = 3,
+ V4L2_TUNER_SDR = 4,
V4L2_TUNER_RF = 5,
};
-enum v4l2_memory {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_TUNER_ADC V4L2_TUNER_SDR
+enum v4l2_memory {
V4L2_MEMORY_MMAP = 1,
V4L2_MEMORY_USERPTR = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_MEMORY_OVERLAY = 3,
V4L2_MEMORY_DMABUF = 4,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum v4l2_colorspace {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_COLORSPACE_DEFAULT = 0,
V4L2_COLORSPACE_SMPTE170M = 1,
V4L2_COLORSPACE_SMPTE240M = 2,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_COLORSPACE_REC709 = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_COLORSPACE_BT878 = 4,
V4L2_COLORSPACE_470_SYSTEM_M = 5,
V4L2_COLORSPACE_470_SYSTEM_BG = 6,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_COLORSPACE_JPEG = 7,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_COLORSPACE_SRGB = 8,
+ V4L2_COLORSPACE_ADOBERGB = 9,
+ V4L2_COLORSPACE_BT2020 = 10,
+ V4L2_COLORSPACE_RAW = 11,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_COLORSPACE_DCI_P3 = 12,
};
-enum v4l2_priority {
+#define V4L2_MAP_COLORSPACE_DEFAULT(is_sdtv,is_hdtv) ((is_sdtv) ? V4L2_COLORSPACE_SMPTE170M : ((is_hdtv) ? V4L2_COLORSPACE_REC709 : V4L2_COLORSPACE_SRGB))
+enum v4l2_xfer_func {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_XFER_FUNC_DEFAULT = 0,
+ V4L2_XFER_FUNC_709 = 1,
+ V4L2_XFER_FUNC_SRGB = 2,
+ V4L2_XFER_FUNC_ADOBERGB = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_XFER_FUNC_SMPTE240M = 4,
+ V4L2_XFER_FUNC_NONE = 5,
+ V4L2_XFER_FUNC_DCI_P3 = 6,
+ V4L2_XFER_FUNC_SMPTE2084 = 7,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define V4L2_MAP_XFER_FUNC_DEFAULT(colsp) ((colsp) == V4L2_COLORSPACE_ADOBERGB ? V4L2_XFER_FUNC_ADOBERGB : ((colsp) == V4L2_COLORSPACE_SMPTE240M ? V4L2_XFER_FUNC_SMPTE240M : ((colsp) == V4L2_COLORSPACE_DCI_P3 ? V4L2_XFER_FUNC_DCI_P3 : ((colsp) == V4L2_COLORSPACE_RAW ? V4L2_XFER_FUNC_NONE : ((colsp) == V4L2_COLORSPACE_SRGB || (colsp) == V4L2_COLORSPACE_JPEG ? V4L2_XFER_FUNC_SRGB : V4L2_XFER_FUNC_709)))))
+enum v4l2_ycbcr_encoding {
+ V4L2_YCBCR_ENC_DEFAULT = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_YCBCR_ENC_601 = 1,
+ V4L2_YCBCR_ENC_709 = 2,
+ V4L2_YCBCR_ENC_XV601 = 3,
+ V4L2_YCBCR_ENC_XV709 = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_YCBCR_ENC_SYCC = 5,
+ V4L2_YCBCR_ENC_BT2020 = 6,
+ V4L2_YCBCR_ENC_BT2020_CONST_LUM = 7,
+ V4L2_YCBCR_ENC_SMPTE240M = 8,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define V4L2_MAP_YCBCR_ENC_DEFAULT(colsp) (((colsp) == V4L2_COLORSPACE_REC709 || (colsp) == V4L2_COLORSPACE_DCI_P3) ? V4L2_YCBCR_ENC_709 : ((colsp) == V4L2_COLORSPACE_BT2020 ? V4L2_YCBCR_ENC_BT2020 : ((colsp) == V4L2_COLORSPACE_SMPTE240M ? V4L2_YCBCR_ENC_SMPTE240M : V4L2_YCBCR_ENC_601)))
+enum v4l2_quantization {
+ V4L2_QUANTIZATION_DEFAULT = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_QUANTIZATION_FULL_RANGE = 1,
+ V4L2_QUANTIZATION_LIM_RANGE = 2,
+};
+#define V4L2_MAP_QUANTIZATION_DEFAULT(is_rgb,colsp,ycbcr_enc) (((is_rgb) && (colsp) == V4L2_COLORSPACE_BT2020) ? V4L2_QUANTIZATION_LIM_RANGE : (((is_rgb) || (ycbcr_enc) == V4L2_YCBCR_ENC_XV601 || (ycbcr_enc) == V4L2_YCBCR_ENC_XV709 || (colsp) == V4L2_COLORSPACE_JPEG) ? V4L2_QUANTIZATION_FULL_RANGE : V4L2_QUANTIZATION_LIM_RANGE))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum v4l2_priority {
V4L2_PRIORITY_UNSET = 0,
V4L2_PRIORITY_BACKGROUND = 1,
V4L2_PRIORITY_INTERACTIVE = 2,
- V4L2_PRIORITY_RECORD = 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ V4L2_PRIORITY_RECORD = 3,
V4L2_PRIORITY_DEFAULT = V4L2_PRIORITY_INTERACTIVE,
};
struct v4l2_rect {
- __s32 left;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 left;
__s32 top;
__u32 width;
__u32 height;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct v4l2_fract {
__u32 numerator;
__u32 denominator;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct v4l2_capability {
__u8 driver[16];
__u8 card[32];
- __u8 bus_info[32];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bus_info[32];
__u32 version;
__u32 capabilities;
__u32 device_caps;
- __u32 reserved[3];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved[3];
};
#define V4L2_CAP_VIDEO_CAPTURE 0x00000001
#define V4L2_CAP_VIDEO_OUTPUT 0x00000002
-#define V4L2_CAP_VIDEO_OVERLAY 0x00000004
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CAP_VIDEO_OVERLAY 0x00000004
#define V4L2_CAP_VBI_CAPTURE 0x00000010
#define V4L2_CAP_VBI_OUTPUT 0x00000020
#define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040
-#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080
#define V4L2_CAP_RDS_CAPTURE 0x00000100
#define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200
#define V4L2_CAP_HW_FREQ_SEEK 0x00000400
-#define V4L2_CAP_RDS_OUTPUT 0x00000800
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CAP_RDS_OUTPUT 0x00000800
#define V4L2_CAP_VIDEO_CAPTURE_MPLANE 0x00001000
#define V4L2_CAP_VIDEO_OUTPUT_MPLANE 0x00002000
#define V4L2_CAP_VIDEO_M2M_MPLANE 0x00004000
-#define V4L2_CAP_VIDEO_M2M 0x00008000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CAP_VIDEO_M2M 0x00008000
#define V4L2_CAP_TUNER 0x00010000
#define V4L2_CAP_AUDIO 0x00020000
#define V4L2_CAP_RADIO 0x00040000
-#define V4L2_CAP_MODULATOR 0x00080000
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CAP_MODULATOR 0x00080000
#define V4L2_CAP_SDR_CAPTURE 0x00100000
#define V4L2_CAP_EXT_PIX_FORMAT 0x00200000
+#define V4L2_CAP_SDR_OUTPUT 0x00400000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CAP_READWRITE 0x01000000
#define V4L2_CAP_ASYNCIO 0x02000000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CAP_STREAMING 0x04000000
#define V4L2_CAP_DEVICE_CAPS 0x80000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_pix_format {
__u32 width;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 height;
__u32 pixelformat;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 field;
__u32 bytesperline;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 sizeimage;
__u32 colorspace;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 priv;
__u32 flags;
+ __u32 ycbcr_enc;
+ __u32 quantization;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 xfer_func;
};
#define V4L2_PIX_FMT_RGB332 v4l2_fourcc('R', 'G', 'B', '1')
#define V4L2_PIX_FMT_RGB444 v4l2_fourcc('R', '4', '4', '4')
-#define V4L2_PIX_FMT_ARGB444 v4l2_fourcc('A', 'R', '1', '2')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_ARGB444 v4l2_fourcc('A', 'R', '1', '2')
#define V4L2_PIX_FMT_XRGB444 v4l2_fourcc('X', 'R', '1', '2')
#define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R', 'G', 'B', 'O')
#define V4L2_PIX_FMT_ARGB555 v4l2_fourcc('A', 'R', '1', '5')
-#define V4L2_PIX_FMT_XRGB555 v4l2_fourcc('X', 'R', '1', '5')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_XRGB555 v4l2_fourcc('X', 'R', '1', '5')
#define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R', 'G', 'B', 'P')
#define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R', 'G', 'B', 'Q')
#define V4L2_PIX_FMT_ARGB555X v4l2_fourcc_be('A', 'R', '1', '5')
-#define V4L2_PIX_FMT_XRGB555X v4l2_fourcc_be('X', 'R', '1', '5')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_XRGB555X v4l2_fourcc_be('X', 'R', '1', '5')
#define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R', 'G', 'B', 'R')
#define V4L2_PIX_FMT_BGR666 v4l2_fourcc('B', 'G', 'R', 'H')
#define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B', 'G', 'R', '3')
-#define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R', 'G', 'B', '3')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R', 'G', 'B', '3')
#define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B', 'G', 'R', '4')
#define V4L2_PIX_FMT_ABGR32 v4l2_fourcc('A', 'R', '2', '4')
#define V4L2_PIX_FMT_XBGR32 v4l2_fourcc('X', 'R', '2', '4')
-#define V4L2_PIX_FMT_RGB32 v4l2_fourcc('R', 'G', 'B', '4')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_RGB32 v4l2_fourcc('R', 'G', 'B', '4')
#define V4L2_PIX_FMT_ARGB32 v4l2_fourcc('B', 'A', '2', '4')
#define V4L2_PIX_FMT_XRGB32 v4l2_fourcc('B', 'X', '2', '4')
#define V4L2_PIX_FMT_GREY v4l2_fourcc('G', 'R', 'E', 'Y')
-#define V4L2_PIX_FMT_Y4 v4l2_fourcc('Y', '0', '4', ' ')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_Y4 v4l2_fourcc('Y', '0', '4', ' ')
#define V4L2_PIX_FMT_Y6 v4l2_fourcc('Y', '0', '6', ' ')
#define V4L2_PIX_FMT_Y10 v4l2_fourcc('Y', '1', '0', ' ')
#define V4L2_PIX_FMT_Y12 v4l2_fourcc('Y', '1', '2', ' ')
-#define V4L2_PIX_FMT_Y16 v4l2_fourcc('Y', '1', '6', ' ')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_Y16 v4l2_fourcc('Y', '1', '6', ' ')
+#define V4L2_PIX_FMT_Y16_BE v4l2_fourcc_be('Y', '1', '6', ' ')
#define V4L2_PIX_FMT_Y10BPACK v4l2_fourcc('Y', '1', '0', 'B')
#define V4L2_PIX_FMT_PAL8 v4l2_fourcc('P', 'A', 'L', '8')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_UV8 v4l2_fourcc('U', 'V', '8', ' ')
#define V4L2_PIX_FMT_YVU410 v4l2_fourcc('Y', 'V', 'U', '9')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y', 'V', '1', '2')
#define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y', 'U', 'Y', 'V')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y', 'Y', 'U', 'V')
#define V4L2_PIX_FMT_YVYU v4l2_fourcc('Y', 'V', 'Y', 'U')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_UYVY v4l2_fourcc('U', 'Y', 'V', 'Y')
#define V4L2_PIX_FMT_VYUY v4l2_fourcc('V', 'Y', 'U', 'Y')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2', 'P')
#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1', 'P')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y', '4', '1', 'P')
#define V4L2_PIX_FMT_YUV444 v4l2_fourcc('Y', '4', '4', '4')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_YUV555 v4l2_fourcc('Y', 'U', 'V', 'O')
#define V4L2_PIX_FMT_YUV565 v4l2_fourcc('Y', 'U', 'V', 'P')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_YUV32 v4l2_fourcc('Y', 'U', 'V', '4')
#define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y', 'U', '1', '2')
#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H', 'I', '2', '4')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H', 'M', '1', '2')
#define V4L2_PIX_FMT_M420 v4l2_fourcc('M', '4', '2', '0')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2')
#define V4L2_PIX_FMT_NV21 v4l2_fourcc('N', 'V', '2', '1')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_NV16 v4l2_fourcc('N', 'V', '1', '6')
#define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4')
#define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2')
#define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_NV16M v4l2_fourcc('N', 'M', '1', '6')
#define V4L2_PIX_FMT_NV61M v4l2_fourcc('N', 'M', '6', '1')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_NV12MT v4l2_fourcc('T', 'M', '1', '2')
#define V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc('V', 'M', '1', '2')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_YUV420M v4l2_fourcc('Y', 'M', '1', '2')
#define V4L2_PIX_FMT_YVU420M v4l2_fourcc('Y', 'M', '2', '1')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B', 'A', '8', '1')
#define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G', 'B', 'R', 'G')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SGRBG8 v4l2_fourcc('G', 'R', 'B', 'G')
#define V4L2_PIX_FMT_SRGGB8 v4l2_fourcc('R', 'G', 'G', 'B')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SBGGR10 v4l2_fourcc('B', 'G', '1', '0')
#define V4L2_PIX_FMT_SGBRG10 v4l2_fourcc('G', 'B', '1', '0')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B', 'A', '1', '0')
#define V4L2_PIX_FMT_SRGGB10 v4l2_fourcc('R', 'G', '1', '0')
+#define V4L2_PIX_FMT_SBGGR10P v4l2_fourcc('p', 'B', 'A', 'A')
+#define V4L2_PIX_FMT_SGBRG10P v4l2_fourcc('p', 'G', 'A', 'A')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define V4L2_PIX_FMT_SBGGR12 v4l2_fourcc('B', 'G', '1', '2')
-#define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G', 'B', '1', '2')
-#define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B', 'A', '1', '2')
-#define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R', 'G', '1', '2')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_SGRBG10P v4l2_fourcc('p', 'g', 'A', 'A')
+#define V4L2_PIX_FMT_SRGGB10P v4l2_fourcc('p', 'R', 'A', 'A')
#define V4L2_PIX_FMT_SBGGR10ALAW8 v4l2_fourcc('a', 'B', 'A', '8')
#define V4L2_PIX_FMT_SGBRG10ALAW8 v4l2_fourcc('a', 'G', 'A', '8')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SGRBG10ALAW8 v4l2_fourcc('a', 'g', 'A', '8')
#define V4L2_PIX_FMT_SRGGB10ALAW8 v4l2_fourcc('a', 'R', 'A', '8')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SBGGR10DPCM8 v4l2_fourcc('b', 'B', 'A', '8')
#define V4L2_PIX_FMT_SGBRG10DPCM8 v4l2_fourcc('b', 'G', 'A', '8')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SGRBG10DPCM8 v4l2_fourcc('B', 'D', '1', '0')
#define V4L2_PIX_FMT_SRGGB10DPCM8 v4l2_fourcc('b', 'R', 'A', '8')
+#define V4L2_PIX_FMT_SBGGR12 v4l2_fourcc('B', 'G', '1', '2')
+#define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G', 'B', '1', '2')
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B', 'A', '1', '2')
+#define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R', 'G', '1', '2')
#define V4L2_PIX_FMT_SBGGR16 v4l2_fourcc('B', 'Y', 'R', '2')
#define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M', 'J', 'P', 'G')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_JPEG v4l2_fourcc('J', 'P', 'E', 'G')
#define V4L2_PIX_FMT_DV v4l2_fourcc('d', 'v', 's', 'd')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_MPEG v4l2_fourcc('M', 'P', 'E', 'G')
#define V4L2_PIX_FMT_H264 v4l2_fourcc('H', '2', '6', '4')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_H264_NO_SC v4l2_fourcc('A', 'V', 'C', '1')
#define V4L2_PIX_FMT_H264_MVC v4l2_fourcc('M', '2', '6', '4')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_H263 v4l2_fourcc('H', '2', '6', '3')
#define V4L2_PIX_FMT_MPEG1 v4l2_fourcc('M', 'P', 'G', '1')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_MPEG2 v4l2_fourcc('M', 'P', 'G', '2')
#define V4L2_PIX_FMT_MPEG4 v4l2_fourcc('M', 'P', 'G', '4')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_XVID v4l2_fourcc('X', 'V', 'I', 'D')
#define V4L2_PIX_FMT_VC1_ANNEX_G v4l2_fourcc('V', 'C', '1', 'G')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_VC1_ANNEX_L v4l2_fourcc('V', 'C', '1', 'L')
#define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_CPIA1 v4l2_fourcc('C', 'P', 'I', 'A')
#define V4L2_PIX_FMT_WNVA v4l2_fourcc('W', 'N', 'V', 'A')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SN9C10X v4l2_fourcc('S', '9', '1', '0')
#define V4L2_PIX_FMT_SN9C20X_I420 v4l2_fourcc('S', '9', '2', '0')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_PWC1 v4l2_fourcc('P', 'W', 'C', '1')
#define V4L2_PIX_FMT_PWC2 v4l2_fourcc('P', 'W', 'C', '2')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_ET61X251 v4l2_fourcc('E', '6', '2', '5')
#define V4L2_PIX_FMT_SPCA501 v4l2_fourcc('S', '5', '0', '1')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SPCA505 v4l2_fourcc('S', '5', '0', '5')
#define V4L2_PIX_FMT_SPCA508 v4l2_fourcc('S', '5', '0', '8')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SPCA561 v4l2_fourcc('S', '5', '6', '1')
#define V4L2_PIX_FMT_PAC207 v4l2_fourcc('P', '2', '0', '7')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_MR97310A v4l2_fourcc('M', '3', '1', '0')
#define V4L2_PIX_FMT_JL2005BCD v4l2_fourcc('J', 'L', '2', '0')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SN9C2028 v4l2_fourcc('S', 'O', 'N', 'X')
#define V4L2_PIX_FMT_SQ905C v4l2_fourcc('9', '0', '5', 'C')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_PJPG v4l2_fourcc('P', 'J', 'P', 'G')
#define V4L2_PIX_FMT_OV511 v4l2_fourcc('O', '5', '1', '1')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_OV518 v4l2_fourcc('O', '5', '1', '8')
#define V4L2_PIX_FMT_STV0680 v4l2_fourcc('S', '6', '8', '0')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_TM6000 v4l2_fourcc('T', 'M', '6', '0')
#define V4L2_PIX_FMT_CIT_YYVYUY v4l2_fourcc('C', 'I', 'T', 'V')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_KONICA420 v4l2_fourcc('K', 'O', 'N', 'I')
#define V4L2_PIX_FMT_JPGL v4l2_fourcc('J', 'P', 'G', 'L')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_SE401 v4l2_fourcc('S', '4', '0', '1')
#define V4L2_PIX_FMT_S5C_UYVY_JPG v4l2_fourcc('S', '5', 'C', 'I')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_SDR_FMT_CU8 v4l2_fourcc('C', 'U', '0', '8')
#define V4L2_SDR_FMT_CU16LE v4l2_fourcc('C', 'U', '1', '6')
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_SDR_FMT_CS8 v4l2_fourcc('C', 'S', '0', '8')
#define V4L2_SDR_FMT_CS14LE v4l2_fourcc('C', 'S', '1', '4')
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_SDR_FMT_RU12LE v4l2_fourcc('R', 'U', '1', '2')
#define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_PIX_FMT_FLAG_PREMUL_ALPHA 0x00000001
struct v4l2_fmtdesc {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
__u32 type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u8 description[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pixelformat;
__u32 reserved[4];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_FMT_FLAG_COMPRESSED 0x0001
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FMT_FLAG_EMULATED 0x0002
enum v4l2_frmsizetypes {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_FRMSIZE_TYPE_DISCRETE = 1,
V4L2_FRMSIZE_TYPE_CONTINUOUS = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_FRMSIZE_TYPE_STEPWISE = 3,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_frmsize_discrete {
__u32 width;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 height;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_frmsize_stepwise {
__u32 min_width;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_width;
__u32 step_width;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 min_height;
__u32 max_height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 step_height;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_frmsizeenum {
__u32 index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pixel_format;
__u32 type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct v4l2_frmsize_discrete discrete;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_frmsize_stepwise stepwise;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[2];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_frmivaltypes {
V4L2_FRMIVAL_TYPE_DISCRETE = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_FRMIVAL_TYPE_CONTINUOUS = 2,
V4L2_FRMIVAL_TYPE_STEPWISE = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_frmival_stepwise {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_fract min;
struct v4l2_fract max;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_fract step;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_frmivalenum {
__u32 index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pixel_format;
__u32 width;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 height;
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct v4l2_fract discrete;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_frmival_stepwise stepwise;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[2];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_timecode {
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u8 frames;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 seconds;
__u8 minutes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 hours;
__u8 userbits[4];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_TC_TYPE_24FPS 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_TC_TYPE_25FPS 2
#define V4L2_TC_TYPE_30FPS 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_TC_TYPE_50FPS 4
#define V4L2_TC_TYPE_60FPS 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_TC_FLAG_DROPFRAME 0x0001
#define V4L2_TC_FLAG_COLORFRAME 0x0002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_TC_USERBITS_field 0x000C
#define V4L2_TC_USERBITS_USERDEFINED 0x0000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_TC_USERBITS_8BITCHARS 0x0008
struct v4l2_jpegcompression {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int quality;
int APPn;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int APP_len;
char APP_data[60];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int COM_len;
char COM_data[60];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 jpeg_markers;
#define V4L2_JPEG_MARKER_DHT (1 << 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_JPEG_MARKER_DQT (1 << 4)
#define V4L2_JPEG_MARKER_DRI (1 << 5)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_JPEG_MARKER_COM (1 << 6)
#define V4L2_JPEG_MARKER_APP (1 << 7)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_requestbuffers {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count;
__u32 type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 memory;
__u32 reserved[2];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_plane {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 bytesused;
__u32 length;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
__u32 mem_offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long userptr;
__s32 fd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} m;
__u32 data_offset;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[11];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_buffer {
__u32 index;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
__u32 bytesused;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u32 field;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct timeval timestamp;
struct v4l2_timecode timecode;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 sequence;
__u32 memory;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
__u32 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned long userptr;
struct v4l2_plane * planes;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 fd;
} m;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 length;
__u32 reserved2;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_MAPPED 0x00000001
#define V4L2_BUF_FLAG_QUEUED 0x00000002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_DONE 0x00000004
#define V4L2_BUF_FLAG_KEYFRAME 0x00000008
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_PFRAME 0x00000010
#define V4L2_BUF_FLAG_BFRAME 0x00000020
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_ERROR 0x00000040
#define V4L2_BUF_FLAG_TIMECODE 0x00000100
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_PREPARED 0x00000400
#define V4L2_BUF_FLAG_NO_CACHE_INVALIDATE 0x00000800
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_NO_CACHE_CLEAN 0x00001000
#define V4L2_BUF_FLAG_TIMESTAMP_MASK 0x0000e000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_TIMESTAMP_UNKNOWN 0x00000000
#define V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC 0x00002000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_TIMESTAMP_COPY 0x00004000
#define V4L2_BUF_FLAG_TSTAMP_SRC_MASK 0x00070000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_BUF_FLAG_TSTAMP_SRC_EOF 0x00000000
#define V4L2_BUF_FLAG_TSTAMP_SRC_SOE 0x00010000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_BUF_FLAG_LAST 0x00100000
struct v4l2_exportbuffer {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
__u32 index;
__u32 plane;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 fd;
__u32 reserved[11];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_framebuffer {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 capability;
__u32 flags;
void * base;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 width;
__u32 height;
__u32 pixelformat;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 field;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 bytesperline;
__u32 sizeimage;
__u32 colorspace;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 priv;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} fmt;
};
#define V4L2_FBUF_CAP_EXTERNOVERLAY 0x0001
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_CAP_CHROMAKEY 0x0002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_CAP_LIST_CLIPPING 0x0004
#define V4L2_FBUF_CAP_BITMAP_CLIPPING 0x0008
#define V4L2_FBUF_CAP_LOCAL_ALPHA 0x0010
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_CAP_GLOBAL_ALPHA 0x0020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_CAP_LOCAL_INV_ALPHA 0x0040
#define V4L2_FBUF_CAP_SRC_CHROMAKEY 0x0080
#define V4L2_FBUF_FLAG_PRIMARY 0x0001
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_FLAG_OVERLAY 0x0002
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_FLAG_CHROMAKEY 0x0004
#define V4L2_FBUF_FLAG_LOCAL_ALPHA 0x0008
#define V4L2_FBUF_FLAG_GLOBAL_ALPHA 0x0010
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_FLAG_LOCAL_INV_ALPHA 0x0020
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_FBUF_FLAG_SRC_CHROMAKEY 0x0040
struct v4l2_clip {
struct v4l2_rect c;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_clip __user * next;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_window {
struct v4l2_rect w;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 field;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 chromakey;
struct v4l2_clip __user * clips;
__u32 clipcount;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
void __user * bitmap;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 global_alpha;
};
struct v4l2_captureparm {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 capability;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 capturemode;
struct v4l2_fract timeperframe;
__u32 extendedmode;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 readbuffers;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[4];
};
#define V4L2_MODE_HIGHQUALITY 0x0001
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CAP_TIMEPERFRAME 0x1000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_outputparm {
__u32 capability;
__u32 outputmode;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_fract timeperframe;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 extendedmode;
__u32 writebuffers;
__u32 reserved[4];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_cropcap {
__u32 type;
struct v4l2_rect bounds;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_rect defrect;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_fract pixelaspect;
};
struct v4l2_crop {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_rect c;
};
struct v4l2_selection {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 target;
__u32 flags;
struct v4l2_rect r;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[9];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
typedef __u64 v4l2_std_id;
#define V4L2_STD_PAL_B ((v4l2_std_id) 0x00000001)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_B1 ((v4l2_std_id) 0x00000002)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_G ((v4l2_std_id) 0x00000004)
#define V4L2_STD_PAL_H ((v4l2_std_id) 0x00000008)
#define V4L2_STD_PAL_I ((v4l2_std_id) 0x00000010)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_D ((v4l2_std_id) 0x00000020)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_D1 ((v4l2_std_id) 0x00000040)
#define V4L2_STD_PAL_K ((v4l2_std_id) 0x00000080)
#define V4L2_STD_PAL_M ((v4l2_std_id) 0x00000100)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_N ((v4l2_std_id) 0x00000200)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_Nc ((v4l2_std_id) 0x00000400)
#define V4L2_STD_PAL_60 ((v4l2_std_id) 0x00000800)
#define V4L2_STD_NTSC_M ((v4l2_std_id) 0x00001000)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_NTSC_M_JP ((v4l2_std_id) 0x00002000)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_NTSC_443 ((v4l2_std_id) 0x00004000)
#define V4L2_STD_NTSC_M_KR ((v4l2_std_id) 0x00008000)
#define V4L2_STD_SECAM_B ((v4l2_std_id) 0x00010000)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_SECAM_D ((v4l2_std_id) 0x00020000)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_SECAM_G ((v4l2_std_id) 0x00040000)
#define V4L2_STD_SECAM_H ((v4l2_std_id) 0x00080000)
#define V4L2_STD_SECAM_K ((v4l2_std_id) 0x00100000)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_SECAM_K1 ((v4l2_std_id) 0x00200000)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_SECAM_L ((v4l2_std_id) 0x00400000)
#define V4L2_STD_SECAM_LC ((v4l2_std_id) 0x00800000)
#define V4L2_STD_ATSC_8_VSB ((v4l2_std_id) 0x01000000)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_ATSC_16_VSB ((v4l2_std_id) 0x02000000)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_NTSC (V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_NTSC_M_KR)
#define V4L2_STD_SECAM_DK (V4L2_STD_SECAM_D | V4L2_STD_SECAM_K | V4L2_STD_SECAM_K1)
#define V4L2_STD_SECAM (V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H | V4L2_STD_SECAM_DK | V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_BG (V4L2_STD_PAL_B | V4L2_STD_PAL_B1 | V4L2_STD_PAL_G)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_PAL_DK (V4L2_STD_PAL_D | V4L2_STD_PAL_D1 | V4L2_STD_PAL_K)
#define V4L2_STD_PAL (V4L2_STD_PAL_BG | V4L2_STD_PAL_DK | V4L2_STD_PAL_H | V4L2_STD_PAL_I)
#define V4L2_STD_B (V4L2_STD_PAL_B | V4L2_STD_PAL_B1 | V4L2_STD_SECAM_B)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_G (V4L2_STD_PAL_G | V4L2_STD_SECAM_G)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_H (V4L2_STD_PAL_H | V4L2_STD_SECAM_H)
#define V4L2_STD_L (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)
#define V4L2_STD_GH (V4L2_STD_G | V4L2_STD_H)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_DK (V4L2_STD_PAL_DK | V4L2_STD_SECAM_DK)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_BG (V4L2_STD_B | V4L2_STD_G)
#define V4L2_STD_MN (V4L2_STD_PAL_M | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc | V4L2_STD_NTSC)
#define V4L2_STD_MTS (V4L2_STD_NTSC_M | V4L2_STD_PAL_M | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_525_60 (V4L2_STD_PAL_M | V4L2_STD_PAL_60 | V4L2_STD_NTSC | V4L2_STD_NTSC_443)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_625_50 (V4L2_STD_PAL | V4L2_STD_PAL_N | V4L2_STD_PAL_Nc | V4L2_STD_SECAM)
#define V4L2_STD_ATSC (V4L2_STD_ATSC_8_VSB | V4L2_STD_ATSC_16_VSB)
#define V4L2_STD_UNKNOWN 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_STD_ALL (V4L2_STD_525_60 | V4L2_STD_625_50)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_standard {
__u32 index;
v4l2_std_id id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 name[24];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_fract frameperiod;
__u32 framelines;
__u32 reserved[4];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_bt_timings {
__u32 width;
__u32 height;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 interlaced;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 polarities;
__u64 pixelclock;
__u32 hfrontporch;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 hsync;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 hbackporch;
__u32 vfrontporch;
__u32 vsync;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 vbackporch;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 il_vfrontporch;
__u32 il_vsync;
__u32 il_vbackporch;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 standards;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u32 reserved[14];
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_PROGRESSIVE 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_INTERLACED 1
#define V4L2_DV_VSYNC_POS_POL 0x00000001
#define V4L2_DV_HSYNC_POS_POL 0x00000002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_BT_STD_CEA861 (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_BT_STD_DMT (1 << 1)
#define V4L2_DV_BT_STD_CVT (1 << 2)
#define V4L2_DV_BT_STD_GTF (1 << 3)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_FL_REDUCED_BLANKING (1 << 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_FL_CAN_REDUCE_FPS (1 << 1)
#define V4L2_DV_FL_REDUCED_FPS (1 << 2)
#define V4L2_DV_FL_HALF_LINE (1 << 3)
+#define V4L2_DV_FL_IS_CE_VIDEO (1 << 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_DV_BT_BLANKING_WIDTH(bt) ((bt)->hfrontporch + (bt)->hsync + (bt)->hbackporch)
#define V4L2_DV_BT_FRAME_WIDTH(bt) ((bt)->width + V4L2_DV_BT_BLANKING_WIDTH(bt))
@@ -829,167 +889,172 @@ struct v4l2_input {
#define V4L2_IN_CAP_DV_TIMINGS 0x00000002
#define V4L2_IN_CAP_CUSTOM_TIMINGS V4L2_IN_CAP_DV_TIMINGS
#define V4L2_IN_CAP_STD 0x00000004
-struct v4l2_output {
+#define V4L2_IN_CAP_NATIVE_SIZE 0x00000008
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct v4l2_output {
__u32 index;
__u8 name[32];
__u32 type;
- __u32 audioset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 audioset;
__u32 modulator;
v4l2_std_id std;
__u32 capabilities;
- __u32 reserved[3];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved[3];
};
#define V4L2_OUTPUT_TYPE_MODULATOR 1
#define V4L2_OUTPUT_TYPE_ANALOG 2
-#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
#define V4L2_OUT_CAP_DV_TIMINGS 0x00000002
#define V4L2_OUT_CAP_CUSTOM_TIMINGS V4L2_OUT_CAP_DV_TIMINGS
#define V4L2_OUT_CAP_STD 0x00000004
-struct v4l2_control {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_OUT_CAP_NATIVE_SIZE 0x00000008
+struct v4l2_control {
__u32 id;
__s32 value;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_ext_control {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 id;
__u32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved2[1];
union {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 value;
__s64 value64;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char __user * string;
__u8 __user * p_u8;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 __user * p_u16;
__u32 __user * p_u32;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
void __user * ptr;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct v4l2_ext_controls {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ctrl_class;
__u32 count;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 error_idx;
__u32 reserved[2];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_ext_control * controls;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_ID_MASK (0x0fffffff)
#define V4L2_CTRL_ID2CLASS(id) ((id) & 0x0fff0000UL)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000)
#define V4L2_CTRL_MAX_DIMS (4)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum v4l2_ctrl_type {
V4L2_CTRL_TYPE_INTEGER = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CTRL_TYPE_BOOLEAN = 2,
V4L2_CTRL_TYPE_MENU = 3,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CTRL_TYPE_BUTTON = 4,
V4L2_CTRL_TYPE_INTEGER64 = 5,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CTRL_TYPE_CTRL_CLASS = 6,
V4L2_CTRL_TYPE_STRING = 7,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CTRL_TYPE_BITMASK = 8,
V4L2_CTRL_TYPE_INTEGER_MENU = 9,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CTRL_COMPOUND_TYPES = 0x0100,
V4L2_CTRL_TYPE_U8 = 0x0100,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
V4L2_CTRL_TYPE_U16 = 0x0101,
V4L2_CTRL_TYPE_U32 = 0x0102,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_queryctrl {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 id;
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 name[32];
__s32 minimum;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 maximum;
__s32 step;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 default_value;
__u32 flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[2];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_query_ext_ctrl {
__u32 id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
char name[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s64 minimum;
__s64 maximum;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 step;
__s64 default_value;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
__u32 elem_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 elems;
__u32 nr_of_dims;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 dims[V4L2_CTRL_MAX_DIMS];
__u32 reserved[32];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_querymenu {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 id;
__u32 index;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
__u8 name[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s64 value;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved;
} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_FLAG_DISABLED 0x0001
#define V4L2_CTRL_FLAG_GRABBED 0x0002
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_FLAG_READ_ONLY 0x0004
#define V4L2_CTRL_FLAG_UPDATE 0x0008
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_FLAG_INACTIVE 0x0010
#define V4L2_CTRL_FLAG_SLIDER 0x0020
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_FLAG_WRITE_ONLY 0x0040
#define V4L2_CTRL_FLAG_VOLATILE 0x0080
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_FLAG_HAS_PAYLOAD 0x0100
+#define V4L2_CTRL_FLAG_EXECUTE_ON_WRITE 0x0200
#define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CTRL_FLAG_NEXT_COMPOUND 0x40000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CID_MAX_CTRLS 1024
#define V4L2_CID_PRIVATE_BASE 0x08000000
struct v4l2_tuner {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 name[32];
__u32 type;
__u32 capability;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rangelow;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rangehigh;
__u32 rxsubchans;
__u32 audmode;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 signal;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 afc;
__u32 reserved[4];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_modulator {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
__u8 name[32];
__u32 capability;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rangelow;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 rangehigh;
__u32 txsubchans;
- __u32 reserved[4];
+ __u32 type;
+ __u32 reserved[3];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define V4L2_TUNER_CAP_LOW 0x0001
@@ -1256,8 +1321,8 @@ struct v4l2_mpeg_vbi_fmt_ivtv {
struct v4l2_plane_pix_format {
__u32 sizeimage;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u16 bytesperline;
- __u16 reserved[7];
+ __u32 bytesperline;
+ __u16 reserved[6];
} __attribute__((packed));
struct v4l2_pix_format_mplane {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -1271,265 +1336,269 @@ struct v4l2_pix_format_mplane {
__u8 num_planes;
__u8 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u8 reserved[10];
+ __u8 ycbcr_enc;
+ __u8 quantization;
+ __u8 xfer_func;
+ __u8 reserved[7];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct v4l2_sdr_format {
__u32 pixelformat;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 buffersize;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 reserved[24];
} __attribute__((packed));
struct v4l2_format {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct v4l2_pix_format pix;
struct v4l2_pix_format_mplane pix_mp;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_window win;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_vbi_format vbi;
struct v4l2_sliced_vbi_format sliced;
struct v4l2_sdr_format sdr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 raw_data[200];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} fmt;
};
struct v4l2_streamparm {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct v4l2_captureparm capture;
struct v4l2_outputparm output;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 raw_data[200];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} parm;
};
#define V4L2_EVENT_ALL 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_VSYNC 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_EOS 2
#define V4L2_EVENT_CTRL 3
#define V4L2_EVENT_FRAME_SYNC 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_SOURCE_CHANGE 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_MOTION_DET 6
#define V4L2_EVENT_PRIVATE_START 0x08000000
struct v4l2_event_vsync {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 field;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
#define V4L2_EVENT_CTRL_CH_VALUE (1 << 0)
#define V4L2_EVENT_CTRL_CH_FLAGS (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_CTRL_CH_RANGE (1 << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_event_ctrl {
__u32 changes;
__u32 type;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 value;
__s64 value64;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 minimum;
__s32 maximum;
__s32 step;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 default_value;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct v4l2_event_frame_sync {
__u32 frame_sequence;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_SRC_CH_RESOLUTION (1 << 0)
struct v4l2_event_src_change {
__u32 changes;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ (1 << 0)
struct v4l2_event_motion_det {
__u32 flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 frame_sequence;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 region_mask;
};
struct v4l2_event {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
struct v4l2_event_vsync vsync;
struct v4l2_event_ctrl ctrl;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_event_frame_sync frame_sync;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_event_src_change src_change;
struct v4l2_event_motion_det motion_det;
__u8 data[64];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} u;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pending;
__u32 sequence;
struct timespec timestamp;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[8];
};
#define V4L2_EVENT_SUB_FL_SEND_INITIAL (1 << 0)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK (1 << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_event_subscription {
__u32 type;
__u32 id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[5];
};
#define V4L2_CHIP_MATCH_BRIDGE 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CHIP_MATCH_SUBDEV 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CHIP_MATCH_HOST V4L2_CHIP_MATCH_BRIDGE
#define V4L2_CHIP_MATCH_I2C_DRIVER 1
#define V4L2_CHIP_MATCH_I2C_ADDR 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define V4L2_CHIP_MATCH_AC97 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_dbg_match {
__u32 type;
union {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 addr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char name[32];
};
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_dbg_register {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_dbg_match match;
__u32 size;
__u64 reg;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 val;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
#define V4L2_CHIP_FL_READABLE (1 << 0)
#define V4L2_CHIP_FL_WRITABLE (1 << 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_dbg_chip_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct v4l2_dbg_match match;
char name[32];
__u32 flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved[32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
struct v4l2_create_buffers {
__u32 index;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 memory;
struct v4l2_format format;
__u32 reserved[8];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_QUERYCAP _IOR('V', 0, struct v4l2_capability)
#define VIDIOC_RESERVED _IO('V', 1)
#define VIDIOC_ENUM_FMT _IOWR('V', 2, struct v4l2_fmtdesc)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_FMT _IOWR('V', 4, struct v4l2_format)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_FMT _IOWR('V', 5, struct v4l2_format)
#define VIDIOC_REQBUFS _IOWR('V', 8, struct v4l2_requestbuffers)
#define VIDIOC_QUERYBUF _IOWR('V', 9, struct v4l2_buffer)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_FBUF _IOR('V', 10, struct v4l2_framebuffer)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_FBUF _IOW('V', 11, struct v4l2_framebuffer)
#define VIDIOC_OVERLAY _IOW('V', 14, int)
#define VIDIOC_QBUF _IOWR('V', 15, struct v4l2_buffer)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_EXPBUF _IOWR('V', 16, struct v4l2_exportbuffer)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_DQBUF _IOWR('V', 17, struct v4l2_buffer)
#define VIDIOC_STREAMON _IOW('V', 18, int)
#define VIDIOC_STREAMOFF _IOW('V', 19, int)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_PARM _IOWR('V', 21, struct v4l2_streamparm)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_PARM _IOWR('V', 22, struct v4l2_streamparm)
#define VIDIOC_G_STD _IOR('V', 23, v4l2_std_id)
#define VIDIOC_S_STD _IOW('V', 24, v4l2_std_id)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_ENUMSTD _IOWR('V', 25, struct v4l2_standard)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_ENUMINPUT _IOWR('V', 26, struct v4l2_input)
#define VIDIOC_G_CTRL _IOWR('V', 27, struct v4l2_control)
#define VIDIOC_S_CTRL _IOWR('V', 28, struct v4l2_control)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_TUNER _IOWR('V', 29, struct v4l2_tuner)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_TUNER _IOW('V', 30, struct v4l2_tuner)
#define VIDIOC_G_AUDIO _IOR('V', 33, struct v4l2_audio)
#define VIDIOC_S_AUDIO _IOW('V', 34, struct v4l2_audio)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_QUERYCTRL _IOWR('V', 36, struct v4l2_queryctrl)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_QUERYMENU _IOWR('V', 37, struct v4l2_querymenu)
#define VIDIOC_G_INPUT _IOR('V', 38, int)
#define VIDIOC_S_INPUT _IOWR('V', 39, int)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_EDID _IOWR('V', 40, struct v4l2_edid)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_EDID _IOWR('V', 41, struct v4l2_edid)
#define VIDIOC_G_OUTPUT _IOR('V', 46, int)
#define VIDIOC_S_OUTPUT _IOWR('V', 47, int)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_ENUMOUTPUT _IOWR('V', 48, struct v4l2_output)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_AUDOUT _IOR('V', 49, struct v4l2_audioout)
#define VIDIOC_S_AUDOUT _IOW('V', 50, struct v4l2_audioout)
#define VIDIOC_G_MODULATOR _IOWR('V', 54, struct v4l2_modulator)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_MODULATOR _IOW('V', 55, struct v4l2_modulator)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_FREQUENCY _IOWR('V', 56, struct v4l2_frequency)
#define VIDIOC_S_FREQUENCY _IOW('V', 57, struct v4l2_frequency)
#define VIDIOC_CROPCAP _IOWR('V', 58, struct v4l2_cropcap)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_CROP _IOWR('V', 59, struct v4l2_crop)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_CROP _IOW('V', 60, struct v4l2_crop)
#define VIDIOC_G_JPEGCOMP _IOR('V', 61, struct v4l2_jpegcompression)
#define VIDIOC_S_JPEGCOMP _IOW('V', 62, struct v4l2_jpegcompression)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_QUERYSTD _IOR('V', 63, v4l2_std_id)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_TRY_FMT _IOWR('V', 64, struct v4l2_format)
#define VIDIOC_ENUMAUDIO _IOWR('V', 65, struct v4l2_audio)
#define VIDIOC_ENUMAUDOUT _IOWR('V', 66, struct v4l2_audioout)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_PRIORITY _IOR('V', 67, __u32)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_PRIORITY _IOW('V', 68, __u32)
#define VIDIOC_G_SLICED_VBI_CAP _IOWR('V', 69, struct v4l2_sliced_vbi_cap)
#define VIDIOC_LOG_STATUS _IO('V', 70)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_EXT_CTRLS _IOWR('V', 71, struct v4l2_ext_controls)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_S_EXT_CTRLS _IOWR('V', 72, struct v4l2_ext_controls)
#define VIDIOC_TRY_EXT_CTRLS _IOWR('V', 73, struct v4l2_ext_controls)
#define VIDIOC_ENUM_FRAMESIZES _IOWR('V', 74, struct v4l2_frmsizeenum)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_ENUM_FRAMEINTERVALS _IOWR('V', 75, struct v4l2_frmivalenum)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_ENC_INDEX _IOR('V', 76, struct v4l2_enc_idx)
#define VIDIOC_ENCODER_CMD _IOWR('V', 77, struct v4l2_encoder_cmd)
#define VIDIOC_TRY_ENCODER_CMD _IOWR('V', 78, struct v4l2_encoder_cmd)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_DBG_S_REGISTER _IOW('V', 79, struct v4l2_dbg_register)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_DBG_G_REGISTER _IOWR('V', 80, struct v4l2_dbg_register)
#define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct v4l2_hw_freq_seek)
#define VIDIOC_S_DV_TIMINGS _IOWR('V', 87, struct v4l2_dv_timings)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_G_DV_TIMINGS _IOWR('V', 88, struct v4l2_dv_timings)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_DQEVENT _IOR('V', 89, struct v4l2_event)
#define VIDIOC_SUBSCRIBE_EVENT _IOW('V', 90, struct v4l2_event_subscription)
#define VIDIOC_UNSUBSCRIBE_EVENT _IOW('V', 91, struct v4l2_event_subscription)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_CREATE_BUFS _IOWR('V', 92, struct v4l2_create_buffers)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_PREPARE_BUF _IOWR('V', 93, struct v4l2_buffer)
#define VIDIOC_G_SELECTION _IOWR('V', 94, struct v4l2_selection)
#define VIDIOC_S_SELECTION _IOWR('V', 95, struct v4l2_selection)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_DECODER_CMD _IOWR('V', 96, struct v4l2_decoder_cmd)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_TRY_DECODER_CMD _IOWR('V', 97, struct v4l2_decoder_cmd)
#define VIDIOC_ENUM_DV_TIMINGS _IOWR('V', 98, struct v4l2_enum_dv_timings)
#define VIDIOC_QUERY_DV_TIMINGS _IOR('V', 99, struct v4l2_dv_timings)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_DV_TIMINGS_CAP _IOWR('V', 100, struct v4l2_dv_timings_cap)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_ENUM_FREQ_BANDS _IOWR('V', 101, struct v4l2_frequency_band)
#define VIDIOC_DBG_G_CHIP_INFO _IOWR('V', 102, struct v4l2_dbg_chip_info)
#define VIDIOC_QUERY_EXT_CTRL _IOWR('V', 103, struct v4l2_query_ext_ctrl)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define BASE_VIDIOC_PRIVATE 192
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/virtio_balloon.h b/libc/kernel/uapi/linux/virtio_balloon.h
index 027b65ff7..7f02dc5d3 100644
--- a/libc/kernel/uapi/linux/virtio_balloon.h
+++ b/libc/kernel/uapi/linux/virtio_balloon.h
@@ -18,29 +18,33 @@
****************************************************************************/
#ifndef _LINUX_VIRTIO_BALLOON_H
#define _LINUX_VIRTIO_BALLOON_H
+#include <linux/types.h>
+#include <linux/virtio_types.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/virtio_ids.h>
#include <linux/virtio_config.h>
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BALLOON_F_MUST_TELL_HOST 0
#define VIRTIO_BALLOON_F_STATS_VQ 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_BALLOON_F_DEFLATE_ON_OOM 2
#define VIRTIO_BALLOON_PFN_SHIFT 12
struct virtio_balloon_config {
+ __u32 num_pages;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __le32 num_pages;
- __le32 actual;
+ __u32 actual;
};
#define VIRTIO_BALLOON_S_SWAP_IN 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BALLOON_S_SWAP_OUT 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BALLOON_S_MAJFLT 2
#define VIRTIO_BALLOON_S_MINFLT 3
#define VIRTIO_BALLOON_S_MEMFREE 4
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BALLOON_S_MEMTOT 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BALLOON_S_NR 6
struct virtio_balloon_stat {
- __u16 tag;
+ __virtio16 tag;
+ __virtio64 val;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u64 val;
} __attribute__((packed));
#endif
diff --git a/libc/kernel/uapi/linux/virtio_blk.h b/libc/kernel/uapi/linux/virtio_blk.h
index b6a22d0ce..9dc7aa726 100644
--- a/libc/kernel/uapi/linux/virtio_blk.h
+++ b/libc/kernel/uapi/linux/virtio_blk.h
@@ -22,68 +22,79 @@
#include <linux/virtio_ids.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/virtio_config.h>
-#define VIRTIO_BLK_F_BARRIER 0
+#include <linux/virtio_types.h>
#define VIRTIO_BLK_F_SIZE_MAX 1
#define VIRTIO_BLK_F_SEG_MAX 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BLK_F_GEOMETRY 4
#define VIRTIO_BLK_F_RO 5
#define VIRTIO_BLK_F_BLK_SIZE 6
+#define VIRTIO_BLK_F_TOPOLOGY 10
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_BLK_F_MQ 12
+#ifndef VIRTIO_BLK_NO_LEGACY
+#define VIRTIO_BLK_F_BARRIER 0
#define VIRTIO_BLK_F_SCSI 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BLK_F_WCE 9
-#define VIRTIO_BLK_F_TOPOLOGY 10
#define VIRTIO_BLK_F_CONFIG_WCE 11
-#define VIRTIO_BLK_F_MQ 12
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BLK_F_FLUSH VIRTIO_BLK_F_WCE
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BLK_ID_BYTES 20
struct virtio_blk_config {
__u64 capacity;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 size_max;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 seg_max;
struct virtio_blk_geometry {
__u16 cylinders;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 heads;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 sectors;
} geometry;
__u32 blk_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 physical_block_exp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 alignment_offset;
__u16 min_io_size;
__u32 opt_io_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 wce;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 unused;
__u16 num_queues;
} __attribute__((packed));
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BLK_T_IN 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_BLK_T_OUT 1
+#ifndef VIRTIO_BLK_NO_LEGACY
#define VIRTIO_BLK_T_SCSI_CMD 2
-#define VIRTIO_BLK_T_FLUSH 4
+#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_BLK_T_FLUSH 4
#define VIRTIO_BLK_T_GET_ID 8
+#ifndef VIRTIO_BLK_NO_LEGACY
#define VIRTIO_BLK_T_BARRIER 0x80000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
struct virtio_blk_outhdr {
- __u32 type;
+ __virtio32 type;
+ __virtio32 ioprio;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 ioprio;
- __u64 sector;
+ __virtio64 sector;
};
+#ifndef VIRTIO_BLK_NO_LEGACY
struct virtio_scsi_inhdr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 errors;
- __u32 data_len;
- __u32 sense_len;
- __u32 residual;
+ __virtio32 errors;
+ __virtio32 data_len;
+ __virtio32 sense_len;
+ __virtio32 residual;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+#endif
#define VIRTIO_BLK_S_OK 0
#define VIRTIO_BLK_S_IOERR 1
-#define VIRTIO_BLK_S_UNSUPP 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_BLK_S_UNSUPP 2
#endif
diff --git a/libc/kernel/uapi/linux/virtio_config.h b/libc/kernel/uapi/linux/virtio_config.h
index 0d1fc6275..1f41faf22 100644
--- a/libc/kernel/uapi/linux/virtio_config.h
+++ b/libc/kernel/uapi/linux/virtio_config.h
@@ -23,11 +23,16 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_CONFIG_S_DRIVER 2
#define VIRTIO_CONFIG_S_DRIVER_OK 4
+#define VIRTIO_CONFIG_S_FEATURES_OK 8
#define VIRTIO_CONFIG_S_FAILED 0x80
-#define VIRTIO_TRANSPORT_F_START 28
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define VIRTIO_TRANSPORT_F_END 32
+#define VIRTIO_TRANSPORT_F_START 28
+#define VIRTIO_TRANSPORT_F_END 33
+#ifndef VIRTIO_CONFIG_NO_LEGACY
#define VIRTIO_F_NOTIFY_ON_EMPTY 24
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_F_ANY_LAYOUT 27
#endif
+#define VIRTIO_F_VERSION_1 32
+#endif
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/virtio_console.h b/libc/kernel/uapi/linux/virtio_console.h
index 9ccf77076..c2c807359 100644
--- a/libc/kernel/uapi/linux/virtio_console.h
+++ b/libc/kernel/uapi/linux/virtio_console.h
@@ -19,36 +19,37 @@
#ifndef _UAPI_LINUX_VIRTIO_CONSOLE_H
#define _UAPI_LINUX_VIRTIO_CONSOLE_H
#include <linux/types.h>
-#include <linux/virtio_ids.h>
+#include <linux/virtio_types.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <linux/virtio_ids.h>
#include <linux/virtio_config.h>
#define VIRTIO_CONSOLE_F_SIZE 0
#define VIRTIO_CONSOLE_F_MULTIPORT 1
-#define VIRTIO_CONSOLE_F_EMERG_WRITE 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_CONSOLE_F_EMERG_WRITE 2
#define VIRTIO_CONSOLE_BAD_ID (~(__u32) 0)
struct virtio_console_config {
__u16 cols;
- __u16 rows;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 rows;
__u32 max_nr_ports;
__u32 emerg_wr;
} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct virtio_console_control {
+ __virtio32 id;
+ __virtio16 event;
+ __virtio16 value;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 id;
- __u16 event;
- __u16 value;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_CONSOLE_DEVICE_READY 0
#define VIRTIO_CONSOLE_PORT_ADD 1
#define VIRTIO_CONSOLE_PORT_REMOVE 2
-#define VIRTIO_CONSOLE_PORT_READY 3
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_CONSOLE_PORT_READY 3
#define VIRTIO_CONSOLE_CONSOLE_PORT 4
#define VIRTIO_CONSOLE_RESIZE 5
#define VIRTIO_CONSOLE_PORT_OPEN 6
-#define VIRTIO_CONSOLE_PORT_NAME 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_CONSOLE_PORT_NAME 7
#endif
diff --git a/libc/kernel/uapi/linux/virtio_gpu.h b/libc/kernel/uapi/linux/virtio_gpu.h
new file mode 100644
index 000000000..f7887d929
--- /dev/null
+++ b/libc/kernel/uapi/linux/virtio_gpu.h
@@ -0,0 +1,278 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef VIRTIO_GPU_HW_H
+#define VIRTIO_GPU_HW_H
+#include <linux/types.h>
+#define VIRTIO_GPU_F_VIRGL 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum virtio_gpu_ctrl_type {
+ VIRTIO_GPU_UNDEFINED = 0,
+ VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100,
+ VIRTIO_GPU_CMD_RESOURCE_CREATE_2D,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_CMD_RESOURCE_UNREF,
+ VIRTIO_GPU_CMD_SET_SCANOUT,
+ VIRTIO_GPU_CMD_RESOURCE_FLUSH,
+ VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING,
+ VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
+ VIRTIO_GPU_CMD_GET_CAPSET_INFO,
+ VIRTIO_GPU_CMD_GET_CAPSET,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
+ VIRTIO_GPU_CMD_CTX_DESTROY,
+ VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE,
+ VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_CMD_RESOURCE_CREATE_3D,
+ VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
+ VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
+ VIRTIO_GPU_CMD_SUBMIT_3D,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
+ VIRTIO_GPU_CMD_MOVE_CURSOR,
+ VIRTIO_GPU_RESP_OK_NODATA = 0x1100,
+ VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_RESP_OK_CAPSET_INFO,
+ VIRTIO_GPU_RESP_OK_CAPSET,
+ VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
+ VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
+ VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
+ VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
+ VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define VIRTIO_GPU_FLAG_FENCE (1 << 0)
+struct virtio_gpu_ctrl_hdr {
+ __le32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 flags;
+ __le64 fence_id;
+ __le32 ctx_id;
+ __le32 padding;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_gpu_cursor_pos {
+ __le32 scanout_id;
+ __le32 x;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 y;
+ __le32 padding;
+};
+struct virtio_gpu_update_cursor {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct virtio_gpu_ctrl_hdr hdr;
+ struct virtio_gpu_cursor_pos pos;
+ __le32 resource_id;
+ __le32 hot_x;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 hot_y;
+ __le32 padding;
+};
+struct virtio_gpu_rect {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 x;
+ __le32 y;
+ __le32 width;
+ __le32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_gpu_resource_unref {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 resource_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 padding;
+};
+struct virtio_gpu_resource_create_2d {
+ struct virtio_gpu_ctrl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 resource_id;
+ __le32 format;
+ __le32 width;
+ __le32 height;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_gpu_set_scanout {
+ struct virtio_gpu_ctrl_hdr hdr;
+ struct virtio_gpu_rect r;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 scanout_id;
+ __le32 resource_id;
+};
+struct virtio_gpu_resource_flush {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct virtio_gpu_ctrl_hdr hdr;
+ struct virtio_gpu_rect r;
+ __le32 resource_id;
+ __le32 padding;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_gpu_transfer_to_host_2d {
+ struct virtio_gpu_ctrl_hdr hdr;
+ struct virtio_gpu_rect r;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le64 offset;
+ __le32 resource_id;
+ __le32 padding;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct virtio_gpu_mem_entry {
+ __le64 addr;
+ __le32 length;
+ __le32 padding;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_gpu_resource_attach_backing {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 resource_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 nr_entries;
+};
+struct virtio_gpu_resource_detach_backing {
+ struct virtio_gpu_ctrl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 resource_id;
+ __le32 padding;
+};
+#define VIRTIO_GPU_MAX_SCANOUTS 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct virtio_gpu_resp_display_info {
+ struct virtio_gpu_ctrl_hdr hdr;
+ struct virtio_gpu_display_one {
+ struct virtio_gpu_rect r;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 enabled;
+ __le32 flags;
+ } pmodes[VIRTIO_GPU_MAX_SCANOUTS];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct virtio_gpu_box {
+ __le32 x, y, z;
+ __le32 w, h, d;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct virtio_gpu_transfer_host_3d {
+ struct virtio_gpu_ctrl_hdr hdr;
+ struct virtio_gpu_box box;
+ __le64 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 resource_id;
+ __le32 level;
+ __le32 stride;
+ __le32 layer_stride;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP (1 << 0)
+struct virtio_gpu_resource_create_3d {
+ struct virtio_gpu_ctrl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 resource_id;
+ __le32 target;
+ __le32 format;
+ __le32 bind;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 width;
+ __le32 height;
+ __le32 depth;
+ __le32 array_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 last_level;
+ __le32 nr_samples;
+ __le32 flags;
+ __le32 padding;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_gpu_ctx_create {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 nlen;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 padding;
+ char debug_name[64];
+};
+struct virtio_gpu_ctx_destroy {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct virtio_gpu_ctrl_hdr hdr;
+};
+struct virtio_gpu_ctx_resource {
+ struct virtio_gpu_ctrl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 resource_id;
+ __le32 padding;
+};
+struct virtio_gpu_cmd_submit {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 size;
+ __le32 padding;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_GPU_CAPSET_VIRGL 1
+struct virtio_gpu_get_capset_info {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 capset_index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 padding;
+};
+struct virtio_gpu_resp_capset_info {
+ struct virtio_gpu_ctrl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 capset_id;
+ __le32 capset_max_version;
+ __le32 capset_max_size;
+ __le32 padding;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_gpu_get_capset {
+ struct virtio_gpu_ctrl_hdr hdr;
+ __le32 capset_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 capset_version;
+};
+struct virtio_gpu_resp_capset {
+ struct virtio_gpu_ctrl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ uint8_t capset_data[];
+};
+#define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
+struct virtio_gpu_config {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 events_read;
+ __u32 events_clear;
+ __u32 num_scanouts;
+ __u32 num_capsets;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+enum virtio_gpu_formats {
+ VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM = 1,
+ VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM = 3,
+ VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM = 4,
+ VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM = 67,
+ VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM = 68,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM = 121,
+ VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134,
+};
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/virtio_ids.h b/libc/kernel/uapi/linux/virtio_ids.h
index b4817c0a5..3f3e76428 100644
--- a/libc/kernel/uapi/linux/virtio_ids.h
+++ b/libc/kernel/uapi/linux/virtio_ids.h
@@ -31,4 +31,6 @@
#define VIRTIO_ID_RPROC_SERIAL 11
#define VIRTIO_ID_CAIF 12
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_ID_GPU 16
+#define VIRTIO_ID_INPUT 18
#endif
diff --git a/libc/kernel/uapi/linux/virtio_input.h b/libc/kernel/uapi/linux/virtio_input.h
new file mode 100644
index 000000000..2dcf0fc43
--- /dev/null
+++ b/libc/kernel/uapi/linux/virtio_input.h
@@ -0,0 +1,71 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _LINUX_VIRTIO_INPUT_H
+#define _LINUX_VIRTIO_INPUT_H
+#include <linux/types.h>
+enum virtio_input_config_select {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_INPUT_CFG_UNSET = 0x00,
+ VIRTIO_INPUT_CFG_ID_NAME = 0x01,
+ VIRTIO_INPUT_CFG_ID_SERIAL = 0x02,
+ VIRTIO_INPUT_CFG_ID_DEVIDS = 0x03,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ VIRTIO_INPUT_CFG_PROP_BITS = 0x10,
+ VIRTIO_INPUT_CFG_EV_BITS = 0x11,
+ VIRTIO_INPUT_CFG_ABS_INFO = 0x12,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct virtio_input_absinfo {
+ __u32 min;
+ __u32 max;
+ __u32 fuzz;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flat;
+ __u32 res;
+};
+struct virtio_input_devids {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 bustype;
+ __u16 vendor;
+ __u16 product;
+ __u16 version;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_input_config {
+ __u8 select;
+ __u8 subsel;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 size;
+ __u8 reserved[5];
+ union {
+ char string[128];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 bitmap[128];
+ struct virtio_input_absinfo abs;
+ struct virtio_input_devids ids;
+ } u;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct virtio_input_event {
+ __le16 type;
+ __le16 code;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 value;
+};
+#endif
diff --git a/libc/kernel/uapi/linux/virtio_net.h b/libc/kernel/uapi/linux/virtio_net.h
index fef80705e..e5e4b6c5e 100644
--- a/libc/kernel/uapi/linux/virtio_net.h
+++ b/libc/kernel/uapi/linux/virtio_net.h
@@ -22,33 +22,38 @@
#include <linux/virtio_ids.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#include <linux/virtio_config.h>
+#include <linux/virtio_types.h>
#include <linux/if_ether.h>
#define VIRTIO_NET_F_CSUM 0
-#define VIRTIO_NET_F_GUEST_CSUM 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_NET_F_GUEST_CSUM 1
+#define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2
#define VIRTIO_NET_F_MAC 5
-#define VIRTIO_NET_F_GSO 6
#define VIRTIO_NET_F_GUEST_TSO4 7
-#define VIRTIO_NET_F_GUEST_TSO6 8
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_NET_F_GUEST_TSO6 8
#define VIRTIO_NET_F_GUEST_ECN 9
#define VIRTIO_NET_F_GUEST_UFO 10
#define VIRTIO_NET_F_HOST_TSO4 11
-#define VIRTIO_NET_F_HOST_TSO6 12
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_NET_F_HOST_TSO6 12
#define VIRTIO_NET_F_HOST_ECN 13
#define VIRTIO_NET_F_HOST_UFO 14
#define VIRTIO_NET_F_MRG_RXBUF 15
-#define VIRTIO_NET_F_STATUS 16
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_NET_F_STATUS 16
#define VIRTIO_NET_F_CTRL_VQ 17
#define VIRTIO_NET_F_CTRL_RX 18
#define VIRTIO_NET_F_CTRL_VLAN 19
-#define VIRTIO_NET_F_CTRL_RX_EXTRA 20
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_NET_F_CTRL_RX_EXTRA 20
#define VIRTIO_NET_F_GUEST_ANNOUNCE 21
#define VIRTIO_NET_F_MQ 22
#define VIRTIO_NET_F_CTRL_MAC_ADDR 23
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef VIRTIO_NET_NO_LEGACY
+#define VIRTIO_NET_F_GSO 6
+#endif
#define VIRTIO_NET_S_LINK_UP 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_S_ANNOUNCE 2
@@ -58,7 +63,7 @@ struct virtio_net_config {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 max_virtqueue_pairs;
} __attribute__((packed));
-struct virtio_net_hdr {
+struct virtio_net_hdr_v1 {
#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_HDR_F_DATA_VALID 2
@@ -71,56 +76,73 @@ struct virtio_net_hdr {
#define VIRTIO_NET_HDR_GSO_ECN 0x80
__u8 gso_type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u16 hdr_len;
- __u16 gso_size;
- __u16 csum_start;
- __u16 csum_offset;
+ __virtio16 hdr_len;
+ __virtio16 gso_size;
+ __virtio16 csum_start;
+ __virtio16 csum_offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio16 num_buffers;
+};
+#ifndef VIRTIO_NET_NO_LEGACY
+struct virtio_net_hdr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 flags;
+ __u8 gso_type;
+ __virtio16 hdr_len;
+ __virtio16 gso_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio16 csum_start;
+ __virtio16 csum_offset;
};
struct virtio_net_hdr_mrg_rxbuf {
- struct virtio_net_hdr hdr;
- __u16 num_buffers;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct virtio_net_hdr hdr;
+ __virtio16 num_buffers;
};
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct virtio_net_ctrl_hdr {
__u8 class;
__u8 cmd;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef __u8 virtio_net_ctrl_ack;
#define VIRTIO_NET_OK 0
#define VIRTIO_NET_ERR 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_RX 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_RX_PROMISC 0
#define VIRTIO_NET_CTRL_RX_ALLMULTI 1
#define VIRTIO_NET_CTRL_RX_ALLUNI 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_RX_NOMULTI 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_RX_NOUNI 4
#define VIRTIO_NET_CTRL_RX_NOBCAST 5
struct virtio_net_ctrl_mac {
+ __virtio32 entries;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 entries;
__u8 macs[][ETH_ALEN];
} __attribute__((packed));
#define VIRTIO_NET_CTRL_MAC 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_MAC_TABLE_SET 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_MAC_ADDR_SET 1
#define VIRTIO_NET_CTRL_VLAN 2
#define VIRTIO_NET_CTRL_VLAN_ADD 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_VLAN_DEL 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_ANNOUNCE 3
#define VIRTIO_NET_CTRL_ANNOUNCE_ACK 0
struct virtio_net_ctrl_mq {
+ __virtio16 virtqueue_pairs;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u16 virtqueue_pairs;
};
#define VIRTIO_NET_CTRL_MQ 4
#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX 0x8000
+#define VIRTIO_NET_CTRL_GUEST_OFFLOADS 5
+#define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET 0
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/virtio_pci.h b/libc/kernel/uapi/linux/virtio_pci.h
index affd6c972..f1072aa21 100644
--- a/libc/kernel/uapi/linux/virtio_pci.h
+++ b/libc/kernel/uapi/linux/virtio_pci.h
@@ -18,27 +18,121 @@
****************************************************************************/
#ifndef _LINUX_VIRTIO_PCI_H
#define _LINUX_VIRTIO_PCI_H
-#include <linux/virtio_config.h>
-#define VIRTIO_PCI_HOST_FEATURES 0
+#include <linux/types.h>
+#ifndef VIRTIO_PCI_NO_LEGACY
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_HOST_FEATURES 0
#define VIRTIO_PCI_GUEST_FEATURES 4
#define VIRTIO_PCI_QUEUE_PFN 8
#define VIRTIO_PCI_QUEUE_NUM 12
-#define VIRTIO_PCI_QUEUE_SEL 14
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_QUEUE_SEL 14
#define VIRTIO_PCI_QUEUE_NOTIFY 16
#define VIRTIO_PCI_STATUS 18
#define VIRTIO_PCI_ISR 19
-#define VIRTIO_PCI_ISR_CONFIG 0x2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_MSI_CONFIG_VECTOR 20
#define VIRTIO_MSI_QUEUE_VECTOR 22
-#define VIRTIO_MSI_NO_VECTOR 0xffff
#define VIRTIO_PCI_CONFIG_OFF(msix_enabled) ((msix_enabled) ? 24 : 20)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_PCI_CONFIG(dev) VIRTIO_PCI_CONFIG_OFF((dev)->msix_enabled)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_PCI_ABI_VERSION 0
#define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12
#define VIRTIO_PCI_VRING_ALIGN 4096
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_ISR_CONFIG 0x2
+#define VIRTIO_MSI_NO_VECTOR 0xffff
+#ifndef VIRTIO_PCI_NO_MODERN
+#define VIRTIO_PCI_CAP_COMMON_CFG 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_CAP_NOTIFY_CFG 2
+#define VIRTIO_PCI_CAP_ISR_CFG 3
+#define VIRTIO_PCI_CAP_DEVICE_CFG 4
+#define VIRTIO_PCI_CAP_PCI_CFG 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct virtio_pci_cap {
+ __u8 cap_vndr;
+ __u8 cap_next;
+ __u8 cap_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 cfg_type;
+ __u8 bar;
+ __u8 padding[3];
+ __le32 offset;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 length;
+};
+struct virtio_pci_notify_cap {
+ struct virtio_pci_cap cap;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 notify_off_multiplier;
+};
+struct virtio_pci_common_cfg {
+ __le32 device_feature_select;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 device_feature;
+ __le32 guest_feature_select;
+ __le32 guest_feature;
+ __le16 msix_config;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le16 num_queues;
+ __u8 device_status;
+ __u8 config_generation;
+ __le16 queue_select;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le16 queue_size;
+ __le16 queue_msix_vector;
+ __le16 queue_enable;
+ __le16 queue_notify_off;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 queue_desc_lo;
+ __le32 queue_desc_hi;
+ __le32 queue_avail_lo;
+ __le32 queue_avail_hi;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 queue_used_lo;
+ __le32 queue_used_hi;
+};
+struct virtio_pci_cfg_cap {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct virtio_pci_cap cap;
+ __u8 pci_cfg_data[4];
+};
+#define VIRTIO_PCI_CAP_VNDR 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_CAP_NEXT 1
+#define VIRTIO_PCI_CAP_LEN 2
+#define VIRTIO_PCI_CAP_CFG_TYPE 3
+#define VIRTIO_PCI_CAP_BAR 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_CAP_OFFSET 8
+#define VIRTIO_PCI_CAP_LENGTH 12
+#define VIRTIO_PCI_NOTIFY_CAP_MULT 16
+#define VIRTIO_PCI_COMMON_DFSELECT 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_COMMON_DF 4
+#define VIRTIO_PCI_COMMON_GFSELECT 8
+#define VIRTIO_PCI_COMMON_GF 12
+#define VIRTIO_PCI_COMMON_MSIX 16
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_COMMON_NUMQ 18
+#define VIRTIO_PCI_COMMON_STATUS 20
+#define VIRTIO_PCI_COMMON_CFGGENERATION 21
+#define VIRTIO_PCI_COMMON_Q_SELECT 22
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_COMMON_Q_SIZE 24
+#define VIRTIO_PCI_COMMON_Q_MSIX 26
+#define VIRTIO_PCI_COMMON_Q_ENABLE 28
+#define VIRTIO_PCI_COMMON_Q_NOFF 30
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_COMMON_Q_DESCLO 32
+#define VIRTIO_PCI_COMMON_Q_DESCHI 36
+#define VIRTIO_PCI_COMMON_Q_AVAILLO 40
+#define VIRTIO_PCI_COMMON_Q_AVAILHI 44
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_PCI_COMMON_Q_USEDLO 48
+#define VIRTIO_PCI_COMMON_Q_USEDHI 52
+#endif
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/virtio_ring.h b/libc/kernel/uapi/linux/virtio_ring.h
index a17187408..3e85e1049 100644
--- a/libc/kernel/uapi/linux/virtio_ring.h
+++ b/libc/kernel/uapi/linux/virtio_ring.h
@@ -18,49 +18,56 @@
****************************************************************************/
#ifndef _UAPI_LINUX_VIRTIO_RING_H
#define _UAPI_LINUX_VIRTIO_RING_H
+#include <stdint.h>
#include <linux/types.h>
-#define VRING_DESC_F_NEXT 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#include <linux/virtio_types.h>
+#define VRING_DESC_F_NEXT 1
#define VRING_DESC_F_WRITE 2
#define VRING_DESC_F_INDIRECT 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VRING_USED_F_NO_NOTIFY 1
#define VRING_AVAIL_F_NO_INTERRUPT 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIRTIO_RING_F_INDIRECT_DESC 28
#define VIRTIO_RING_F_EVENT_IDX 29
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct vring_desc {
- __u64 addr;
+ __virtio64 addr;
+ __virtio32 len;
+ __virtio16 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- __u32 len;
- __u16 flags;
- __u16 next;
+ __virtio16 next;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct vring_avail {
- __u16 flags;
- __u16 idx;
- __u16 ring[];
+ __virtio16 flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio16 idx;
+ __virtio16 ring[];
};
struct vring_used_elem {
- __u32 id;
- __u32 len;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio32 id;
+ __virtio32 len;
};
struct vring_used {
- __u16 flags;
- __u16 idx;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio16 flags;
+ __virtio16 idx;
struct vring_used_elem ring[];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct vring {
unsigned int num;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct vring_desc * desc;
struct vring_avail * avail;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct vring_used * used;
};
+#define VRING_AVAIL_ALIGN_SIZE 2
+#define VRING_USED_ALIGN_SIZE 4
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VRING_DESC_ALIGN_SIZE 16
#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num])
-#define vring_avail_event(vr) (* (__u16 *) & (vr)->used->ring[(vr)->num])
+#define vring_avail_event(vr) (* (__virtio16 *) & (vr)->used->ring[(vr)->num])
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/linux/virtio_scsi.h b/libc/kernel/uapi/linux/virtio_scsi.h
new file mode 100644
index 000000000..9bd9ef55e
--- /dev/null
+++ b/libc/kernel/uapi/linux/virtio_scsi.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _LINUX_VIRTIO_SCSI_H
+#define _LINUX_VIRTIO_SCSI_H
+#include <linux/virtio_types.h>
+#define VIRTIO_SCSI_CDB_DEFAULT_SIZE 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_SENSE_DEFAULT_SIZE 96
+#ifndef VIRTIO_SCSI_CDB_SIZE
+#define VIRTIO_SCSI_CDB_SIZE VIRTIO_SCSI_CDB_DEFAULT_SIZE
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#ifndef VIRTIO_SCSI_SENSE_SIZE
+#define VIRTIO_SCSI_SENSE_SIZE VIRTIO_SCSI_SENSE_DEFAULT_SIZE
+#endif
+struct virtio_scsi_cmd_req {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 lun[8];
+ __virtio64 tag;
+ __u8 task_attr;
+ __u8 prio;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 crn;
+ __u8 cdb[VIRTIO_SCSI_CDB_SIZE];
+} __attribute__((packed));
+struct virtio_scsi_cmd_req_pi {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 lun[8];
+ __virtio64 tag;
+ __u8 task_attr;
+ __u8 prio;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 crn;
+ __virtio32 pi_bytesout;
+ __virtio32 pi_bytesin;
+ __u8 cdb[VIRTIO_SCSI_CDB_SIZE];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct virtio_scsi_cmd_resp {
+ __virtio32 sense_len;
+ __virtio32 resid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio16 status_qualifier;
+ __u8 status;
+ __u8 response;
+ __u8 sense[VIRTIO_SCSI_SENSE_SIZE];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct virtio_scsi_ctrl_tmf_req {
+ __virtio32 type;
+ __virtio32 subtype;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 lun[8];
+ __virtio64 tag;
+} __attribute__((packed));
+struct virtio_scsi_ctrl_tmf_resp {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 response;
+} __attribute__((packed));
+struct virtio_scsi_ctrl_an_req {
+ __virtio32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 lun[8];
+ __virtio32 event_requested;
+} __attribute__((packed));
+struct virtio_scsi_ctrl_an_resp {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio32 event_actual;
+ __u8 response;
+} __attribute__((packed));
+struct virtio_scsi_event {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __virtio32 event;
+ __u8 lun[8];
+ __virtio32 reason;
+} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct virtio_scsi_config {
+ __u32 num_queues;
+ __u32 seg_max;
+ __u32 max_sectors;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 cmd_per_lun;
+ __u32 event_info_size;
+ __u32 sense_size;
+ __u32 cdb_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 max_channel;
+ __u16 max_target;
+ __u32 max_lun;
+} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_F_INOUT 0
+#define VIRTIO_SCSI_F_HOTPLUG 1
+#define VIRTIO_SCSI_F_CHANGE 2
+#define VIRTIO_SCSI_F_T10_PI 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_S_OK 0
+#define VIRTIO_SCSI_S_OVERRUN 1
+#define VIRTIO_SCSI_S_ABORTED 2
+#define VIRTIO_SCSI_S_BAD_TARGET 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_S_RESET 4
+#define VIRTIO_SCSI_S_BUSY 5
+#define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6
+#define VIRTIO_SCSI_S_TARGET_FAILURE 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_S_NEXUS_FAILURE 8
+#define VIRTIO_SCSI_S_FAILURE 9
+#define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED 10
+#define VIRTIO_SCSI_S_FUNCTION_REJECTED 11
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_S_INCORRECT_LUN 12
+#define VIRTIO_SCSI_T_TMF 0
+#define VIRTIO_SCSI_T_AN_QUERY 1
+#define VIRTIO_SCSI_T_AN_SUBSCRIBE 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_T_TMF_ABORT_TASK 0
+#define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET 1
+#define VIRTIO_SCSI_T_TMF_CLEAR_ACA 2
+#define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET 4
+#define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET 5
+#define VIRTIO_SCSI_T_TMF_QUERY_TASK 6
+#define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET 7
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_T_EVENTS_MISSED 0x80000000
+#define VIRTIO_SCSI_T_NO_EVENT 0
+#define VIRTIO_SCSI_T_TRANSPORT_RESET 1
+#define VIRTIO_SCSI_T_ASYNC_NOTIFY 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_T_PARAM_CHANGE 3
+#define VIRTIO_SCSI_EVT_RESET_HARD 0
+#define VIRTIO_SCSI_EVT_RESET_RESCAN 1
+#define VIRTIO_SCSI_EVT_RESET_REMOVED 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define VIRTIO_SCSI_S_SIMPLE 0
+#define VIRTIO_SCSI_S_ORDERED 1
+#define VIRTIO_SCSI_S_HEAD 2
+#define VIRTIO_SCSI_S_ACA 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/linux/virtio_types.h b/libc/kernel/uapi/linux/virtio_types.h
new file mode 100644
index 000000000..e3982163f
--- /dev/null
+++ b/libc/kernel/uapi/linux/virtio_types.h
@@ -0,0 +1,26 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI_LINUX_VIRTIO_TYPES_H
+#define _UAPI_LINUX_VIRTIO_TYPES_H
+#include <linux/types.h>
+typedef __u16 __bitwise__ __virtio16;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef __u32 __bitwise__ __virtio32;
+typedef __u64 __bitwise__ __virtio64;
+#endif
diff --git a/libc/kernel/uapi/linux/vsp1.h b/libc/kernel/uapi/linux/vsp1.h
index 28f7fcdde..f708b6332 100644
--- a/libc/kernel/uapi/linux/vsp1.h
+++ b/libc/kernel/uapi/linux/vsp1.h
@@ -23,7 +23,7 @@
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define VIDIOC_VSP1_LUT_CONFIG _IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct vsp1_lut_config)
struct vsp1_lut_config {
- u32 lut[256];
+ __u32 lut[256];
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/vt.h b/libc/kernel/uapi/linux/vt.h
index c9a8245ee..5bea24ef4 100644
--- a/libc/kernel/uapi/linux/vt.h
+++ b/libc/kernel/uapi/linux/vt.h
@@ -96,5 +96,4 @@ struct vt_setactivate {
};
#define VT_SETACTIVATE 0x560F
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
-#define vt_get_kmsg_redirect() vt_kmsg_redirect(- 1)
#endif
diff --git a/libc/kernel/uapi/linux/xfrm.h b/libc/kernel/uapi/linux/xfrm.h
index 3ab173af6..27f9436cb 100644
--- a/libc/kernel/uapi/linux/xfrm.h
+++ b/libc/kernel/uapi/linux/xfrm.h
@@ -18,534 +18,537 @@
****************************************************************************/
#ifndef _LINUX_XFRM_H
#define _LINUX_XFRM_H
+#include <linux/in6.h>
#include <linux/types.h>
-typedef union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef union {
__be32 a4;
__be32 a6[4];
+ struct in6_addr in6;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} xfrm_address_t;
struct xfrm_id {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t daddr;
__be32 spi;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 proto;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_sec_ctx {
__u8 ctx_doi;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 ctx_alg;
__u16 ctx_len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ctx_sid;
char ctx_str[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define XFRM_SC_DOI_RESERVED 0
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_SC_DOI_LSM 1
#define XFRM_SC_ALG_RESERVED 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_SC_ALG_SELINUX 1
struct xfrm_selector {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t daddr;
xfrm_address_t saddr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 dport;
__be16 dport_mask;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 sport;
__be16 sport_mask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 family;
__u8 prefixlen_d;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 prefixlen_s;
__u8 proto;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
int ifindex;
__kernel_uid32_t user;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define XFRM_INF (~(__u64) 0)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_lifetime_cfg {
__u64 soft_byte_limit;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 hard_byte_limit;
__u64 soft_packet_limit;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 hard_packet_limit;
__u64 soft_add_expires_seconds;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 hard_add_expires_seconds;
__u64 soft_use_expires_seconds;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 hard_use_expires_seconds;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_lifetime_cur {
__u64 bytes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 packets;
__u64 add_time;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 use_time;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_replay_state {
__u32 oseq;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 seq;
__u32 bitmap;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define XFRMA_REPLAY_ESN_MAX 4096
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_replay_state_esn {
unsigned int bmp_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 oseq;
__u32 seq;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 oseq_hi;
__u32 seq_hi;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 replay_window;
__u32 bmp[0];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_algo {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char alg_name[64];
unsigned int alg_key_len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char alg_key[0];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_algo_auth {
char alg_name[64];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int alg_key_len;
unsigned int alg_trunc_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char alg_key[0];
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_algo_aead {
char alg_name[64];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int alg_key_len;
unsigned int alg_icv_len;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char alg_key[0];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_stats {
__u32 replay_window;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 replay;
__u32 integrity_failed;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_POLICY_TYPE_MAIN = 0,
XFRM_POLICY_TYPE_SUB = 1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_POLICY_TYPE_MAX = 2,
XFRM_POLICY_TYPE_ANY = 255
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_POLICY_IN = 0,
XFRM_POLICY_OUT = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_POLICY_FWD = 2,
XFRM_POLICY_MASK = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_POLICY_MAX = 3
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
XFRM_SHARE_ANY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_SHARE_SESSION,
XFRM_SHARE_USER,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_SHARE_UNIQUE
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_MODE_TRANSPORT 0
#define XFRM_MODE_TUNNEL 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_MODE_ROUTEOPTIMIZATION 2
#define XFRM_MODE_IN_TRIGGER 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_MODE_BEET 4
#define XFRM_MODE_MAX 5
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
XFRM_MSG_BASE = 0x10,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_NEWSA = 0x10,
#define XFRM_MSG_NEWSA XFRM_MSG_NEWSA
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_DELSA,
#define XFRM_MSG_DELSA XFRM_MSG_DELSA
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_GETSA,
#define XFRM_MSG_GETSA XFRM_MSG_GETSA
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_NEWPOLICY,
#define XFRM_MSG_NEWPOLICY XFRM_MSG_NEWPOLICY
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_DELPOLICY,
#define XFRM_MSG_DELPOLICY XFRM_MSG_DELPOLICY
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_GETPOLICY,
#define XFRM_MSG_GETPOLICY XFRM_MSG_GETPOLICY
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_ALLOCSPI,
#define XFRM_MSG_ALLOCSPI XFRM_MSG_ALLOCSPI
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_ACQUIRE,
#define XFRM_MSG_ACQUIRE XFRM_MSG_ACQUIRE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_EXPIRE,
#define XFRM_MSG_EXPIRE XFRM_MSG_EXPIRE
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_UPDPOLICY,
#define XFRM_MSG_UPDPOLICY XFRM_MSG_UPDPOLICY
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_UPDSA,
#define XFRM_MSG_UPDSA XFRM_MSG_UPDSA
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_POLEXPIRE,
#define XFRM_MSG_POLEXPIRE XFRM_MSG_POLEXPIRE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_FLUSHSA,
#define XFRM_MSG_FLUSHSA XFRM_MSG_FLUSHSA
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_FLUSHPOLICY,
#define XFRM_MSG_FLUSHPOLICY XFRM_MSG_FLUSHPOLICY
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_NEWAE,
#define XFRM_MSG_NEWAE XFRM_MSG_NEWAE
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_GETAE,
#define XFRM_MSG_GETAE XFRM_MSG_GETAE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_REPORT,
#define XFRM_MSG_REPORT XFRM_MSG_REPORT
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_MIGRATE,
#define XFRM_MSG_MIGRATE XFRM_MSG_MIGRATE
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_NEWSADINFO,
#define XFRM_MSG_NEWSADINFO XFRM_MSG_NEWSADINFO
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_GETSADINFO,
#define XFRM_MSG_GETSADINFO XFRM_MSG_GETSADINFO
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_NEWSPDINFO,
#define XFRM_MSG_NEWSPDINFO XFRM_MSG_NEWSPDINFO
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_GETSPDINFO,
#define XFRM_MSG_GETSPDINFO XFRM_MSG_GETSPDINFO
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_MSG_MAPPING,
#define XFRM_MSG_MAPPING XFRM_MSG_MAPPING
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__XFRM_MSG_MAX
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_MSG_MAX (__XFRM_MSG_MAX - 1)
#define XFRM_NR_MSGTYPES (XFRM_MSG_MAX + 1 - XFRM_MSG_BASE)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_user_sec_ctx {
__u16 len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 exttype;
__u8 ctx_alg;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 ctx_doi;
__u16 ctx_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_user_tmpl {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_id id;
__u16 family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t saddr;
__u32 reqid;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 mode;
__u8 share;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 optional;
__u32 aalgos;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ealgos;
__u32 calgos;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_encap_tmpl {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 encap_type;
__be16 encap_sport;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 encap_dport;
xfrm_address_t encap_oa;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum xfrm_ae_ftype_t {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_AE_UNSPEC,
XFRM_AE_RTHR = 1,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_AE_RVAL = 2,
XFRM_AE_LVAL = 4,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_AE_ETHR = 8,
XFRM_AE_CR = 16,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRM_AE_CE = 32,
XFRM_AE_CU = 64,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__XFRM_AE_MAX
#define XFRM_AE_MAX (__XFRM_AE_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_userpolicy_type {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 type;
__u16 reserved1;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 reserved2;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum xfrm_attr_type_t {
XFRMA_UNSPEC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_ALG_AUTH,
XFRMA_ALG_CRYPT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_ALG_COMP,
XFRMA_ENCAP,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_TMPL,
XFRMA_SA,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_POLICY,
XFRMA_SEC_CTX,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_LTIME_VAL,
XFRMA_REPLAY_VAL,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_REPLAY_THRESH,
XFRMA_ETIMER_THRESH,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_SRCADDR,
XFRMA_COADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_LASTUSED,
XFRMA_POLICY_TYPE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_MIGRATE,
XFRMA_ALG_AEAD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_KMADDRESS,
XFRMA_ALG_AUTH_TRUNC,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_MARK,
XFRMA_TFCPAD,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_REPLAY_ESN_VAL,
XFRMA_SA_EXTRA_FLAGS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_PROTO,
XFRMA_ADDRESS_FILTER,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__XFRMA_MAX
#define XFRMA_MAX (__XFRMA_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_mark {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 v;
__u32 m;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum xfrm_sadattr_type_t {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_SAD_UNSPEC,
XFRMA_SAD_CNT,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_SAD_HINFO,
__XFRMA_SAD_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMA_SAD_MAX (__XFRMA_SAD_MAX - 1)
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrmu_sadhinfo {
__u32 sadhcnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 sadhmcnt;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum xfrm_spdattr_type_t {
XFRMA_SPD_UNSPEC,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_SPD_INFO,
XFRMA_SPD_HINFO,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
XFRMA_SPD_IPV4_HTHRESH,
XFRMA_SPD_IPV6_HTHRESH,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__XFRMA_SPD_MAX
#define XFRMA_SPD_MAX (__XFRMA_SPD_MAX - 1)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrmu_spdinfo {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 incnt;
__u32 outcnt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 fwdcnt;
__u32 inscnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 outscnt;
__u32 fwdscnt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrmu_spdhinfo {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 spdhcnt;
__u32 spdhmcnt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrmu_spdhthresh {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 lbits;
__u8 rbits;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_usersa_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_selector sel;
struct xfrm_id id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t saddr;
struct xfrm_lifetime_cfg lft;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_lifetime_cur curlft;
struct xfrm_stats stats;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 seq;
__u32 reqid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 family;
__u8 mode;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 replay_window;
__u8 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_STATE_NOECN 1
#define XFRM_STATE_DECAP_DSCP 2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_STATE_NOPMTUDISC 4
#define XFRM_STATE_WILDRECV 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_STATE_ICMP 16
#define XFRM_STATE_AF_UNSPEC 32
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_STATE_ALIGN4 64
#define XFRM_STATE_ESN 128
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define XFRM_SA_XFLAG_DONT_ENCAP_DSCP 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_usersa_id {
xfrm_address_t daddr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be32 spi;
__u16 family;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 proto;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_aevent_id {
struct xfrm_usersa_id sa_id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t saddr;
__u32 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reqid;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_userspi_info {
struct xfrm_usersa_info info;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 min;
__u32 max;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_userpolicy_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_selector sel;
struct xfrm_lifetime_cfg lft;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_lifetime_cur curlft;
__u32 priority;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
__u8 dir;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 action;
#define XFRM_POLICY_ALLOW 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_POLICY_BLOCK 1
__u8 flags;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRM_POLICY_LOCALOK 1
#define XFRM_POLICY_ICMP 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 share;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_userpolicy_id {
struct xfrm_selector sel;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 index;
__u8 dir;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_user_acquire {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_id id;
xfrm_address_t saddr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_selector sel;
struct xfrm_userpolicy_info policy;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 aalgos;
__u32 ealgos;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 calgos;
__u32 seq;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_user_expire {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_usersa_info state;
__u8 hard;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_user_polexpire {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_userpolicy_info pol;
__u8 hard;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct xfrm_usersa_flush {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 proto;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_user_report {
__u8 proto;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_selector sel;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_user_kmaddress {
xfrm_address_t local;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t remote;
__u32 reserved;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 family;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_user_migrate {
xfrm_address_t old_daddr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t old_saddr;
xfrm_address_t new_daddr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t new_saddr;
__u8 proto;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 mode;
__u16 reserved;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reqid;
__u16 old_family;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 new_family;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_user_mapping {
struct xfrm_usersa_id id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reqid;
xfrm_address_t old_saddr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t new_saddr;
__be16 old_sport;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be16 new_sport;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct xfrm_address_filter {
xfrm_address_t saddr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
xfrm_address_t daddr;
__u16 family;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 splen;
__u8 dplen;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define XFRMGRP_ACQUIRE 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMGRP_EXPIRE 2
#define XFRMGRP_SA 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMGRP_POLICY 8
#define XFRMGRP_REPORT 0x20
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum xfrm_nlgroups {
XFRMNLGRP_NONE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_NONE XFRMNLGRP_NONE
XFRMNLGRP_ACQUIRE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_ACQUIRE XFRMNLGRP_ACQUIRE
XFRMNLGRP_EXPIRE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_EXPIRE XFRMNLGRP_EXPIRE
XFRMNLGRP_SA,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_SA XFRMNLGRP_SA
XFRMNLGRP_POLICY,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_POLICY XFRMNLGRP_POLICY
XFRMNLGRP_AEVENTS,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_AEVENTS XFRMNLGRP_AEVENTS
XFRMNLGRP_REPORT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_REPORT XFRMNLGRP_REPORT
XFRMNLGRP_MIGRATE,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_MIGRATE XFRMNLGRP_MIGRATE
XFRMNLGRP_MAPPING,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define XFRMNLGRP_MAPPING XFRMNLGRP_MAPPING
__XFRMNLGRP_MAX
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define XFRMNLGRP_MAX (__XFRMNLGRP_MAX - 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/linux/xilinx-v4l2-controls.h b/libc/kernel/uapi/linux/xilinx-v4l2-controls.h
new file mode 100644
index 000000000..3a7fdbbda
--- /dev/null
+++ b/libc/kernel/uapi/linux/xilinx-v4l2-controls.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __UAPI_XILINX_V4L2_CONTROLS_H__
+#define __UAPI_XILINX_V4L2_CONTROLS_H__
+#include <linux/v4l2-controls.h>
+#define V4L2_CID_XILINX_OFFSET 0xc000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CID_XILINX_BASE (V4L2_CID_USER_BASE + V4L2_CID_XILINX_OFFSET)
+#define V4L2_CID_XILINX_TPG (V4L2_CID_USER_BASE + 0xc000)
+#define V4L2_CID_XILINX_TPG_CROSS_HAIRS (V4L2_CID_XILINX_TPG + 1)
+#define V4L2_CID_XILINX_TPG_MOVING_BOX (V4L2_CID_XILINX_TPG + 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CID_XILINX_TPG_COLOR_MASK (V4L2_CID_XILINX_TPG + 3)
+#define V4L2_CID_XILINX_TPG_STUCK_PIXEL (V4L2_CID_XILINX_TPG + 4)
+#define V4L2_CID_XILINX_TPG_NOISE (V4L2_CID_XILINX_TPG + 5)
+#define V4L2_CID_XILINX_TPG_MOTION (V4L2_CID_XILINX_TPG + 6)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CID_XILINX_TPG_MOTION_SPEED (V4L2_CID_XILINX_TPG + 7)
+#define V4L2_CID_XILINX_TPG_CROSS_HAIR_ROW (V4L2_CID_XILINX_TPG + 8)
+#define V4L2_CID_XILINX_TPG_CROSS_HAIR_COLUMN (V4L2_CID_XILINX_TPG + 9)
+#define V4L2_CID_XILINX_TPG_ZPLATE_HOR_START (V4L2_CID_XILINX_TPG + 10)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CID_XILINX_TPG_ZPLATE_HOR_SPEED (V4L2_CID_XILINX_TPG + 11)
+#define V4L2_CID_XILINX_TPG_ZPLATE_VER_START (V4L2_CID_XILINX_TPG + 12)
+#define V4L2_CID_XILINX_TPG_ZPLATE_VER_SPEED (V4L2_CID_XILINX_TPG + 13)
+#define V4L2_CID_XILINX_TPG_BOX_SIZE (V4L2_CID_XILINX_TPG + 14)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define V4L2_CID_XILINX_TPG_BOX_COLOR (V4L2_CID_XILINX_TPG + 15)
+#define V4L2_CID_XILINX_TPG_STUCK_PIXEL_THRESH (V4L2_CID_XILINX_TPG + 16)
+#define V4L2_CID_XILINX_TPG_NOISE_GAIN (V4L2_CID_XILINX_TPG + 17)
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/misc/cxl.h b/libc/kernel/uapi/misc/cxl.h
index 150a0d93c..e13a55b3d 100644
--- a/libc/kernel/uapi/misc/cxl.h
+++ b/libc/kernel/uapi/misc/cxl.h
@@ -38,59 +38,81 @@ struct cxl_ioctl_start_work {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CXL_START_WORK_AMR 0x0000000000000001ULL
#define CXL_START_WORK_NUM_IRQS 0x0000000000000002ULL
-#define CXL_START_WORK_ALL (CXL_START_WORK_AMR | CXL_START_WORK_NUM_IRQS)
+#define CXL_START_WORK_ERR_FF 0x0000000000000004ULL
+#define CXL_START_WORK_ALL (CXL_START_WORK_AMR | CXL_START_WORK_NUM_IRQS | CXL_START_WORK_ERR_FF)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CXL_MODE_DEDICATED 0x1
+#define CXL_MODE_DIRECTED 0x2
+#define CXL_AFUID_FLAG_SLAVE 0x1
+struct cxl_afu_id {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 flags;
+ __u32 card_id;
+ __u32 afu_offset;
+ __u32 afu_mode;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved1;
+ __u64 reserved2;
+ __u64 reserved3;
+ __u64 reserved4;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 reserved5;
+ __u64 reserved6;
+};
#define CXL_MAGIC 0xCA
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CXL_IOCTL_START_WORK _IOW(CXL_MAGIC, 0x00, struct cxl_ioctl_start_work)
#define CXL_IOCTL_GET_PROCESS_ELEMENT _IOR(CXL_MAGIC, 0x01, __u32)
+#define CXL_IOCTL_GET_AFU_ID _IOR(CXL_MAGIC, 0x02, struct cxl_afu_id)
#define CXL_READ_MIN_SIZE 0x1000
-enum cxl_event_type {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum cxl_event_type {
CXL_EVENT_RESERVED = 0,
CXL_EVENT_AFU_INTERRUPT = 1,
CXL_EVENT_DATA_STORAGE = 2,
- CXL_EVENT_AFU_ERROR = 3,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ CXL_EVENT_AFU_ERROR = 3,
};
struct cxl_event_header {
__u16 type;
- __u16 size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 size;
__u16 process_element;
__u16 reserved1;
};
-struct cxl_event_afu_interrupt {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct cxl_event_afu_interrupt {
__u16 flags;
__u16 irq;
__u32 reserved1;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct cxl_event_data_storage {
__u16 flags;
__u16 reserved1;
- __u32 reserved2;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved2;
__u64 addr;
__u64 dsisr;
__u64 reserved3;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct cxl_event_afu_error {
__u16 flags;
__u16 reserved1;
- __u32 reserved2;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved2;
__u64 error;
};
struct cxl_event {
- struct cxl_event_header header;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct cxl_event_header header;
union {
struct cxl_event_afu_interrupt irq;
struct cxl_event_data_storage fault;
- struct cxl_event_afu_error afu_error;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct cxl_event_afu_error afu_error;
};
};
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/mtd/mtd-user.h b/libc/kernel/uapi/mtd/mtd-user.h
index 83a863561..b78a46e12 100644
--- a/libc/kernel/uapi/mtd/mtd-user.h
+++ b/libc/kernel/uapi/mtd/mtd-user.h
@@ -18,13 +18,12 @@
****************************************************************************/
#ifndef __MTD_USER_H__
#define __MTD_USER_H__
-#include <stdint.h>
#include <mtd/mtd-abi.h>
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct mtd_info_user mtd_info_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct erase_info_user erase_info_t;
typedef struct region_info_user region_info_t;
typedef struct nand_oobinfo nand_oobinfo_t;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct nand_ecclayout_user nand_ecclayout_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/rdma/hfi/hfi1_user.h b/libc/kernel/uapi/rdma/hfi/hfi1_user.h
new file mode 100644
index 000000000..a0079b524
--- /dev/null
+++ b/libc/kernel/uapi/rdma/hfi/hfi1_user.h
@@ -0,0 +1,239 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _LINUX__HFI1_USER_H
+#define _LINUX__HFI1_USER_H
+#include <linux/types.h>
+#define HFI1_USER_SWMAJOR 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_USER_SWMINOR 0
+#define HFI1_CAP_DMA_RTAIL (1UL << 0)
+#define HFI1_CAP_SDMA (1UL << 1)
+#define HFI1_CAP_SDMA_AHG (1UL << 2)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CAP_EXTENDED_PSN (1UL << 3)
+#define HFI1_CAP_HDRSUPP (1UL << 4)
+#define HFI1_CAP_USE_SDMA_HEAD (1UL << 6)
+#define HFI1_CAP_MULTI_PKT_EGR (1UL << 7)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CAP_NODROP_RHQ_FULL (1UL << 8)
+#define HFI1_CAP_NODROP_EGR_FULL (1UL << 9)
+#define HFI1_CAP_TID_UNMAP (1UL << 10)
+#define HFI1_CAP_PRINT_UNIMPL (1UL << 11)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CAP_ALLOW_PERM_JKEY (1UL << 12)
+#define HFI1_CAP_NO_INTEGRITY (1UL << 13)
+#define HFI1_CAP_PKEY_CHECK (1UL << 14)
+#define HFI1_CAP_STATIC_RATE_CTRL (1UL << 15)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CAP_SDMA_HEAD_CHECK (1UL << 17)
+#define HFI1_CAP_EARLY_CREDIT_RETURN (1UL << 18)
+#define HFI1_RCVHDR_ENTSIZE_2 (1UL << 0)
+#define HFI1_RCVHDR_ENTSIZE_16 (1UL << 1)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_RCVDHR_ENTSIZE_32 (1UL << 2)
+#define HFI1_ALG_ACROSS 0
+#define HFI1_ALG_WITHIN 1
+#define HFI1_ALG_COUNT 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CMD_ASSIGN_CTXT 1
+#define HFI1_CMD_CTXT_INFO 2
+#define HFI1_CMD_USER_INFO 3
+#define HFI1_CMD_TID_UPDATE 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CMD_TID_FREE 5
+#define HFI1_CMD_CREDIT_UPD 6
+#define HFI1_CMD_SDMA_STATUS_UPD 7
+#define HFI1_CMD_RECV_CTRL 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CMD_POLL_TYPE 9
+#define HFI1_CMD_ACK_EVENT 10
+#define HFI1_CMD_SET_PKEY 11
+#define HFI1_CMD_CTXT_RESET 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CMD_EP_INFO 64
+#define HFI1_CMD_EP_ERASE_CHIP 65
+#define HFI1_CMD_EP_ERASE_P0 66
+#define HFI1_CMD_EP_ERASE_P1 67
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_CMD_EP_READ_P0 68
+#define HFI1_CMD_EP_READ_P1 69
+#define HFI1_CMD_EP_WRITE_P0 70
+#define HFI1_CMD_EP_WRITE_P1 71
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _HFI1_EVENT_FROZEN_BIT 0
+#define _HFI1_EVENT_LINKDOWN_BIT 1
+#define _HFI1_EVENT_LID_CHANGE_BIT 2
+#define _HFI1_EVENT_LMC_CHANGE_BIT 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define _HFI1_EVENT_SL2VL_CHANGE_BIT 4
+#define _HFI1_MAX_EVENT_BIT _HFI1_EVENT_SL2VL_CHANGE_BIT
+#define HFI1_EVENT_FROZEN (1UL << _HFI1_EVENT_FROZEN_BIT)
+#define HFI1_EVENT_LINKDOWN_BIT (1UL << _HFI1_EVENT_LINKDOWN_BIT)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_EVENT_LID_CHANGE_BIT (1UL << _HFI1_EVENT_LID_CHANGE_BIT)
+#define HFI1_EVENT_LMC_CHANGE_BIT (1UL << _HFI1_EVENT_LMC_CHANGE_BIT)
+#define HFI1_EVENT_SL2VL_CHANGE_BIT (1UL << _HFI1_EVENT_SL2VL_CHANGE_BIT)
+#define HFI1_STATUS_INITTED 0x1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_STATUS_CHIP_PRESENT 0x20
+#define HFI1_STATUS_IB_READY 0x40
+#define HFI1_STATUS_IB_CONF 0x80
+#define HFI1_STATUS_HWERROR 0x200
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_MAX_SHARED_CTXTS 8
+#define HFI1_POLL_TYPE_ANYRCV 0x0
+#define HFI1_POLL_TYPE_URGENT 0x1
+struct hfi1_user_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 userversion;
+ __u16 pad;
+ __u16 hfi1_alg;
+ __u16 subctxt_cnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 subctxt_id;
+ __u8 uuid[16];
+};
+struct hfi1_ctxt_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 runtime_flags;
+ __u32 rcvegr_size;
+ __u16 num_active;
+ __u16 unit;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 ctxt;
+ __u16 subctxt;
+ __u16 rcvtids;
+ __u16 credits;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 numa_node;
+ __u16 rec_cpu;
+ __u16 send_ctxt;
+ __u16 egrtids;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 rcvhdrq_cnt;
+ __u16 rcvhdrq_entsize;
+ __u16 sdma_ring_size;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct hfi1_tid_info {
+ __u64 vaddr;
+ __u64 tidlist;
+ __u32 tidcnt;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 length;
+ __u64 tidmap;
+};
+struct hfi1_cmd {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 type;
+ __u32 len;
+ __u64 addr;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum hfi1_sdma_comp_state {
+ FREE = 0,
+ QUEUED,
+ COMPLETE,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ERROR
+};
+struct hfi1_sdma_comp_entry {
+ __u32 status;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 errcode;
+};
+struct hfi1_status {
+ __u64 dev;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 port;
+ char freezemsg[0];
+};
+struct hfi1_base_info {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 hw_version;
+ __u32 sw_version;
+ __u16 jkey;
+ __u16 padding1;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 bthqp;
+ __u64 sc_credits_addr;
+ __u64 pio_bufbase_sop;
+ __u64 pio_bufbase;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 rcvhdr_bufbase;
+ __u64 rcvegr_bufbase;
+ __u64 sdma_comp_bufbase;
+ __u64 user_regbase;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 events_bufbase;
+ __u64 status_bufbase;
+ __u64 rcvhdrtail_base;
+ __u64 subctxt_uregbase;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 subctxt_rcvegrbuf;
+ __u64 subctxt_rcvhdrbuf;
+};
+enum sdma_req_opcode {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ EXPECTED = 0,
+ EAGER
+};
+#define HFI1_SDMA_REQ_VERSION_MASK 0xF
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_SDMA_REQ_VERSION_SHIFT 0x0
+#define HFI1_SDMA_REQ_OPCODE_MASK 0xF
+#define HFI1_SDMA_REQ_OPCODE_SHIFT 0x4
+#define HFI1_SDMA_REQ_IOVCNT_MASK 0xFF
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HFI1_SDMA_REQ_IOVCNT_SHIFT 0x8
+struct sdma_req_info {
+ __u16 ctrl;
+ __u16 npkts;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 fragsize;
+ __u16 comp_idx;
+} __packed;
+struct hfi1_kdeth_header {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 ver_tid_offset;
+ __le16 jkey;
+ __le16 hcrc;
+ __le32 swdata[7];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __packed;
+struct hfi1_pkt_header {
+ __le16 pbc[4];
+ __be16 lrh[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __be32 bth[3];
+ struct hfi1_kdeth_header kdeth;
+} __packed;
+enum hfi1_ureg {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ur_rcvhdrtail = 0,
+ ur_rcvhdrhead = 1,
+ ur_rcvegrindextail = 2,
+ ur_rcvegrindexhead = 3,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ur_rcvegroffsettail = 4,
+ ur_maxreg,
+ ur_rcvtidflowtable = 256
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/rdma/ib_user_verbs.h b/libc/kernel/uapi/rdma/ib_user_verbs.h
index 9c23ac21a..a3ed5dbce 100644
--- a/libc/kernel/uapi/rdma/ib_user_verbs.h
+++ b/libc/kernel/uapi/rdma/ib_user_verbs.h
@@ -77,106 +77,136 @@ enum {
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+ IB_USER_VERBS_EX_CMD_QUERY_DEVICE = IB_USER_VERBS_CMD_QUERY_DEVICE,
+ IB_USER_VERBS_EX_CMD_CREATE_CQ = IB_USER_VERBS_CMD_CREATE_CQ,
+ IB_USER_VERBS_EX_CMD_CREATE_QP = IB_USER_VERBS_CMD_CREATE_QP,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD,
- IB_USER_VERBS_EX_CMD_DESTROY_FLOW
+ IB_USER_VERBS_EX_CMD_DESTROY_FLOW,
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_async_event_desc {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 element;
__u32 event_type;
__u32 reserved;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_comp_event_desc {
__u64 cq_handle;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IB_USER_VERBS_CMD_COMMAND_MASK 0xff
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IB_USER_VERBS_CMD_FLAGS_MASK 0xff000000u
#define IB_USER_VERBS_CMD_FLAGS_SHIFT 24
#define IB_USER_VERBS_CMD_FLAG_EXTENDED 0x80
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_cmd_hdr {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 command;
__u16 in_words;
__u16 out_words;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_ex_cmd_hdr {
__u64 response;
__u16 provider_in_words;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 provider_out_words;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cmd_hdr_reserved;
};
struct ib_uverbs_get_context {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 response;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 driver_data[0];
};
struct ib_uverbs_get_context_resp {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 async_fd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 num_comp_vectors;
};
struct ib_uverbs_query_device {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 response;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 driver_data[0];
};
struct ib_uverbs_query_device_resp {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 fw_ver;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__be64 node_guid;
__be64 sys_image_guid;
__u64 max_mr_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 page_size_cap;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 vendor_id;
__u32 vendor_part_id;
__u32 hw_ver;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_qp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_qp_wr;
__u32 device_cap_flags;
__u32 max_sge;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_sge_rd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_cq;
__u32 max_cqe;
__u32 max_mr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_pd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_qp_rd_atom;
__u32 max_ee_rd_atom;
__u32 max_res_rd_atom;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_qp_init_rd_atom;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_ee_init_rd_atom;
__u32 atomic_cap;
__u32 max_ee;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_rdd;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_mw;
__u32 max_raw_ipv6_qp;
__u32 max_raw_ethy_qp;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_mcast_grp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_mcast_qp_attach;
__u32 max_total_mcast_qp_attach;
__u32 max_ah;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_fmr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_map_per_fmr;
__u32 max_srq;
__u32 max_srq_wr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_srq_sge;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 max_pkeys;
__u8 local_ca_ack_delay;
__u8 phys_port_cnt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 reserved[4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct ib_uverbs_ex_query_device {
+ __u32 comp_mask;
+ __u32 reserved;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct ib_uverbs_odp_caps {
+ __u64 general_caps;
+ struct {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rc_odp_caps;
+ __u32 uc_odp_caps;
+ __u32 ud_odp_caps;
+ } per_transport_caps;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
+};
+struct ib_uverbs_ex_query_device_resp {
+ struct ib_uverbs_query_device_resp base;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 comp_mask;
+ __u32 response_length;
+ struct ib_uverbs_odp_caps odp_caps;
+ __u64 timestamp_mask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 hca_core_clock;
};
struct ib_uverbs_query_port {
__u64 response;
@@ -316,163 +346,203 @@ struct ib_uverbs_create_cq {
__u64 driver_data[0];
};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ib_uverbs_ex_create_cq {
+ __u64 user_handle;
+ __u32 cqe;
+ __u32 comp_vector;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __s32 comp_channel;
+ __u32 comp_mask;
+ __u32 flags;
+ __u32 reserved;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_create_cq_resp {
__u32 cq_handle;
__u32 cqe;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+struct ib_uverbs_ex_create_cq_resp {
+ struct ib_uverbs_create_cq_resp base;
+ __u32 comp_mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 response_length;
+};
struct ib_uverbs_resize_cq {
__u64 response;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cq_handle;
__u32 cqe;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 driver_data[0];
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_resize_cq_resp {
__u32 cqe;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved;
__u64 driver_data[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ib_uverbs_poll_cq {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 response;
__u32 cq_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 ne;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_wc {
__u64 wr_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 status;
__u32 opcode;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 vendor_err;
__u32 byte_len;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
union {
__u32 imm_data;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 invalidate_rkey;
} ex;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 qp_num;
__u32 src_qp;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 wc_flags;
__u16 pkey_index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 slid;
__u8 sl;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 dlid_path_bits;
__u8 port_num;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 reserved;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_poll_cq_resp {
__u32 count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved;
struct ib_uverbs_wc wc[0];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ib_uverbs_req_notify_cq {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 cq_handle;
__u32 solicited_only;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ib_uverbs_destroy_cq {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 response;
__u32 cq_handle;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_destroy_cq_resp {
__u32 comp_events_reported;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 async_events_reported;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_global_route {
__u8 dgid[16];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 flow_label;
__u8 sgid_index;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 hop_limit;
__u8 traffic_class;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 reserved;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_ah_attr {
struct ib_uverbs_global_route grh;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 dlid;
__u8 sl;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 src_path_bits;
__u8 static_rate;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 is_global;
__u8 port_num;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 reserved;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_qp_attr {
__u32 qp_attr_mask;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 qp_state;
__u32 cur_qp_state;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 path_mtu;
__u32 path_mig_state;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 qkey;
__u32 rq_psn;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 sq_psn;
__u32 dest_qp_num;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 qp_access_flags;
struct ib_uverbs_ah_attr ah_attr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ib_uverbs_ah_attr alt_ah_attr;
__u32 max_send_wr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_recv_wr;
__u32 max_send_sge;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_recv_sge;
__u32 max_inline_data;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u16 pkey_index;
__u16 alt_pkey_index;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 en_sqd_async_notify;
__u8 sq_draining;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 max_rd_atomic;
__u8 max_dest_rd_atomic;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 min_rnr_timer;
__u8 port_num;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 timeout;
__u8 retry_cnt;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 rnr_retry;
__u8 alt_port_num;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 alt_timeout;
__u8 reserved[5];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
struct ib_uverbs_create_qp {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u64 response;
__u64 user_handle;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 pd_handle;
__u32 send_cq_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 recv_cq_handle;
__u32 srq_handle;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_send_wr;
__u32 max_recv_wr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_send_sge;
__u32 max_recv_sge;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 max_inline_data;
__u8 sq_sig_all;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 qp_type;
__u8 is_srq;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 reserved;
__u64 driver_data[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct ib_uverbs_ex_create_qp {
+ __u64 user_handle;
+ __u32 pd_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 send_cq_handle;
+ __u32 recv_cq_handle;
+ __u32 srq_handle;
+ __u32 max_send_wr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 max_recv_wr;
+ __u32 max_send_sge;
+ __u32 max_recv_sge;
+ __u32 max_inline_data;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 sq_sig_all;
+ __u8 qp_type;
+ __u8 is_srq;
+ __u8 reserved;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 comp_mask;
+ __u32 create_flags;
};
struct ib_uverbs_open_qp {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -498,412 +568,418 @@ struct ib_uverbs_create_qp_resp {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 reserved;
};
+struct ib_uverbs_ex_create_qp_resp {
+ struct ib_uverbs_create_qp_resp base;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 comp_mask;
+ __u32 response_length;
+};
struct ib_uverbs_qp_dest {
- __u8 dgid[16];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 dgid[16];
__u32 flow_label;
__u16 dlid;
__u16 reserved;
- __u8 sgid_index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 sgid_index;
__u8 hop_limit;
__u8 traffic_class;
__u8 sl;
- __u8 src_path_bits;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 src_path_bits;
__u8 static_rate;
__u8 is_global;
__u8 port_num;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_query_qp {
__u64 response;
__u32 qp_handle;
- __u32 attr_mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 attr_mask;
__u64 driver_data[0];
};
struct ib_uverbs_query_qp_resp {
- struct ib_uverbs_qp_dest dest;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ib_uverbs_qp_dest dest;
struct ib_uverbs_qp_dest alt_dest;
__u32 max_send_wr;
__u32 max_recv_wr;
- __u32 max_send_sge;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 max_send_sge;
__u32 max_recv_sge;
__u32 max_inline_data;
__u32 qkey;
- __u32 rq_psn;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rq_psn;
__u32 sq_psn;
__u32 dest_qp_num;
__u32 qp_access_flags;
- __u16 pkey_index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 pkey_index;
__u16 alt_pkey_index;
__u8 qp_state;
__u8 cur_qp_state;
- __u8 path_mtu;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 path_mtu;
__u8 path_mig_state;
__u8 sq_draining;
__u8 max_rd_atomic;
- __u8 max_dest_rd_atomic;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 max_dest_rd_atomic;
__u8 min_rnr_timer;
__u8 port_num;
__u8 timeout;
- __u8 retry_cnt;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 retry_cnt;
__u8 rnr_retry;
__u8 alt_port_num;
__u8 alt_timeout;
- __u8 sq_sig_all;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 sq_sig_all;
__u8 reserved[5];
__u64 driver_data[0];
};
-struct ib_uverbs_modify_qp {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ib_uverbs_modify_qp {
struct ib_uverbs_qp_dest dest;
struct ib_uverbs_qp_dest alt_dest;
__u32 qp_handle;
- __u32 attr_mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 attr_mask;
__u32 qkey;
__u32 rq_psn;
__u32 sq_psn;
- __u32 dest_qp_num;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 dest_qp_num;
__u32 qp_access_flags;
__u16 pkey_index;
__u16 alt_pkey_index;
- __u8 qp_state;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 qp_state;
__u8 cur_qp_state;
__u8 path_mtu;
__u8 path_mig_state;
- __u8 en_sqd_async_notify;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 en_sqd_async_notify;
__u8 max_rd_atomic;
__u8 max_dest_rd_atomic;
__u8 min_rnr_timer;
- __u8 port_num;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 port_num;
__u8 timeout;
__u8 retry_cnt;
__u8 rnr_retry;
- __u8 alt_port_num;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 alt_port_num;
__u8 alt_timeout;
__u8 reserved[2];
__u64 driver_data[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_modify_qp_resp {
};
struct ib_uverbs_destroy_qp {
- __u64 response;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 response;
__u32 qp_handle;
__u32 reserved;
};
-struct ib_uverbs_destroy_qp_resp {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ib_uverbs_destroy_qp_resp {
__u32 events_reported;
};
struct ib_uverbs_sge {
- __u64 addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 addr;
__u32 length;
__u32 lkey;
};
-struct ib_uverbs_send_wr {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ib_uverbs_send_wr {
__u64 wr_id;
__u32 num_sge;
__u32 opcode;
- __u32 send_flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 send_flags;
union {
__u32 imm_data;
__u32 invalidate_rkey;
- } ex;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } ex;
union {
struct {
__u64 remote_addr;
- __u32 rkey;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 rkey;
__u32 reserved;
} rdma;
struct {
- __u64 remote_addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 remote_addr;
__u64 compare_add;
__u64 swap;
__u32 rkey;
- __u32 reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
} atomic;
struct {
__u32 ah;
- __u32 remote_qpn;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 remote_qpn;
__u32 remote_qkey;
__u32 reserved;
} ud;
- } wr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } wr;
};
struct ib_uverbs_post_send {
__u64 response;
- __u32 qp_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 qp_handle;
__u32 wr_count;
__u32 sge_count;
__u32 wqe_size;
- struct ib_uverbs_send_wr send_wr[0];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ib_uverbs_send_wr send_wr[0];
};
struct ib_uverbs_post_send_resp {
__u32 bad_wr;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_recv_wr {
__u64 wr_id;
__u32 num_sge;
- __u32 reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
};
struct ib_uverbs_post_recv {
__u64 response;
- __u32 qp_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 qp_handle;
__u32 wr_count;
__u32 sge_count;
__u32 wqe_size;
- struct ib_uverbs_recv_wr recv_wr[0];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ib_uverbs_recv_wr recv_wr[0];
};
struct ib_uverbs_post_recv_resp {
__u32 bad_wr;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_post_srq_recv {
__u64 response;
__u32 srq_handle;
- __u32 wr_count;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 wr_count;
__u32 sge_count;
__u32 wqe_size;
struct ib_uverbs_recv_wr recv[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_post_srq_recv_resp {
__u32 bad_wr;
};
-struct ib_uverbs_create_ah {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ib_uverbs_create_ah {
__u64 response;
__u64 user_handle;
__u32 pd_handle;
- __u32 reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
struct ib_uverbs_ah_attr attr;
};
struct ib_uverbs_create_ah_resp {
- __u32 ah_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 ah_handle;
};
struct ib_uverbs_destroy_ah {
__u32 ah_handle;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_attach_mcast {
__u8 gid[16];
__u32 qp_handle;
- __u16 mlid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 mlid;
__u16 reserved;
__u64 driver_data[0];
};
-struct ib_uverbs_detach_mcast {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ib_uverbs_detach_mcast {
__u8 gid[16];
__u32 qp_handle;
__u16 mlid;
- __u16 reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 reserved;
__u64 driver_data[0];
};
struct ib_uverbs_flow_spec_hdr {
- __u32 type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 type;
__u16 size;
__u16 reserved;
__u64 flow_spec_data[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_flow_eth_filter {
__u8 dst_mac[6];
__u8 src_mac[6];
- __be16 ether_type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __be16 ether_type;
__be16 vlan_tag;
};
struct ib_uverbs_flow_spec_eth {
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
struct ib_uverbs_flow_spec_hdr hdr;
struct {
__u32 type;
- __u16 size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 size;
__u16 reserved;
};
};
- struct ib_uverbs_flow_eth_filter val;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ib_uverbs_flow_eth_filter val;
struct ib_uverbs_flow_eth_filter mask;
};
struct ib_uverbs_flow_ipv4_filter {
- __be32 src_ip;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __be32 src_ip;
__be32 dst_ip;
};
struct ib_uverbs_flow_spec_ipv4 {
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
struct ib_uverbs_flow_spec_hdr hdr;
struct {
__u32 type;
- __u16 size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 size;
__u16 reserved;
};
};
- struct ib_uverbs_flow_ipv4_filter val;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ib_uverbs_flow_ipv4_filter val;
struct ib_uverbs_flow_ipv4_filter mask;
};
struct ib_uverbs_flow_tcp_udp_filter {
- __be16 dst_port;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __be16 dst_port;
__be16 src_port;
};
struct ib_uverbs_flow_spec_tcp_udp {
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
struct ib_uverbs_flow_spec_hdr hdr;
struct {
__u32 type;
- __u16 size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u16 size;
__u16 reserved;
};
};
- struct ib_uverbs_flow_tcp_udp_filter val;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ib_uverbs_flow_tcp_udp_filter val;
struct ib_uverbs_flow_tcp_udp_filter mask;
};
struct ib_uverbs_flow_attr {
- __u32 type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 type;
__u16 size;
__u16 priority;
__u8 num_of_specs;
- __u8 reserved[2];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 reserved[2];
__u8 port;
__u32 flags;
struct ib_uverbs_flow_spec_hdr flow_specs[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_create_flow {
__u32 comp_mask;
__u32 qp_handle;
- struct ib_uverbs_flow_attr flow_attr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct ib_uverbs_flow_attr flow_attr;
};
struct ib_uverbs_create_flow_resp {
__u32 comp_mask;
- __u32 flow_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flow_handle;
};
struct ib_uverbs_destroy_flow {
__u32 comp_mask;
- __u32 flow_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 flow_handle;
};
struct ib_uverbs_create_srq {
__u64 response;
- __u64 user_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 user_handle;
__u32 pd_handle;
__u32 max_wr;
__u32 max_sge;
- __u32 srq_limit;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 srq_limit;
__u64 driver_data[0];
};
struct ib_uverbs_create_xsrq {
- __u64 response;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 response;
__u64 user_handle;
__u32 srq_type;
__u32 pd_handle;
- __u32 max_wr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 max_wr;
__u32 max_sge;
__u32 srq_limit;
__u32 reserved;
- __u32 xrcd_handle;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 xrcd_handle;
__u32 cq_handle;
__u64 driver_data[0];
};
-struct ib_uverbs_create_srq_resp {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct ib_uverbs_create_srq_resp {
__u32 srq_handle;
__u32 max_wr;
__u32 max_sge;
- __u32 srqn;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 srqn;
};
struct ib_uverbs_modify_srq {
__u32 srq_handle;
- __u32 attr_mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 attr_mask;
__u32 max_wr;
__u32 srq_limit;
__u64 driver_data[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_query_srq {
__u64 response;
__u32 srq_handle;
- __u32 reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
__u64 driver_data[0];
};
struct ib_uverbs_query_srq_resp {
- __u32 max_wr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 max_wr;
__u32 max_sge;
__u32 srq_limit;
__u32 reserved;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct ib_uverbs_destroy_srq {
__u64 response;
__u32 srq_handle;
- __u32 reserved;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 reserved;
};
struct ib_uverbs_destroy_srq_resp {
__u32 events_reported;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#endif
diff --git a/libc/kernel/uapi/rdma/rdma_netlink.h b/libc/kernel/uapi/rdma/rdma_netlink.h
index e49bfffb5..b35703aa5 100644
--- a/libc/kernel/uapi/rdma/rdma_netlink.h
+++ b/libc/kernel/uapi/rdma/rdma_netlink.h
@@ -24,132 +24,180 @@ enum {
RDMA_NL_RDMA_CM = 1,
RDMA_NL_NES,
RDMA_NL_C4IW,
- RDMA_NL_NUM_CLIENTS
+ RDMA_NL_LS,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ RDMA_NL_NUM_CLIENTS
};
enum {
RDMA_NL_GROUP_CM = 1,
- RDMA_NL_GROUP_IWPM,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ RDMA_NL_GROUP_IWPM,
+ RDMA_NL_GROUP_LS,
RDMA_NL_NUM_GROUPS
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDMA_NL_GET_CLIENT(type) ((type & (((1 << 6) - 1) << 10)) >> 10)
#define RDMA_NL_GET_OP(type) (type & ((1 << 10) - 1))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define RDMA_NL_GET_TYPE(client,op) ((client << 10) + op)
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RDMA_NL_RDMA_CM_ID_STATS = 0,
RDMA_NL_RDMA_CM_NUM_OPS
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RDMA_NL_RDMA_CM_ATTR_SRC_ADDR = 1,
RDMA_NL_RDMA_CM_ATTR_DST_ADDR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RDMA_NL_RDMA_CM_NUM_ATTR,
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
RDMA_NL_IWPM_REG_PID = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RDMA_NL_IWPM_ADD_MAPPING,
RDMA_NL_IWPM_QUERY_MAPPING,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RDMA_NL_IWPM_REMOVE_MAPPING,
+ RDMA_NL_IWPM_REMOTE_INFO,
RDMA_NL_IWPM_HANDLE_ERR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RDMA_NL_IWPM_MAPINFO,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
RDMA_NL_IWPM_MAPINFO_NUM,
RDMA_NL_IWPM_NUM_OPS
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct rdma_cm_id_stats {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u32 qp_num;
__u32 bound_dev_if;
__u32 port_space;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__s32 pid;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 cm_state;
__u8 node_type;
__u8 port_num;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
__u8 qp_type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
IWPM_NLA_REG_PID_UNSPEC = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_REG_PID_SEQ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_REG_IF_NAME,
IWPM_NLA_REG_IBDEV_NAME,
IWPM_NLA_REG_ULIB_NAME,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_REG_PID_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
IWPM_NLA_RREG_PID_UNSPEC = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RREG_PID_SEQ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RREG_IBDEV_NAME,
IWPM_NLA_RREG_ULIB_NAME,
IWPM_NLA_RREG_ULIB_VER,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RREG_PID_ERR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RREG_PID_MAX
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MANAGE_MAPPING_UNSPEC = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MANAGE_MAPPING_SEQ,
IWPM_NLA_MANAGE_ADDR,
IWPM_NLA_MANAGE_MAPPED_LOC_ADDR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RMANAGE_MAPPING_ERR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RMANAGE_MAPPING_MAX
};
#define IWPM_NLA_MANAGE_MAPPING_MAX 3
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IWPM_NLA_QUERY_MAPPING_MAX 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define IWPM_NLA_MAPINFO_SEND_MAX 3
enum {
IWPM_NLA_QUERY_MAPPING_UNSPEC = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_QUERY_MAPPING_SEQ,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_QUERY_LOCAL_ADDR,
IWPM_NLA_QUERY_REMOTE_ADDR,
IWPM_NLA_RQUERY_MAPPED_LOC_ADDR,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RQUERY_MAPPED_REM_ADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_RQUERY_MAPPING_ERR,
IWPM_NLA_RQUERY_MAPPING_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MAPINFO_REQ_UNSPEC = 0,
IWPM_NLA_MAPINFO_ULIB_NAME,
IWPM_NLA_MAPINFO_ULIB_VER,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MAPINFO_REQ_MAX
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
enum {
IWPM_NLA_MAPINFO_UNSPEC = 0,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MAPINFO_LOCAL_ADDR,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MAPINFO_MAPPED_ADDR,
IWPM_NLA_MAPINFO_MAX
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
enum {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MAPINFO_NUM_UNSPEC = 0,
IWPM_NLA_MAPINFO_SEQ,
IWPM_NLA_MAPINFO_SEND_NUM,
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MAPINFO_ACK_NUM,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_MAPINFO_NUM_MAX
};
enum {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_ERR_UNSPEC = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
IWPM_NLA_ERR_SEQ,
IWPM_NLA_ERR_CODE,
IWPM_NLA_ERR_MAX
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ RDMA_NL_LS_OP_RESOLVE = 0,
+ RDMA_NL_LS_OP_SET_TIMEOUT,
+ RDMA_NL_LS_NUM_OPS
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define RDMA_NL_LS_F_ERR 0x0100
+enum {
+ LS_RESOLVE_PATH_USE_ALL = 0,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LS_RESOLVE_PATH_USE_UNIDIRECTIONAL,
+ LS_RESOLVE_PATH_USE_GMP,
+ LS_RESOLVE_PATH_USE_MAX
+};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define LS_DEVICE_NAME_MAX 64
+struct rdma_ls_resolve_header {
+ __u8 device_name[LS_DEVICE_NAME_MAX];
+ __u8 port_num;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 path_use;
+};
+#define RDMA_NLA_F_MANDATORY (1 << 13)
+#define RDMA_NLA_TYPE_MASK (~(NLA_F_NESTED | NLA_F_NET_BYTEORDER | RDMA_NLA_F_MANDATORY))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ LS_NLA_TYPE_UNSPEC = 0,
+ LS_NLA_TYPE_PATH_RECORD,
+ LS_NLA_TYPE_TIMEOUT,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LS_NLA_TYPE_SERVICE_ID,
+ LS_NLA_TYPE_DGID,
+ LS_NLA_TYPE_SGID,
+ LS_NLA_TYPE_TCLASS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ LS_NLA_TYPE_PKEY,
+ LS_NLA_TYPE_QOS_CLASS,
+ LS_NLA_TYPE_MAX
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct rdma_nla_ls_gid {
+ __u8 gid[16];
};
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/scsi/cxlflash_ioctl.h b/libc/kernel/uapi/scsi/cxlflash_ioctl.h
new file mode 100644
index 000000000..fe7c82201
--- /dev/null
+++ b/libc/kernel/uapi/scsi/cxlflash_ioctl.h
@@ -0,0 +1,168 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _CXLFLASH_IOCTL_H
+#define _CXLFLASH_IOCTL_H
+#include <linux/types.h>
+#define DK_CXLFLASH_VERSION_0 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct dk_cxlflash_hdr {
+ __u16 version;
+ __u16 rsvd[3];
+ __u64 flags;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 return_flags;
+};
+#define DK_CXLFLASH_ATTACH_REUSE_CONTEXT 0x8000000000000000ULL
+struct dk_cxlflash_attach {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dk_cxlflash_hdr hdr;
+ __u64 num_interrupts;
+ __u64 context_id;
+ __u64 mmio_size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 block_size;
+ __u64 adap_fd;
+ __u64 last_lba;
+ __u64 max_xfer;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 reserved[8];
+};
+struct dk_cxlflash_detach {
+ struct dk_cxlflash_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 context_id;
+ __u64 reserved[8];
+};
+struct dk_cxlflash_udirect {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dk_cxlflash_hdr hdr;
+ __u64 context_id;
+ __u64 rsrc_handle;
+ __u64 last_lba;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 reserved[8];
+};
+#define DK_CXLFLASH_UVIRTUAL_NEED_WRITE_SAME 0x8000000000000000ULL
+struct dk_cxlflash_uvirtual {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dk_cxlflash_hdr hdr;
+ __u64 context_id;
+ __u64 lun_size;
+ __u64 rsrc_handle;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 last_lba;
+ __u64 reserved[8];
+};
+struct dk_cxlflash_release {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dk_cxlflash_hdr hdr;
+ __u64 context_id;
+ __u64 rsrc_handle;
+ __u64 reserved[8];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct dk_cxlflash_resize {
+ struct dk_cxlflash_hdr hdr;
+ __u64 context_id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 rsrc_handle;
+ __u64 req_size;
+ __u64 last_lba;
+ __u64 reserved[8];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct dk_cxlflash_clone {
+ struct dk_cxlflash_hdr hdr;
+ __u64 context_id_src;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 context_id_dst;
+ __u64 adap_fd_src;
+ __u64 reserved[8];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DK_CXLFLASH_VERIFY_SENSE_LEN 18
+#define DK_CXLFLASH_VERIFY_HINT_SENSE 0x8000000000000000ULL
+struct dk_cxlflash_verify {
+ struct dk_cxlflash_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 context_id;
+ __u64 rsrc_handle;
+ __u64 hint;
+ __u64 last_lba;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u8 sense_data[DK_CXLFLASH_VERIFY_SENSE_LEN];
+ __u8 pad[6];
+ __u64 reserved[8];
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DK_CXLFLASH_RECOVER_AFU_CONTEXT_RESET 0x8000000000000000ULL
+struct dk_cxlflash_recover_afu {
+ struct dk_cxlflash_hdr hdr;
+ __u64 reason;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 context_id;
+ __u64 mmio_size;
+ __u64 adap_fd;
+ __u64 reserved[8];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+#define DK_CXLFLASH_MANAGE_LUN_WWID_LEN 16
+#define DK_CXLFLASH_MANAGE_LUN_ENABLE_SUPERPIPE 0x8000000000000000ULL
+#define DK_CXLFLASH_MANAGE_LUN_DISABLE_SUPERPIPE 0x4000000000000000ULL
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DK_CXLFLASH_MANAGE_LUN_ALL_PORTS_ACCESSIBLE 0x2000000000000000ULL
+struct dk_cxlflash_manage_lun {
+ struct dk_cxlflash_hdr hdr;
+ __u8 wwid[DK_CXLFLASH_MANAGE_LUN_WWID_LEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u64 reserved[8];
+};
+union cxlflash_ioctls {
+ struct dk_cxlflash_attach attach;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dk_cxlflash_detach detach;
+ struct dk_cxlflash_udirect udirect;
+ struct dk_cxlflash_uvirtual uvirtual;
+ struct dk_cxlflash_release release;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dk_cxlflash_resize resize;
+ struct dk_cxlflash_clone clone;
+ struct dk_cxlflash_verify verify;
+ struct dk_cxlflash_recover_afu recover_afu;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct dk_cxlflash_manage_lun manage_lun;
+};
+#define MAX_CXLFLASH_IOCTL_SZ (sizeof(union cxlflash_ioctls))
+#define CXL_MAGIC 0xCA
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define CXL_IOWR(_n,_s) _IOWR(CXL_MAGIC, _n, struct _s)
+#define DK_CXLFLASH_ATTACH CXL_IOWR(0x80, dk_cxlflash_attach)
+#define DK_CXLFLASH_USER_DIRECT CXL_IOWR(0x81, dk_cxlflash_udirect)
+#define DK_CXLFLASH_RELEASE CXL_IOWR(0x82, dk_cxlflash_release)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DK_CXLFLASH_DETACH CXL_IOWR(0x83, dk_cxlflash_detach)
+#define DK_CXLFLASH_VERIFY CXL_IOWR(0x84, dk_cxlflash_verify)
+#define DK_CXLFLASH_RECOVER_AFU CXL_IOWR(0x85, dk_cxlflash_recover_afu)
+#define DK_CXLFLASH_MANAGE_LUN CXL_IOWR(0x86, dk_cxlflash_manage_lun)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define DK_CXLFLASH_USER_VIRTUAL CXL_IOWR(0x87, dk_cxlflash_uvirtual)
+#define DK_CXLFLASH_VLUN_RESIZE CXL_IOWR(0x88, dk_cxlflash_resize)
+#define DK_CXLFLASH_VLUN_CLONE CXL_IOWR(0x89, dk_cxlflash_clone)
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/sound/asequencer.h b/libc/kernel/uapi/sound/asequencer.h
index fb58991a8..3596012f0 100644
--- a/libc/kernel/uapi/sound/asequencer.h
+++ b/libc/kernel/uapi/sound/asequencer.h
@@ -18,483 +18,484 @@
****************************************************************************/
#ifndef _UAPI__SOUND_ASEQUENCER_H
#define _UAPI__SOUND_ASEQUENCER_H
+#include <sound/asound.h>
#define SNDRV_SEQ_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
-#define SNDRV_SEQ_EVENT_SYSTEM 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_SYSTEM 0
#define SNDRV_SEQ_EVENT_RESULT 1
#define SNDRV_SEQ_EVENT_NOTE 5
#define SNDRV_SEQ_EVENT_NOTEON 6
-#define SNDRV_SEQ_EVENT_NOTEOFF 7
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_NOTEOFF 7
#define SNDRV_SEQ_EVENT_KEYPRESS 8
#define SNDRV_SEQ_EVENT_CONTROLLER 10
#define SNDRV_SEQ_EVENT_PGMCHANGE 11
-#define SNDRV_SEQ_EVENT_CHANPRESS 12
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_CHANPRESS 12
#define SNDRV_SEQ_EVENT_PITCHBEND 13
#define SNDRV_SEQ_EVENT_CONTROL14 14
#define SNDRV_SEQ_EVENT_NONREGPARAM 15
-#define SNDRV_SEQ_EVENT_REGPARAM 16
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_REGPARAM 16
#define SNDRV_SEQ_EVENT_SONGPOS 20
#define SNDRV_SEQ_EVENT_SONGSEL 21
#define SNDRV_SEQ_EVENT_QFRAME 22
-#define SNDRV_SEQ_EVENT_TIMESIGN 23
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_TIMESIGN 23
#define SNDRV_SEQ_EVENT_KEYSIGN 24
#define SNDRV_SEQ_EVENT_START 30
#define SNDRV_SEQ_EVENT_CONTINUE 31
-#define SNDRV_SEQ_EVENT_STOP 32
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_STOP 32
#define SNDRV_SEQ_EVENT_SETPOS_TICK 33
#define SNDRV_SEQ_EVENT_SETPOS_TIME 34
#define SNDRV_SEQ_EVENT_TEMPO 35
-#define SNDRV_SEQ_EVENT_CLOCK 36
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_CLOCK 36
#define SNDRV_SEQ_EVENT_TICK 37
#define SNDRV_SEQ_EVENT_QUEUE_SKEW 38
#define SNDRV_SEQ_EVENT_TUNE_REQUEST 40
-#define SNDRV_SEQ_EVENT_RESET 41
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_RESET 41
#define SNDRV_SEQ_EVENT_SENSING 42
#define SNDRV_SEQ_EVENT_ECHO 50
#define SNDRV_SEQ_EVENT_OSS 51
-#define SNDRV_SEQ_EVENT_CLIENT_START 60
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_CLIENT_START 60
#define SNDRV_SEQ_EVENT_CLIENT_EXIT 61
#define SNDRV_SEQ_EVENT_CLIENT_CHANGE 62
#define SNDRV_SEQ_EVENT_PORT_START 63
-#define SNDRV_SEQ_EVENT_PORT_EXIT 64
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_PORT_EXIT 64
#define SNDRV_SEQ_EVENT_PORT_CHANGE 65
#define SNDRV_SEQ_EVENT_PORT_SUBSCRIBED 66
#define SNDRV_SEQ_EVENT_PORT_UNSUBSCRIBED 67
-#define SNDRV_SEQ_EVENT_USR0 90
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_USR0 90
#define SNDRV_SEQ_EVENT_USR1 91
#define SNDRV_SEQ_EVENT_USR2 92
#define SNDRV_SEQ_EVENT_USR3 93
-#define SNDRV_SEQ_EVENT_USR4 94
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_USR4 94
#define SNDRV_SEQ_EVENT_USR5 95
#define SNDRV_SEQ_EVENT_USR6 96
#define SNDRV_SEQ_EVENT_USR7 97
-#define SNDRV_SEQ_EVENT_USR8 98
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_USR8 98
#define SNDRV_SEQ_EVENT_USR9 99
#define SNDRV_SEQ_EVENT_SYSEX 130
#define SNDRV_SEQ_EVENT_BOUNCE 131
-#define SNDRV_SEQ_EVENT_USR_VAR0 135
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_USR_VAR0 135
#define SNDRV_SEQ_EVENT_USR_VAR1 136
#define SNDRV_SEQ_EVENT_USR_VAR2 137
#define SNDRV_SEQ_EVENT_USR_VAR3 138
-#define SNDRV_SEQ_EVENT_USR_VAR4 139
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_USR_VAR4 139
#define SNDRV_SEQ_EVENT_KERNEL_ERROR 150
#define SNDRV_SEQ_EVENT_KERNEL_QUOTE 151
#define SNDRV_SEQ_EVENT_NONE 255
-typedef unsigned char snd_seq_event_type_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef unsigned char snd_seq_event_type_t;
struct snd_seq_addr {
unsigned char client;
unsigned char port;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_seq_connect {
struct snd_seq_addr sender;
struct snd_seq_addr dest;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_SEQ_ADDRESS_UNKNOWN 253
#define SNDRV_SEQ_ADDRESS_SUBSCRIBERS 254
#define SNDRV_SEQ_ADDRESS_BROADCAST 255
-#define SNDRV_SEQ_QUEUE_DIRECT 253
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_QUEUE_DIRECT 253
#define SNDRV_SEQ_TIME_STAMP_TICK (0 << 0)
#define SNDRV_SEQ_TIME_STAMP_REAL (1 << 0)
#define SNDRV_SEQ_TIME_STAMP_MASK (1 << 0)
-#define SNDRV_SEQ_TIME_MODE_ABS (0 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_TIME_MODE_ABS (0 << 1)
#define SNDRV_SEQ_TIME_MODE_REL (1 << 1)
#define SNDRV_SEQ_TIME_MODE_MASK (1 << 1)
#define SNDRV_SEQ_EVENT_LENGTH_FIXED (0 << 2)
-#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE (1 << 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_EVENT_LENGTH_VARIABLE (1 << 2)
#define SNDRV_SEQ_EVENT_LENGTH_VARUSR (2 << 2)
#define SNDRV_SEQ_EVENT_LENGTH_MASK (3 << 2)
#define SNDRV_SEQ_PRIORITY_NORMAL (0 << 4)
-#define SNDRV_SEQ_PRIORITY_HIGH (1 << 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PRIORITY_HIGH (1 << 4)
#define SNDRV_SEQ_PRIORITY_MASK (1 << 4)
struct snd_seq_ev_note {
unsigned char channel;
- unsigned char note;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char note;
unsigned char velocity;
unsigned char off_velocity;
unsigned int duration;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_seq_ev_ctrl {
unsigned char channel;
unsigned char unused1, unused2, unused3;
- unsigned int param;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int param;
signed int value;
};
struct snd_seq_ev_raw8 {
- unsigned char d[12];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char d[12];
};
struct snd_seq_ev_raw32 {
unsigned int d[3];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_seq_ev_ext {
unsigned int len;
void * ptr;
-} __attribute__((packed));
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
struct snd_seq_result {
int event;
int result;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_seq_real_time {
unsigned int tv_sec;
unsigned int tv_nsec;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
typedef unsigned int snd_seq_tick_time_t;
union snd_seq_timestamp {
snd_seq_tick_time_t tick;
- struct snd_seq_real_time time;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_seq_real_time time;
};
struct snd_seq_queue_skew {
unsigned int value;
- unsigned int base;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int base;
};
struct snd_seq_ev_queue_control {
unsigned char queue;
- unsigned char pad[3];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char pad[3];
union {
signed int value;
union snd_seq_timestamp time;
- unsigned int position;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int position;
struct snd_seq_queue_skew skew;
unsigned int d32[2];
unsigned char d8[8];
- } param;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } param;
};
struct snd_seq_ev_quote {
struct snd_seq_addr origin;
- unsigned short value;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short value;
struct snd_seq_event * event;
} __attribute__((packed));
struct snd_seq_event {
- snd_seq_event_type_t type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ snd_seq_event_type_t type;
unsigned char flags;
char tag;
unsigned char queue;
- union snd_seq_timestamp time;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union snd_seq_timestamp time;
struct snd_seq_addr source;
struct snd_seq_addr dest;
union {
- struct snd_seq_ev_note note;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_seq_ev_note note;
struct snd_seq_ev_ctrl control;
struct snd_seq_ev_raw8 raw8;
struct snd_seq_ev_raw32 raw32;
- struct snd_seq_ev_ext ext;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_seq_ev_ext ext;
struct snd_seq_ev_queue_control queue;
union snd_seq_timestamp time;
struct snd_seq_addr addr;
- struct snd_seq_connect connect;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_seq_connect connect;
struct snd_seq_result result;
struct snd_seq_ev_quote quote;
} data;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_seq_event_bounce {
int err;
struct snd_seq_event event;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_seq_system_info {
int queues;
int clients;
- int ports;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int ports;
int channels;
int cur_clients;
int cur_queues;
- char reserved[24];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char reserved[24];
};
struct snd_seq_running_info {
unsigned char client;
- unsigned char big_endian;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char big_endian;
unsigned char cpu_mode;
unsigned char pad;
unsigned char reserved[12];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_SEQ_CLIENT_SYSTEM 0
#define SNDRV_SEQ_CLIENT_DUMMY 14
#define SNDRV_SEQ_CLIENT_OSS 15
-typedef int __bitwise snd_seq_client_type_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef int __bitwise snd_seq_client_type_t;
#define NO_CLIENT ((__force snd_seq_client_type_t) 0)
#define USER_CLIENT ((__force snd_seq_client_type_t) 1)
#define KERNEL_CLIENT ((__force snd_seq_client_type_t) 2)
-#define SNDRV_SEQ_FILTER_BROADCAST (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_FILTER_BROADCAST (1 << 0)
#define SNDRV_SEQ_FILTER_MULTICAST (1 << 1)
#define SNDRV_SEQ_FILTER_BOUNCE (1 << 2)
#define SNDRV_SEQ_FILTER_USE_EVENT (1 << 31)
-struct snd_seq_client_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_seq_client_info {
int client;
snd_seq_client_type_t type;
char name[64];
- unsigned int filter;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int filter;
unsigned char multicast_filter[8];
unsigned char event_filter[32];
int num_ports;
- int event_lost;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int event_lost;
char reserved[64];
};
struct snd_seq_client_pool {
- int client;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int client;
int output_pool;
int input_pool;
int output_room;
- int output_free;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int output_free;
int input_free;
char reserved[64];
};
-#define SNDRV_SEQ_REMOVE_INPUT (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_REMOVE_INPUT (1 << 0)
#define SNDRV_SEQ_REMOVE_OUTPUT (1 << 1)
#define SNDRV_SEQ_REMOVE_DEST (1 << 2)
#define SNDRV_SEQ_REMOVE_DEST_CHANNEL (1 << 3)
-#define SNDRV_SEQ_REMOVE_TIME_BEFORE (1 << 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_REMOVE_TIME_BEFORE (1 << 4)
#define SNDRV_SEQ_REMOVE_TIME_AFTER (1 << 5)
#define SNDRV_SEQ_REMOVE_TIME_TICK (1 << 6)
#define SNDRV_SEQ_REMOVE_EVENT_TYPE (1 << 7)
-#define SNDRV_SEQ_REMOVE_IGNORE_OFF (1 << 8)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_REMOVE_IGNORE_OFF (1 << 8)
#define SNDRV_SEQ_REMOVE_TAG_MATCH (1 << 9)
struct snd_seq_remove_events {
unsigned int remove_mode;
- union snd_seq_timestamp time;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union snd_seq_timestamp time;
unsigned char queue;
struct snd_seq_addr dest;
unsigned char channel;
- int type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int type;
char tag;
int reserved[10];
};
-#define SNDRV_SEQ_PORT_SYSTEM_TIMER 0
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PORT_SYSTEM_TIMER 0
#define SNDRV_SEQ_PORT_SYSTEM_ANNOUNCE 1
#define SNDRV_SEQ_PORT_CAP_READ (1 << 0)
#define SNDRV_SEQ_PORT_CAP_WRITE (1 << 1)
-#define SNDRV_SEQ_PORT_CAP_SYNC_READ (1 << 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PORT_CAP_SYNC_READ (1 << 2)
#define SNDRV_SEQ_PORT_CAP_SYNC_WRITE (1 << 3)
#define SNDRV_SEQ_PORT_CAP_DUPLEX (1 << 4)
#define SNDRV_SEQ_PORT_CAP_SUBS_READ (1 << 5)
-#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE (1 << 6)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PORT_CAP_SUBS_WRITE (1 << 6)
#define SNDRV_SEQ_PORT_CAP_NO_EXPORT (1 << 7)
#define SNDRV_SEQ_PORT_TYPE_SPECIFIC (1 << 0)
#define SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC (1 << 1)
-#define SNDRV_SEQ_PORT_TYPE_MIDI_GM (1 << 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PORT_TYPE_MIDI_GM (1 << 2)
#define SNDRV_SEQ_PORT_TYPE_MIDI_GS (1 << 3)
#define SNDRV_SEQ_PORT_TYPE_MIDI_XG (1 << 4)
#define SNDRV_SEQ_PORT_TYPE_MIDI_MT32 (1 << 5)
-#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2 (1 << 6)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PORT_TYPE_MIDI_GM2 (1 << 6)
#define SNDRV_SEQ_PORT_TYPE_SYNTH (1 << 10)
#define SNDRV_SEQ_PORT_TYPE_DIRECT_SAMPLE (1 << 11)
#define SNDRV_SEQ_PORT_TYPE_SAMPLE (1 << 12)
-#define SNDRV_SEQ_PORT_TYPE_HARDWARE (1 << 16)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PORT_TYPE_HARDWARE (1 << 16)
#define SNDRV_SEQ_PORT_TYPE_SOFTWARE (1 << 17)
#define SNDRV_SEQ_PORT_TYPE_SYNTHESIZER (1 << 18)
#define SNDRV_SEQ_PORT_TYPE_PORT (1 << 19)
-#define SNDRV_SEQ_PORT_TYPE_APPLICATION (1 << 20)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_PORT_TYPE_APPLICATION (1 << 20)
#define SNDRV_SEQ_PORT_FLG_GIVEN_PORT (1 << 0)
#define SNDRV_SEQ_PORT_FLG_TIMESTAMP (1 << 1)
#define SNDRV_SEQ_PORT_FLG_TIME_REAL (1 << 2)
-struct snd_seq_port_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_seq_port_info {
struct snd_seq_addr addr;
char name[64];
unsigned int capability;
- unsigned int type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int type;
int midi_channels;
int midi_voices;
int synth_voices;
- int read_use;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int read_use;
int write_use;
void * kernel;
unsigned int flags;
- unsigned char time_queue;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char time_queue;
char reserved[59];
};
#define SNDRV_SEQ_QUEUE_FLG_SYNC (1 << 0)
-struct snd_seq_queue_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_seq_queue_info {
int queue;
int owner;
unsigned locked : 1;
- char name[64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char name[64];
unsigned int flags;
char reserved[60];
};
-struct snd_seq_queue_status {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_seq_queue_status {
int queue;
int events;
snd_seq_tick_time_t tick;
- struct snd_seq_real_time time;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_seq_real_time time;
int running;
int flags;
char reserved[64];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_seq_queue_tempo {
int queue;
unsigned int tempo;
- int ppq;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int ppq;
unsigned int skew_value;
unsigned int skew_base;
char reserved[24];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_SEQ_TIMER_ALSA 0
#define SNDRV_SEQ_TIMER_MIDI_CLOCK 1
#define SNDRV_SEQ_TIMER_MIDI_TICK 2
-struct snd_seq_queue_timer {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_seq_queue_timer {
int queue;
int type;
union {
- struct {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
struct snd_timer_id id;
unsigned int resolution;
} alsa;
- } u;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } u;
char reserved[64];
};
struct snd_seq_queue_client {
- int queue;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int queue;
int client;
int used;
char reserved[64];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_SEQ_PORT_SUBS_EXCLUSIVE (1 << 0)
#define SNDRV_SEQ_PORT_SUBS_TIMESTAMP (1 << 1)
#define SNDRV_SEQ_PORT_SUBS_TIME_REAL (1 << 2)
-struct snd_seq_port_subscribe {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_seq_port_subscribe {
struct snd_seq_addr sender;
struct snd_seq_addr dest;
unsigned int voices;
- unsigned int flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int flags;
unsigned char queue;
unsigned char pad[3];
char reserved[64];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_SEQ_QUERY_SUBS_READ 0
#define SNDRV_SEQ_QUERY_SUBS_WRITE 1
struct snd_seq_query_subs {
- struct snd_seq_addr root;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_seq_addr root;
int type;
int index;
int num_subs;
- struct snd_seq_addr addr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_seq_addr addr;
unsigned char queue;
unsigned int flags;
char reserved[64];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_SEQ_IOCTL_PVERSION _IOR('S', 0x00, int)
#define SNDRV_SEQ_IOCTL_CLIENT_ID _IOR('S', 0x01, int)
#define SNDRV_SEQ_IOCTL_SYSTEM_INFO _IOWR('S', 0x02, struct snd_seq_system_info)
-#define SNDRV_SEQ_IOCTL_RUNNING_MODE _IOWR('S', 0x03, struct snd_seq_running_info)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_RUNNING_MODE _IOWR('S', 0x03, struct snd_seq_running_info)
#define SNDRV_SEQ_IOCTL_GET_CLIENT_INFO _IOWR('S', 0x10, struct snd_seq_client_info)
#define SNDRV_SEQ_IOCTL_SET_CLIENT_INFO _IOW('S', 0x11, struct snd_seq_client_info)
#define SNDRV_SEQ_IOCTL_CREATE_PORT _IOWR('S', 0x20, struct snd_seq_port_info)
-#define SNDRV_SEQ_IOCTL_DELETE_PORT _IOW('S', 0x21, struct snd_seq_port_info)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_DELETE_PORT _IOW('S', 0x21, struct snd_seq_port_info)
#define SNDRV_SEQ_IOCTL_GET_PORT_INFO _IOWR('S', 0x22, struct snd_seq_port_info)
#define SNDRV_SEQ_IOCTL_SET_PORT_INFO _IOW('S', 0x23, struct snd_seq_port_info)
#define SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT _IOW('S', 0x30, struct snd_seq_port_subscribe)
-#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW('S', 0x31, struct snd_seq_port_subscribe)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT _IOW('S', 0x31, struct snd_seq_port_subscribe)
#define SNDRV_SEQ_IOCTL_CREATE_QUEUE _IOWR('S', 0x32, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_DELETE_QUEUE _IOW('S', 0x33, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_INFO _IOWR('S', 0x34, struct snd_seq_queue_info)
-#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO _IOWR('S', 0x35, struct snd_seq_queue_info)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_SET_QUEUE_INFO _IOWR('S', 0x35, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE _IOWR('S', 0x36, struct snd_seq_queue_info)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS _IOWR('S', 0x40, struct snd_seq_queue_status)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO _IOWR('S', 0x41, struct snd_seq_queue_tempo)
-#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO _IOW('S', 0x42, struct snd_seq_queue_tempo)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO _IOW('S', 0x42, struct snd_seq_queue_tempo)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_OWNER _IOWR('S', 0x43, struct snd_seq_queue_owner)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_OWNER _IOW('S', 0x44, struct snd_seq_queue_owner)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER _IOWR('S', 0x45, struct snd_seq_queue_timer)
-#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER _IOW('S', 0x46, struct snd_seq_queue_timer)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER _IOW('S', 0x46, struct snd_seq_queue_timer)
#define SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT _IOWR('S', 0x49, struct snd_seq_queue_client)
#define SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT _IOW('S', 0x4a, struct snd_seq_queue_client)
#define SNDRV_SEQ_IOCTL_GET_CLIENT_POOL _IOWR('S', 0x4b, struct snd_seq_client_pool)
-#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL _IOW('S', 0x4c, struct snd_seq_client_pool)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_SET_CLIENT_POOL _IOW('S', 0x4c, struct snd_seq_client_pool)
#define SNDRV_SEQ_IOCTL_REMOVE_EVENTS _IOW('S', 0x4e, struct snd_seq_remove_events)
#define SNDRV_SEQ_IOCTL_QUERY_SUBS _IOWR('S', 0x4f, struct snd_seq_query_subs)
#define SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION _IOWR('S', 0x50, struct snd_seq_port_subscribe)
-#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT _IOWR('S', 0x51, struct snd_seq_client_info)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT _IOWR('S', 0x51, struct snd_seq_client_info)
#define SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT _IOWR('S', 0x52, struct snd_seq_port_info)
#endif
diff --git a/libc/kernel/uapi/sound/asoc.h b/libc/kernel/uapi/sound/asoc.h
new file mode 100644
index 000000000..a4fac2279
--- /dev/null
+++ b/libc/kernel/uapi/sound/asoc.h
@@ -0,0 +1,289 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __LINUX_UAPI_SND_ASOC_H
+#define __LINUX_UAPI_SND_ASOC_H
+#include <linux/types.h>
+#include <sound/asound.h>
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#error This API is an early revision and not enabled in the current
+#error kernel release , it will be enabled in a future kernel version
+#error with incompatible changes to what is here .
+#define SND_SOC_TPLG_MAX_CHAN 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_MAX_FORMATS 16
+#define SND_SOC_TPLG_STREAM_CONFIG_MAX 8
+#define SND_SOC_TPLG_CTL_VOLSW 1
+#define SND_SOC_TPLG_CTL_VOLSW_SX 2
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_CTL_VOLSW_XR_SX 3
+#define SND_SOC_TPLG_CTL_ENUM 4
+#define SND_SOC_TPLG_CTL_BYTES 5
+#define SND_SOC_TPLG_CTL_ENUM_VALUE 6
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_CTL_RANGE 7
+#define SND_SOC_TPLG_CTL_STROBE 8
+#define SND_SOC_TPLG_DAPM_CTL_VOLSW 64
+#define SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE 65
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT 66
+#define SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE 67
+#define SND_SOC_TPLG_DAPM_CTL_PIN 68
+#define SND_SOC_TPLG_DAPM_INPUT 0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_DAPM_OUTPUT 1
+#define SND_SOC_TPLG_DAPM_MUX 2
+#define SND_SOC_TPLG_DAPM_MIXER 3
+#define SND_SOC_TPLG_DAPM_PGA 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_DAPM_OUT_DRV 5
+#define SND_SOC_TPLG_DAPM_ADC 6
+#define SND_SOC_TPLG_DAPM_DAC 7
+#define SND_SOC_TPLG_DAPM_SWITCH 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_DAPM_PRE 9
+#define SND_SOC_TPLG_DAPM_POST 10
+#define SND_SOC_TPLG_DAPM_AIF_IN 11
+#define SND_SOC_TPLG_DAPM_AIF_OUT 12
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_DAPM_DAI_IN 13
+#define SND_SOC_TPLG_DAPM_DAI_OUT 14
+#define SND_SOC_TPLG_DAPM_DAI_LINK 15
+#define SND_SOC_TPLG_DAPM_LAST SND_SOC_TPLG_DAPM_DAI_LINK
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_MAGIC 0x41536F43
+#define SND_SOC_TPLG_NUM_TEXTS 16
+#define SND_SOC_TPLG_ABI_VERSION 0x4
+#define SND_SOC_TPLG_TLV_SIZE 32
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_TYPE_MIXER 1
+#define SND_SOC_TPLG_TYPE_BYTES 2
+#define SND_SOC_TPLG_TYPE_ENUM 3
+#define SND_SOC_TPLG_TYPE_DAPM_GRAPH 4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_TYPE_DAPM_WIDGET 5
+#define SND_SOC_TPLG_TYPE_DAI_LINK 6
+#define SND_SOC_TPLG_TYPE_PCM 7
+#define SND_SOC_TPLG_TYPE_MANIFEST 8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_TYPE_CODEC_LINK 9
+#define SND_SOC_TPLG_TYPE_BACKEND_LINK 10
+#define SND_SOC_TPLG_TYPE_PDATA 11
+#define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_PDATA
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_TYPE_VENDOR_FW 1000
+#define SND_SOC_TPLG_TYPE_VENDOR_CONFIG 1001
+#define SND_SOC_TPLG_TYPE_VENDOR_COEFF 1002
+#define SND_SOC_TPLG_TYPEVENDOR_CODEC 1003
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SND_SOC_TPLG_STREAM_PLAYBACK 0
+#define SND_SOC_TPLG_STREAM_CAPTURE 1
+struct snd_soc_tplg_hdr {
+ __le32 magic;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 abi;
+ __le32 version;
+ __le32 type;
+ __le32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 vendor_type;
+ __le32 payload_size;
+ __le32 index;
+ __le32 count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct snd_soc_tplg_private {
+ __le32 size;
+ char data[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct snd_soc_tplg_tlv_dbscale {
+ __le32 min;
+ __le32 step;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 mute;
+} __attribute__((packed));
+struct snd_soc_tplg_ctl_tlv {
+ __le32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 type;
+ union {
+ __le32 data[SND_SOC_TPLG_TLV_SIZE];
+ struct snd_soc_tplg_tlv_dbscale scale;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ };
+} __attribute__((packed));
+struct snd_soc_tplg_channel {
+ __le32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 reg;
+ __le32 shift;
+ __le32 id;
+} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_soc_tplg_io_ops {
+ __le32 get;
+ __le32 put;
+ __le32 info;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct snd_soc_tplg_ctl_hdr {
+ __le32 size;
+ __le32 type;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le32 access;
+ struct snd_soc_tplg_io_ops ops;
+ struct snd_soc_tplg_ctl_tlv tlv;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct snd_soc_tplg_stream_caps {
+ __le32 size;
+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le64 formats;
+ __le32 rates;
+ __le32 rate_min;
+ __le32 rate_max;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 channels_min;
+ __le32 channels_max;
+ __le32 periods_min;
+ __le32 periods_max;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 period_size_min;
+ __le32 period_size_max;
+ __le32 buffer_size_min;
+ __le32 buffer_size_max;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct snd_soc_tplg_stream {
+ __le32 size;
+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le64 format;
+ __le32 rate;
+ __le32 period_bytes;
+ __le32 buffer_bytes;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 channels;
+} __attribute__((packed));
+struct snd_soc_tplg_manifest {
+ __le32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 control_elems;
+ __le32 widget_elems;
+ __le32 graph_elems;
+ __le32 dai_elems;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 dai_link_elems;
+ struct snd_soc_tplg_private priv;
+} __attribute__((packed));
+struct snd_soc_tplg_mixer_control {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_soc_tplg_ctl_hdr hdr;
+ __le32 size;
+ __le32 min;
+ __le32 max;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 platform_max;
+ __le32 invert;
+ __le32 num_channels;
+ struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_soc_tplg_private priv;
+} __attribute__((packed));
+struct snd_soc_tplg_enum_control {
+ struct snd_soc_tplg_ctl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 size;
+ __le32 num_channels;
+ struct snd_soc_tplg_channel channel[SND_SOC_TPLG_MAX_CHAN];
+ __le32 items;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 mask;
+ __le32 count;
+ char texts[SND_SOC_TPLG_NUM_TEXTS][SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le32 values[SND_SOC_TPLG_NUM_TEXTS * SNDRV_CTL_ELEM_ID_NAME_MAXLEN / 4];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_soc_tplg_private priv;
+} __attribute__((packed));
+struct snd_soc_tplg_bytes_control {
+ struct snd_soc_tplg_ctl_hdr hdr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 size;
+ __le32 max;
+ __le32 mask;
+ __le32 base;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 num_regs;
+ struct snd_soc_tplg_io_ops ext_ops;
+ struct snd_soc_tplg_private priv;
+} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_soc_tplg_dapm_graph_elem {
+ char sink[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ char control[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ char source[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct snd_soc_tplg_dapm_widget {
+ __le32 size;
+ __le32 id;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ char sname[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le32 reg;
+ __le32 shift;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 mask;
+ __le32 subseq;
+ __le32 invert;
+ __le32 ignore_suspend;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le16 event_flags;
+ __le16 event_type;
+ __le32 num_kcontrols;
+ struct snd_soc_tplg_private priv;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+} __attribute__((packed));
+struct snd_soc_tplg_pcm {
+ __le32 size;
+ char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
+ __le32 pcm_id;
+ __le32 dai_id;
+ __le32 playback;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 capture;
+ __le32 compress;
+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX];
+ __le32 num_streams;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_soc_tplg_stream_caps caps[2];
+} __attribute__((packed));
+struct snd_soc_tplg_link_config {
+ __le32 size;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __le32 id;
+ struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX];
+ __le32 num_streams;
+} __attribute__((packed));
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/sound/asound.h b/libc/kernel/uapi/sound/asound.h
index 1419fe8b0..0dfff8bef 100644
--- a/libc/kernel/uapi/sound/asound.h
+++ b/libc/kernel/uapi/sound/asound.h
@@ -19,59 +19,64 @@
#ifndef _UAPI__SOUND_ASOUND_H
#define _UAPI__SOUND_ASOUND_H
#include <linux/types.h>
-#define SNDRV_PROTOCOL_VERSION(major,minor,subminor) (((major) << 16) | ((minor) << 8) | (subminor))
+#include <stdlib.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PROTOCOL_VERSION(major,minor,subminor) (((major) << 16) | ((minor) << 8) | (subminor))
#define SNDRV_PROTOCOL_MAJOR(version) (((version) >> 16) & 0xffff)
#define SNDRV_PROTOCOL_MINOR(version) (((version) >> 8) & 0xff)
#define SNDRV_PROTOCOL_MICRO(version) ((version) & 0xff)
-#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion,uversion) (SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PROTOCOL_INCOMPATIBLE(kversion,uversion) (SNDRV_PROTOCOL_MAJOR(kversion) != SNDRV_PROTOCOL_MAJOR(uversion) || (SNDRV_PROTOCOL_MAJOR(kversion) == SNDRV_PROTOCOL_MAJOR(uversion) && SNDRV_PROTOCOL_MINOR(kversion) != SNDRV_PROTOCOL_MINOR(uversion)))
struct snd_aes_iec958 {
unsigned char status[24];
unsigned char subcode[147];
- unsigned char pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char pad;
unsigned char dig_subframe[4];
};
struct snd_cea_861_aud_if {
- unsigned char db1_ct_cc;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char db1_ct_cc;
unsigned char db2_sf_ss;
unsigned char db3;
unsigned char db4_ca;
- unsigned char db5_dminh_lsv;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char db5_dminh_lsv;
};
#define SNDRV_HWDEP_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
enum {
- SNDRV_HWDEP_IFACE_OPL2 = 0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_HWDEP_IFACE_OPL2 = 0,
SNDRV_HWDEP_IFACE_OPL3,
SNDRV_HWDEP_IFACE_OPL4,
SNDRV_HWDEP_IFACE_SB16CSP,
- SNDRV_HWDEP_IFACE_EMU10K1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_HWDEP_IFACE_EMU10K1,
SNDRV_HWDEP_IFACE_YSS225,
SNDRV_HWDEP_IFACE_ICS2115,
SNDRV_HWDEP_IFACE_SSCAPE,
- SNDRV_HWDEP_IFACE_VX,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_HWDEP_IFACE_VX,
SNDRV_HWDEP_IFACE_MIXART,
SNDRV_HWDEP_IFACE_USX2Y,
SNDRV_HWDEP_IFACE_EMUX_WAVETABLE,
- SNDRV_HWDEP_IFACE_BLUETOOTH,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_HWDEP_IFACE_BLUETOOTH,
SNDRV_HWDEP_IFACE_USX2Y_PCM,
SNDRV_HWDEP_IFACE_PCXHR,
SNDRV_HWDEP_IFACE_SB_RC,
- SNDRV_HWDEP_IFACE_HDA,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_HWDEP_IFACE_HDA,
SNDRV_HWDEP_IFACE_USB_STREAM,
SNDRV_HWDEP_IFACE_FW_DICE,
SNDRV_HWDEP_IFACE_FW_FIREWORKS,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
SNDRV_HWDEP_IFACE_FW_BEBOB,
+ SNDRV_HWDEP_IFACE_FW_OXFW,
+ SNDRV_HWDEP_IFACE_FW_DIGI00X,
+ SNDRV_HWDEP_IFACE_FW_TASCAM,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_FW_BEBOB
+ SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_FW_TASCAM
};
struct snd_hwdep_info {
unsigned int device;
@@ -107,7 +112,7 @@ struct snd_hwdep_dsp_image {
#define SNDRV_HWDEP_IOCTL_DSP_STATUS _IOR('H', 0x02, struct snd_hwdep_dsp_status)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_HWDEP_IOCTL_DSP_LOAD _IOW('H', 0x03, struct snd_hwdep_dsp_image)
-#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 12)
+#define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 13)
typedef unsigned long snd_pcm_uframes_t;
typedef signed long snd_pcm_sframes_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
@@ -253,160 +258,180 @@ typedef int __bitwise snd_pcm_subformat_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_PCM_INFO_NO_PERIOD_WAKEUP 0x00800000
#define SNDRV_PCM_INFO_HAS_WALL_CLOCK 0x01000000
+#define SNDRV_PCM_INFO_HAS_LINK_ATIME 0x01000000
+#define SNDRV_PCM_INFO_HAS_LINK_ABSOLUTE_ATIME 0x02000000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_INFO_HAS_LINK_ESTIMATED_ATIME 0x04000000
+#define SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME 0x08000000
+#define SNDRV_PCM_INFO_DRAIN_TRIGGER 0x40000000
#define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000
-typedef int __bitwise snd_pcm_state_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef int __bitwise snd_pcm_state_t;
#define SNDRV_PCM_STATE_OPEN ((__force snd_pcm_state_t) 0)
#define SNDRV_PCM_STATE_SETUP ((__force snd_pcm_state_t) 1)
#define SNDRV_PCM_STATE_PREPARED ((__force snd_pcm_state_t) 2)
-#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_STATE_RUNNING ((__force snd_pcm_state_t) 3)
#define SNDRV_PCM_STATE_XRUN ((__force snd_pcm_state_t) 4)
#define SNDRV_PCM_STATE_DRAINING ((__force snd_pcm_state_t) 5)
#define SNDRV_PCM_STATE_PAUSED ((__force snd_pcm_state_t) 6)
-#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_STATE_SUSPENDED ((__force snd_pcm_state_t) 7)
#define SNDRV_PCM_STATE_DISCONNECTED ((__force snd_pcm_state_t) 8)
#define SNDRV_PCM_STATE_LAST SNDRV_PCM_STATE_DISCONNECTED
enum {
- SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_PCM_MMAP_OFFSET_DATA = 0x00000000,
SNDRV_PCM_MMAP_OFFSET_STATUS = 0x80000000,
SNDRV_PCM_MMAP_OFFSET_CONTROL = 0x81000000,
};
-union snd_pcm_sync_id {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+union snd_pcm_sync_id {
unsigned char id[16];
unsigned short id16[8];
unsigned int id32[4];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_pcm_info {
unsigned int device;
unsigned int subdevice;
- int stream;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int stream;
int card;
unsigned char id[64];
unsigned char name[80];
- unsigned char subname[32];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char subname[32];
int dev_class;
int dev_subclass;
unsigned int subdevices_count;
- unsigned int subdevices_avail;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int subdevices_avail;
union snd_pcm_sync_id sync;
unsigned char reserved[64];
};
-typedef int snd_pcm_hw_param_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef int snd_pcm_hw_param_t;
#define SNDRV_PCM_HW_PARAM_ACCESS 0
#define SNDRV_PCM_HW_PARAM_FORMAT 1
#define SNDRV_PCM_HW_PARAM_SUBFORMAT 2
-#define SNDRV_PCM_HW_PARAM_FIRST_MASK SNDRV_PCM_HW_PARAM_ACCESS
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_HW_PARAM_FIRST_MASK SNDRV_PCM_HW_PARAM_ACCESS
#define SNDRV_PCM_HW_PARAM_LAST_MASK SNDRV_PCM_HW_PARAM_SUBFORMAT
#define SNDRV_PCM_HW_PARAM_SAMPLE_BITS 8
#define SNDRV_PCM_HW_PARAM_FRAME_BITS 9
-#define SNDRV_PCM_HW_PARAM_CHANNELS 10
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_HW_PARAM_CHANNELS 10
#define SNDRV_PCM_HW_PARAM_RATE 11
#define SNDRV_PCM_HW_PARAM_PERIOD_TIME 12
#define SNDRV_PCM_HW_PARAM_PERIOD_SIZE 13
-#define SNDRV_PCM_HW_PARAM_PERIOD_BYTES 14
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_HW_PARAM_PERIOD_BYTES 14
#define SNDRV_PCM_HW_PARAM_PERIODS 15
#define SNDRV_PCM_HW_PARAM_BUFFER_TIME 16
#define SNDRV_PCM_HW_PARAM_BUFFER_SIZE 17
-#define SNDRV_PCM_HW_PARAM_BUFFER_BYTES 18
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_HW_PARAM_BUFFER_BYTES 18
#define SNDRV_PCM_HW_PARAM_TICK_TIME 19
#define SNDRV_PCM_HW_PARAM_FIRST_INTERVAL SNDRV_PCM_HW_PARAM_SAMPLE_BITS
#define SNDRV_PCM_HW_PARAM_LAST_INTERVAL SNDRV_PCM_HW_PARAM_TICK_TIME
-#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1 << 0)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_HW_PARAMS_NORESAMPLE (1 << 0)
#define SNDRV_PCM_HW_PARAMS_EXPORT_BUFFER (1 << 1)
#define SNDRV_PCM_HW_PARAMS_NO_PERIOD_WAKEUP (1 << 2)
struct snd_interval {
- unsigned int min, max;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int min, max;
unsigned int openmin : 1, openmax : 1, integer : 1, empty : 1;
};
#define SNDRV_MASK_MAX 256
-struct snd_mask {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_mask {
__u32 bits[(SNDRV_MASK_MAX + 31) / 32];
};
struct snd_pcm_hw_params {
- unsigned int flags;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int flags;
struct snd_mask masks[SNDRV_PCM_HW_PARAM_LAST_MASK - SNDRV_PCM_HW_PARAM_FIRST_MASK + 1];
struct snd_mask mres[5];
struct snd_interval intervals[SNDRV_PCM_HW_PARAM_LAST_INTERVAL - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1];
- struct snd_interval ires[9];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_interval ires[9];
unsigned int rmask;
unsigned int cmask;
unsigned int info;
- unsigned int msbits;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int msbits;
unsigned int rate_num;
unsigned int rate_den;
snd_pcm_uframes_t fifo_size;
- unsigned char reserved[64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char reserved[64];
};
enum {
SNDRV_PCM_TSTAMP_NONE = 0,
- SNDRV_PCM_TSTAMP_ENABLE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_PCM_TSTAMP_ENABLE,
SNDRV_PCM_TSTAMP_LAST = SNDRV_PCM_TSTAMP_ENABLE,
};
struct snd_pcm_sw_params {
- int tstamp_mode;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int tstamp_mode;
unsigned int period_step;
unsigned int sleep_min;
snd_pcm_uframes_t avail_min;
- snd_pcm_uframes_t xfer_align;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ snd_pcm_uframes_t xfer_align;
snd_pcm_uframes_t start_threshold;
snd_pcm_uframes_t stop_threshold;
snd_pcm_uframes_t silence_threshold;
- snd_pcm_uframes_t silence_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ snd_pcm_uframes_t silence_size;
snd_pcm_uframes_t boundary;
unsigned int proto;
unsigned int tstamp_type;
- unsigned char reserved[56];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char reserved[56];
};
struct snd_pcm_channel_info {
unsigned int channel;
- __kernel_off_t offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __kernel_off_t offset;
unsigned int first;
unsigned int step;
};
-struct snd_pcm_status {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1,
+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK = 2,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3,
+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4,
+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5,
+ SNDRV_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
+struct snd_pcm_status {
snd_pcm_state_t state;
struct timespec trigger_tstamp;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct timespec tstamp;
snd_pcm_uframes_t appl_ptr;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
snd_pcm_uframes_t hw_ptr;
snd_pcm_sframes_t delay;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
snd_pcm_uframes_t avail;
snd_pcm_uframes_t avail_max;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
snd_pcm_uframes_t overrange;
snd_pcm_state_t suspended_state;
- __u32 reserved_alignment;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __u32 audio_tstamp_data;
struct timespec audio_tstamp;
+ struct timespec driver_tstamp;
+ __u32 audio_tstamp_accuracy;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned char reserved[56 - sizeof(struct timespec)];
+ unsigned char reserved[52 - 2 * sizeof(struct timespec)];
};
struct snd_pcm_mmap_status {
snd_pcm_state_t state;
@@ -529,467 +554,468 @@ enum {
#define SNDRV_PCM_IOCTL_DELAY _IOR('A', 0x21, snd_pcm_sframes_t)
#define SNDRV_PCM_IOCTL_HWSYNC _IO('A', 0x22)
#define SNDRV_PCM_IOCTL_SYNC_PTR _IOWR('A', 0x23, struct snd_pcm_sync_ptr)
-#define SNDRV_PCM_IOCTL_CHANNEL_INFO _IOR('A', 0x32, struct snd_pcm_channel_info)
+#define SNDRV_PCM_IOCTL_STATUS_EXT _IOWR('A', 0x24, struct snd_pcm_status)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_IOCTL_CHANNEL_INFO _IOR('A', 0x32, struct snd_pcm_channel_info)
#define SNDRV_PCM_IOCTL_PREPARE _IO('A', 0x40)
#define SNDRV_PCM_IOCTL_RESET _IO('A', 0x41)
#define SNDRV_PCM_IOCTL_START _IO('A', 0x42)
-#define SNDRV_PCM_IOCTL_DROP _IO('A', 0x43)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_IOCTL_DROP _IO('A', 0x43)
#define SNDRV_PCM_IOCTL_DRAIN _IO('A', 0x44)
#define SNDRV_PCM_IOCTL_PAUSE _IOW('A', 0x45, int)
#define SNDRV_PCM_IOCTL_REWIND _IOW('A', 0x46, snd_pcm_uframes_t)
-#define SNDRV_PCM_IOCTL_RESUME _IO('A', 0x47)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_IOCTL_RESUME _IO('A', 0x47)
#define SNDRV_PCM_IOCTL_XRUN _IO('A', 0x48)
#define SNDRV_PCM_IOCTL_FORWARD _IOW('A', 0x49, snd_pcm_uframes_t)
#define SNDRV_PCM_IOCTL_WRITEI_FRAMES _IOW('A', 0x50, struct snd_xferi)
-#define SNDRV_PCM_IOCTL_READI_FRAMES _IOR('A', 0x51, struct snd_xferi)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_IOCTL_READI_FRAMES _IOR('A', 0x51, struct snd_xferi)
#define SNDRV_PCM_IOCTL_WRITEN_FRAMES _IOW('A', 0x52, struct snd_xfern)
#define SNDRV_PCM_IOCTL_READN_FRAMES _IOR('A', 0x53, struct snd_xfern)
#define SNDRV_PCM_IOCTL_LINK _IOW('A', 0x60, int)
-#define SNDRV_PCM_IOCTL_UNLINK _IO('A', 0x61)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_PCM_IOCTL_UNLINK _IO('A', 0x61)
#define SNDRV_RAWMIDI_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 0)
enum {
SNDRV_RAWMIDI_STREAM_OUTPUT = 0,
- SNDRV_RAWMIDI_STREAM_INPUT,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_RAWMIDI_STREAM_INPUT,
SNDRV_RAWMIDI_STREAM_LAST = SNDRV_RAWMIDI_STREAM_INPUT,
};
#define SNDRV_RAWMIDI_INFO_OUTPUT 0x00000001
-#define SNDRV_RAWMIDI_INFO_INPUT 0x00000002
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_RAWMIDI_INFO_INPUT 0x00000002
#define SNDRV_RAWMIDI_INFO_DUPLEX 0x00000004
struct snd_rawmidi_info {
unsigned int device;
- unsigned int subdevice;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int subdevice;
int stream;
int card;
unsigned int flags;
- unsigned char id[64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char id[64];
unsigned char name[80];
unsigned char subname[32];
unsigned int subdevices_count;
- unsigned int subdevices_avail;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int subdevices_avail;
unsigned char reserved[64];
};
struct snd_rawmidi_params {
- int stream;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int stream;
size_t buffer_size;
size_t avail_min;
unsigned int no_active_sensing : 1;
- unsigned char reserved[16];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char reserved[16];
};
struct snd_rawmidi_status {
int stream;
- struct timespec tstamp;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct timespec tstamp;
size_t avail;
size_t xruns;
unsigned char reserved[16];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_RAWMIDI_IOCTL_PVERSION _IOR('W', 0x00, int)
#define SNDRV_RAWMIDI_IOCTL_INFO _IOR('W', 0x01, struct snd_rawmidi_info)
#define SNDRV_RAWMIDI_IOCTL_PARAMS _IOWR('W', 0x10, struct snd_rawmidi_params)
-#define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_RAWMIDI_IOCTL_STATUS _IOWR('W', 0x20, struct snd_rawmidi_status)
#define SNDRV_RAWMIDI_IOCTL_DROP _IOW('W', 0x30, int)
#define SNDRV_RAWMIDI_IOCTL_DRAIN _IOW('W', 0x31, int)
#define SNDRV_TIMER_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 6)
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
SNDRV_TIMER_CLASS_NONE = - 1,
SNDRV_TIMER_CLASS_SLAVE = 0,
SNDRV_TIMER_CLASS_GLOBAL,
- SNDRV_TIMER_CLASS_CARD,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_TIMER_CLASS_CARD,
SNDRV_TIMER_CLASS_PCM,
SNDRV_TIMER_CLASS_LAST = SNDRV_TIMER_CLASS_PCM,
};
-enum {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum {
SNDRV_TIMER_SCLASS_NONE = 0,
SNDRV_TIMER_SCLASS_APPLICATION,
SNDRV_TIMER_SCLASS_SEQUENCER,
- SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
SNDRV_TIMER_SCLASS_LAST = SNDRV_TIMER_SCLASS_OSS_SEQUENCER,
};
#define SNDRV_TIMER_GLOBAL_SYSTEM 0
-#define SNDRV_TIMER_GLOBAL_RTC 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_TIMER_GLOBAL_RTC 1
#define SNDRV_TIMER_GLOBAL_HPET 2
#define SNDRV_TIMER_GLOBAL_HRTIMER 3
#define SNDRV_TIMER_FLG_SLAVE (1 << 0)
-struct snd_timer_id {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_timer_id {
int dev_class;
int dev_sclass;
int card;
- int device;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int device;
int subdevice;
};
struct snd_timer_ginfo {
- struct snd_timer_id tid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_timer_id tid;
unsigned int flags;
int card;
unsigned char id[64];
- unsigned char name[80];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char name[80];
unsigned long reserved0;
unsigned long resolution;
unsigned long resolution_min;
- unsigned long resolution_max;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned long resolution_max;
unsigned int clients;
unsigned char reserved[32];
};
-struct snd_timer_gparams {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_timer_gparams {
struct snd_timer_id tid;
unsigned long period_num;
unsigned long period_den;
- unsigned char reserved[32];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char reserved[32];
};
struct snd_timer_gstatus {
struct snd_timer_id tid;
- unsigned long resolution;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned long resolution;
unsigned long resolution_num;
unsigned long resolution_den;
unsigned char reserved[32];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_timer_select {
struct snd_timer_id id;
unsigned char reserved[32];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_timer_info {
unsigned int flags;
int card;
- unsigned char id[64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char id[64];
unsigned char name[80];
unsigned long reserved0;
unsigned long resolution;
- unsigned char reserved[64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char reserved[64];
};
#define SNDRV_TIMER_PSFLG_AUTO (1 << 0)
#define SNDRV_TIMER_PSFLG_EXCLUSIVE (1 << 1)
-#define SNDRV_TIMER_PSFLG_EARLY_EVENT (1 << 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_TIMER_PSFLG_EARLY_EVENT (1 << 2)
struct snd_timer_params {
unsigned int flags;
unsigned int ticks;
- unsigned int queue_size;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int queue_size;
unsigned int reserved0;
unsigned int filter;
unsigned char reserved[60];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_timer_status {
struct timespec tstamp;
unsigned int resolution;
- unsigned int lost;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int lost;
unsigned int overrun;
unsigned int queue;
unsigned char reserved[64];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_TIMER_IOCTL_PVERSION _IOR('T', 0x00, int)
#define SNDRV_TIMER_IOCTL_NEXT_DEVICE _IOWR('T', 0x01, struct snd_timer_id)
#define SNDRV_TIMER_IOCTL_TREAD _IOW('T', 0x02, int)
-#define SNDRV_TIMER_IOCTL_GINFO _IOWR('T', 0x03, struct snd_timer_ginfo)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_TIMER_IOCTL_GINFO _IOWR('T', 0x03, struct snd_timer_ginfo)
#define SNDRV_TIMER_IOCTL_GPARAMS _IOW('T', 0x04, struct snd_timer_gparams)
#define SNDRV_TIMER_IOCTL_GSTATUS _IOWR('T', 0x05, struct snd_timer_gstatus)
#define SNDRV_TIMER_IOCTL_SELECT _IOW('T', 0x10, struct snd_timer_select)
-#define SNDRV_TIMER_IOCTL_INFO _IOR('T', 0x11, struct snd_timer_info)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_TIMER_IOCTL_INFO _IOR('T', 0x11, struct snd_timer_info)
#define SNDRV_TIMER_IOCTL_PARAMS _IOW('T', 0x12, struct snd_timer_params)
#define SNDRV_TIMER_IOCTL_STATUS _IOR('T', 0x14, struct snd_timer_status)
#define SNDRV_TIMER_IOCTL_START _IO('T', 0xa0)
-#define SNDRV_TIMER_IOCTL_STOP _IO('T', 0xa1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_TIMER_IOCTL_STOP _IO('T', 0xa1)
#define SNDRV_TIMER_IOCTL_CONTINUE _IO('T', 0xa2)
#define SNDRV_TIMER_IOCTL_PAUSE _IO('T', 0xa3)
struct snd_timer_read {
- unsigned int resolution;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int resolution;
unsigned int ticks;
};
enum {
- SNDRV_TIMER_EVENT_RESOLUTION = 0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_TIMER_EVENT_RESOLUTION = 0,
SNDRV_TIMER_EVENT_TICK,
SNDRV_TIMER_EVENT_START,
SNDRV_TIMER_EVENT_STOP,
- SNDRV_TIMER_EVENT_CONTINUE,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_TIMER_EVENT_CONTINUE,
SNDRV_TIMER_EVENT_PAUSE,
SNDRV_TIMER_EVENT_EARLY,
SNDRV_TIMER_EVENT_SUSPEND,
- SNDRV_TIMER_EVENT_RESUME,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_TIMER_EVENT_RESUME,
SNDRV_TIMER_EVENT_MSTART = SNDRV_TIMER_EVENT_START + 10,
SNDRV_TIMER_EVENT_MSTOP = SNDRV_TIMER_EVENT_STOP + 10,
SNDRV_TIMER_EVENT_MCONTINUE = SNDRV_TIMER_EVENT_CONTINUE + 10,
- SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_TIMER_EVENT_MPAUSE = SNDRV_TIMER_EVENT_PAUSE + 10,
SNDRV_TIMER_EVENT_MSUSPEND = SNDRV_TIMER_EVENT_SUSPEND + 10,
SNDRV_TIMER_EVENT_MRESUME = SNDRV_TIMER_EVENT_RESUME + 10,
};
-struct snd_timer_tread {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_timer_tread {
int event;
struct timespec tstamp;
unsigned int val;
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 7)
struct snd_ctl_card_info {
int card;
- int pad;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int pad;
unsigned char id[16];
unsigned char driver[16];
unsigned char name[32];
- unsigned char longname[80];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char longname[80];
unsigned char reserved_[16];
unsigned char mixername[80];
unsigned char components[128];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
typedef int __bitwise snd_ctl_elem_type_t;
#define SNDRV_CTL_ELEM_TYPE_NONE ((__force snd_ctl_elem_type_t) 0)
#define SNDRV_CTL_ELEM_TYPE_BOOLEAN ((__force snd_ctl_elem_type_t) 1)
-#define SNDRV_CTL_ELEM_TYPE_INTEGER ((__force snd_ctl_elem_type_t) 2)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_TYPE_INTEGER ((__force snd_ctl_elem_type_t) 2)
#define SNDRV_CTL_ELEM_TYPE_ENUMERATED ((__force snd_ctl_elem_type_t) 3)
#define SNDRV_CTL_ELEM_TYPE_BYTES ((__force snd_ctl_elem_type_t) 4)
#define SNDRV_CTL_ELEM_TYPE_IEC958 ((__force snd_ctl_elem_type_t) 5)
-#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((__force snd_ctl_elem_type_t) 6)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_TYPE_INTEGER64 ((__force snd_ctl_elem_type_t) 6)
#define SNDRV_CTL_ELEM_TYPE_LAST SNDRV_CTL_ELEM_TYPE_INTEGER64
typedef int __bitwise snd_ctl_elem_iface_t;
#define SNDRV_CTL_ELEM_IFACE_CARD ((__force snd_ctl_elem_iface_t) 0)
-#define SNDRV_CTL_ELEM_IFACE_HWDEP ((__force snd_ctl_elem_iface_t) 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_IFACE_HWDEP ((__force snd_ctl_elem_iface_t) 1)
#define SNDRV_CTL_ELEM_IFACE_MIXER ((__force snd_ctl_elem_iface_t) 2)
#define SNDRV_CTL_ELEM_IFACE_PCM ((__force snd_ctl_elem_iface_t) 3)
#define SNDRV_CTL_ELEM_IFACE_RAWMIDI ((__force snd_ctl_elem_iface_t) 4)
-#define SNDRV_CTL_ELEM_IFACE_TIMER ((__force snd_ctl_elem_iface_t) 5)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_IFACE_TIMER ((__force snd_ctl_elem_iface_t) 5)
#define SNDRV_CTL_ELEM_IFACE_SEQUENCER ((__force snd_ctl_elem_iface_t) 6)
#define SNDRV_CTL_ELEM_IFACE_LAST SNDRV_CTL_ELEM_IFACE_SEQUENCER
#define SNDRV_CTL_ELEM_ACCESS_READ (1 << 0)
-#define SNDRV_CTL_ELEM_ACCESS_WRITE (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_ACCESS_WRITE (1 << 1)
#define SNDRV_CTL_ELEM_ACCESS_READWRITE (SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE)
#define SNDRV_CTL_ELEM_ACCESS_VOLATILE (1 << 2)
#define SNDRV_CTL_ELEM_ACCESS_TIMESTAMP (1 << 3)
-#define SNDRV_CTL_ELEM_ACCESS_TLV_READ (1 << 4)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_ACCESS_TLV_READ (1 << 4)
#define SNDRV_CTL_ELEM_ACCESS_TLV_WRITE (1 << 5)
#define SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE (SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_TLV_WRITE)
#define SNDRV_CTL_ELEM_ACCESS_TLV_COMMAND (1 << 6)
-#define SNDRV_CTL_ELEM_ACCESS_INACTIVE (1 << 8)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_ACCESS_INACTIVE (1 << 8)
#define SNDRV_CTL_ELEM_ACCESS_LOCK (1 << 9)
#define SNDRV_CTL_ELEM_ACCESS_OWNER (1 << 10)
#define SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK (1 << 28)
-#define SNDRV_CTL_ELEM_ACCESS_USER (1 << 29)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_ELEM_ACCESS_USER (1 << 29)
#define SNDRV_CTL_POWER_D0 0x0000
#define SNDRV_CTL_POWER_D1 0x0100
#define SNDRV_CTL_POWER_D2 0x0200
-#define SNDRV_CTL_POWER_D3 0x0300
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_POWER_D3 0x0300
#define SNDRV_CTL_POWER_D3hot (SNDRV_CTL_POWER_D3 | 0x0000)
#define SNDRV_CTL_POWER_D3cold (SNDRV_CTL_POWER_D3 | 0x0001)
#define SNDRV_CTL_ELEM_ID_NAME_MAXLEN 44
-struct snd_ctl_elem_id {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_ctl_elem_id {
unsigned int numid;
snd_ctl_elem_iface_t iface;
unsigned int device;
- unsigned int subdevice;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- unsigned char name[44];
+ unsigned int subdevice;
+ unsigned char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
unsigned int index;
};
-struct snd_ctl_elem_list {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_ctl_elem_list {
unsigned int offset;
unsigned int space;
unsigned int used;
- unsigned int count;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int count;
struct snd_ctl_elem_id __user * pids;
unsigned char reserved[50];
};
-struct snd_ctl_elem_info {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_ctl_elem_info {
struct snd_ctl_elem_id id;
snd_ctl_elem_type_t type;
unsigned int access;
- unsigned int count;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int count;
__kernel_pid_t owner;
union {
struct {
- long min;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ long min;
long max;
long step;
} integer;
- struct {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct {
long long min;
long long max;
long long step;
- } integer64;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } integer64;
struct {
unsigned int items;
unsigned int item;
- char name[64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ char name[64];
__u64 names_ptr;
unsigned int names_length;
} enumerated;
- unsigned char reserved[128];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char reserved[128];
} value;
union {
unsigned short d[4];
- unsigned short * d_ptr;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short * d_ptr;
} dimen;
unsigned char reserved[64 - 4 * sizeof(unsigned short)];
};
-struct snd_ctl_elem_value {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_ctl_elem_value {
struct snd_ctl_elem_id id;
unsigned int indirect : 1;
union {
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
long value[128];
long * value_ptr;
} integer;
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
long long value[64];
long long * value_ptr;
} integer64;
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
unsigned int item[128];
unsigned int * item_ptr;
} enumerated;
- union {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ union {
unsigned char data[512];
unsigned char * data_ptr;
} bytes;
- struct snd_aes_iec958 iec958;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_aes_iec958 iec958;
} value;
struct timespec tstamp;
unsigned char reserved[128 - sizeof(struct timespec)];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_ctl_tlv {
unsigned int numid;
unsigned int length;
- unsigned int tlv[0];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int tlv[0];
};
#define SNDRV_CTL_IOCTL_PVERSION _IOR('U', 0x00, int)
#define SNDRV_CTL_IOCTL_CARD_INFO _IOR('U', 0x01, struct snd_ctl_card_info)
-#define SNDRV_CTL_IOCTL_ELEM_LIST _IOWR('U', 0x10, struct snd_ctl_elem_list)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_IOCTL_ELEM_LIST _IOWR('U', 0x10, struct snd_ctl_elem_list)
#define SNDRV_CTL_IOCTL_ELEM_INFO _IOWR('U', 0x11, struct snd_ctl_elem_info)
#define SNDRV_CTL_IOCTL_ELEM_READ _IOWR('U', 0x12, struct snd_ctl_elem_value)
#define SNDRV_CTL_IOCTL_ELEM_WRITE _IOWR('U', 0x13, struct snd_ctl_elem_value)
-#define SNDRV_CTL_IOCTL_ELEM_LOCK _IOW('U', 0x14, struct snd_ctl_elem_id)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_IOCTL_ELEM_LOCK _IOW('U', 0x14, struct snd_ctl_elem_id)
#define SNDRV_CTL_IOCTL_ELEM_UNLOCK _IOW('U', 0x15, struct snd_ctl_elem_id)
#define SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS _IOWR('U', 0x16, int)
#define SNDRV_CTL_IOCTL_ELEM_ADD _IOWR('U', 0x17, struct snd_ctl_elem_info)
-#define SNDRV_CTL_IOCTL_ELEM_REPLACE _IOWR('U', 0x18, struct snd_ctl_elem_info)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_IOCTL_ELEM_REPLACE _IOWR('U', 0x18, struct snd_ctl_elem_info)
#define SNDRV_CTL_IOCTL_ELEM_REMOVE _IOWR('U', 0x19, struct snd_ctl_elem_id)
#define SNDRV_CTL_IOCTL_TLV_READ _IOWR('U', 0x1a, struct snd_ctl_tlv)
#define SNDRV_CTL_IOCTL_TLV_WRITE _IOWR('U', 0x1b, struct snd_ctl_tlv)
-#define SNDRV_CTL_IOCTL_TLV_COMMAND _IOWR('U', 0x1c, struct snd_ctl_tlv)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_IOCTL_TLV_COMMAND _IOWR('U', 0x1c, struct snd_ctl_tlv)
#define SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE _IOWR('U', 0x20, int)
#define SNDRV_CTL_IOCTL_HWDEP_INFO _IOR('U', 0x21, struct snd_hwdep_info)
#define SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE _IOR('U', 0x30, int)
-#define SNDRV_CTL_IOCTL_PCM_INFO _IOWR('U', 0x31, struct snd_pcm_info)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_IOCTL_PCM_INFO _IOWR('U', 0x31, struct snd_pcm_info)
#define SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE _IOW('U', 0x32, int)
#define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int)
#define SNDRV_CTL_IOCTL_RAWMIDI_INFO _IOWR('U', 0x41, struct snd_rawmidi_info)
-#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
#define SNDRV_CTL_IOCTL_POWER _IOWR('U', 0xd0, int)
#define SNDRV_CTL_IOCTL_POWER_STATE _IOR('U', 0xd1, int)
enum sndrv_ctl_event_type {
- SNDRV_CTL_EVENT_ELEM = 0,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ SNDRV_CTL_EVENT_ELEM = 0,
SNDRV_CTL_EVENT_LAST = SNDRV_CTL_EVENT_ELEM,
};
#define SNDRV_CTL_EVENT_MASK_VALUE (1 << 0)
-#define SNDRV_CTL_EVENT_MASK_INFO (1 << 1)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_EVENT_MASK_INFO (1 << 1)
#define SNDRV_CTL_EVENT_MASK_ADD (1 << 2)
#define SNDRV_CTL_EVENT_MASK_TLV (1 << 3)
#define SNDRV_CTL_EVENT_MASK_REMOVE (~0U)
-struct snd_ctl_event {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_ctl_event {
int type;
union {
struct {
- unsigned int mask;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int mask;
struct snd_ctl_elem_id id;
} elem;
unsigned char data8[60];
- } data;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } data;
};
#define SNDRV_CTL_NAME_NONE ""
#define SNDRV_CTL_NAME_PLAYBACK "Playback "
-#define SNDRV_CTL_NAME_CAPTURE "Capture "
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_NAME_CAPTURE "Capture "
#define SNDRV_CTL_NAME_IEC958_NONE ""
#define SNDRV_CTL_NAME_IEC958_SWITCH "Switch"
#define SNDRV_CTL_NAME_IEC958_VOLUME "Volume"
-#define SNDRV_CTL_NAME_IEC958_DEFAULT "Default"
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_NAME_IEC958_DEFAULT "Default"
#define SNDRV_CTL_NAME_IEC958_MASK "Mask"
#define SNDRV_CTL_NAME_IEC958_CON_MASK "Con Mask"
#define SNDRV_CTL_NAME_IEC958_PRO_MASK "Pro Mask"
-#define SNDRV_CTL_NAME_IEC958_PCM_STREAM "PCM Stream"
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_NAME_IEC958_PCM_STREAM "PCM Stream"
#define SNDRV_CTL_NAME_IEC958(expl,direction,what) "IEC958 " expl SNDRV_CTL_NAME_ ##direction SNDRV_CTL_NAME_IEC958_ ##what
#endif
diff --git a/libc/kernel/uapi/sound/compress_offload.h b/libc/kernel/uapi/sound/compress_offload.h
index 8928cbf67..0f6077f2b 100644
--- a/libc/kernel/uapi/sound/compress_offload.h
+++ b/libc/kernel/uapi/sound/compress_offload.h
@@ -72,7 +72,7 @@ struct snd_compr_codec_caps {
struct snd_codec_desc descriptor[MAX_NUM_CODEC_DESCRIPTORS];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
} __attribute__((packed, aligned(4)));
-enum {
+enum sndrv_compress_encoder {
SNDRV_COMPRESS_ENCODER_PADDING = 1,
SNDRV_COMPRESS_ENCODER_DELAY = 2,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/sound/emu10k1.h b/libc/kernel/uapi/sound/emu10k1.h
index 970122780..b03fce6ad 100644
--- a/libc/kernel/uapi/sound/emu10k1.h
+++ b/libc/kernel/uapi/sound/emu10k1.h
@@ -19,368 +19,371 @@
#ifndef _UAPI__SOUND_EMU10K1_H
#define _UAPI__SOUND_EMU10K1_H
#include <linux/types.h>
-#define EMU10K1_CARD_CREATIVE 0x00000000
+#include <sound/asound.h>
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define EMU10K1_CARD_CREATIVE 0x00000000
#define EMU10K1_CARD_EMUAPS 0x00000001
#define EMU10K1_FX8010_PCM_COUNT 8
+#define __EMU10K1_DECLARE_BITMAP(name,bits) unsigned long name[(bits) / (sizeof(unsigned long) * 8)]
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iMAC0 0x00
#define iMAC1 0x01
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iMAC2 0x02
#define iMAC3 0x03
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iMACINT0 0x04
#define iMACINT1 0x05
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iACC3 0x06
#define iMACMV 0x07
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iANDXOR 0x08
#define iTSTNEG 0x09
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iLIMITGE 0x0a
#define iLIMITLT 0x0b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iLOG 0x0c
#define iEXP 0x0d
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define iINTERP 0x0e
#define iSKIP 0x0f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS(x) (0x00 + (x))
#define EXTIN(x) (0x10 + (x))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT(x) (0x20 + (x))
#define FXBUS2(x) (0x30 + (x))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_00000000 0x40
#define C_00000001 0x41
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_00000002 0x42
#define C_00000003 0x43
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_00000004 0x44
#define C_00000008 0x45
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_00000010 0x46
#define C_00000020 0x47
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_00000100 0x48
#define C_00010000 0x49
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_00080000 0x4a
#define C_10000000 0x4b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_20000000 0x4c
#define C_40000000 0x4d
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_80000000 0x4e
#define C_7fffffff 0x4f
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_ffffffff 0x50
#define C_fffffffe 0x51
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_c0000000 0x52
#define C_4f1bbcdc 0x53
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define C_5a7ef9db 0x54
#define C_00100000 0x55
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define GPR_ACCU 0x56
#define GPR_COND 0x57
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define GPR_NOISE0 0x58
#define GPR_NOISE1 0x59
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define GPR_IRQ 0x5a
#define GPR_DBAC 0x5b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define GPR(x) (FXGPREGBASE + (x))
#define ITRAM_DATA(x) (TANKMEMDATAREGBASE + 0x00 + (x))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ETRAM_DATA(x) (TANKMEMDATAREGBASE + 0x80 + (x))
#define ITRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x00 + (x))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define ETRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x80 + (x))
#define A_ITRAM_DATA(x) (TANKMEMDATAREGBASE + 0x00 + (x))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_ETRAM_DATA(x) (TANKMEMDATAREGBASE + 0xc0 + (x))
#define A_ITRAM_ADDR(x) (TANKMEMADDRREGBASE + 0x00 + (x))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_ETRAM_ADDR(x) (TANKMEMADDRREGBASE + 0xc0 + (x))
#define A_ITRAM_CTL(x) (A_TANKMEMCTLREGBASE + 0x00 + (x))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_ETRAM_CTL(x) (A_TANKMEMCTLREGBASE + 0xc0 + (x))
#define A_FXBUS(x) (0x00 + (x))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTIN(x) (0x40 + (x))
#define A_P16VIN(x) (0x50 + (x))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT(x) (0x60 + (x))
#define A_FXBUS2(x) (0x80 + (x))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EMU32OUTH(x) (0xa0 + (x))
#define A_EMU32OUTL(x) (0xb0 + (x))
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A3_EMU32IN(x) (0x160 + (x))
#define A3_EMU32OUT(x) (0x1E0 + (x))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_GPR(x) (A_FXGPREGBASE + (x))
#define CC_REG_NORMALIZED C_00000001
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CC_REG_BORROW C_00000002
#define CC_REG_MINUS C_00000004
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CC_REG_ZERO C_00000008
#define CC_REG_SATURATE C_00000010
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define CC_REG_NONZERO C_00000100
#define FXBUS_PCM_LEFT 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_PCM_RIGHT 0x01
#define FXBUS_PCM_LEFT_REAR 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_PCM_RIGHT_REAR 0x03
#define FXBUS_MIDI_LEFT 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_MIDI_RIGHT 0x05
#define FXBUS_PCM_CENTER 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_PCM_LFE 0x07
#define FXBUS_PCM_LEFT_FRONT 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_PCM_RIGHT_FRONT 0x09
#define FXBUS_MIDI_REVERB 0x0c
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_MIDI_CHORUS 0x0d
#define FXBUS_PCM_LEFT_SIDE 0x0e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_PCM_RIGHT_SIDE 0x0f
#define FXBUS_PT_LEFT 0x14
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define FXBUS_PT_RIGHT 0x15
#define EXTIN_AC97_L 0x00
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTIN_AC97_R 0x01
#define EXTIN_SPDIF_CD_L 0x02
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTIN_SPDIF_CD_R 0x03
#define EXTIN_ZOOM_L 0x04
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTIN_ZOOM_R 0x05
#define EXTIN_TOSLINK_L 0x06
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTIN_TOSLINK_R 0x07
#define EXTIN_LINE1_L 0x08
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTIN_LINE1_R 0x09
#define EXTIN_COAX_SPDIF_L 0x0a
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTIN_COAX_SPDIF_R 0x0b
#define EXTIN_LINE2_L 0x0c
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTIN_LINE2_R 0x0d
#define EXTOUT_AC97_L 0x00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_AC97_R 0x01
#define EXTOUT_TOSLINK_L 0x02
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_TOSLINK_R 0x03
#define EXTOUT_AC97_CENTER 0x04
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_AC97_LFE 0x05
#define EXTOUT_HEADPHONE_L 0x06
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_HEADPHONE_R 0x07
#define EXTOUT_REAR_L 0x08
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_REAR_R 0x09
#define EXTOUT_ADC_CAP_L 0x0a
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_ADC_CAP_R 0x0b
#define EXTOUT_MIC_CAP 0x0c
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_AC97_REAR_L 0x0d
#define EXTOUT_AC97_REAR_R 0x0e
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EXTOUT_ACENTER 0x11
#define EXTOUT_ALFE 0x12
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTIN_AC97_L 0x00
#define A_EXTIN_AC97_R 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTIN_SPDIF_CD_L 0x02
#define A_EXTIN_SPDIF_CD_R 0x03
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTIN_OPT_SPDIF_L 0x04
#define A_EXTIN_OPT_SPDIF_R 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTIN_LINE2_L 0x08
#define A_EXTIN_LINE2_R 0x09
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTIN_ADC_L 0x0a
#define A_EXTIN_ADC_R 0x0b
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTIN_AUX2_L 0x0c
#define A_EXTIN_AUX2_R 0x0d
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_FRONT_L 0x00
#define A_EXTOUT_FRONT_R 0x01
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_CENTER 0x02
#define A_EXTOUT_LFE 0x03
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_HEADPHONE_L 0x04
#define A_EXTOUT_HEADPHONE_R 0x05
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_REAR_L 0x06
#define A_EXTOUT_REAR_R 0x07
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_AFRONT_L 0x08
#define A_EXTOUT_AFRONT_R 0x09
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_ACENTER 0x0a
#define A_EXTOUT_ALFE 0x0b
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_ASIDE_L 0x0c
#define A_EXTOUT_ASIDE_R 0x0d
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_AREAR_L 0x0e
#define A_EXTOUT_AREAR_R 0x0f
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_AC97_L 0x10
#define A_EXTOUT_AC97_R 0x11
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_ADC_CAP_L 0x16
#define A_EXTOUT_ADC_CAP_R 0x17
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_EXTOUT_MIC_CAP 0x18
#define A_C_00000000 0xc0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_00000001 0xc1
#define A_C_00000002 0xc2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_00000003 0xc3
#define A_C_00000004 0xc4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_00000008 0xc5
#define A_C_00000010 0xc6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_00000020 0xc7
#define A_C_00000100 0xc8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_00010000 0xc9
#define A_C_00000800 0xca
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_10000000 0xcb
#define A_C_20000000 0xcc
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_40000000 0xcd
#define A_C_80000000 0xce
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_7fffffff 0xcf
#define A_C_ffffffff 0xd0
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_fffffffe 0xd1
#define A_C_c0000000 0xd2
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_4f1bbcdc 0xd3
#define A_C_5a7ef9db 0xd4
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_C_00100000 0xd5
#define A_GPR_ACCU 0xd6
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_GPR_COND 0xd7
#define A_GPR_NOISE0 0xd8
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_GPR_NOISE1 0xd9
#define A_GPR_IRQ 0xda
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define A_GPR_DBAC 0xdb
#define A_GPR_DBACE 0xde
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EMU10K1_DBG_ZC 0x80000000
#define EMU10K1_DBG_SATURATION_OCCURED 0x02000000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EMU10K1_DBG_SATURATION_ADDR 0x01ff0000
#define EMU10K1_DBG_SINGLE_STEP 0x00008000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EMU10K1_DBG_STEP 0x00004000
#define EMU10K1_DBG_CONDITION_CODE 0x00003e00
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EMU10K1_DBG_SINGLE_STEP_ADDR 0x000001ff
#define TANKMEMADDRREG_ADDR_MASK 0x000fffff
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TANKMEMADDRREG_CLEAR 0x00800000
#define TANKMEMADDRREG_ALIGN 0x00400000
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define TANKMEMADDRREG_WRITE 0x00200000
#define TANKMEMADDRREG_READ 0x00100000
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct snd_emu10k1_fx8010_info {
unsigned int internal_tram_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int external_tram_size;
char fxbus_names[16][32];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
char extin_names[16][32];
char extout_names[32][32];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int gpr_controls;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EMU10K1_GPR_TRANSLATION_NONE 0
#define EMU10K1_GPR_TRANSLATION_TABLE100 1
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EMU10K1_GPR_TRANSLATION_BASS 2
#define EMU10K1_GPR_TRANSLATION_TREBLE 3
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define EMU10K1_GPR_TRANSLATION_ONOFF 4
struct snd_emu10k1_fx8010_control_gpr {
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct snd_ctl_elem_id id;
unsigned int vcount;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int count;
unsigned short gpr[32];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int value[32];
unsigned int min;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int max;
unsigned int translation;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
const unsigned int * tlv;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct snd_emu10k1_fx8010_control_old_gpr {
struct snd_ctl_elem_id id;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int vcount;
unsigned int count;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short gpr[32];
unsigned int value[32];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int min;
unsigned int max;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int translation;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct snd_emu10k1_fx8010_code {
char name[128];
- DECLARE_BITMAP(gpr_valid, 0x200);
- __u32 __user * gpr_map;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __EMU10K1_DECLARE_BITMAP(gpr_valid, 0x200);
+ __u32 __user * gpr_map;
unsigned int gpr_add_control_count;
struct snd_emu10k1_fx8010_control_gpr __user * gpr_add_controls;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int gpr_del_control_count;
struct snd_ctl_elem_id __user * gpr_del_controls;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int gpr_list_control_count;
unsigned int gpr_list_control_total;
- struct snd_emu10k1_fx8010_control_gpr __user * gpr_list_controls;
- DECLARE_BITMAP(tram_valid, 0x100);
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_emu10k1_fx8010_control_gpr __user * gpr_list_controls;
+ __EMU10K1_DECLARE_BITMAP(tram_valid, 0x100);
__u32 __user * tram_data_map;
__u32 __user * tram_addr_map;
- DECLARE_BITMAP(code_valid, 1024);
- __u32 __user * code;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __EMU10K1_DECLARE_BITMAP(code_valid, 1024);
+ __u32 __user * code;
};
struct snd_emu10k1_fx8010_tram {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int address;
unsigned int size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int * samples;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct snd_emu10k1_fx8010_pcm_rec {
unsigned int substream;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int res1;
unsigned int channels;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int tram_start;
unsigned int buffer_size;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short gpr_size;
unsigned short gpr_ptr;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short gpr_count;
unsigned short gpr_tmpcount;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned short gpr_trigger;
unsigned short gpr_running;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned char pad;
unsigned char etram[32];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
unsigned int res2;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_VERSION SNDRV_PROTOCOL_VERSION(1, 0, 1)
#define SNDRV_EMU10K1_IOCTL_INFO _IOR('H', 0x10, struct snd_emu10k1_fx8010_info)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_IOCTL_CODE_POKE _IOW('H', 0x11, struct snd_emu10k1_fx8010_code)
#define SNDRV_EMU10K1_IOCTL_CODE_PEEK _IOWR('H', 0x12, struct snd_emu10k1_fx8010_code)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_IOCTL_TRAM_SETUP _IOW('H', 0x20, int)
#define SNDRV_EMU10K1_IOCTL_TRAM_POKE _IOW('H', 0x21, struct snd_emu10k1_fx8010_tram)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_IOCTL_TRAM_PEEK _IOWR('H', 0x22, struct snd_emu10k1_fx8010_tram)
#define SNDRV_EMU10K1_IOCTL_PCM_POKE _IOW('H', 0x30, struct snd_emu10k1_fx8010_pcm_rec)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_IOCTL_PCM_PEEK _IOWR('H', 0x31, struct snd_emu10k1_fx8010_pcm_rec)
#define SNDRV_EMU10K1_IOCTL_PVERSION _IOR('H', 0x40, int)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_IOCTL_STOP _IO('H', 0x80)
#define SNDRV_EMU10K1_IOCTL_CONTINUE _IO('H', 0x81)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER _IO('H', 0x82)
#define SNDRV_EMU10K1_IOCTL_SINGLE_STEP _IOW('H', 0x83, int)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_EMU10K1_IOCTL_DBG_READ _IOR('H', 0x84, int)
typedef struct snd_emu10k1_fx8010_info emu10k1_fx8010_info_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct snd_emu10k1_fx8010_control_gpr emu10k1_fx8010_control_gpr_t;
typedef struct snd_emu10k1_fx8010_code emu10k1_fx8010_code_t;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
typedef struct snd_emu10k1_fx8010_tram emu10k1_fx8010_tram_t;
typedef struct snd_emu10k1_fx8010_pcm_rec emu10k1_fx8010_pcm_t;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#endif
diff --git a/libc/kernel/uapi/sound/firewire.h b/libc/kernel/uapi/sound/firewire.h
index 7965fc45e..f489408e1 100644
--- a/libc/kernel/uapi/sound/firewire.h
+++ b/libc/kernel/uapi/sound/firewire.h
@@ -24,58 +24,70 @@
#define SNDRV_FIREWIRE_EVENT_LOCK_STATUS 0x000010cc
#define SNDRV_FIREWIRE_EVENT_DICE_NOTIFICATION 0xd1ce004e
#define SNDRV_FIREWIRE_EVENT_EFW_RESPONSE 0x4e617475
-struct snd_firewire_event_common {
+#define SNDRV_FIREWIRE_EVENT_DIGI00X_MESSAGE 0x746e736c
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_firewire_event_common {
unsigned int type;
};
struct snd_firewire_event_lock_status {
- unsigned int type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int type;
unsigned int status;
};
struct snd_firewire_event_dice_notification {
- unsigned int type;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int type;
unsigned int notification;
};
#define SND_EFW_TRANSACTION_USER_SEQNUM_MAX ((__u32) ((__u16) ~0) - 1)
-struct snd_efw_transaction {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct snd_efw_transaction {
__be32 length;
__be32 version;
__be32 seqnum;
- __be32 category;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ __be32 category;
__be32 command;
__be32 status;
__be32 params[0];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct snd_firewire_event_efw_response {
unsigned int type;
__be32 response[0];
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
+struct snd_firewire_event_digi00x_message {
+ unsigned int type;
+ __u32 message;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
union snd_firewire_event {
struct snd_firewire_event_common common;
struct snd_firewire_event_lock_status lock_status;
- struct snd_firewire_event_dice_notification dice_notification;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ struct snd_firewire_event_dice_notification dice_notification;
struct snd_firewire_event_efw_response efw_response;
+ struct snd_firewire_event_digi00x_message digi00x_message;
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_FIREWIRE_IOCTL_GET_INFO _IOR('H', 0xf8, struct snd_firewire_get_info)
#define SNDRV_FIREWIRE_IOCTL_LOCK _IO('H', 0xf9)
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_FIREWIRE_IOCTL_UNLOCK _IO('H', 0xfa)
#define SNDRV_FIREWIRE_TYPE_DICE 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define SNDRV_FIREWIRE_TYPE_FIREWORKS 2
#define SNDRV_FIREWIRE_TYPE_BEBOB 3
+#define SNDRV_FIREWIRE_TYPE_OXFW 4
+#define SNDRV_FIREWIRE_TYPE_DIGI00X 5
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_FIREWIRE_TYPE_TASCAM 6
struct snd_firewire_get_info {
unsigned int type;
unsigned int card;
- unsigned char guid[8];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char guid[8];
char device_name[16];
};
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/sound/hdspm.h b/libc/kernel/uapi/sound/hdspm.h
index 16d03ba36..586507bf4 100644
--- a/libc/kernel/uapi/sound/hdspm.h
+++ b/libc/kernel/uapi/sound/hdspm.h
@@ -18,167 +18,168 @@
****************************************************************************/
#ifndef __SOUND_HDSPM_H
#define __SOUND_HDSPM_H
+#include <linux/types.h>
#define HDSPM_MAX_CHANNELS 64
-enum hdspm_io_type {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum hdspm_io_type {
MADI,
MADIface,
AIO,
- AES32,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ AES32,
RayDAT
};
enum hdspm_speed {
- ss,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ ss,
ds,
qs
};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct hdspm_peak_rms {
+ __u32 input_peaks[64];
+ __u32 playback_peaks[64];
+ __u32 output_peaks[64];
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t input_peaks[64];
- uint32_t playback_peaks[64];
- uint32_t output_peaks[64];
- uint64_t input_rms[64];
+ __u64 input_rms[64];
+ __u64 playback_rms[64];
+ __u64 output_rms[64];
+ __u8 speed;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint64_t playback_rms[64];
- uint64_t output_rms[64];
- uint8_t speed;
int status2;
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define SNDRV_HDSPM_IOCTL_GET_PEAK_RMS _IOR('H', 0x42, struct hdspm_peak_rms)
struct hdspm_config {
- unsigned char pref_sync_ref;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char pref_sync_ref;
unsigned char wordclock_sync_check;
unsigned char madi_sync_check;
unsigned int system_sample_rate;
- unsigned int autosync_sample_rate;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned int autosync_sample_rate;
unsigned char system_clock_mode;
unsigned char clock_source;
unsigned char autosync_ref;
- unsigned char line_out;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned char line_out;
unsigned int passthru;
unsigned int analog_out;
};
-#define SNDRV_HDSPM_IOCTL_GET_CONFIG _IOR('H', 0x41, struct hdspm_config)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_HDSPM_IOCTL_GET_CONFIG _IOR('H', 0x41, struct hdspm_config)
enum hdspm_ltc_format {
format_invalid,
fps_24,
- fps_25,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ fps_25,
fps_2997,
fps_30
};
-enum hdspm_ltc_frame {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+enum hdspm_ltc_frame {
frame_invalid,
drop_frame,
full_frame
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
enum hdspm_ltc_input_format {
ntsc,
pal,
- no_video
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ no_video
};
struct hdspm_ltc {
unsigned int ltc;
- enum hdspm_ltc_format format;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ enum hdspm_ltc_format format;
enum hdspm_ltc_frame frame;
enum hdspm_ltc_input_format input_format;
};
-#define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_ltc)
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_HDSPM_IOCTL_GET_LTC _IOR('H', 0x46, struct hdspm_ltc)
enum hdspm_sync {
hdspm_sync_no_lock = 0,
hdspm_sync_lock = 1,
- hdspm_sync_sync = 2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ hdspm_sync_sync = 2
};
enum hdspm_madi_input {
hdspm_input_optical = 0,
- hdspm_input_coax = 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ hdspm_input_coax = 1
};
enum hdspm_madi_channel_format {
hdspm_format_ch_64 = 0,
- hdspm_format_ch_56 = 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ hdspm_format_ch_56 = 1
};
enum hdspm_madi_frame_format {
hdspm_frame_48 = 0,
- hdspm_frame_96 = 1
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ hdspm_frame_96 = 1
};
enum hdspm_syncsource {
syncsource_wc = 0,
- syncsource_madi = 1,
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ syncsource_madi = 1,
syncsource_tco = 2,
syncsource_sync = 3,
syncsource_none = 4
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct hdspm_status {
- uint8_t card_type;
+ __u8 card_type;
enum hdspm_syncsource autosync_source;
- uint64_t card_clock;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t master_period;
+ __u64 card_clock;
+ __u32 master_period;
union {
struct {
- uint8_t sync_wc;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint8_t sync_madi;
- uint8_t sync_tco;
- uint8_t sync_in;
- uint8_t madi_input;
+ __u8 sync_wc;
+ __u8 sync_madi;
+ __u8 sync_tco;
+ __u8 sync_in;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint8_t channel_format;
- uint8_t frame_format;
+ __u8 madi_input;
+ __u8 channel_format;
+ __u8 frame_format;
} madi;
- } card_specific;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ } card_specific;
};
#define SNDRV_HDSPM_IOCTL_GET_STATUS _IOR('H', 0x47, struct hdspm_status)
#define HDSPM_ADDON_TCO 1
-struct hdspm_version {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint8_t card_type;
+struct hdspm_version {
+ __u8 card_type;
char cardname[20];
unsigned int serial;
- unsigned short firmware_rev;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned short firmware_rev;
int addons;
};
#define SNDRV_HDSPM_IOCTL_GET_VERSION _IOR('H', 0x48, struct hdspm_version)
-#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define HDSPM_MIXER_CHANNELS HDSPM_MAX_CHANNELS
struct hdspm_channelfader {
unsigned int in[HDSPM_MIXER_CHANNELS];
unsigned int pb[HDSPM_MIXER_CHANNELS];
-};
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
struct hdspm_mixer {
struct hdspm_channelfader ch[HDSPM_MIXER_CHANNELS];
};
-struct hdspm_mixer_ioctl {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct hdspm_mixer_ioctl {
struct hdspm_mixer * mixer;
};
#define SNDRV_HDSPM_IOCTL_GET_MIXER _IOR('H', 0x44, struct hdspm_mixer_ioctl)
-typedef struct hdspm_peak_rms hdspm_peak_rms_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct hdspm_peak_rms hdspm_peak_rms_t;
typedef struct hdspm_config_info hdspm_config_info_t;
typedef struct hdspm_version hdspm_version_t;
typedef struct hdspm_channelfader snd_hdspm_channelfader_t;
-typedef struct hdspm_mixer hdspm_mixer_t;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+typedef struct hdspm_mixer hdspm_mixer_t;
#endif
diff --git a/libc/kernel/uapi/sound/tlv.h b/libc/kernel/uapi/sound/tlv.h
new file mode 100644
index 000000000..09f6ae47e
--- /dev/null
+++ b/libc/kernel/uapi/sound/tlv.h
@@ -0,0 +1,33 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef __UAPI_SOUND_TLV_H
+#define __UAPI_SOUND_TLV_H
+#define SNDRV_CTL_TLVT_CONTAINER 0
+#define SNDRV_CTL_TLVT_DB_SCALE 1
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_TLVT_DB_LINEAR 2
+#define SNDRV_CTL_TLVT_DB_RANGE 3
+#define SNDRV_CTL_TLVT_DB_MINMAX 4
+#define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define SNDRV_CTL_TLVT_CHMAP_FIXED 0x101
+#define SNDRV_CTL_TLVT_CHMAP_VAR 0x102
+#define SNDRV_CTL_TLVT_CHMAP_PAIRED 0x103
+#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/kernel/uapi/sound/usb_stream.h b/libc/kernel/uapi/sound/usb_stream.h
new file mode 100644
index 000000000..8393a265f
--- /dev/null
+++ b/libc/kernel/uapi/sound/usb_stream.h
@@ -0,0 +1,74 @@
+/****************************************************************************
+ ****************************************************************************
+ ***
+ *** This header was automatically generated from a Linux kernel header
+ *** of the same name, to make information necessary for userspace to
+ *** call into the kernel available to libc. It contains only constants,
+ *** structures, and macros generated from the original header, and thus,
+ *** contains no copyrightable information.
+ ***
+ *** To edit the content of this header, modify the corresponding
+ *** source file (e.g. under external/kernel-headers/original/) then
+ *** run bionic/libc/kernel/tools/update_all.py
+ ***
+ *** Any manual change here will be lost the next time this script will
+ *** be run. You've been warned!
+ ***
+ ****************************************************************************
+ ****************************************************************************/
+#ifndef _UAPI__SOUND_USB_STREAM_H
+#define _UAPI__SOUND_USB_STREAM_H
+#define USB_STREAM_INTERFACE_VERSION 2
+#define SNDRV_USB_STREAM_IOCTL_SET_PARAMS _IOW('H', 0x90, struct usb_stream_config)
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct usb_stream_packet {
+ unsigned offset;
+ unsigned length;
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+struct usb_stream_config {
+ unsigned version;
+ unsigned sample_rate;
+ unsigned period_frames;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned frame_size;
+};
+struct usb_stream {
+ struct usb_stream_config cfg;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned read_size;
+ unsigned write_size;
+ int period_size;
+ unsigned state;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ int idle_insize;
+ int idle_outsize;
+ int sync_packet;
+ unsigned insize_done;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned periods_done;
+ unsigned periods_polled;
+ struct usb_stream_packet outpacket[2];
+ unsigned inpackets;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned inpacket_head;
+ unsigned inpacket_split;
+ unsigned inpacket_split_at;
+ unsigned next_inpacket_split;
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ unsigned next_inpacket_split_at;
+ struct usb_stream_packet inpacket[0];
+};
+enum usb_stream_state {
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ usb_stream_invalid,
+ usb_stream_stopped,
+ usb_stream_sync0,
+ usb_stream_sync1,
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+ usb_stream_ready,
+ usb_stream_running,
+ usb_stream_xrun,
+};
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#endif
diff --git a/libc/kernel/uapi/xen/gntalloc.h b/libc/kernel/uapi/xen/gntalloc.h
index 1710f4a06..ff546357c 100644
--- a/libc/kernel/uapi/xen/gntalloc.h
+++ b/libc/kernel/uapi/xen/gntalloc.h
@@ -18,32 +18,33 @@
****************************************************************************/
#ifndef __LINUX_PUBLIC_GNTALLOC_H__
#define __LINUX_PUBLIC_GNTALLOC_H__
+#include <linux/types.h>
#define IOCTL_GNTALLOC_ALLOC_GREF _IOC(_IOC_NONE, 'G', 5, sizeof(struct ioctl_gntalloc_alloc_gref))
-struct ioctl_gntalloc_alloc_gref {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint16_t domid;
- uint16_t flags;
- uint32_t count;
- uint64_t index;
+struct ioctl_gntalloc_alloc_gref {
+ __u16 domid;
+ __u16 flags;
+ __u32 count;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t gref_ids[1];
+ __u64 index;
+ __u32 gref_ids[1];
};
#define GNTALLOC_FLAG_WRITABLE 1
-#define IOCTL_GNTALLOC_DEALLOC_GREF _IOC(_IOC_NONE, 'G', 6, sizeof(struct ioctl_gntalloc_dealloc_gref))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IOCTL_GNTALLOC_DEALLOC_GREF _IOC(_IOC_NONE, 'G', 6, sizeof(struct ioctl_gntalloc_dealloc_gref))
struct ioctl_gntalloc_dealloc_gref {
- uint64_t index;
- uint32_t count;
-};
+ __u64 index;
+ __u32 count;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+};
#define IOCTL_GNTALLOC_SET_UNMAP_NOTIFY _IOC(_IOC_NONE, 'G', 7, sizeof(struct ioctl_gntalloc_unmap_notify))
struct ioctl_gntalloc_unmap_notify {
- uint64_t index;
- uint32_t action;
+ __u64 index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t event_channel_port;
+ __u32 action;
+ __u32 event_channel_port;
};
#define UNMAP_NOTIFY_CLEAR_BYTE 0x1
-#define UNMAP_NOTIFY_SEND_EVENT 0x2
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define UNMAP_NOTIFY_SEND_EVENT 0x2
#endif
diff --git a/libc/kernel/uapi/xen/gntdev.h b/libc/kernel/uapi/xen/gntdev.h
index c00e5abad..89e5eb080 100644
--- a/libc/kernel/uapi/xen/gntdev.h
+++ b/libc/kernel/uapi/xen/gntdev.h
@@ -18,49 +18,51 @@
****************************************************************************/
#ifndef __LINUX_PUBLIC_GNTDEV_H__
#define __LINUX_PUBLIC_GNTDEV_H__
+#include <linux/types.h>
struct ioctl_gntdev_grant_ref {
- uint32_t domid;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t ref;
+ __u32 domid;
+ __u32 ref;
};
#define IOCTL_GNTDEV_MAP_GRANT_REF _IOC(_IOC_NONE, 'G', 0, sizeof(struct ioctl_gntdev_map_grant_ref))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ioctl_gntdev_map_grant_ref {
+ __u32 count;
+ __u32 pad;
+ __u64 index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t count;
- uint32_t pad;
- uint64_t index;
struct ioctl_gntdev_grant_ref refs[1];
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
};
#define IOCTL_GNTDEV_UNMAP_GRANT_REF _IOC(_IOC_NONE, 'G', 1, sizeof(struct ioctl_gntdev_unmap_grant_ref))
struct ioctl_gntdev_unmap_grant_ref {
- uint64_t index;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t count;
- uint32_t pad;
+ __u64 index;
+ __u32 count;
+ __u32 pad;
};
-#define IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR _IOC(_IOC_NONE, 'G', 2, sizeof(struct ioctl_gntdev_get_offset_for_vaddr))
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
+#define IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR _IOC(_IOC_NONE, 'G', 2, sizeof(struct ioctl_gntdev_get_offset_for_vaddr))
struct ioctl_gntdev_get_offset_for_vaddr {
- uint64_t vaddr;
- uint64_t offset;
- uint32_t count;
+ __u64 vaddr;
+ __u64 offset;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t pad;
+ __u32 count;
+ __u32 pad;
};
#define IOCTL_GNTDEV_SET_MAX_GRANTS _IOC(_IOC_NONE, 'G', 3, sizeof(struct ioctl_gntdev_set_max_grants))
-struct ioctl_gntdev_set_max_grants {
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint32_t count;
+struct ioctl_gntdev_set_max_grants {
+ __u32 count;
};
#define IOCTL_GNTDEV_SET_UNMAP_NOTIFY _IOC(_IOC_NONE, 'G', 7, sizeof(struct ioctl_gntdev_unmap_notify))
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
struct ioctl_gntdev_unmap_notify {
+ __u64 index;
+ __u32 action;
+ __u32 event_channel_port;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
- uint64_t index;
- uint32_t action;
- uint32_t event_channel_port;
};
-/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
#define UNMAP_NOTIFY_CLEAR_BYTE 0x1
#define UNMAP_NOTIFY_SEND_EVENT 0x2
#endif
+/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
diff --git a/libc/libc.map b/libc/libc.arm.brillo.map
index 47c52a40f..4e5b5c840 100644
--- a/libc/libc.map
+++ b/libc/libc.arm.brillo.map
@@ -1,3 +1,4 @@
+# Generated by genversionscripts.py. Do not edit.
LIBC {
global:
__assert;
@@ -9,44 +10,25 @@ LIBC {
__b64_ntop;
__b64_pton;
__brk; # arm x86 mips
- __cmpdf2; # arm
__cmsg_nxthdr;
__connect; # arm x86 mips
__ctype_get_mb_cur_max;
__cxa_atexit;
__cxa_finalize;
__cxa_thread_atexit_impl;
- __divdf3; # arm
- __divdi3; # arm x86 mips
- __divsf3; # arm
- __divsi3; # arm
__dn_comp;
__dn_count_labels;
__dn_skipname;
__epoll_pwait; # arm x86 mips
- __eqdf2; # arm
__errno;
__exit; # arm x86 mips
- __extendsfdf2; # arm
- __fadvise64; # x86 mips
__fbufsize;
__fcntl64; # arm x86 mips
__FD_CLR_chk;
__FD_ISSET_chk;
__FD_SET_chk;
__fgets_chk;
- __fixdfsi; # arm
- __fixsfsi; # arm
- __fixunssfsi; # arm
__flbf;
- __floatdidf; # arm
- __floatdisf; # arm
- __floatsidf; # arm
- __floatsisf; # arm
- __floatundidf; # arm
- __floatundisf; # arm
- __floatunsidf; # arm
- __floatunsisf; # arm
__fp_nquery;
__fp_query;
__fpclassify;
@@ -58,23 +40,14 @@ LIBC {
__freadable;
__fsetlocking;
__fstatfs64; # arm x86 mips
- __futex_wait; # arm x86 mips
- __futex_wake; # arm x86 mips
__fwritable;
- __gedf2; # arm
__get_h_errno;
- __get_thread; # arm x86 mips
- __get_tls; # arm x86 mips
__getcpu; # arm x86 mips
__getcwd; # arm x86 mips
- __getdents64; # arm x86 mips
__getpid; # arm x86 mips
__getpriority; # arm x86 mips
__gnu_basename;
- __gnu_ldivmod_helper; # arm
__gnu_strerror_r;
- __gnu_uldivmod_helper; # arm
- __gtdf2; # arm
__hostalias;
__ioctl; # arm x86 mips
__isfinite;
@@ -89,27 +62,19 @@ LIBC {
__isnormal;
__isnormalf;
__isnormall;
- __isthreaded;
- __ledf2; # arm
+ __isthreaded; # arm x86 mips
__libc_current_sigrtmax;
__libc_current_sigrtmin;
__libc_init;
__llseek; # arm x86 mips
__loc_aton;
__loc_ntoa;
- __lshrdi3; # arm
- __ltdf2; # arm
__memchr_chk;
__memcpy_chk;
__memmove_chk;
__memrchr_chk;
__memset_chk;
__mmap2; # arm x86 mips
- __moddi3; # x86 mips
- __muldf3; # arm
- __muldi3; # arm
- __mulsf3; # arm
- __nedf2; # arm
__ns_format_ttl; # arm x86 mips
__ns_get16; # arm x86 mips
__ns_get32; # arm x86 mips
@@ -132,7 +97,6 @@ LIBC {
__ns_skiprr; # arm x86 mips
__ns_sprintrr; # arm x86 mips
__ns_sprintrrf; # arm x86 mips
- __open; # arm x86 mips
__open_2;
__openat; # arm x86 mips
__openat_2;
@@ -149,11 +113,7 @@ LIBC {
__p_time;
__p_type;
__p_type_syms;
- __page_shift; # arm x86 mips
- __page_size; # arm x86 mips
__poll_chk;
- __popcount_tab; # arm
- __popcountsi2; # arm x86 mips
__ppoll; # arm x86 mips
__ppoll_chk;
__pread64_chk;
@@ -162,7 +122,6 @@ LIBC {
__pselect6; # arm x86 mips
__pthread_cleanup_pop;
__pthread_cleanup_push;
- __pthread_gettid; # arm x86 mips
__ptrace; # arm x86 mips
__putlong;
__putshort;
@@ -192,7 +151,6 @@ LIBC {
__res_send;
__res_send_setqhook;
__res_send_setrhook;
- __restore_core_regs; # arm
__rt_sigaction; # arm x86 mips
__rt_sigpending; # arm x86 mips
__rt_sigprocmask; # arm x86 mips
@@ -202,28 +160,13 @@ LIBC {
__sched_cpucount;
__sched_cpufree;
__sched_getaffinity; # arm x86 mips
- __sclose; # arm x86 mips
- __sdidinit; # arm x86 mips
- __set_errno; # arm x86 mips
- __set_thread_area; # x86
__set_tid_address; # arm x86 mips
__set_tls; # arm mips
__sF;
- __sflags; # arm x86 mips
- __sflush; # arm x86 mips
- __sfp; # arm x86 mips
- __sglue; # arm x86 mips
__sigaction; # arm x86 mips
- __signalfd4; # arm x86 mips
- __sinit; # arm x86 mips
- __smakebuf; # arm x86 mips
__snprintf_chk;
__socket; # arm x86 mips
__sprintf_chk;
- __sread; # arm x86 mips
- __srefill; # arm x86 mips
- __srget; # arm x86 mips
- __sseek; # arm x86 mips
__stack_chk_fail;
__stack_chk_guard;
__statfs64; # arm x86 mips
@@ -240,11 +183,6 @@ LIBC {
__strncpy_chk;
__strncpy_chk2;
__strrchr_chk;
- __subdf3; # arm
- __subsf3; # arm
- __swbuf; # arm x86 mips
- __swrite; # arm x86 mips
- __swsetup; # arm x86 mips
__sym_ntop;
__sym_ntos;
__sym_ston;
@@ -268,23 +206,14 @@ LIBC {
__timer_getoverrun; # arm x86 mips
__timer_gettime; # arm x86 mips
__timer_settime; # arm x86 mips
- __truncdfsf2; # arm
- __udivdi3; # arm x86 mips
- __udivsi3; # arm
__umask_chk;
- __umoddi3; # x86 mips
- __unorddf2; # arm
- __unordsf2; # arm
__vsnprintf_chk;
__vsprintf_chk;
- __wait4; # arm x86 mips
__waitid; # arm x86 mips
_ctype_;
_Exit;
_exit;
- _flush_cache; # mips
_flushlbf;
- _fwalk; # arm x86 mips
_getlong;
_getshort;
_longjmp;
@@ -305,15 +234,9 @@ LIBC {
alarm;
alphasort;
alphasort64;
- android_getaddrinfofornet;
- android_getaddrinfofornetcontext;
- android_gethostbyaddrfornet;
- android_gethostbynamefornet;
android_set_abort_message;
arc4random;
- arc4random_addrandom; # arm x86 mips
arc4random_buf;
- arc4random_stir; # arm x86 mips
arc4random_uniform;
asctime;
asctime64; # arm x86 mips
@@ -327,14 +250,11 @@ LIBC {
atoll;
basename;
basename_r; # arm x86 mips
- bcopy; # arm x86 mips
bind;
bindresvport;
brk;
- bsd_signal; # arm x86 mips
bsearch;
btowc;
- bzero; # arm x86 mips
c16rtomb;
c32rtomb;
cacheflush; # arm mips
@@ -387,9 +307,7 @@ LIBC {
dup3;
duplocale;
endmntent;
- endpwent;
endservent;
- endusershell;
endutent;
environ;
epoll_create;
@@ -421,8 +339,6 @@ LIBC {
execvpe;
exit;
faccessat;
- fake_gmtime_r; # arm x86 mips
- fake_localtime_r; # arm x86 mips
fallocate;
fallocate64;
fchdir;
@@ -435,7 +351,6 @@ LIBC {
fdatasync;
fdopen;
fdopendir;
- fdprintf; # arm x86 mips
feof;
feof_unlocked;
ferror;
@@ -467,7 +382,6 @@ LIBC {
fputws;
fread;
free;
- free_malloc_leak_info;
freeaddrinfo;
freelocale;
fremovexattr;
@@ -488,7 +402,6 @@ LIBC {
fsync;
ftell;
ftello;
- ftime; # arm x86 mips
ftok;
ftruncate;
ftruncate64;
@@ -509,7 +422,6 @@ LIBC {
fwscanf;
gai_strerror;
get_avphys_pages;
- get_malloc_leak_info;
get_nprocs;
get_nprocs_conf;
get_phys_pages;
@@ -521,8 +433,6 @@ LIBC {
getchar_unlocked;
getcwd;
getdelim;
- getdents; # arm x86 mips
- getdtablesize; # arm x86 mips
getegid;
getenv;
geteuid;
@@ -580,7 +490,6 @@ LIBC {
gettid;
gettimeofday;
getuid;
- getusershell;
getutent;
getwc;
getwchar;
@@ -598,7 +507,6 @@ LIBC {
if_nametoindex;
imaxabs;
imaxdiv;
- index; # arm x86 mips
inet_addr;
inet_aton;
inet_lnaof;
@@ -651,7 +559,6 @@ LIBC {
isprint_l;
ispunct;
ispunct_l;
- issetugid; # arm x86 mips
isspace;
isspace_l;
isupper;
@@ -741,7 +648,6 @@ LIBC {
mempcpy;
memrchr;
memset;
- memswap; # arm x86 mips
mincore;
mkdir;
mkdirat;
@@ -761,7 +667,6 @@ LIBC {
mktemp;
mktime;
mktime64; # arm x86 mips
- mktime_tz;
mlock;
mlockall;
mmap;
@@ -780,28 +685,6 @@ LIBC {
nftw64;
nice;
nrand48;
- ns_format_ttl; # arm64 x86_64 mips64
- ns_get16; # arm64 x86_64 mips64
- ns_get32; # arm64 x86_64 mips64
- ns_initparse; # arm64 x86_64 mips64
- ns_makecanon; # arm64 x86_64 mips64
- ns_msg_getflag; # arm64 x86_64 mips64
- ns_name_compress; # arm64 x86_64 mips64
- ns_name_ntol; # arm64 x86_64 mips64
- ns_name_ntop; # arm64 x86_64 mips64
- ns_name_pack; # arm64 x86_64 mips64
- ns_name_pton; # arm64 x86_64 mips64
- ns_name_rollback; # arm64 x86_64 mips64
- ns_name_skip; # arm64 x86_64 mips64
- ns_name_uncompress; # arm64 x86_64 mips64
- ns_name_unpack; # arm64 x86_64 mips64
- ns_parserr; # arm64 x86_64 mips64
- ns_put16; # arm64 x86_64 mips64
- ns_put32; # arm64 x86_64 mips64
- ns_samename; # arm64 x86_64 mips64
- ns_skiprr; # arm64 x86_64 mips64
- ns_sprintrr; # arm64 x86_64 mips64
- ns_sprintrrf; # arm64 x86_64 mips64
nsdispatch;
ntohl;
ntohs;
@@ -840,7 +723,6 @@ LIBC {
pread;
pread64;
printf;
- prlimit; # arm64 x86_64 mips64
prlimit64;
process_vm_readv;
process_vm_writev;
@@ -855,7 +737,6 @@ LIBC {
pthread_attr_getschedpolicy;
pthread_attr_getscope;
pthread_attr_getstack;
- pthread_attr_getstackaddr; # arm x86 mips
pthread_attr_getstacksize;
pthread_attr_init;
pthread_attr_setdetachstate;
@@ -864,7 +745,6 @@ LIBC {
pthread_attr_setschedpolicy;
pthread_attr_setscope;
pthread_attr_setstack;
- pthread_attr_setstackaddr; # arm x86 mips
pthread_attr_setstacksize;
pthread_cond_broadcast;
pthread_cond_destroy;
@@ -980,7 +860,6 @@ LIBC {
res_mkquery;
res_query;
res_search;
- restore_core_regs; # arm
rewind;
rewinddir;
rmdir;
@@ -1051,7 +930,6 @@ LIBC {
setstate;
settimeofday;
setuid;
- setusershell;
setutent;
setvbuf;
setxattr;
@@ -1124,8 +1002,6 @@ LIBC {
strncpy;
strndup;
strnlen;
- strntoimax; # arm x86 mips
- strntoumax; # arm x86 mips
strpbrk;
strptime;
strrchr;
@@ -1144,7 +1020,6 @@ LIBC {
strtoll;
strtoll_l;
strtoq;
- strtotimeval; # arm x86 mips
strtoul;
strtoull;
strtoull_l;
@@ -1166,7 +1041,6 @@ LIBC {
sysinfo;
syslog;
system;
- sysv_signal; # arm x86 mips
tcdrain;
tcflow;
tcflush;
@@ -1198,7 +1072,6 @@ LIBC {
timerfd_settime;
times;
timezone;
- tkill; # arm x86 mips
tmpfile;
tmpnam;
toascii;
@@ -1240,7 +1113,6 @@ LIBC {
vdprintf;
verr;
verrx;
- vfdprintf; # arm x86 mips
vfork;
vfprintf;
vfscanf;
@@ -1260,7 +1132,6 @@ LIBC {
vwprintf;
vwscanf;
wait;
- wait3; # arm x86 mips
wait4;
waitid;
waitpid;
@@ -1309,7 +1180,6 @@ LIBC {
wcstoull;
wcstoull_l;
wcstoumax;
- wcswcs; # arm x86 mips
wcswidth;
wcsxfrm;
wcsxfrm_l;
@@ -1332,6 +1202,71 @@ LIBC {
*;
};
+LIBC_N {
+ global:
+ __aeabi_atexit; # arm
+ __aeabi_memclr; # arm
+ __aeabi_memclr4; # arm
+ __aeabi_memclr8; # arm
+ __aeabi_memcpy; # arm
+ __aeabi_memcpy4; # arm
+ __aeabi_memcpy8; # arm
+ __aeabi_memmove; # arm
+ __aeabi_memmove4; # arm
+ __aeabi_memmove8; # arm
+ __aeabi_memset; # arm
+ __aeabi_memset4; # arm
+ __aeabi_memset8; # arm
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __gnu_Unwind_Find_exidx; # arm
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ prlimit; # arm mips x86
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
LIBC_PRIVATE {
global:
___Unwind_Backtrace; # arm
@@ -1408,8 +1343,29 @@ LIBC_PRIVATE {
__ashrdi3; # arm
__bionic_brk; # arm x86 mips
__bionic_libgcc_compat_symbols; # arm x86
- __bionic_libgcc_unwind_symbols; # arm
+ __cmpdf2; # arm
+ __divdf3; # arm
+ __divdi3; # arm x86 mips
+ __divsf3; # arm
+ __divsi3; # arm
__dso_handle; # arm
+ __eqdf2; # arm
+ __extendsfdf2; # arm
+ __fixdfsi; # arm
+ __fixsfsi; # arm
+ __fixunssfsi; # arm
+ __floatdidf; # arm
+ __floatdisf; # arm
+ __floatsidf; # arm
+ __floatsisf; # arm
+ __floatundidf; # arm
+ __floatundisf; # arm
+ __floatunsidf; # arm
+ __floatunsisf; # arm
+ __gedf2; # arm
+ __getdents64; # arm x86 mips
+ __gnu_ldivmod_helper; # arm
+ __gnu_uldivmod_helper; # arm
__gnu_Unwind_Backtrace; # arm
__gnu_unwind_execute; # arm
__gnu_Unwind_Find_exidx; # arm
@@ -1428,6 +1384,38 @@ LIBC_PRIVATE {
__gnu_Unwind_Save_VFP_D_16_to_31; # arm
__gnu_Unwind_Save_WMMXC; # arm
__gnu_Unwind_Save_WMMXD; # arm
+ __gtdf2; # arm
+ __ledf2; # arm
+ __lshrdi3; # arm
+ __ltdf2; # arm
+ __muldf3; # arm
+ __muldi3; # arm
+ __mulsf3; # arm
+ __nedf2; # arm
+ __popcount_tab; # arm
+ __popcountsi2; # arm x86 mips
+ __restore_core_regs; # arm
+ __sclose; # arm x86 mips
+ __sflags; # arm x86 mips
+ __sflush; # arm x86 mips
+ __sfp; # arm x86 mips
+ __sglue; # arm x86 mips
+ __smakebuf; # arm x86 mips
+ __sread; # arm x86 mips
+ __srefill; # arm x86 mips
+ __srget; # arm x86 mips
+ __sseek; # arm x86 mips
+ __subdf3; # arm
+ __subsf3; # arm
+ __swbuf; # arm x86 mips
+ __swrite; # arm x86 mips
+ __swsetup; # arm x86 mips
+ __truncdfsf2; # arm
+ __udivdi3; # arm x86 mips
+ __udivsi3; # arm
+ __unorddf2; # arm
+ __unordsf2; # arm
+ _fwalk; # arm x86 mips
_Unwind_Backtrace; # arm
_Unwind_Complete; # arm
_Unwind_DeleteException; # arm
@@ -1443,14 +1431,28 @@ LIBC_PRIVATE {
_Unwind_VRS_Get; # arm
_Unwind_VRS_Pop; # arm
_Unwind_VRS_Set; # arm
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
atexit; # arm
- dlmalloc; # arm x86 mips
- dlmalloc_inspect_all;
- dlmalloc_trim;
- dlmalloc_usable_size; # arm x86 mips
+ free_malloc_leak_info;
+ get_malloc_leak_info;
gMallocLeakZygoteChild;
+ restore_core_regs; # arm
SHA1Final; # arm x86 mips
SHA1Init; # arm x86 mips
SHA1Transform; # arm x86 mips
SHA1Update; # arm x86 mips
-} LIBC;
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.arm.map b/libc/libc.arm.map
new file mode 100644
index 000000000..38f8437f4
--- /dev/null
+++ b/libc/libc.arm.map
@@ -0,0 +1,1497 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __atomic_cmpxchg; # arm
+ __atomic_dec; # arm
+ __atomic_inc; # arm
+ __atomic_swap; # arm
+ __b64_ntop;
+ __b64_pton;
+ __brk; # arm x86 mips
+ __cmsg_nxthdr;
+ __connect; # arm x86 mips
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __epoll_pwait; # arm x86 mips
+ __errno;
+ __exit; # arm x86 mips
+ __fbufsize;
+ __fcntl64; # arm x86 mips
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fstatfs64; # arm x86 mips
+ __fwritable;
+ __get_h_errno;
+ __getcpu; # arm x86 mips
+ __getcwd; # arm x86 mips
+ __getpid; # arm x86 mips
+ __getpriority; # arm x86 mips
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __ioctl; # arm x86 mips
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __isthreaded; # arm x86 mips
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __llseek; # arm x86 mips
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __mmap2; # arm x86 mips
+ __ns_format_ttl; # arm x86 mips
+ __ns_get16; # arm x86 mips
+ __ns_get32; # arm x86 mips
+ __ns_initparse; # arm x86 mips
+ __ns_makecanon; # arm x86 mips
+ __ns_msg_getflag; # arm x86 mips
+ __ns_name_compress; # arm x86 mips
+ __ns_name_ntol; # arm x86 mips
+ __ns_name_ntop; # arm x86 mips
+ __ns_name_pack; # arm x86 mips
+ __ns_name_pton; # arm x86 mips
+ __ns_name_rollback; # arm x86 mips
+ __ns_name_skip; # arm x86 mips
+ __ns_name_uncompress; # arm x86 mips
+ __ns_name_unpack; # arm x86 mips
+ __ns_parserr; # arm x86 mips
+ __ns_put16; # arm x86 mips
+ __ns_put32; # arm x86 mips
+ __ns_samename; # arm x86 mips
+ __ns_skiprr; # arm x86 mips
+ __ns_sprintrr; # arm x86 mips
+ __ns_sprintrrf; # arm x86 mips
+ __open_2;
+ __openat; # arm x86 mips
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll; # arm x86 mips
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pselect6; # arm x86 mips
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __ptrace; # arm x86 mips
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __reboot; # arm x86 mips
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __rt_sigaction; # arm x86 mips
+ __rt_sigpending; # arm x86 mips
+ __rt_sigprocmask; # arm x86 mips
+ __rt_sigsuspend; # arm x86 mips
+ __rt_sigtimedwait; # arm x86 mips
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sched_getaffinity; # arm x86 mips
+ __set_tid_address; # arm x86 mips
+ __set_tls; # arm mips
+ __sF;
+ __sigaction; # arm x86 mips
+ __snprintf_chk;
+ __socket; # arm x86 mips
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __statfs64; # arm x86 mips
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __timer_create; # arm x86 mips
+ __timer_delete; # arm x86 mips
+ __timer_getoverrun; # arm x86 mips
+ __timer_gettime; # arm x86 mips
+ __timer_settime; # arm x86 mips
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ __waitid; # arm x86 mips
+ _ctype_;
+ _Exit;
+ _exit;
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _tolower_tab_; # arm x86 mips
+ _toupper;
+ _toupper_tab_; # arm x86 mips
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime64; # arm x86 mips
+ asctime64_r; # arm x86 mips
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ basename_r; # arm x86 mips
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ cacheflush; # arm mips
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime64; # arm x86 mips
+ ctime64_r; # arm x86 mips
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ dirname_r; # arm x86 mips
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime64; # arm x86 mips
+ gmtime64_r; # arm x86 mips
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime64; # arm x86 mips
+ localtime64_r; # arm x86 mips
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mktime64; # arm x86 mips
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_timedwait_monotonic; # arm x86 mips
+ pthread_cond_timedwait_monotonic_np; # arm x86 mips
+ pthread_cond_timedwait_relative_np; # arm x86 mips
+ pthread_cond_timeout_np; # arm x86 mips
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_lock_timeout_np; # arm x86 mips
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putw; # arm x86 mips
+ putwc;
+ putwchar;
+ pvalloc; # arm x86 mips
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timegm64; # arm x86 mips
+ timelocal;
+ timelocal64; # arm x86 mips
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ valloc; # arm x86 mips
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __aeabi_atexit; # arm
+ __aeabi_memclr; # arm
+ __aeabi_memclr4; # arm
+ __aeabi_memclr8; # arm
+ __aeabi_memcpy; # arm
+ __aeabi_memcpy4; # arm
+ __aeabi_memcpy8; # arm
+ __aeabi_memmove; # arm
+ __aeabi_memmove4; # arm
+ __aeabi_memmove8; # arm
+ __aeabi_memset; # arm
+ __aeabi_memset4; # arm
+ __aeabi_memset8; # arm
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __gnu_Unwind_Find_exidx; # arm
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ prlimit; # arm mips x86
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ ___Unwind_Backtrace; # arm
+ ___Unwind_ForcedUnwind; # arm
+ ___Unwind_RaiseException; # arm
+ ___Unwind_Resume; # arm
+ ___Unwind_Resume_or_Rethrow; # arm
+ __accept4; # arm x86 mips
+ __adddf3; # arm
+ __addsf3; # arm
+ __aeabi_atexit; # arm
+ __aeabi_cdcmpeq; # arm
+ __aeabi_cdcmple; # arm
+ __aeabi_cdrcmple; # arm
+ __aeabi_d2f; # arm
+ __aeabi_d2iz; # arm
+ __aeabi_dadd; # arm
+ __aeabi_dcmpeq; # arm
+ __aeabi_dcmpge; # arm
+ __aeabi_dcmpgt; # arm
+ __aeabi_dcmple; # arm
+ __aeabi_dcmplt; # arm
+ __aeabi_dcmpun; # arm
+ __aeabi_ddiv; # arm
+ __aeabi_dmul; # arm
+ __aeabi_drsub; # arm
+ __aeabi_dsub; # arm
+ __aeabi_f2d; # arm
+ __aeabi_f2iz; # arm
+ __aeabi_f2uiz; # arm
+ __aeabi_fadd; # arm
+ __aeabi_fcmpun; # arm
+ __aeabi_fdiv; # arm
+ __aeabi_fmul; # arm
+ __aeabi_frsub; # arm
+ __aeabi_fsub; # arm
+ __aeabi_i2d; # arm
+ __aeabi_i2f; # arm
+ __aeabi_idiv; # arm
+ __aeabi_idiv0; # arm
+ __aeabi_idivmod; # arm
+ __aeabi_l2d; # arm
+ __aeabi_l2f; # arm
+ __aeabi_lasr; # arm
+ __aeabi_ldiv0; # arm
+ __aeabi_ldivmod; # arm
+ __aeabi_llsl; # arm
+ __aeabi_llsr; # arm
+ __aeabi_lmul; # arm
+ __aeabi_memclr; # arm
+ __aeabi_memclr4; # arm
+ __aeabi_memclr8; # arm
+ __aeabi_memcpy; # arm
+ __aeabi_memcpy4; # arm
+ __aeabi_memcpy8; # arm
+ __aeabi_memmove; # arm
+ __aeabi_memmove4; # arm
+ __aeabi_memmove8; # arm
+ __aeabi_memset; # arm
+ __aeabi_memset4; # arm
+ __aeabi_memset8; # arm
+ __aeabi_ui2d; # arm
+ __aeabi_ui2f; # arm
+ __aeabi_uidiv; # arm
+ __aeabi_uidivmod; # arm
+ __aeabi_ul2d; # arm
+ __aeabi_ul2f; # arm
+ __aeabi_uldivmod; # arm
+ __aeabi_unwind_cpp_pr0; # arm
+ __aeabi_unwind_cpp_pr1; # arm
+ __aeabi_unwind_cpp_pr2; # arm
+ __arm_fadvise64_64; # arm
+ __ashldi3; # arm
+ __ashrdi3; # arm
+ __bionic_brk; # arm x86 mips
+ __bionic_libgcc_compat_symbols; # arm x86
+ __cmpdf2; # arm
+ __divdf3; # arm
+ __divdi3; # arm x86 mips
+ __divsf3; # arm
+ __divsi3; # arm
+ __dso_handle; # arm
+ __eqdf2; # arm
+ __extendsfdf2; # arm
+ __fixdfsi; # arm
+ __fixsfsi; # arm
+ __fixunssfsi; # arm
+ __floatdidf; # arm
+ __floatdisf; # arm
+ __floatsidf; # arm
+ __floatsisf; # arm
+ __floatundidf; # arm
+ __floatundisf; # arm
+ __floatunsidf; # arm
+ __floatunsisf; # arm
+ __futex_wait; # arm x86 mips nobrillo
+ __futex_wake; # arm x86 mips nobrillo
+ __gedf2; # arm
+ __get_thread; # arm x86 mips nobrillo
+ __get_tls; # arm x86 mips nobrillo
+ __getdents64; # arm x86 mips
+ __gnu_ldivmod_helper; # arm
+ __gnu_uldivmod_helper; # arm
+ __gnu_Unwind_Backtrace; # arm
+ __gnu_unwind_execute; # arm
+ __gnu_Unwind_Find_exidx; # arm
+ __gnu_Unwind_ForcedUnwind; # arm
+ __gnu_unwind_frame; # arm
+ __gnu_Unwind_RaiseException; # arm
+ __gnu_Unwind_Restore_VFP; # arm
+ __gnu_Unwind_Restore_VFP_D; # arm
+ __gnu_Unwind_Restore_VFP_D_16_to_31; # arm
+ __gnu_Unwind_Restore_WMMXC; # arm
+ __gnu_Unwind_Restore_WMMXD; # arm
+ __gnu_Unwind_Resume; # arm
+ __gnu_Unwind_Resume_or_Rethrow; # arm
+ __gnu_Unwind_Save_VFP; # arm
+ __gnu_Unwind_Save_VFP_D; # arm
+ __gnu_Unwind_Save_VFP_D_16_to_31; # arm
+ __gnu_Unwind_Save_WMMXC; # arm
+ __gnu_Unwind_Save_WMMXD; # arm
+ __gtdf2; # arm
+ __ledf2; # arm
+ __lshrdi3; # arm
+ __ltdf2; # arm
+ __muldf3; # arm
+ __muldi3; # arm
+ __mulsf3; # arm
+ __nedf2; # arm
+ __open; # arm x86 mips nobrillo
+ __page_shift; # arm x86 mips nobrillo
+ __page_size; # arm x86 mips nobrillo
+ __popcount_tab; # arm
+ __popcountsi2; # arm x86 mips
+ __pthread_gettid; # arm x86 mips nobrillo
+ __restore_core_regs; # arm
+ __sclose; # arm x86 mips
+ __sdidinit; # arm x86 mips nobrillo
+ __set_errno; # arm x86 mips nobrillo
+ __sflags; # arm x86 mips
+ __sflush; # arm x86 mips
+ __sfp; # arm x86 mips
+ __sglue; # arm x86 mips
+ __sinit; # arm x86 mips nobrillo
+ __smakebuf; # arm x86 mips
+ __sread; # arm x86 mips
+ __srefill; # arm x86 mips
+ __srget; # arm x86 mips
+ __sseek; # arm x86 mips
+ __subdf3; # arm
+ __subsf3; # arm
+ __swbuf; # arm x86 mips
+ __swrite; # arm x86 mips
+ __swsetup; # arm x86 mips
+ __truncdfsf2; # arm
+ __udivdi3; # arm x86 mips
+ __udivsi3; # arm
+ __unorddf2; # arm
+ __unordsf2; # arm
+ __wait4; # arm x86 mips nobrillo
+ _fwalk; # arm x86 mips
+ _Unwind_Backtrace; # arm
+ _Unwind_Complete; # arm
+ _Unwind_DeleteException; # arm
+ _Unwind_ForcedUnwind; # arm
+ _Unwind_GetCFA; # arm
+ _Unwind_GetDataRelBase; # arm
+ _Unwind_GetLanguageSpecificData; # arm
+ _Unwind_GetRegionStart; # arm
+ _Unwind_GetTextRelBase; # arm
+ _Unwind_RaiseException; # arm
+ _Unwind_Resume; # arm
+ _Unwind_Resume_or_Rethrow; # arm
+ _Unwind_VRS_Get; # arm
+ _Unwind_VRS_Pop; # arm
+ _Unwind_VRS_Set; # arm
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ arc4random_addrandom; # arm x86 mips nobrillo
+ arc4random_stir; # arm x86 mips nobrillo
+ atexit; # arm
+ bcopy; # arm x86 mips nobrillo
+ bzero; # arm x86 mips nobrillo
+ bsd_signal; # arm x86 mips nobrillo
+ dlmalloc; # arm x86 mips nobrillo
+ dlmalloc_inspect_all; # arm x86 mips nobrillo
+ dlmalloc_trim; # arm x86 mips nobrillo
+ dlmalloc_usable_size; # arm x86 mips nobrillo
+ endpwent; # arm x86 mips nobrillo
+ fdprintf; # arm x86 mips nobrillo
+ free_malloc_leak_info;
+ ftime; # arm x86 mips nobrillo
+ get_malloc_leak_info;
+ getdents; # arm x86 mips nobrillo
+ getdtablesize; # arm x86 mips nobrillo
+ gMallocLeakZygoteChild;
+ index; # arm x86 mips nobrillo
+ issetugid; # arm x86 mips nobrillo
+ memswap; # arm x86 mips nobrillo
+ pthread_attr_getstackaddr; # arm x86 mips nobrillo
+ pthread_attr_setstackaddr; # arm x86 mips nobrillo
+ restore_core_regs; # arm
+ SHA1Final; # arm x86 mips
+ SHA1Init; # arm x86 mips
+ SHA1Transform; # arm x86 mips
+ SHA1Update; # arm x86 mips
+ strntoimax; # arm x86 mips nobrillo
+ strntoumax; # arm x86 mips nobrillo
+ strtotimeval; # arm x86 mips nobrillo
+ sysv_signal; # arm x86 mips nobrillo
+ tkill; # arm x86 mips nobrillo
+ vfdprintf; # arm x86 mips nobrillo
+ wait3; # arm x86 mips nobrillo
+ wcswcs; # arm x86 mips nobrillo
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.arm64.map b/libc/libc.arm64.map
new file mode 100644
index 000000000..afbd0ee4b
--- /dev/null
+++ b/libc/libc.arm64.map
@@ -0,0 +1,1212 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __b64_ntop;
+ __b64_pton;
+ __cmsg_nxthdr;
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __errno;
+ __fbufsize;
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fwritable;
+ __get_h_errno;
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __open_2;
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sF;
+ __snprintf_chk;
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ _ctype_;
+ _Exit;
+ _exit;
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _toupper;
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ ns_format_ttl; # arm64 x86_64 mips64
+ ns_get16; # arm64 x86_64 mips64
+ ns_get32; # arm64 x86_64 mips64
+ ns_initparse; # arm64 x86_64 mips64
+ ns_makecanon; # arm64 x86_64 mips64
+ ns_msg_getflag; # arm64 x86_64 mips64
+ ns_name_compress; # arm64 x86_64 mips64
+ ns_name_ntol; # arm64 x86_64 mips64
+ ns_name_ntop; # arm64 x86_64 mips64
+ ns_name_pack; # arm64 x86_64 mips64
+ ns_name_pton; # arm64 x86_64 mips64
+ ns_name_rollback; # arm64 x86_64 mips64
+ ns_name_skip; # arm64 x86_64 mips64
+ ns_name_uncompress; # arm64 x86_64 mips64
+ ns_name_unpack; # arm64 x86_64 mips64
+ ns_parserr; # arm64 x86_64 mips64
+ ns_put16; # arm64 x86_64 mips64
+ ns_put32; # arm64 x86_64 mips64
+ ns_samename; # arm64 x86_64 mips64
+ ns_skiprr; # arm64 x86_64 mips64
+ ns_sprintrr; # arm64 x86_64 mips64
+ ns_sprintrrf; # arm64 x86_64 mips64
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit; # arm64 x86_64 mips64
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putwc;
+ putwchar;
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timelocal;
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ free_malloc_leak_info;
+ get_malloc_leak_info;
+ gMallocLeakZygoteChild;
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.map.txt b/libc/libc.map.txt
new file mode 100644
index 000000000..0e41f6ccb
--- /dev/null
+++ b/libc/libc.map.txt
@@ -0,0 +1,1523 @@
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __atomic_cmpxchg; # arm
+ __atomic_dec; # arm
+ __atomic_inc; # arm
+ __atomic_swap; # arm
+ __b64_ntop;
+ __b64_pton;
+ __brk; # arm x86 mips
+ __cmsg_nxthdr;
+ __connect; # arm x86 mips
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __epoll_pwait; # arm x86 mips
+ __errno;
+ __exit; # arm x86 mips
+ __fadvise64; # x86 mips
+ __fbufsize;
+ __fcntl64; # arm x86 mips
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fstatfs64; # arm x86 mips
+ __fwritable;
+ __get_h_errno;
+ __getcpu; # arm x86 mips
+ __getcwd; # arm x86 mips
+ __getpid; # arm x86 mips
+ __getpriority; # arm x86 mips
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __ioctl; # arm x86 mips
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __isthreaded; # arm x86 mips
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __llseek; # arm x86 mips
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __mmap2; # arm x86 mips
+ __ns_format_ttl; # arm x86 mips
+ __ns_get16; # arm x86 mips
+ __ns_get32; # arm x86 mips
+ __ns_initparse; # arm x86 mips
+ __ns_makecanon; # arm x86 mips
+ __ns_msg_getflag; # arm x86 mips
+ __ns_name_compress; # arm x86 mips
+ __ns_name_ntol; # arm x86 mips
+ __ns_name_ntop; # arm x86 mips
+ __ns_name_pack; # arm x86 mips
+ __ns_name_pton; # arm x86 mips
+ __ns_name_rollback; # arm x86 mips
+ __ns_name_skip; # arm x86 mips
+ __ns_name_uncompress; # arm x86 mips
+ __ns_name_unpack; # arm x86 mips
+ __ns_parserr; # arm x86 mips
+ __ns_put16; # arm x86 mips
+ __ns_put32; # arm x86 mips
+ __ns_samename; # arm x86 mips
+ __ns_skiprr; # arm x86 mips
+ __ns_sprintrr; # arm x86 mips
+ __ns_sprintrrf; # arm x86 mips
+ __open_2;
+ __openat; # arm x86 mips
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll; # arm x86 mips
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pselect6; # arm x86 mips
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __ptrace; # arm x86 mips
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __reboot; # arm x86 mips
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __rt_sigaction; # arm x86 mips
+ __rt_sigpending; # arm x86 mips
+ __rt_sigprocmask; # arm x86 mips
+ __rt_sigsuspend; # arm x86 mips
+ __rt_sigtimedwait; # arm x86 mips
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sched_getaffinity; # arm x86 mips
+ __set_thread_area; # x86
+ __set_tid_address; # arm x86 mips
+ __set_tls; # arm mips
+ __sF;
+ __sigaction; # arm x86 mips
+ __snprintf_chk;
+ __socket; # arm x86 mips
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __statfs64; # arm x86 mips
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __timer_create; # arm x86 mips
+ __timer_delete; # arm x86 mips
+ __timer_getoverrun; # arm x86 mips
+ __timer_gettime; # arm x86 mips
+ __timer_settime; # arm x86 mips
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ __waitid; # arm x86 mips
+ _ctype_;
+ _Exit;
+ _exit;
+ _flush_cache; # mips
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _tolower_tab_; # arm x86 mips
+ _toupper;
+ _toupper_tab_; # arm x86 mips
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime64; # arm x86 mips
+ asctime64_r; # arm x86 mips
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ basename_r; # arm x86 mips
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ cacheflush; # arm mips
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime64; # arm x86 mips
+ ctime64_r; # arm x86 mips
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ dirname_r; # arm x86 mips
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime64; # arm x86 mips
+ gmtime64_r; # arm x86 mips
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime64; # arm x86 mips
+ localtime64_r; # arm x86 mips
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mktime64; # arm x86 mips
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ ns_format_ttl; # arm64 x86_64 mips64
+ ns_get16; # arm64 x86_64 mips64
+ ns_get32; # arm64 x86_64 mips64
+ ns_initparse; # arm64 x86_64 mips64
+ ns_makecanon; # arm64 x86_64 mips64
+ ns_msg_getflag; # arm64 x86_64 mips64
+ ns_name_compress; # arm64 x86_64 mips64
+ ns_name_ntol; # arm64 x86_64 mips64
+ ns_name_ntop; # arm64 x86_64 mips64
+ ns_name_pack; # arm64 x86_64 mips64
+ ns_name_pton; # arm64 x86_64 mips64
+ ns_name_rollback; # arm64 x86_64 mips64
+ ns_name_skip; # arm64 x86_64 mips64
+ ns_name_uncompress; # arm64 x86_64 mips64
+ ns_name_unpack; # arm64 x86_64 mips64
+ ns_parserr; # arm64 x86_64 mips64
+ ns_put16; # arm64 x86_64 mips64
+ ns_put32; # arm64 x86_64 mips64
+ ns_samename; # arm64 x86_64 mips64
+ ns_skiprr; # arm64 x86_64 mips64
+ ns_sprintrr; # arm64 x86_64 mips64
+ ns_sprintrrf; # arm64 x86_64 mips64
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit; # arm64 x86_64 mips64
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_timedwait_monotonic; # arm x86 mips
+ pthread_cond_timedwait_monotonic_np; # arm x86 mips
+ pthread_cond_timedwait_relative_np; # arm x86 mips
+ pthread_cond_timeout_np; # arm x86 mips
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_lock_timeout_np; # arm x86 mips
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putw; # arm x86 mips
+ putwc;
+ putwchar;
+ pvalloc; # arm x86 mips
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timegm64; # arm x86 mips
+ timelocal;
+ timelocal64; # arm x86 mips
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ valloc; # arm x86 mips
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __aeabi_atexit; # arm
+ __aeabi_memclr; # arm
+ __aeabi_memclr4; # arm
+ __aeabi_memclr8; # arm
+ __aeabi_memcpy; # arm
+ __aeabi_memcpy4; # arm
+ __aeabi_memcpy8; # arm
+ __aeabi_memmove; # arm
+ __aeabi_memmove4; # arm
+ __aeabi_memmove8; # arm
+ __aeabi_memset; # arm
+ __aeabi_memset4; # arm
+ __aeabi_memset8; # arm
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __gnu_Unwind_Find_exidx; # arm
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ prlimit; # arm mips x86
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ ___Unwind_Backtrace; # arm
+ ___Unwind_ForcedUnwind; # arm
+ ___Unwind_RaiseException; # arm
+ ___Unwind_Resume; # arm
+ ___Unwind_Resume_or_Rethrow; # arm
+ __accept4; # arm x86 mips
+ __adddf3; # arm
+ __addsf3; # arm
+ __aeabi_atexit; # arm
+ __aeabi_cdcmpeq; # arm
+ __aeabi_cdcmple; # arm
+ __aeabi_cdrcmple; # arm
+ __aeabi_d2f; # arm
+ __aeabi_d2iz; # arm
+ __aeabi_dadd; # arm
+ __aeabi_dcmpeq; # arm
+ __aeabi_dcmpge; # arm
+ __aeabi_dcmpgt; # arm
+ __aeabi_dcmple; # arm
+ __aeabi_dcmplt; # arm
+ __aeabi_dcmpun; # arm
+ __aeabi_ddiv; # arm
+ __aeabi_dmul; # arm
+ __aeabi_drsub; # arm
+ __aeabi_dsub; # arm
+ __aeabi_f2d; # arm
+ __aeabi_f2iz; # arm
+ __aeabi_f2uiz; # arm
+ __aeabi_fadd; # arm
+ __aeabi_fcmpun; # arm
+ __aeabi_fdiv; # arm
+ __aeabi_fmul; # arm
+ __aeabi_frsub; # arm
+ __aeabi_fsub; # arm
+ __aeabi_i2d; # arm
+ __aeabi_i2f; # arm
+ __aeabi_idiv; # arm
+ __aeabi_idiv0; # arm
+ __aeabi_idivmod; # arm
+ __aeabi_l2d; # arm
+ __aeabi_l2f; # arm
+ __aeabi_lasr; # arm
+ __aeabi_ldiv0; # arm
+ __aeabi_ldivmod; # arm
+ __aeabi_llsl; # arm
+ __aeabi_llsr; # arm
+ __aeabi_lmul; # arm
+ __aeabi_memclr; # arm
+ __aeabi_memclr4; # arm
+ __aeabi_memclr8; # arm
+ __aeabi_memcpy; # arm
+ __aeabi_memcpy4; # arm
+ __aeabi_memcpy8; # arm
+ __aeabi_memmove; # arm
+ __aeabi_memmove4; # arm
+ __aeabi_memmove8; # arm
+ __aeabi_memset; # arm
+ __aeabi_memset4; # arm
+ __aeabi_memset8; # arm
+ __aeabi_ui2d; # arm
+ __aeabi_ui2f; # arm
+ __aeabi_uidiv; # arm
+ __aeabi_uidivmod; # arm
+ __aeabi_ul2d; # arm
+ __aeabi_ul2f; # arm
+ __aeabi_uldivmod; # arm
+ __aeabi_unwind_cpp_pr0; # arm
+ __aeabi_unwind_cpp_pr1; # arm
+ __aeabi_unwind_cpp_pr2; # arm
+ __arm_fadvise64_64; # arm
+ __ashldi3; # arm
+ __ashrdi3; # arm
+ __bionic_brk; # arm x86 mips
+ __bionic_libgcc_compat_symbols; # arm x86
+ __cmpdf2; # arm
+ __divdf3; # arm
+ __divdi3; # arm x86 mips
+ __divsf3; # arm
+ __divsi3; # arm
+ __dso_handle; # arm
+ __eqdf2; # arm
+ __extendsfdf2; # arm
+ __fixdfsi; # arm
+ __fixsfsi; # arm
+ __fixunssfsi; # arm
+ __floatdidf; # arm
+ __floatdisf; # arm
+ __floatsidf; # arm
+ __floatsisf; # arm
+ __floatundidf; # arm
+ __floatundisf; # arm
+ __floatunsidf; # arm
+ __floatunsisf; # arm
+ __futex_wait; # arm x86 mips nobrillo
+ __futex_wake; # arm x86 mips nobrillo
+ __gedf2; # arm
+ __get_thread; # arm x86 mips nobrillo
+ __get_tls; # arm x86 mips nobrillo
+ __getdents64; # arm x86 mips
+ __gnu_ldivmod_helper; # arm
+ __gnu_uldivmod_helper; # arm
+ __gnu_Unwind_Backtrace; # arm
+ __gnu_unwind_execute; # arm
+ __gnu_Unwind_Find_exidx; # arm
+ __gnu_Unwind_ForcedUnwind; # arm
+ __gnu_unwind_frame; # arm
+ __gnu_Unwind_RaiseException; # arm
+ __gnu_Unwind_Restore_VFP; # arm
+ __gnu_Unwind_Restore_VFP_D; # arm
+ __gnu_Unwind_Restore_VFP_D_16_to_31; # arm
+ __gnu_Unwind_Restore_WMMXC; # arm
+ __gnu_Unwind_Restore_WMMXD; # arm
+ __gnu_Unwind_Resume; # arm
+ __gnu_Unwind_Resume_or_Rethrow; # arm
+ __gnu_Unwind_Save_VFP; # arm
+ __gnu_Unwind_Save_VFP_D; # arm
+ __gnu_Unwind_Save_VFP_D_16_to_31; # arm
+ __gnu_Unwind_Save_WMMXC; # arm
+ __gnu_Unwind_Save_WMMXD; # arm
+ __gtdf2; # arm
+ __ledf2; # arm
+ __lshrdi3; # arm
+ __ltdf2; # arm
+ __muldf3; # arm
+ __muldi3; # arm
+ __mulsf3; # arm
+ __nedf2; # arm
+ __open; # arm x86 mips nobrillo
+ __page_shift; # arm x86 mips nobrillo
+ __page_size; # arm x86 mips nobrillo
+ __popcount_tab; # arm
+ __popcountsi2; # arm x86 mips
+ __pthread_gettid; # arm x86 mips nobrillo
+ __restore_core_regs; # arm
+ __sclose; # arm x86 mips
+ __sdidinit; # arm x86 mips nobrillo
+ __set_errno; # arm x86 mips nobrillo
+ __sflags; # arm x86 mips
+ __sflush; # arm x86 mips
+ __sfp; # arm x86 mips
+ __sglue; # arm x86 mips
+ __sinit; # arm x86 mips nobrillo
+ __smakebuf; # arm x86 mips
+ __sread; # arm x86 mips
+ __srefill; # arm x86 mips
+ __srget; # arm x86 mips
+ __sseek; # arm x86 mips
+ __subdf3; # arm
+ __subsf3; # arm
+ __swbuf; # arm x86 mips
+ __swrite; # arm x86 mips
+ __swsetup; # arm x86 mips
+ __truncdfsf2; # arm
+ __udivdi3; # arm x86 mips
+ __udivsi3; # arm
+ __umoddi3; # x86 mips
+ __unorddf2; # arm
+ __unordsf2; # arm
+ __wait4; # arm x86 mips nobrillo
+ _fwalk; # arm x86 mips
+ _Unwind_Backtrace; # arm
+ _Unwind_Complete; # arm
+ _Unwind_DeleteException; # arm
+ _Unwind_ForcedUnwind; # arm
+ _Unwind_GetCFA; # arm
+ _Unwind_GetDataRelBase; # arm
+ _Unwind_GetLanguageSpecificData; # arm
+ _Unwind_GetRegionStart; # arm
+ _Unwind_GetTextRelBase; # arm
+ _Unwind_RaiseException; # arm
+ _Unwind_Resume; # arm
+ _Unwind_Resume_or_Rethrow; # arm
+ _Unwind_VRS_Get; # arm
+ _Unwind_VRS_Pop; # arm
+ _Unwind_VRS_Set; # arm
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ arc4random_addrandom; # arm x86 mips nobrillo
+ arc4random_stir; # arm x86 mips nobrillo
+ atexit; # arm
+ bcopy; # arm x86 mips nobrillo
+ bzero; # arm x86 mips nobrillo
+ bsd_signal; # arm x86 mips nobrillo
+ dlmalloc; # arm x86 mips nobrillo
+ dlmalloc_inspect_all; # arm x86 mips nobrillo
+ dlmalloc_trim; # arm x86 mips nobrillo
+ dlmalloc_usable_size; # arm x86 mips nobrillo
+ endpwent; # arm x86 mips nobrillo
+ fdprintf; # arm x86 mips nobrillo
+ free_malloc_leak_info;
+ ftime; # arm x86 mips nobrillo
+ get_malloc_leak_info;
+ getdents; # arm x86 mips nobrillo
+ getdtablesize; # arm x86 mips nobrillo
+ gMallocLeakZygoteChild;
+ index; # arm x86 mips nobrillo
+ issetugid; # arm x86 mips nobrillo
+ memswap; # arm x86 mips nobrillo
+ pthread_attr_getstackaddr; # arm x86 mips nobrillo
+ pthread_attr_setstackaddr; # arm x86 mips nobrillo
+ restore_core_regs; # arm
+ SHA1Final; # arm x86 mips
+ SHA1Init; # arm x86 mips
+ SHA1Transform; # arm x86 mips
+ SHA1Update; # arm x86 mips
+ strntoimax; # arm x86 mips nobrillo
+ strntoumax; # arm x86 mips nobrillo
+ strtotimeval; # arm x86 mips nobrillo
+ sysv_signal; # arm x86 mips nobrillo
+ tkill; # arm x86 mips nobrillo
+ vfdprintf; # arm x86 mips nobrillo
+ wait3; # arm x86 mips nobrillo
+ wcswcs; # arm x86 mips nobrillo
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.mips.brillo.map b/libc/libc.mips.brillo.map
new file mode 100644
index 000000000..d11a5ab97
--- /dev/null
+++ b/libc/libc.mips.brillo.map
@@ -0,0 +1,1299 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __b64_ntop;
+ __b64_pton;
+ __brk; # arm x86 mips
+ __cmsg_nxthdr;
+ __connect; # arm x86 mips
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __epoll_pwait; # arm x86 mips
+ __errno;
+ __exit; # arm x86 mips
+ __fadvise64; # x86 mips
+ __fbufsize;
+ __fcntl64; # arm x86 mips
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fstatfs64; # arm x86 mips
+ __fwritable;
+ __get_h_errno;
+ __getcpu; # arm x86 mips
+ __getcwd; # arm x86 mips
+ __getpid; # arm x86 mips
+ __getpriority; # arm x86 mips
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __ioctl; # arm x86 mips
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __isthreaded; # arm x86 mips
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __llseek; # arm x86 mips
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __mmap2; # arm x86 mips
+ __ns_format_ttl; # arm x86 mips
+ __ns_get16; # arm x86 mips
+ __ns_get32; # arm x86 mips
+ __ns_initparse; # arm x86 mips
+ __ns_makecanon; # arm x86 mips
+ __ns_msg_getflag; # arm x86 mips
+ __ns_name_compress; # arm x86 mips
+ __ns_name_ntol; # arm x86 mips
+ __ns_name_ntop; # arm x86 mips
+ __ns_name_pack; # arm x86 mips
+ __ns_name_pton; # arm x86 mips
+ __ns_name_rollback; # arm x86 mips
+ __ns_name_skip; # arm x86 mips
+ __ns_name_uncompress; # arm x86 mips
+ __ns_name_unpack; # arm x86 mips
+ __ns_parserr; # arm x86 mips
+ __ns_put16; # arm x86 mips
+ __ns_put32; # arm x86 mips
+ __ns_samename; # arm x86 mips
+ __ns_skiprr; # arm x86 mips
+ __ns_sprintrr; # arm x86 mips
+ __ns_sprintrrf; # arm x86 mips
+ __open_2;
+ __openat; # arm x86 mips
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll; # arm x86 mips
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pselect6; # arm x86 mips
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __ptrace; # arm x86 mips
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __reboot; # arm x86 mips
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __rt_sigaction; # arm x86 mips
+ __rt_sigpending; # arm x86 mips
+ __rt_sigprocmask; # arm x86 mips
+ __rt_sigsuspend; # arm x86 mips
+ __rt_sigtimedwait; # arm x86 mips
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sched_getaffinity; # arm x86 mips
+ __set_tid_address; # arm x86 mips
+ __set_tls; # arm mips
+ __sF;
+ __sigaction; # arm x86 mips
+ __snprintf_chk;
+ __socket; # arm x86 mips
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __statfs64; # arm x86 mips
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __timer_create; # arm x86 mips
+ __timer_delete; # arm x86 mips
+ __timer_getoverrun; # arm x86 mips
+ __timer_gettime; # arm x86 mips
+ __timer_settime; # arm x86 mips
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ __waitid; # arm x86 mips
+ _ctype_;
+ _Exit;
+ _exit;
+ _flush_cache; # mips
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _tolower_tab_; # arm x86 mips
+ _toupper;
+ _toupper_tab_; # arm x86 mips
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime64; # arm x86 mips
+ asctime64_r; # arm x86 mips
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ basename_r; # arm x86 mips
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ cacheflush; # arm mips
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime64; # arm x86 mips
+ ctime64_r; # arm x86 mips
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ dirname_r; # arm x86 mips
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime64; # arm x86 mips
+ gmtime64_r; # arm x86 mips
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime64; # arm x86 mips
+ localtime64_r; # arm x86 mips
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mktime64; # arm x86 mips
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_timedwait_monotonic; # arm x86 mips
+ pthread_cond_timedwait_monotonic_np; # arm x86 mips
+ pthread_cond_timedwait_relative_np; # arm x86 mips
+ pthread_cond_timeout_np; # arm x86 mips
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_lock_timeout_np; # arm x86 mips
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putw; # arm x86 mips
+ putwc;
+ putwchar;
+ pvalloc; # arm x86 mips
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timegm64; # arm x86 mips
+ timelocal;
+ timelocal64; # arm x86 mips
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ valloc; # arm x86 mips
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ prlimit; # arm mips x86
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ __accept4; # arm x86 mips
+ __bionic_brk; # arm x86 mips
+ __divdi3; # arm x86 mips
+ __getdents64; # arm x86 mips
+ __popcountsi2; # arm x86 mips
+ __sclose; # arm x86 mips
+ __sflags; # arm x86 mips
+ __sflush; # arm x86 mips
+ __sfp; # arm x86 mips
+ __sglue; # arm x86 mips
+ __smakebuf; # arm x86 mips
+ __sread; # arm x86 mips
+ __srefill; # arm x86 mips
+ __srget; # arm x86 mips
+ __sseek; # arm x86 mips
+ __swbuf; # arm x86 mips
+ __swrite; # arm x86 mips
+ __swsetup; # arm x86 mips
+ __udivdi3; # arm x86 mips
+ __umoddi3; # x86 mips
+ _fwalk; # arm x86 mips
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ free_malloc_leak_info;
+ get_malloc_leak_info;
+ gMallocLeakZygoteChild;
+ SHA1Final; # arm x86 mips
+ SHA1Init; # arm x86 mips
+ SHA1Transform; # arm x86 mips
+ SHA1Update; # arm x86 mips
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.mips.map b/libc/libc.mips.map
new file mode 100644
index 000000000..46c835b0b
--- /dev/null
+++ b/libc/libc.mips.map
@@ -0,0 +1,1338 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __b64_ntop;
+ __b64_pton;
+ __brk; # arm x86 mips
+ __cmsg_nxthdr;
+ __connect; # arm x86 mips
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __epoll_pwait; # arm x86 mips
+ __errno;
+ __exit; # arm x86 mips
+ __fadvise64; # x86 mips
+ __fbufsize;
+ __fcntl64; # arm x86 mips
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fstatfs64; # arm x86 mips
+ __fwritable;
+ __get_h_errno;
+ __getcpu; # arm x86 mips
+ __getcwd; # arm x86 mips
+ __getpid; # arm x86 mips
+ __getpriority; # arm x86 mips
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __ioctl; # arm x86 mips
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __isthreaded; # arm x86 mips
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __llseek; # arm x86 mips
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __mmap2; # arm x86 mips
+ __ns_format_ttl; # arm x86 mips
+ __ns_get16; # arm x86 mips
+ __ns_get32; # arm x86 mips
+ __ns_initparse; # arm x86 mips
+ __ns_makecanon; # arm x86 mips
+ __ns_msg_getflag; # arm x86 mips
+ __ns_name_compress; # arm x86 mips
+ __ns_name_ntol; # arm x86 mips
+ __ns_name_ntop; # arm x86 mips
+ __ns_name_pack; # arm x86 mips
+ __ns_name_pton; # arm x86 mips
+ __ns_name_rollback; # arm x86 mips
+ __ns_name_skip; # arm x86 mips
+ __ns_name_uncompress; # arm x86 mips
+ __ns_name_unpack; # arm x86 mips
+ __ns_parserr; # arm x86 mips
+ __ns_put16; # arm x86 mips
+ __ns_put32; # arm x86 mips
+ __ns_samename; # arm x86 mips
+ __ns_skiprr; # arm x86 mips
+ __ns_sprintrr; # arm x86 mips
+ __ns_sprintrrf; # arm x86 mips
+ __open_2;
+ __openat; # arm x86 mips
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll; # arm x86 mips
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pselect6; # arm x86 mips
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __ptrace; # arm x86 mips
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __reboot; # arm x86 mips
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __rt_sigaction; # arm x86 mips
+ __rt_sigpending; # arm x86 mips
+ __rt_sigprocmask; # arm x86 mips
+ __rt_sigsuspend; # arm x86 mips
+ __rt_sigtimedwait; # arm x86 mips
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sched_getaffinity; # arm x86 mips
+ __set_tid_address; # arm x86 mips
+ __set_tls; # arm mips
+ __sF;
+ __sigaction; # arm x86 mips
+ __snprintf_chk;
+ __socket; # arm x86 mips
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __statfs64; # arm x86 mips
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __timer_create; # arm x86 mips
+ __timer_delete; # arm x86 mips
+ __timer_getoverrun; # arm x86 mips
+ __timer_gettime; # arm x86 mips
+ __timer_settime; # arm x86 mips
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ __waitid; # arm x86 mips
+ _ctype_;
+ _Exit;
+ _exit;
+ _flush_cache; # mips
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _tolower_tab_; # arm x86 mips
+ _toupper;
+ _toupper_tab_; # arm x86 mips
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime64; # arm x86 mips
+ asctime64_r; # arm x86 mips
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ basename_r; # arm x86 mips
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ cacheflush; # arm mips
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime64; # arm x86 mips
+ ctime64_r; # arm x86 mips
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ dirname_r; # arm x86 mips
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime64; # arm x86 mips
+ gmtime64_r; # arm x86 mips
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime64; # arm x86 mips
+ localtime64_r; # arm x86 mips
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mktime64; # arm x86 mips
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_timedwait_monotonic; # arm x86 mips
+ pthread_cond_timedwait_monotonic_np; # arm x86 mips
+ pthread_cond_timedwait_relative_np; # arm x86 mips
+ pthread_cond_timeout_np; # arm x86 mips
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_lock_timeout_np; # arm x86 mips
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putw; # arm x86 mips
+ putwc;
+ putwchar;
+ pvalloc; # arm x86 mips
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timegm64; # arm x86 mips
+ timelocal;
+ timelocal64; # arm x86 mips
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ valloc; # arm x86 mips
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ prlimit; # arm mips x86
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ __accept4; # arm x86 mips
+ __bionic_brk; # arm x86 mips
+ __divdi3; # arm x86 mips
+ __futex_wait; # arm x86 mips nobrillo
+ __futex_wake; # arm x86 mips nobrillo
+ __get_thread; # arm x86 mips nobrillo
+ __get_tls; # arm x86 mips nobrillo
+ __getdents64; # arm x86 mips
+ __open; # arm x86 mips nobrillo
+ __page_shift; # arm x86 mips nobrillo
+ __page_size; # arm x86 mips nobrillo
+ __popcountsi2; # arm x86 mips
+ __pthread_gettid; # arm x86 mips nobrillo
+ __sclose; # arm x86 mips
+ __sdidinit; # arm x86 mips nobrillo
+ __set_errno; # arm x86 mips nobrillo
+ __sflags; # arm x86 mips
+ __sflush; # arm x86 mips
+ __sfp; # arm x86 mips
+ __sglue; # arm x86 mips
+ __sinit; # arm x86 mips nobrillo
+ __smakebuf; # arm x86 mips
+ __sread; # arm x86 mips
+ __srefill; # arm x86 mips
+ __srget; # arm x86 mips
+ __sseek; # arm x86 mips
+ __swbuf; # arm x86 mips
+ __swrite; # arm x86 mips
+ __swsetup; # arm x86 mips
+ __udivdi3; # arm x86 mips
+ __umoddi3; # x86 mips
+ __wait4; # arm x86 mips nobrillo
+ _fwalk; # arm x86 mips
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ arc4random_addrandom; # arm x86 mips nobrillo
+ arc4random_stir; # arm x86 mips nobrillo
+ bcopy; # arm x86 mips nobrillo
+ bzero; # arm x86 mips nobrillo
+ bsd_signal; # arm x86 mips nobrillo
+ dlmalloc; # arm x86 mips nobrillo
+ dlmalloc_inspect_all; # arm x86 mips nobrillo
+ dlmalloc_trim; # arm x86 mips nobrillo
+ dlmalloc_usable_size; # arm x86 mips nobrillo
+ endpwent; # arm x86 mips nobrillo
+ fdprintf; # arm x86 mips nobrillo
+ free_malloc_leak_info;
+ ftime; # arm x86 mips nobrillo
+ get_malloc_leak_info;
+ getdents; # arm x86 mips nobrillo
+ getdtablesize; # arm x86 mips nobrillo
+ gMallocLeakZygoteChild;
+ index; # arm x86 mips nobrillo
+ issetugid; # arm x86 mips nobrillo
+ memswap; # arm x86 mips nobrillo
+ pthread_attr_getstackaddr; # arm x86 mips nobrillo
+ pthread_attr_setstackaddr; # arm x86 mips nobrillo
+ SHA1Final; # arm x86 mips
+ SHA1Init; # arm x86 mips
+ SHA1Transform; # arm x86 mips
+ SHA1Update; # arm x86 mips
+ strntoimax; # arm x86 mips nobrillo
+ strntoumax; # arm x86 mips nobrillo
+ strtotimeval; # arm x86 mips nobrillo
+ sysv_signal; # arm x86 mips nobrillo
+ tkill; # arm x86 mips nobrillo
+ vfdprintf; # arm x86 mips nobrillo
+ wait3; # arm x86 mips nobrillo
+ wcswcs; # arm x86 mips nobrillo
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.mips64.map b/libc/libc.mips64.map
new file mode 100644
index 000000000..afbd0ee4b
--- /dev/null
+++ b/libc/libc.mips64.map
@@ -0,0 +1,1212 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __b64_ntop;
+ __b64_pton;
+ __cmsg_nxthdr;
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __errno;
+ __fbufsize;
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fwritable;
+ __get_h_errno;
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __open_2;
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sF;
+ __snprintf_chk;
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ _ctype_;
+ _Exit;
+ _exit;
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _toupper;
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ ns_format_ttl; # arm64 x86_64 mips64
+ ns_get16; # arm64 x86_64 mips64
+ ns_get32; # arm64 x86_64 mips64
+ ns_initparse; # arm64 x86_64 mips64
+ ns_makecanon; # arm64 x86_64 mips64
+ ns_msg_getflag; # arm64 x86_64 mips64
+ ns_name_compress; # arm64 x86_64 mips64
+ ns_name_ntol; # arm64 x86_64 mips64
+ ns_name_ntop; # arm64 x86_64 mips64
+ ns_name_pack; # arm64 x86_64 mips64
+ ns_name_pton; # arm64 x86_64 mips64
+ ns_name_rollback; # arm64 x86_64 mips64
+ ns_name_skip; # arm64 x86_64 mips64
+ ns_name_uncompress; # arm64 x86_64 mips64
+ ns_name_unpack; # arm64 x86_64 mips64
+ ns_parserr; # arm64 x86_64 mips64
+ ns_put16; # arm64 x86_64 mips64
+ ns_put32; # arm64 x86_64 mips64
+ ns_samename; # arm64 x86_64 mips64
+ ns_skiprr; # arm64 x86_64 mips64
+ ns_sprintrr; # arm64 x86_64 mips64
+ ns_sprintrrf; # arm64 x86_64 mips64
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit; # arm64 x86_64 mips64
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putwc;
+ putwchar;
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timelocal;
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ free_malloc_leak_info;
+ get_malloc_leak_info;
+ gMallocLeakZygoteChild;
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.x86.brillo.map b/libc/libc.x86.brillo.map
new file mode 100644
index 000000000..34f5e0eb0
--- /dev/null
+++ b/libc/libc.x86.brillo.map
@@ -0,0 +1,1298 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __b64_ntop;
+ __b64_pton;
+ __brk; # arm x86 mips
+ __cmsg_nxthdr;
+ __connect; # arm x86 mips
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __epoll_pwait; # arm x86 mips
+ __errno;
+ __exit; # arm x86 mips
+ __fadvise64; # x86 mips
+ __fbufsize;
+ __fcntl64; # arm x86 mips
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fstatfs64; # arm x86 mips
+ __fwritable;
+ __get_h_errno;
+ __getcpu; # arm x86 mips
+ __getcwd; # arm x86 mips
+ __getpid; # arm x86 mips
+ __getpriority; # arm x86 mips
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __ioctl; # arm x86 mips
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __isthreaded; # arm x86 mips
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __llseek; # arm x86 mips
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __mmap2; # arm x86 mips
+ __ns_format_ttl; # arm x86 mips
+ __ns_get16; # arm x86 mips
+ __ns_get32; # arm x86 mips
+ __ns_initparse; # arm x86 mips
+ __ns_makecanon; # arm x86 mips
+ __ns_msg_getflag; # arm x86 mips
+ __ns_name_compress; # arm x86 mips
+ __ns_name_ntol; # arm x86 mips
+ __ns_name_ntop; # arm x86 mips
+ __ns_name_pack; # arm x86 mips
+ __ns_name_pton; # arm x86 mips
+ __ns_name_rollback; # arm x86 mips
+ __ns_name_skip; # arm x86 mips
+ __ns_name_uncompress; # arm x86 mips
+ __ns_name_unpack; # arm x86 mips
+ __ns_parserr; # arm x86 mips
+ __ns_put16; # arm x86 mips
+ __ns_put32; # arm x86 mips
+ __ns_samename; # arm x86 mips
+ __ns_skiprr; # arm x86 mips
+ __ns_sprintrr; # arm x86 mips
+ __ns_sprintrrf; # arm x86 mips
+ __open_2;
+ __openat; # arm x86 mips
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll; # arm x86 mips
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pselect6; # arm x86 mips
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __ptrace; # arm x86 mips
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __reboot; # arm x86 mips
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __rt_sigaction; # arm x86 mips
+ __rt_sigpending; # arm x86 mips
+ __rt_sigprocmask; # arm x86 mips
+ __rt_sigsuspend; # arm x86 mips
+ __rt_sigtimedwait; # arm x86 mips
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sched_getaffinity; # arm x86 mips
+ __set_thread_area; # x86
+ __set_tid_address; # arm x86 mips
+ __sF;
+ __sigaction; # arm x86 mips
+ __snprintf_chk;
+ __socket; # arm x86 mips
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __statfs64; # arm x86 mips
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __timer_create; # arm x86 mips
+ __timer_delete; # arm x86 mips
+ __timer_getoverrun; # arm x86 mips
+ __timer_gettime; # arm x86 mips
+ __timer_settime; # arm x86 mips
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ __waitid; # arm x86 mips
+ _ctype_;
+ _Exit;
+ _exit;
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _tolower_tab_; # arm x86 mips
+ _toupper;
+ _toupper_tab_; # arm x86 mips
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime64; # arm x86 mips
+ asctime64_r; # arm x86 mips
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ basename_r; # arm x86 mips
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime64; # arm x86 mips
+ ctime64_r; # arm x86 mips
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ dirname_r; # arm x86 mips
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime64; # arm x86 mips
+ gmtime64_r; # arm x86 mips
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime64; # arm x86 mips
+ localtime64_r; # arm x86 mips
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mktime64; # arm x86 mips
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_timedwait_monotonic; # arm x86 mips
+ pthread_cond_timedwait_monotonic_np; # arm x86 mips
+ pthread_cond_timedwait_relative_np; # arm x86 mips
+ pthread_cond_timeout_np; # arm x86 mips
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_lock_timeout_np; # arm x86 mips
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putw; # arm x86 mips
+ putwc;
+ putwchar;
+ pvalloc; # arm x86 mips
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timegm64; # arm x86 mips
+ timelocal;
+ timelocal64; # arm x86 mips
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ valloc; # arm x86 mips
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ prlimit; # arm mips x86
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ __accept4; # arm x86 mips
+ __bionic_brk; # arm x86 mips
+ __bionic_libgcc_compat_symbols; # arm x86
+ __divdi3; # arm x86 mips
+ __getdents64; # arm x86 mips
+ __popcountsi2; # arm x86 mips
+ __sclose; # arm x86 mips
+ __sflags; # arm x86 mips
+ __sflush; # arm x86 mips
+ __sfp; # arm x86 mips
+ __sglue; # arm x86 mips
+ __smakebuf; # arm x86 mips
+ __sread; # arm x86 mips
+ __srefill; # arm x86 mips
+ __srget; # arm x86 mips
+ __sseek; # arm x86 mips
+ __swbuf; # arm x86 mips
+ __swrite; # arm x86 mips
+ __swsetup; # arm x86 mips
+ __udivdi3; # arm x86 mips
+ __umoddi3; # x86 mips
+ _fwalk; # arm x86 mips
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ free_malloc_leak_info;
+ get_malloc_leak_info;
+ gMallocLeakZygoteChild;
+ SHA1Final; # arm x86 mips
+ SHA1Init; # arm x86 mips
+ SHA1Transform; # arm x86 mips
+ SHA1Update; # arm x86 mips
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.x86.map b/libc/libc.x86.map
new file mode 100644
index 000000000..9417d5620
--- /dev/null
+++ b/libc/libc.x86.map
@@ -0,0 +1,1337 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __b64_ntop;
+ __b64_pton;
+ __brk; # arm x86 mips
+ __cmsg_nxthdr;
+ __connect; # arm x86 mips
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __epoll_pwait; # arm x86 mips
+ __errno;
+ __exit; # arm x86 mips
+ __fadvise64; # x86 mips
+ __fbufsize;
+ __fcntl64; # arm x86 mips
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fstatfs64; # arm x86 mips
+ __fwritable;
+ __get_h_errno;
+ __getcpu; # arm x86 mips
+ __getcwd; # arm x86 mips
+ __getpid; # arm x86 mips
+ __getpriority; # arm x86 mips
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __ioctl; # arm x86 mips
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __isthreaded; # arm x86 mips
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __llseek; # arm x86 mips
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __mmap2; # arm x86 mips
+ __ns_format_ttl; # arm x86 mips
+ __ns_get16; # arm x86 mips
+ __ns_get32; # arm x86 mips
+ __ns_initparse; # arm x86 mips
+ __ns_makecanon; # arm x86 mips
+ __ns_msg_getflag; # arm x86 mips
+ __ns_name_compress; # arm x86 mips
+ __ns_name_ntol; # arm x86 mips
+ __ns_name_ntop; # arm x86 mips
+ __ns_name_pack; # arm x86 mips
+ __ns_name_pton; # arm x86 mips
+ __ns_name_rollback; # arm x86 mips
+ __ns_name_skip; # arm x86 mips
+ __ns_name_uncompress; # arm x86 mips
+ __ns_name_unpack; # arm x86 mips
+ __ns_parserr; # arm x86 mips
+ __ns_put16; # arm x86 mips
+ __ns_put32; # arm x86 mips
+ __ns_samename; # arm x86 mips
+ __ns_skiprr; # arm x86 mips
+ __ns_sprintrr; # arm x86 mips
+ __ns_sprintrrf; # arm x86 mips
+ __open_2;
+ __openat; # arm x86 mips
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll; # arm x86 mips
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pselect6; # arm x86 mips
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __ptrace; # arm x86 mips
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __reboot; # arm x86 mips
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __rt_sigaction; # arm x86 mips
+ __rt_sigpending; # arm x86 mips
+ __rt_sigprocmask; # arm x86 mips
+ __rt_sigsuspend; # arm x86 mips
+ __rt_sigtimedwait; # arm x86 mips
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sched_getaffinity; # arm x86 mips
+ __set_thread_area; # x86
+ __set_tid_address; # arm x86 mips
+ __sF;
+ __sigaction; # arm x86 mips
+ __snprintf_chk;
+ __socket; # arm x86 mips
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __statfs64; # arm x86 mips
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __timer_create; # arm x86 mips
+ __timer_delete; # arm x86 mips
+ __timer_getoverrun; # arm x86 mips
+ __timer_gettime; # arm x86 mips
+ __timer_settime; # arm x86 mips
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ __waitid; # arm x86 mips
+ _ctype_;
+ _Exit;
+ _exit;
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _tolower_tab_; # arm x86 mips
+ _toupper;
+ _toupper_tab_; # arm x86 mips
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime64; # arm x86 mips
+ asctime64_r; # arm x86 mips
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ basename_r; # arm x86 mips
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime64; # arm x86 mips
+ ctime64_r; # arm x86 mips
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ dirname_r; # arm x86 mips
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime64; # arm x86 mips
+ gmtime64_r; # arm x86 mips
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime64; # arm x86 mips
+ localtime64_r; # arm x86 mips
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mktime64; # arm x86 mips
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_timedwait_monotonic; # arm x86 mips
+ pthread_cond_timedwait_monotonic_np; # arm x86 mips
+ pthread_cond_timedwait_relative_np; # arm x86 mips
+ pthread_cond_timeout_np; # arm x86 mips
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_lock_timeout_np; # arm x86 mips
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putw; # arm x86 mips
+ putwc;
+ putwchar;
+ pvalloc; # arm x86 mips
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timegm64; # arm x86 mips
+ timelocal;
+ timelocal64; # arm x86 mips
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ valloc; # arm x86 mips
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ prlimit; # arm mips x86
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ __accept4; # arm x86 mips
+ __bionic_brk; # arm x86 mips
+ __bionic_libgcc_compat_symbols; # arm x86
+ __divdi3; # arm x86 mips
+ __futex_wait; # arm x86 mips nobrillo
+ __futex_wake; # arm x86 mips nobrillo
+ __get_thread; # arm x86 mips nobrillo
+ __get_tls; # arm x86 mips nobrillo
+ __getdents64; # arm x86 mips
+ __open; # arm x86 mips nobrillo
+ __page_shift; # arm x86 mips nobrillo
+ __page_size; # arm x86 mips nobrillo
+ __popcountsi2; # arm x86 mips
+ __pthread_gettid; # arm x86 mips nobrillo
+ __sclose; # arm x86 mips
+ __sdidinit; # arm x86 mips nobrillo
+ __set_errno; # arm x86 mips nobrillo
+ __sflags; # arm x86 mips
+ __sflush; # arm x86 mips
+ __sfp; # arm x86 mips
+ __sglue; # arm x86 mips
+ __sinit; # arm x86 mips nobrillo
+ __smakebuf; # arm x86 mips
+ __sread; # arm x86 mips
+ __srefill; # arm x86 mips
+ __srget; # arm x86 mips
+ __sseek; # arm x86 mips
+ __swbuf; # arm x86 mips
+ __swrite; # arm x86 mips
+ __swsetup; # arm x86 mips
+ __udivdi3; # arm x86 mips
+ __umoddi3; # x86 mips
+ __wait4; # arm x86 mips nobrillo
+ _fwalk; # arm x86 mips
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ arc4random_addrandom; # arm x86 mips nobrillo
+ arc4random_stir; # arm x86 mips nobrillo
+ bcopy; # arm x86 mips nobrillo
+ bzero; # arm x86 mips nobrillo
+ bsd_signal; # arm x86 mips nobrillo
+ dlmalloc; # arm x86 mips nobrillo
+ dlmalloc_inspect_all; # arm x86 mips nobrillo
+ dlmalloc_trim; # arm x86 mips nobrillo
+ dlmalloc_usable_size; # arm x86 mips nobrillo
+ endpwent; # arm x86 mips nobrillo
+ fdprintf; # arm x86 mips nobrillo
+ free_malloc_leak_info;
+ ftime; # arm x86 mips nobrillo
+ get_malloc_leak_info;
+ getdents; # arm x86 mips nobrillo
+ getdtablesize; # arm x86 mips nobrillo
+ gMallocLeakZygoteChild;
+ index; # arm x86 mips nobrillo
+ issetugid; # arm x86 mips nobrillo
+ memswap; # arm x86 mips nobrillo
+ pthread_attr_getstackaddr; # arm x86 mips nobrillo
+ pthread_attr_setstackaddr; # arm x86 mips nobrillo
+ SHA1Final; # arm x86 mips
+ SHA1Init; # arm x86 mips
+ SHA1Transform; # arm x86 mips
+ SHA1Update; # arm x86 mips
+ strntoimax; # arm x86 mips nobrillo
+ strntoumax; # arm x86 mips nobrillo
+ strtotimeval; # arm x86 mips nobrillo
+ sysv_signal; # arm x86 mips nobrillo
+ tkill; # arm x86 mips nobrillo
+ vfdprintf; # arm x86 mips nobrillo
+ wait3; # arm x86 mips nobrillo
+ wcswcs; # arm x86 mips nobrillo
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/libc.x86_64.map b/libc/libc.x86_64.map
new file mode 100644
index 000000000..afbd0ee4b
--- /dev/null
+++ b/libc/libc.x86_64.map
@@ -0,0 +1,1212 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __assert;
+ __assert2;
+ __b64_ntop;
+ __b64_pton;
+ __cmsg_nxthdr;
+ __ctype_get_mb_cur_max;
+ __cxa_atexit;
+ __cxa_finalize;
+ __cxa_thread_atexit_impl;
+ __dn_comp;
+ __dn_count_labels;
+ __dn_skipname;
+ __errno;
+ __fbufsize;
+ __FD_CLR_chk;
+ __FD_ISSET_chk;
+ __FD_SET_chk;
+ __fgets_chk;
+ __flbf;
+ __fp_nquery;
+ __fp_query;
+ __fpclassify;
+ __fpclassifyd;
+ __fpclassifyf;
+ __fpclassifyl;
+ __fpending;
+ __fpurge;
+ __freadable;
+ __fsetlocking;
+ __fwritable;
+ __get_h_errno;
+ __gnu_basename;
+ __gnu_strerror_r;
+ __hostalias;
+ __isfinite;
+ __isfinitef;
+ __isfinitel;
+ __isinf;
+ __isinff;
+ __isinfl;
+ __isnan;
+ __isnanf;
+ __isnanl;
+ __isnormal;
+ __isnormalf;
+ __isnormall;
+ __libc_current_sigrtmax;
+ __libc_current_sigrtmin;
+ __libc_init;
+ __loc_aton;
+ __loc_ntoa;
+ __memchr_chk;
+ __memcpy_chk;
+ __memmove_chk;
+ __memrchr_chk;
+ __memset_chk;
+ __open_2;
+ __openat_2;
+ __p_cdname;
+ __p_cdnname;
+ __p_class;
+ __p_class_syms;
+ __p_fqname;
+ __p_fqnname;
+ __p_option;
+ __p_query;
+ __p_rcode;
+ __p_secstodate;
+ __p_time;
+ __p_type;
+ __p_type_syms;
+ __poll_chk;
+ __ppoll_chk;
+ __pread64_chk;
+ __pread_chk;
+ __progname;
+ __pthread_cleanup_pop;
+ __pthread_cleanup_push;
+ __putlong;
+ __putshort;
+ __read_chk;
+ __readlink_chk;
+ __readlinkat_chk;
+ __recvfrom_chk;
+ __register_atfork;
+ __res_close;
+ __res_dnok;
+ __res_hnok;
+ __res_hostalias;
+ __res_isourserver;
+ __res_mailok;
+ __res_nameinquery;
+ __res_nclose;
+ __res_ninit;
+ __res_nmkquery;
+ __res_nquery;
+ __res_nquerydomain;
+ __res_nsearch;
+ __res_nsend;
+ __res_ownok;
+ __res_queriesmatch;
+ __res_querydomain;
+ __res_send;
+ __res_send_setqhook;
+ __res_send_setrhook;
+ __sched_cpualloc;
+ __sched_cpucount;
+ __sched_cpufree;
+ __sF;
+ __snprintf_chk;
+ __sprintf_chk;
+ __stack_chk_fail;
+ __stack_chk_guard;
+ __stpcpy_chk;
+ __stpncpy_chk;
+ __stpncpy_chk2;
+ __strcat_chk;
+ __strchr_chk;
+ __strcpy_chk;
+ __strlcat_chk;
+ __strlcpy_chk;
+ __strlen_chk;
+ __strncat_chk;
+ __strncpy_chk;
+ __strncpy_chk2;
+ __strrchr_chk;
+ __sym_ntop;
+ __sym_ntos;
+ __sym_ston;
+ __system_properties_init;
+ __system_property_add;
+ __system_property_area__;
+ __system_property_area_init;
+ __system_property_area_serial;
+ __system_property_find;
+ __system_property_find_nth;
+ __system_property_foreach;
+ __system_property_get;
+ __system_property_read;
+ __system_property_serial;
+ __system_property_set;
+ __system_property_set_filename;
+ __system_property_update;
+ __system_property_wait_any;
+ __umask_chk;
+ __vsnprintf_chk;
+ __vsprintf_chk;
+ _ctype_;
+ _Exit;
+ _exit;
+ _flushlbf;
+ _getlong;
+ _getshort;
+ _longjmp;
+ _resolv_delete_cache_for_net;
+ _resolv_flush_cache_for_net;
+ _resolv_set_nameservers_for_net;
+ _setjmp;
+ _tolower;
+ _toupper;
+ abort;
+ abs;
+ accept;
+ accept4;
+ access;
+ acct;
+ alarm;
+ alphasort;
+ alphasort64;
+ android_set_abort_message;
+ arc4random;
+ arc4random_buf;
+ arc4random_uniform;
+ asctime;
+ asctime_r;
+ asprintf;
+ at_quick_exit;
+ atof;
+ atoi;
+ atol;
+ atoll;
+ basename;
+ bind;
+ bindresvport;
+ brk;
+ bsearch;
+ btowc;
+ c16rtomb;
+ c32rtomb;
+ calloc;
+ capget;
+ capset;
+ cfgetispeed;
+ cfgetospeed;
+ cfmakeraw;
+ cfsetispeed;
+ cfsetospeed;
+ cfsetspeed;
+ chdir;
+ chmod;
+ chown;
+ chroot;
+ clearenv;
+ clearerr;
+ clearerr_unlocked;
+ clock;
+ clock_getcpuclockid;
+ clock_getres;
+ clock_gettime;
+ clock_nanosleep;
+ clock_settime;
+ clone;
+ close;
+ closedir;
+ closelog;
+ connect;
+ creat;
+ creat64;
+ ctime;
+ ctime_r;
+ daemon;
+ daylight;
+ delete_module;
+ difftime;
+ dirfd;
+ dirname;
+ div;
+ dn_expand;
+ dprintf;
+ drand48;
+ dup;
+ dup2;
+ dup3;
+ duplocale;
+ endmntent;
+ endservent;
+ endutent;
+ environ;
+ epoll_create;
+ epoll_create1;
+ epoll_ctl;
+ epoll_pwait;
+ epoll_wait;
+ erand48;
+ err;
+ error;
+ error_at_line;
+ error_message_count;
+ error_one_per_line;
+ error_print_progname;
+ errx;
+ ether_aton;
+ ether_aton_r;
+ ether_ntoa;
+ ether_ntoa_r;
+ eventfd;
+ eventfd_read;
+ eventfd_write;
+ execl;
+ execle;
+ execlp;
+ execv;
+ execve;
+ execvp;
+ execvpe;
+ exit;
+ faccessat;
+ fallocate;
+ fallocate64;
+ fchdir;
+ fchmod;
+ fchmodat;
+ fchown;
+ fchownat;
+ fclose;
+ fcntl;
+ fdatasync;
+ fdopen;
+ fdopendir;
+ feof;
+ feof_unlocked;
+ ferror;
+ ferror_unlocked;
+ fflush;
+ ffs;
+ fgetc;
+ fgetln;
+ fgetpos;
+ fgets;
+ fgetwc;
+ fgetws;
+ fgetxattr;
+ fileno;
+ flistxattr;
+ flock;
+ flockfile;
+ fmemopen;
+ fnmatch;
+ fopen;
+ fork;
+ forkpty;
+ fpathconf;
+ fprintf;
+ fpurge;
+ fputc;
+ fputs;
+ fputwc;
+ fputws;
+ fread;
+ free;
+ freeaddrinfo;
+ freelocale;
+ fremovexattr;
+ freopen;
+ fscanf;
+ fseek;
+ fseeko;
+ fsetpos;
+ fsetxattr;
+ fstat;
+ fstat64;
+ fstatat;
+ fstatat64;
+ fstatfs;
+ fstatfs64;
+ fstatvfs;
+ fstatvfs64;
+ fsync;
+ ftell;
+ ftello;
+ ftok;
+ ftruncate;
+ ftruncate64;
+ ftrylockfile;
+ fts_children;
+ fts_close;
+ fts_open;
+ fts_read;
+ fts_set;
+ ftw;
+ ftw64;
+ funlockfile;
+ funopen;
+ futimens;
+ fwide;
+ fwprintf;
+ fwrite;
+ fwscanf;
+ gai_strerror;
+ get_avphys_pages;
+ get_nprocs;
+ get_nprocs_conf;
+ get_phys_pages;
+ getaddrinfo;
+ getauxval;
+ getc;
+ getc_unlocked;
+ getchar;
+ getchar_unlocked;
+ getcwd;
+ getdelim;
+ getegid;
+ getenv;
+ geteuid;
+ getgid;
+ getgrgid;
+ getgrnam;
+ getgrouplist;
+ getgroups;
+ gethostbyaddr;
+ gethostbyaddr_r;
+ gethostbyname;
+ gethostbyname2;
+ gethostbyname2_r;
+ gethostbyname_r;
+ gethostent;
+ gethostname;
+ getitimer;
+ getline;
+ getlogin;
+ getmntent;
+ getmntent_r;
+ getnameinfo;
+ getnetbyaddr;
+ getnetbyname;
+ getopt;
+ getopt_long;
+ getopt_long_only;
+ getpagesize;
+ getpeername;
+ getpgid;
+ getpgrp;
+ getpid;
+ getppid;
+ getpriority;
+ getprogname;
+ getprotobyname;
+ getprotobynumber;
+ getpt;
+ getpwnam;
+ getpwnam_r;
+ getpwuid;
+ getpwuid_r;
+ getresgid;
+ getresuid;
+ getrlimit;
+ getrlimit64;
+ getrusage;
+ gets;
+ getservbyname;
+ getservbyport;
+ getservent;
+ getsid;
+ getsockname;
+ getsockopt;
+ gettid;
+ gettimeofday;
+ getuid;
+ getutent;
+ getwc;
+ getwchar;
+ getxattr;
+ gmtime;
+ gmtime_r;
+ grantpt;
+ herror;
+ hstrerror;
+ htonl;
+ htons;
+ if_indextoname;
+ if_nametoindex;
+ imaxabs;
+ imaxdiv;
+ inet_addr;
+ inet_aton;
+ inet_lnaof;
+ inet_makeaddr;
+ inet_netof;
+ inet_network;
+ inet_nsap_addr;
+ inet_nsap_ntoa;
+ inet_ntoa;
+ inet_ntop;
+ inet_pton;
+ init_module;
+ initgroups;
+ initstate;
+ inotify_add_watch;
+ inotify_init;
+ inotify_init1;
+ inotify_rm_watch;
+ insque;
+ ioctl;
+ isalnum;
+ isalnum_l;
+ isalpha;
+ isalpha_l;
+ isascii;
+ isatty;
+ isblank;
+ isblank_l;
+ iscntrl;
+ iscntrl_l;
+ isdigit;
+ isdigit_l;
+ isfinite;
+ isfinitef;
+ isfinitel;
+ isgraph;
+ isgraph_l;
+ isinf;
+ isinff;
+ isinfl;
+ islower;
+ islower_l;
+ isnan;
+ isnanf;
+ isnanl;
+ isnormal;
+ isnormalf;
+ isnormall;
+ isprint;
+ isprint_l;
+ ispunct;
+ ispunct_l;
+ isspace;
+ isspace_l;
+ isupper;
+ isupper_l;
+ iswalnum;
+ iswalnum_l;
+ iswalpha;
+ iswalpha_l;
+ iswblank;
+ iswblank_l;
+ iswcntrl;
+ iswcntrl_l;
+ iswctype;
+ iswctype_l;
+ iswdigit;
+ iswdigit_l;
+ iswgraph;
+ iswgraph_l;
+ iswlower;
+ iswlower_l;
+ iswprint;
+ iswprint_l;
+ iswpunct;
+ iswpunct_l;
+ iswspace;
+ iswspace_l;
+ iswupper;
+ iswupper_l;
+ iswxdigit;
+ iswxdigit_l;
+ isxdigit;
+ isxdigit_l;
+ jrand48;
+ kill;
+ killpg;
+ klogctl;
+ labs;
+ lchown;
+ lcong48;
+ ldexp;
+ ldiv;
+ lfind;
+ lgetxattr;
+ link;
+ linkat;
+ listen;
+ listxattr;
+ llabs;
+ lldiv;
+ llistxattr;
+ localeconv;
+ localtime;
+ localtime_r;
+ login_tty;
+ longjmp;
+ lrand48;
+ lremovexattr;
+ lsearch;
+ lseek;
+ lseek64;
+ lsetxattr;
+ lstat;
+ lstat64;
+ madvise;
+ mallinfo;
+ malloc;
+ malloc_info;
+ malloc_usable_size;
+ mbrlen;
+ mbrtoc16;
+ mbrtoc32;
+ mbrtowc;
+ mbsinit;
+ mbsnrtowcs;
+ mbsrtowcs;
+ mbstowcs;
+ mbtowc;
+ memalign;
+ memccpy;
+ memchr;
+ memcmp;
+ memcpy;
+ memmem;
+ memmove;
+ mempcpy;
+ memrchr;
+ memset;
+ mincore;
+ mkdir;
+ mkdirat;
+ mkdtemp;
+ mkfifo;
+ mkfifoat;
+ mknod;
+ mknodat;
+ mkostemp;
+ mkostemp64;
+ mkostemps;
+ mkostemps64;
+ mkstemp;
+ mkstemp64;
+ mkstemps;
+ mkstemps64;
+ mktemp;
+ mktime;
+ mlock;
+ mlockall;
+ mmap;
+ mmap64;
+ mount;
+ mprotect;
+ mrand48;
+ mremap;
+ msync;
+ munlock;
+ munlockall;
+ munmap;
+ nanosleep;
+ newlocale;
+ nftw;
+ nftw64;
+ nice;
+ nrand48;
+ ns_format_ttl; # arm64 x86_64 mips64
+ ns_get16; # arm64 x86_64 mips64
+ ns_get32; # arm64 x86_64 mips64
+ ns_initparse; # arm64 x86_64 mips64
+ ns_makecanon; # arm64 x86_64 mips64
+ ns_msg_getflag; # arm64 x86_64 mips64
+ ns_name_compress; # arm64 x86_64 mips64
+ ns_name_ntol; # arm64 x86_64 mips64
+ ns_name_ntop; # arm64 x86_64 mips64
+ ns_name_pack; # arm64 x86_64 mips64
+ ns_name_pton; # arm64 x86_64 mips64
+ ns_name_rollback; # arm64 x86_64 mips64
+ ns_name_skip; # arm64 x86_64 mips64
+ ns_name_uncompress; # arm64 x86_64 mips64
+ ns_name_unpack; # arm64 x86_64 mips64
+ ns_parserr; # arm64 x86_64 mips64
+ ns_put16; # arm64 x86_64 mips64
+ ns_put32; # arm64 x86_64 mips64
+ ns_samename; # arm64 x86_64 mips64
+ ns_skiprr; # arm64 x86_64 mips64
+ ns_sprintrr; # arm64 x86_64 mips64
+ ns_sprintrrf; # arm64 x86_64 mips64
+ nsdispatch;
+ ntohl;
+ ntohs;
+ open;
+ open64;
+ open_memstream;
+ open_wmemstream;
+ openat;
+ openat64;
+ opendir;
+ openlog;
+ openpty;
+ optarg;
+ opterr;
+ optind;
+ optopt;
+ optreset;
+ pathconf;
+ pause;
+ pclose;
+ perror;
+ personality;
+ pipe;
+ pipe2;
+ poll;
+ popen;
+ posix_fadvise;
+ posix_fadvise64;
+ posix_fallocate;
+ posix_fallocate64;
+ posix_madvise;
+ posix_memalign;
+ posix_openpt;
+ ppoll;
+ prctl;
+ pread;
+ pread64;
+ printf;
+ prlimit; # arm64 x86_64 mips64
+ prlimit64;
+ process_vm_readv;
+ process_vm_writev;
+ pselect;
+ psiginfo;
+ psignal;
+ pthread_atfork;
+ pthread_attr_destroy;
+ pthread_attr_getdetachstate;
+ pthread_attr_getguardsize;
+ pthread_attr_getschedparam;
+ pthread_attr_getschedpolicy;
+ pthread_attr_getscope;
+ pthread_attr_getstack;
+ pthread_attr_getstacksize;
+ pthread_attr_init;
+ pthread_attr_setdetachstate;
+ pthread_attr_setguardsize;
+ pthread_attr_setschedparam;
+ pthread_attr_setschedpolicy;
+ pthread_attr_setscope;
+ pthread_attr_setstack;
+ pthread_attr_setstacksize;
+ pthread_cond_broadcast;
+ pthread_cond_destroy;
+ pthread_cond_init;
+ pthread_cond_signal;
+ pthread_cond_timedwait;
+ pthread_cond_wait;
+ pthread_condattr_destroy;
+ pthread_condattr_getclock;
+ pthread_condattr_getpshared;
+ pthread_condattr_init;
+ pthread_condattr_setclock;
+ pthread_condattr_setpshared;
+ pthread_create;
+ pthread_detach;
+ pthread_equal;
+ pthread_exit;
+ pthread_getattr_np;
+ pthread_getcpuclockid;
+ pthread_getschedparam;
+ pthread_getspecific;
+ pthread_gettid_np;
+ pthread_join;
+ pthread_key_create;
+ pthread_key_delete;
+ pthread_kill;
+ pthread_mutex_destroy;
+ pthread_mutex_init;
+ pthread_mutex_lock;
+ pthread_mutex_timedlock;
+ pthread_mutex_trylock;
+ pthread_mutex_unlock;
+ pthread_mutexattr_destroy;
+ pthread_mutexattr_getpshared;
+ pthread_mutexattr_gettype;
+ pthread_mutexattr_init;
+ pthread_mutexattr_setpshared;
+ pthread_mutexattr_settype;
+ pthread_once;
+ pthread_rwlock_destroy;
+ pthread_rwlock_init;
+ pthread_rwlock_rdlock;
+ pthread_rwlock_timedrdlock;
+ pthread_rwlock_timedwrlock;
+ pthread_rwlock_tryrdlock;
+ pthread_rwlock_trywrlock;
+ pthread_rwlock_unlock;
+ pthread_rwlock_wrlock;
+ pthread_rwlockattr_destroy;
+ pthread_rwlockattr_getkind_np;
+ pthread_rwlockattr_getpshared;
+ pthread_rwlockattr_init;
+ pthread_rwlockattr_setkind_np;
+ pthread_rwlockattr_setpshared;
+ pthread_self;
+ pthread_setname_np;
+ pthread_setschedparam;
+ pthread_setspecific;
+ pthread_sigmask;
+ ptrace;
+ ptsname;
+ ptsname_r;
+ putc;
+ putc_unlocked;
+ putchar;
+ putchar_unlocked;
+ putenv;
+ puts;
+ pututline;
+ putwc;
+ putwchar;
+ pwrite;
+ pwrite64;
+ qsort;
+ quick_exit;
+ raise;
+ rand;
+ rand_r;
+ random;
+ read;
+ readahead;
+ readdir;
+ readdir64;
+ readdir64_r;
+ readdir_r;
+ readlink;
+ readlinkat;
+ readv;
+ realloc;
+ realpath;
+ reboot;
+ recv;
+ recvfrom;
+ recvmmsg;
+ recvmsg;
+ regcomp;
+ regerror;
+ regexec;
+ regfree;
+ remove;
+ removexattr;
+ remque;
+ rename;
+ renameat;
+ res_init;
+ res_mkquery;
+ res_query;
+ res_search;
+ rewind;
+ rewinddir;
+ rmdir;
+ sbrk;
+ scandir;
+ scandir64;
+ scanf;
+ sched_get_priority_max;
+ sched_get_priority_min;
+ sched_getaffinity;
+ sched_getcpu;
+ sched_getparam;
+ sched_getscheduler;
+ sched_rr_get_interval;
+ sched_setaffinity;
+ sched_setparam;
+ sched_setscheduler;
+ sched_yield;
+ seed48;
+ seekdir;
+ select;
+ sem_close;
+ sem_destroy;
+ sem_getvalue;
+ sem_init;
+ sem_open;
+ sem_post;
+ sem_timedwait;
+ sem_trywait;
+ sem_unlink;
+ sem_wait;
+ send;
+ sendfile;
+ sendfile64;
+ sendmmsg;
+ sendmsg;
+ sendto;
+ setbuf;
+ setbuffer;
+ setegid;
+ setenv;
+ seteuid;
+ setfsgid;
+ setfsuid;
+ setgid;
+ setgroups;
+ sethostname;
+ setitimer;
+ setjmp;
+ setlinebuf;
+ setlocale;
+ setlogmask;
+ setmntent;
+ setns;
+ setpgid;
+ setpgrp;
+ setpriority;
+ setprogname;
+ setregid;
+ setresgid;
+ setresuid;
+ setreuid;
+ setrlimit;
+ setrlimit64;
+ setservent;
+ setsid;
+ setsockopt;
+ setstate;
+ settimeofday;
+ setuid;
+ setutent;
+ setvbuf;
+ setxattr;
+ shutdown;
+ sigaction;
+ sigaddset;
+ sigaltstack;
+ sigblock;
+ sigdelset;
+ sigemptyset;
+ sigfillset;
+ siginterrupt;
+ sigismember;
+ siglongjmp;
+ signal;
+ signalfd;
+ sigpending;
+ sigprocmask;
+ sigqueue;
+ sigsetjmp;
+ sigsetmask;
+ sigsuspend;
+ sigtimedwait;
+ sigwait;
+ sigwaitinfo;
+ sleep;
+ snprintf;
+ socket;
+ socketpair;
+ splice;
+ sprintf;
+ srand;
+ srand48;
+ srandom;
+ sscanf;
+ stat;
+ stat64;
+ statfs;
+ statfs64;
+ statvfs;
+ statvfs64;
+ stderr;
+ stdin;
+ stdout;
+ stpcpy;
+ stpncpy;
+ strcasecmp;
+ strcasecmp_l;
+ strcasestr;
+ strcat;
+ strchr;
+ strcmp;
+ strcoll;
+ strcoll_l;
+ strcpy;
+ strcspn;
+ strdup;
+ strerror;
+ strerror_l;
+ strerror_r;
+ strftime;
+ strftime_l;
+ strlcat;
+ strlcpy;
+ strlen;
+ strncasecmp;
+ strncasecmp_l;
+ strncat;
+ strncmp;
+ strncpy;
+ strndup;
+ strnlen;
+ strpbrk;
+ strptime;
+ strrchr;
+ strsep;
+ strsignal;
+ strspn;
+ strstr;
+ strtod;
+ strtof;
+ strtoimax;
+ strtok;
+ strtok_r;
+ strtol;
+ strtold;
+ strtold_l;
+ strtoll;
+ strtoll_l;
+ strtoq;
+ strtoul;
+ strtoull;
+ strtoull_l;
+ strtoumax;
+ strtouq;
+ strxfrm;
+ strxfrm_l;
+ swapoff;
+ swapon;
+ swprintf;
+ swscanf;
+ symlink;
+ symlinkat;
+ sync;
+ sys_siglist;
+ sys_signame;
+ syscall;
+ sysconf;
+ sysinfo;
+ syslog;
+ system;
+ tcdrain;
+ tcflow;
+ tcflush;
+ tcgetattr;
+ tcgetpgrp;
+ tcgetsid;
+ tcsendbreak;
+ tcsetattr;
+ tcsetpgrp;
+ tdelete;
+ tdestroy;
+ tee;
+ telldir;
+ tempnam;
+ tfind;
+ tgkill;
+ time;
+ timegm;
+ timelocal;
+ timer_create;
+ timer_delete;
+ timer_getoverrun;
+ timer_gettime;
+ timer_settime;
+ timerfd_create;
+ timerfd_gettime;
+ timerfd_settime;
+ times;
+ timezone;
+ tmpfile;
+ tmpnam;
+ toascii;
+ tolower;
+ tolower_l;
+ toupper;
+ toupper_l;
+ towlower;
+ towlower_l;
+ towupper;
+ towupper_l;
+ truncate;
+ truncate64;
+ tsearch;
+ ttyname;
+ ttyname_r;
+ twalk;
+ tzname;
+ tzset;
+ umask;
+ umount;
+ umount2;
+ uname;
+ ungetc;
+ ungetwc;
+ unlink;
+ unlinkat;
+ unlockpt;
+ unsetenv;
+ unshare;
+ uselocale;
+ usleep;
+ utime;
+ utimensat;
+ utimes;
+ utmpname;
+ vasprintf;
+ vdprintf;
+ verr;
+ verrx;
+ vfork;
+ vfprintf;
+ vfscanf;
+ vfwprintf;
+ vfwscanf;
+ vmsplice;
+ vprintf;
+ vscanf;
+ vsnprintf;
+ vsprintf;
+ vsscanf;
+ vswprintf;
+ vswscanf;
+ vsyslog;
+ vwarn;
+ vwarnx;
+ vwprintf;
+ vwscanf;
+ wait;
+ wait4;
+ waitid;
+ waitpid;
+ warn;
+ warnx;
+ wcpcpy;
+ wcpncpy;
+ wcrtomb;
+ wcscasecmp;
+ wcscasecmp_l;
+ wcscat;
+ wcschr;
+ wcscmp;
+ wcscoll;
+ wcscoll_l;
+ wcscpy;
+ wcscspn;
+ wcsdup;
+ wcsftime;
+ wcslcat;
+ wcslcpy;
+ wcslen;
+ wcsncasecmp;
+ wcsncasecmp_l;
+ wcsncat;
+ wcsncmp;
+ wcsncpy;
+ wcsnlen;
+ wcsnrtombs;
+ wcspbrk;
+ wcsrchr;
+ wcsrtombs;
+ wcsspn;
+ wcsstr;
+ wcstod;
+ wcstof;
+ wcstoimax;
+ wcstok;
+ wcstol;
+ wcstold;
+ wcstold_l;
+ wcstoll;
+ wcstoll_l;
+ wcstombs;
+ wcstoul;
+ wcstoull;
+ wcstoull_l;
+ wcstoumax;
+ wcswidth;
+ wcsxfrm;
+ wcsxfrm_l;
+ wctob;
+ wctomb;
+ wctype;
+ wctype_l;
+ wcwidth;
+ wmemchr;
+ wmemcmp;
+ wmemcpy;
+ wmemmove;
+ wmempcpy;
+ wmemset;
+ wprintf;
+ write;
+ writev;
+ wscanf;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ __fread_chk;
+ __fwrite_chk;
+ __getcwd_chk;
+ __pwrite_chk;
+ __pwrite64_chk;
+ __write_chk;
+ adjtimex;
+ clock_adjtime;
+ fgetpos64;
+ fileno_unlocked;
+ fopen64;
+ freeifaddrs;
+ freopen64;
+ fseeko64;
+ fsetpos64;
+ ftello64;
+ funopen64;
+ getgrgid_r;
+ getgrnam_r;
+ getifaddrs;
+ if_freenameindex;
+ if_nameindex;
+ in6addr_any;
+ in6addr_loopback;
+ lockf;
+ lockf64;
+ preadv;
+ preadv64;
+ pthread_barrierattr_destroy;
+ pthread_barrierattr_getpshared;
+ pthread_barrierattr_init;
+ pthread_barrierattr_setpshared;
+ pthread_barrier_destroy;
+ pthread_barrier_init;
+ pthread_barrier_wait;
+ pthread_spin_destroy;
+ pthread_spin_init;
+ pthread_spin_lock;
+ pthread_spin_trylock;
+ pthread_spin_unlock;
+ pwritev;
+ pwritev64;
+ scandirat;
+ scandirat64;
+ strchrnul;
+ tmpfile64;
+} LIBC;
+
+LIBC_PRIVATE {
+ global:
+ android_getaddrinfofornet;
+ android_getaddrinfofornetcontext;
+ android_gethostbyaddrfornet;
+ android_gethostbynamefornet;
+ free_malloc_leak_info;
+ get_malloc_leak_info;
+ gMallocLeakZygoteChild;
+} LIBC_N;
+
+LIBC_PLATFORM {
+ global:
+ android_net_res_stats_get_info_for_net;
+ android_net_res_stats_aggregate;
+ android_net_res_stats_get_usable_servers;
+ malloc_backtrace;
+ malloc_disable;
+ malloc_enable;
+ malloc_iterate;
+} LIBC_N;
diff --git a/libc/malloc_debug/Android.mk b/libc/malloc_debug/Android.mk
new file mode 100644
index 000000000..3576611f5
--- /dev/null
+++ b/libc/malloc_debug/Android.mk
@@ -0,0 +1,109 @@
+LOCAL_PATH := $(call my-dir)
+
+libc_malloc_debug_src_files := \
+ BacktraceData.cpp \
+ Config.cpp \
+ DebugData.cpp \
+ debug_disable.cpp \
+ FreeTrackData.cpp \
+ GuardData.cpp \
+ malloc_debug.cpp \
+ TrackData.cpp \
+
+# ==============================================================
+# libc_malloc_debug_backtrace.a
+# ==============================================================
+# Used by libmemunreachable
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libc_malloc_debug_backtrace
+
+LOCAL_SRC_FILES := \
+ backtrace.cpp \
+ MapData.cpp \
+
+LOCAL_CXX_STL := libc++_static
+
+LOCAL_STATIC_LIBRARIES += \
+ libc_logging \
+
+LOCAL_C_INCLUDES += bionic/libc
+LOCAL_EXPORT_C_INCLUDE_DIRS += $(LOCAL_PATH)
+
+LOCAL_SANITIZE := never
+LOCAL_NATIVE_COVERAGE := false
+
+# -Wno-error=format-zero-length needed for gcc to compile.
+LOCAL_CFLAGS := \
+ -Wall \
+ -Werror \
+ -Wno-error=format-zero-length \
+
+include $(BUILD_STATIC_LIBRARY)
+
+# ==============================================================
+# libc_malloc_debug.so
+# ==============================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libc_malloc_debug
+
+LOCAL_SRC_FILES := \
+ $(libc_malloc_debug_src_files) \
+
+LOCAL_CXX_STL := libc++_static
+
+# Only need this for arm since libc++ uses its own unwind code that
+# doesn't mix with the other default unwind code.
+LOCAL_STATIC_LIBRARIES_arm := libunwind_llvm
+
+LOCAL_STATIC_LIBRARIES += \
+ libc_malloc_debug_backtrace \
+ libc_logging \
+
+LOCAL_LDFLAGS_32 := -Wl,--version-script,$(LOCAL_PATH)/exported32.map
+LOCAL_LDFLAGS_64 := -Wl,--version-script,$(LOCAL_PATH)/exported64.map
+LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
+LOCAL_C_INCLUDES += bionic/libc
+
+LOCAL_SANITIZE := never
+LOCAL_NATIVE_COVERAGE := false
+
+# -Wno-error=format-zero-length needed for gcc to compile.
+LOCAL_CFLAGS := \
+ -Wall \
+ -Werror \
+ -fno-stack-protector \
+ -Wno-error=format-zero-length \
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ==============================================================
+# Unit Tests
+# ==============================================================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := malloc_debug_unit_tests
+LOCAL_MODULE_STEM_32 := $(LOCAL_MODULE)32
+LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
+
+LOCAL_SRC_FILES := \
+ tests/backtrace_fake.cpp \
+ tests/log_fake.cpp \
+ tests/libc_fake.cpp \
+ tests/property_fake.cpp \
+ tests/malloc_debug_config_tests.cpp \
+ tests/malloc_debug_unit_tests.cpp \
+ $(libc_malloc_debug_src_files) \
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/tests
+LOCAL_C_INCLUDES += bionic/libc
+
+LOCAL_SHARED_LIBRARIES := libbase
+
+LOCAL_CFLAGS := \
+ -Wall \
+ -Werror \
+ -Wno-error=format-zero-length \
+
+include $(BUILD_NATIVE_TEST)
diff --git a/libc/malloc_debug/BacktraceData.cpp b/libc/malloc_debug/BacktraceData.cpp
new file mode 100644
index 000000000..400e282c9
--- /dev/null
+++ b/libc/malloc_debug/BacktraceData.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <signal.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <private/bionic_macros.h>
+
+#include "BacktraceData.h"
+#include "Config.h"
+#include "DebugData.h"
+#include "debug_log.h"
+#include "malloc_debug.h"
+
+BacktraceData::BacktraceData(const Config& config, size_t* offset) {
+ size_t hdr_len = sizeof(BacktraceHeader) + sizeof(uintptr_t) * config.backtrace_frames;
+ alloc_offset_ = *offset;
+ *offset += BIONIC_ALIGN(hdr_len, MINIMUM_ALIGNMENT_BYTES);
+}
+
+static BacktraceData* g_backtrace_data = nullptr;
+
+static void EnableToggle(int, siginfo_t*, void*) {
+ if (g_backtrace_data->enabled()) {
+ g_backtrace_data->set_enabled(false);
+ } else {
+ g_backtrace_data->set_enabled(true);
+ }
+}
+
+bool BacktraceData::Initialize(const Config& config) {
+ enabled_ = config.backtrace_enabled;
+ if (config.backtrace_enable_on_signal) {
+ g_backtrace_data = this;
+
+ struct sigaction enable_act;
+ memset(&enable_act, 0, sizeof(enable_act));
+
+ enable_act.sa_sigaction = EnableToggle;
+ enable_act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK;
+ sigemptyset(&enable_act.sa_mask);
+ if (sigaction(config.backtrace_signal, &enable_act, nullptr) != 0) {
+ error_log("Unable to set up backtrace signal enable function: %s", strerror(errno));
+ return false;
+ }
+ info_log("%s: Run: 'kill -%d %d' to enable backtracing.", getprogname(),
+ config.backtrace_signal, getpid());
+ }
+ return true;
+}
diff --git a/libc/malloc_debug/BacktraceData.h b/libc/malloc_debug/BacktraceData.h
new file mode 100644
index 000000000..842e37236
--- /dev/null
+++ b/libc/malloc_debug/BacktraceData.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef DEBUG_MALLOC_BACKTRACEDATA_H
+#define DEBUG_MALLOC_BACKTRACEDATA_H
+
+#include <stdint.h>
+
+#include <private/bionic_macros.h>
+
+// Forward declarations.
+struct Config;
+
+class BacktraceData {
+ public:
+ BacktraceData(const Config& config, size_t* offset);
+ virtual ~BacktraceData() = default;
+
+ bool Initialize(const Config& config);
+
+ inline size_t alloc_offset() { return alloc_offset_; }
+
+ bool enabled() { return enabled_; }
+ void set_enabled(bool enabled) { enabled_ = enabled; }
+
+ private:
+ size_t alloc_offset_ = 0;
+
+ volatile bool enabled_ = false;
+
+ DISALLOW_COPY_AND_ASSIGN(BacktraceData);
+};
+
+#endif // DEBUG_MALLOC_BACKTRACEDATA_H
diff --git a/libc/malloc_debug/Config.cpp b/libc/malloc_debug/Config.cpp
new file mode 100644
index 000000000..cc600861f
--- /dev/null
+++ b/libc/malloc_debug/Config.cpp
@@ -0,0 +1,391 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/cdefs.h>
+
+#include <string>
+#include <vector>
+
+#include <sys/system_properties.h>
+
+#include <private/bionic_macros.h>
+
+#include "Config.h"
+#include "debug_log.h"
+
+// Config constants
+static constexpr uint8_t DEFAULT_FILL_ALLOC_VALUE = 0xeb;
+static constexpr uint8_t DEFAULT_FILL_FREE_VALUE = 0xef;
+
+static constexpr uint8_t DEFAULT_FRONT_GUARD_VALUE = 0xaa;
+static constexpr uint8_t DEFAULT_REAR_GUARD_VALUE = 0xbb;
+
+// Used as the default for all guard values.
+static constexpr size_t DEFAULT_GUARD_BYTES = 32;
+static constexpr size_t MAX_GUARD_BYTES = 16384;
+
+static constexpr size_t DEFAULT_BACKTRACE_FRAMES = 16;
+static constexpr size_t MAX_BACKTRACE_FRAMES = 256;
+
+static constexpr size_t DEFAULT_EXPAND_BYTES = 16;
+static constexpr size_t MAX_EXPAND_BYTES = 16384;
+
+static constexpr size_t DEFAULT_FREE_TRACK_ALLOCATIONS = 100;
+static constexpr size_t MAX_FREE_TRACK_ALLOCATIONS = 16384;
+
+struct Feature {
+ Feature(std::string name, size_t default_value, size_t min_value, size_t max_value,
+ uint64_t option, size_t* value, bool* config, bool combo_option)
+ : name(name), default_value(default_value), min_value(min_value), max_value(max_value),
+ option(option), value(value), config(config), combo_option(combo_option) {}
+ std::string name;
+ size_t default_value = 0;
+ size_t min_value = 0;
+ size_t max_value = 0;
+
+ uint64_t option = 0;
+ size_t* value = nullptr;
+ bool* config = nullptr;
+ // If set to true, then all of the options following are set on until
+ // for which the combo_option value is set.
+ bool combo_option = false;
+};
+
+class PropertyParser {
+ public:
+ PropertyParser(const char* property) : cur_(property) {}
+
+ bool Get(std::string* property, size_t* value, bool* value_set);
+
+ bool Done() { return done_; }
+
+ void LogUsage();
+
+ private:
+ const char* cur_ = nullptr;
+
+ bool done_ = false;
+
+ DISALLOW_COPY_AND_ASSIGN(PropertyParser);
+};
+
+bool PropertyParser::Get(std::string* property, size_t* value, bool* value_set) {
+ // Process each property name we can find.
+ while (isspace(*cur_))
+ ++cur_;
+
+ if (*cur_ == '\0') {
+ done_ = true;
+ return false;
+ }
+
+ const char* property_start = cur_;
+ while (!isspace(*cur_) && *cur_ != '=' && *cur_ != '\0')
+ ++cur_;
+
+ *property = std::string(property_start, cur_ - property_start);
+
+ // Skip any spaces after the name.
+ while (isspace(*cur_) && *cur_ != '=' && *cur_ != '\0')
+ ++cur_;
+
+ if (*cur_ == '=') {
+ ++cur_;
+ errno = 0;
+ *value_set = true;
+ char* end;
+ long read_value = strtol(cur_, const_cast<char**>(&end), 10);
+ if (errno != 0) {
+ error_log("%s: bad value for option '%s': %s", getprogname(), property->c_str(),
+ strerror(errno));
+ return false;
+ }
+ if (cur_ == end || (!isspace(*end) && *end != '\0')) {
+ if (cur_ == end) {
+ error_log("%s: bad value for option '%s'", getprogname(), property->c_str());
+ } else {
+ error_log("%s: bad value for option '%s', non space found after option: %s",
+ getprogname(), property->c_str(), end);
+ }
+ return false;
+ } else if (read_value < 0) {
+ error_log("%s: bad value for option '%s', value cannot be negative: %ld",
+ getprogname(), property->c_str(), read_value);
+ return false;
+ }
+ *value = static_cast<size_t>(read_value);
+ cur_ = end;
+ } else {
+ *value_set = false;
+ }
+ return true;
+}
+
+void PropertyParser::LogUsage() {
+ error_log("malloc debug options usage:");
+ error_log("");
+ error_log(" front_guard[=XX]");
+ error_log(" Enables a front guard on all allocations. If XX is set");
+ error_log(" it sets the number of bytes in the guard. The default is");
+ error_log(" %zu bytes, the max bytes is %zu.", DEFAULT_GUARD_BYTES, MAX_GUARD_BYTES);
+ error_log("");
+ error_log(" rear_guard[=XX]");
+ error_log(" Enables a rear guard on all allocations. If XX is set");
+ error_log(" it sets the number of bytes in the guard. The default is");
+ error_log(" %zu bytes, the max bytes is %zu.", DEFAULT_GUARD_BYTES, MAX_GUARD_BYTES);
+ error_log("");
+ error_log(" guard[=XX]");
+ error_log(" Enables both a front guard and a rear guard on all allocations.");
+ error_log(" If XX is set it sets the number of bytes in both guards.");
+ error_log(" The default is %zu bytes, the max bytes is %zu.",
+ DEFAULT_GUARD_BYTES, MAX_GUARD_BYTES);
+ error_log("");
+ error_log(" backtrace[=XX]");
+ error_log(" Enable capturing the backtrace at the point of allocation.");
+ error_log(" If XX is set it sets the number of backtrace frames.");
+ error_log(" The default is %zu frames, the max number of frames is %zu.",
+ DEFAULT_BACKTRACE_FRAMES, MAX_BACKTRACE_FRAMES);
+ error_log("");
+ error_log(" backtrace_enable_on_signal[=XX]");
+ error_log(" Enable capturing the backtrace at the point of allocation.");
+ error_log(" The backtrace capture is not enabled until the process");
+ error_log(" receives a signal. If XX is set it sets the number of backtrace");
+ error_log(" frames. The default is %zu frames, the max number of frames is %zu.",
+ DEFAULT_BACKTRACE_FRAMES, MAX_BACKTRACE_FRAMES);
+ error_log("");
+ error_log(" fill_on_alloc[=XX]");
+ error_log(" On first allocation, fill with the value 0x%02x.", DEFAULT_FILL_ALLOC_VALUE);
+ error_log(" If XX is set it will only fill up to XX bytes of the");
+ error_log(" allocation. The default is to fill the entire allocation.");
+ error_log("");
+ error_log(" fill_on_free[=XX]");
+ error_log(" On free, fill with the value 0x%02x. If XX is set it will",
+ DEFAULT_FILL_FREE_VALUE);
+ error_log(" only fill up to XX bytes of the allocation. The default is to");
+ error_log(" fill the entire allocation.");
+ error_log("");
+ error_log(" fill[=XX]");
+ error_log(" On both first allocation free, fill with the value 0x%02x on",
+ DEFAULT_FILL_ALLOC_VALUE);
+ error_log(" first allocation and the value 0x%02x. If XX is set, only fill",
+ DEFAULT_FILL_FREE_VALUE);
+ error_log(" up to XX bytes. The default is to fill the entire allocation.");
+ error_log("");
+ error_log(" expand_alloc[=XX]");
+ error_log(" Allocate an extra number of bytes for every allocation call.");
+ error_log(" If XX is set, that is the number of bytes to expand the");
+ error_log(" allocation by. The default is %zu bytes, the max bytes is %zu.",
+ DEFAULT_EXPAND_BYTES, MAX_EXPAND_BYTES);
+ error_log("");
+ error_log(" free_track[=XX]");
+ error_log(" When a pointer is freed, do not free the memory right away.");
+ error_log(" Instead, keep XX of these allocations around and then verify");
+ error_log(" that they have not been modified when the total number of freed");
+ error_log(" allocations exceeds the XX amount. When the program terminates,");
+ error_log(" the rest of these allocations are verified. When this option is");
+ error_log(" enabled, it automatically records the backtrace at the time of the free.");
+ error_log(" The default is to record %zu allocations, the max allocations",
+ DEFAULT_FREE_TRACK_ALLOCATIONS);
+ error_log(" to record is %zu.", MAX_FREE_TRACK_ALLOCATIONS);
+ error_log("");
+ error_log(" free_track_backtrace_num_frames[=XX]");
+ error_log(" This option only has meaning if free_track is set. This indicates");
+ error_log(" how many backtrace frames to capture when an allocation is freed.");
+ error_log(" If XX is set, that is the number of frames to capture. If XX");
+ error_log(" is set to zero, then no backtrace will be captured.");
+ error_log(" The default is to record %zu frames, the max number of frames is %zu.",
+ DEFAULT_BACKTRACE_FRAMES, MAX_BACKTRACE_FRAMES);
+ error_log("");
+ error_log(" leak_track");
+ error_log(" Enable the leak tracking of memory allocations.");
+}
+
+static bool SetFeature(
+ const std::string name, const Feature& feature, size_t value, bool value_set) {
+ if (feature.config) {
+ *feature.config = true;
+ }
+ if (feature.value != nullptr) {
+ if (value_set) {
+ if (value < feature.min_value) {
+ error_log("%s: bad value for option '%s', value must be >= %zu: %zu",
+ getprogname(), name.c_str(), feature.min_value, value);
+ return false;
+ } else if (value > feature.max_value) {
+ error_log("%s: bad value for option '%s', value must be <= %zu: %zu",
+ getprogname(), name.c_str(), feature.max_value, value);
+ return false;
+ }
+ *feature.value = value;
+ } else {
+ *feature.value = feature.default_value;
+ }
+ } else if (value_set) {
+ error_log("%s: value set for option '%s' which does not take a value",
+ getprogname(), name.c_str());
+ return false;
+ }
+ return true;
+}
+
+// This function is designed to be called once. A second call will not
+// reset all variables.
+bool Config::SetFromProperties() {
+ char property_str[PROP_VALUE_MAX];
+ memset(property_str, 0, sizeof(property_str));
+ if (!__system_property_get("libc.debug.malloc.options", property_str)) {
+ return false;
+ }
+
+ // Initialize a few default values.
+ fill_alloc_value = DEFAULT_FILL_ALLOC_VALUE;
+ fill_free_value = DEFAULT_FILL_FREE_VALUE;
+ front_guard_value = DEFAULT_FRONT_GUARD_VALUE;
+ rear_guard_value = DEFAULT_REAR_GUARD_VALUE;
+ backtrace_signal = SIGRTMAX - 19;
+ free_track_backtrace_num_frames = 16;
+
+ // Parse the options are of the format:
+ // option_name or option_name=XX
+
+ // Supported features:
+ const Feature features[] = {
+ Feature("guard", DEFAULT_GUARD_BYTES, 1, MAX_GUARD_BYTES, 0, nullptr, nullptr, true),
+ // Enable front guard. Value is the size of the guard.
+ Feature("front_guard", DEFAULT_GUARD_BYTES, 1, MAX_GUARD_BYTES, FRONT_GUARD,
+ &this->front_guard_bytes, nullptr, true),
+ // Enable end guard. Value is the size of the guard.
+ Feature("rear_guard", DEFAULT_GUARD_BYTES, 1, MAX_GUARD_BYTES, REAR_GUARD,
+ &this->rear_guard_bytes, nullptr, true),
+
+ // Enable logging the backtrace on allocation. Value is the total
+ // number of frames to log.
+ Feature("backtrace", DEFAULT_BACKTRACE_FRAMES, 1, MAX_BACKTRACE_FRAMES,
+ BACKTRACE | TRACK_ALLOCS, &this->backtrace_frames, &this->backtrace_enabled, false),
+ // Enable gathering backtrace values on a signal.
+ Feature("backtrace_enable_on_signal", DEFAULT_BACKTRACE_FRAMES, 1, MAX_BACKTRACE_FRAMES,
+ BACKTRACE | TRACK_ALLOCS, &this->backtrace_frames, &this->backtrace_enable_on_signal,
+ false),
+
+ Feature("fill", SIZE_MAX, 1, SIZE_MAX, 0, nullptr, nullptr, true),
+ // Fill the allocation with an arbitrary pattern on allocation.
+ // Value is the number of bytes of the allocation to fill
+ // (default entire allocation).
+ Feature("fill_on_alloc", SIZE_MAX, 1, SIZE_MAX, FILL_ON_ALLOC, &this->fill_on_alloc_bytes,
+ nullptr, true),
+ // Fill the allocation with an arbitrary pattern on free.
+ // Value is the number of bytes of the allocation to fill
+ // (default entire allocation).
+ Feature("fill_on_free", SIZE_MAX, 1, SIZE_MAX, FILL_ON_FREE, &this->fill_on_free_bytes, nullptr, true),
+
+ // Expand the size of every alloc by this number bytes. Value is
+ // the total number of bytes to expand every allocation by.
+ Feature ("expand_alloc", DEFAULT_EXPAND_BYTES, 1, MAX_EXPAND_BYTES, EXPAND_ALLOC,
+ &this->expand_alloc_bytes, nullptr, false),
+
+ // Keep track of the freed allocations and verify at a later date
+ // that they have not been used. Turning this on, also turns on
+ // fill on free.
+ Feature("free_track", DEFAULT_FREE_TRACK_ALLOCATIONS, 1, MAX_FREE_TRACK_ALLOCATIONS,
+ FREE_TRACK | FILL_ON_FREE, &this->free_track_allocations, nullptr, false),
+ // Number of backtrace frames to keep when free_track is enabled. If this
+ // value is set to zero, no backtrace will be kept.
+ Feature("free_track_backtrace_num_frames", DEFAULT_BACKTRACE_FRAMES,
+ 0, MAX_BACKTRACE_FRAMES, 0, &this->free_track_backtrace_num_frames, nullptr, false),
+
+ // Enable printing leaked allocations.
+ Feature("leak_track", 0, 0, 0, LEAK_TRACK | TRACK_ALLOCS, nullptr, nullptr, false),
+ };
+
+ // Process each property name we can find.
+ std::string property;
+ size_t value;
+ bool value_set;
+ PropertyParser parser(property_str);
+ bool valid = true;
+ while (valid && parser.Get(&property, &value, &value_set)) {
+ bool found = false;
+ for (size_t i = 0; i < sizeof(features)/sizeof(Feature); i++) {
+ if (property == features[i].name) {
+ if (features[i].option == 0 && features[i].combo_option) {
+ i++;
+ for (; i < sizeof(features)/sizeof(Feature) && features[i].combo_option; i++) {
+ if (!SetFeature(property, features[i], value, value_set)) {
+ valid = false;
+ break;
+ }
+ options |= features[i].option;
+ }
+ if (!valid) {
+ break;
+ }
+ } else {
+ if (!SetFeature(property, features[i], value, value_set)) {
+ valid = false;
+ break;
+ }
+ options |= features[i].option;
+ }
+ found = true;
+ break;
+ }
+ }
+ if (valid && !found) {
+ error_log("%s: unknown option %s", getprogname(), property.c_str());
+ valid = false;
+ break;
+ }
+ }
+
+ valid = valid && parser.Done();
+
+ if (valid) {
+ // It's necessary to align the front guard to MINIMUM_ALIGNMENT_BYTES to
+ // make sure that the header is aligned properly.
+ if (options & FRONT_GUARD) {
+ front_guard_bytes = BIONIC_ALIGN(front_guard_bytes, MINIMUM_ALIGNMENT_BYTES);
+ }
+
+ // This situation can occur if the free_track option is specified and
+ // the fill_on_free option is not. In this case, indicate the whole
+ // allocation should be filled.
+ if ((options & FILL_ON_FREE) && fill_on_free_bytes == 0) {
+ fill_on_free_bytes = SIZE_MAX;
+ }
+ } else {
+ parser.LogUsage();
+ }
+
+ return valid;
+}
diff --git a/libc/malloc_debug/Config.h b/libc/malloc_debug/Config.h
new file mode 100644
index 000000000..cb1de5a04
--- /dev/null
+++ b/libc/malloc_debug/Config.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef MALLOC_DEBUG_CONFIG_H
+#define MALLOC_DEBUG_CONFIG_H
+
+#include <stdint.h>
+
+constexpr uint64_t FRONT_GUARD = 0x1;
+constexpr uint64_t REAR_GUARD = 0x2;
+constexpr uint64_t BACKTRACE = 0x4;
+constexpr uint64_t FILL_ON_ALLOC = 0x8;
+constexpr uint64_t FILL_ON_FREE = 0x10;
+constexpr uint64_t EXPAND_ALLOC = 0x20;
+constexpr uint64_t FREE_TRACK = 0x40;
+constexpr uint64_t TRACK_ALLOCS = 0x80;
+constexpr uint64_t LEAK_TRACK = 0x100;
+
+// In order to guarantee posix compliance, set the minimum alignment
+// to 8 bytes for 32 bit systems and 16 bytes for 64 bit systems.
+#if defined(__LP64__)
+constexpr size_t MINIMUM_ALIGNMENT_BYTES = 16;
+#else
+constexpr size_t MINIMUM_ALIGNMENT_BYTES = 8;
+#endif
+
+// If only one or more of these options is set, then no special header is needed.
+constexpr uint64_t NO_HEADER_OPTIONS = FILL_ON_ALLOC | FILL_ON_FREE | EXPAND_ALLOC;
+
+struct Config {
+ bool SetFromProperties();
+
+ size_t front_guard_bytes = 0;
+ size_t rear_guard_bytes = 0;
+
+ bool backtrace_enable_on_signal = false;
+ int backtrace_signal = 0;
+ bool backtrace_enabled = false;
+ size_t backtrace_frames = 0;
+
+ size_t fill_on_alloc_bytes = 0;
+ size_t fill_on_free_bytes = 0;
+
+ size_t expand_alloc_bytes = 0;
+
+ size_t free_track_allocations = 0;
+ size_t free_track_backtrace_num_frames = 0;
+
+ uint64_t options = 0;
+ uint8_t fill_alloc_value;
+ uint8_t fill_free_value;
+ uint8_t front_guard_value;
+ uint8_t rear_guard_value;
+};
+
+#endif // MALLOC_DEBUG_CONFIG_H
diff --git a/libc/malloc_debug/DebugData.cpp b/libc/malloc_debug/DebugData.cpp
new file mode 100644
index 000000000..0447566b0
--- /dev/null
+++ b/libc/malloc_debug/DebugData.cpp
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdint.h>
+
+#include "BacktraceData.h"
+#include "Config.h"
+#include "DebugData.h"
+#include "debug_disable.h"
+#include "FreeTrackData.h"
+#include "GuardData.h"
+#include "malloc_debug.h"
+#include "TrackData.h"
+
+bool DebugData::Initialize() {
+ if (!config_.SetFromProperties()) {
+ return false;
+ }
+
+ // Check to see if the options that require a header are enabled.
+ if ((config_.options & ~(NO_HEADER_OPTIONS)) != 0) {
+ need_header_ = true;
+
+ // Initialize all of the static header offsets.
+ pointer_offset_ = BIONIC_ALIGN(sizeof(Header), MINIMUM_ALIGNMENT_BYTES);
+
+ if (config_.options & BACKTRACE) {
+ backtrace.reset(new BacktraceData(config_, &pointer_offset_));
+ if (!backtrace->Initialize(config_)) {
+ return false;
+ }
+ }
+
+ if (config_.options & FRONT_GUARD) {
+ front_guard.reset(new FrontGuardData(config_, &pointer_offset_));
+ }
+
+ extra_bytes_ = pointer_offset_;
+
+ // Initialize all of the non-header data.
+ if (config_.options & REAR_GUARD) {
+ rear_guard.reset(new RearGuardData(config_));
+ extra_bytes_ += config_.rear_guard_bytes;
+ }
+
+ if (config_.options & FREE_TRACK) {
+ free_track.reset(new FreeTrackData(config_));
+ }
+
+ if (config_.options & TRACK_ALLOCS) {
+ track.reset(new TrackData());
+ }
+ }
+
+ if (config_.options & EXPAND_ALLOC) {
+ extra_bytes_ += config_.expand_alloc_bytes;
+ }
+ return true;
+}
+
+void DebugData::PrepareFork() {
+ if (track != nullptr) {
+ track->PrepareFork();
+ }
+}
+
+void DebugData::PostForkParent() {
+ if (track != nullptr) {
+ track->PostForkParent();
+ }
+}
+
+void DebugData::PostForkChild() {
+ if (track != nullptr) {
+ track->PostForkChild();
+ }
+}
diff --git a/libc/malloc_debug/DebugData.h b/libc/malloc_debug/DebugData.h
new file mode 100644
index 000000000..4600b33bc
--- /dev/null
+++ b/libc/malloc_debug/DebugData.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef DEBUG_MALLOC_DEBUGDATA_H
+#define DEBUG_MALLOC_DEBUGDATA_H
+
+#include <stdint.h>
+
+#include <memory>
+#include <vector>
+
+#include <private/bionic_macros.h>
+
+#include "BacktraceData.h"
+#include "Config.h"
+#include "FreeTrackData.h"
+#include "GuardData.h"
+#include "malloc_debug.h"
+#include "TrackData.h"
+
+class DebugData {
+ public:
+ DebugData() = default;
+ ~DebugData() = default;
+
+ bool Initialize();
+
+ static bool Disabled();
+
+ inline void* GetPointer(const Header* header) {
+ uintptr_t value = reinterpret_cast<uintptr_t>(header);
+ return reinterpret_cast<void*>(value + pointer_offset_);
+ }
+
+ Header* GetHeader(const void* pointer) {
+ uintptr_t value = reinterpret_cast<uintptr_t>(pointer);
+ return reinterpret_cast<Header*>(value - pointer_offset_);
+ }
+
+ BacktraceHeader* GetAllocBacktrace(const Header* header) {
+ uintptr_t value = reinterpret_cast<uintptr_t>(header);
+ return reinterpret_cast<BacktraceHeader*>(value + backtrace->alloc_offset());
+ }
+
+ uint8_t* GetFrontGuard(const Header* header) {
+ uintptr_t value = reinterpret_cast<uintptr_t>(header);
+ return reinterpret_cast<uint8_t*>(value + front_guard->offset());
+ }
+
+ uint8_t* GetRearGuard(const Header* header) {
+ uintptr_t value = reinterpret_cast<uintptr_t>(GetPointer(header));
+ return reinterpret_cast<uint8_t*>(value + header->real_size());
+ }
+
+ const Config& config() { return config_; }
+ size_t pointer_offset() { return pointer_offset_; }
+ bool need_header() { return need_header_; }
+ size_t extra_bytes() { return extra_bytes_; }
+
+ void PrepareFork();
+ void PostForkParent();
+ void PostForkChild();
+
+ std::unique_ptr<BacktraceData> backtrace;
+ std::unique_ptr<TrackData> track;
+ std::unique_ptr<FrontGuardData> front_guard;
+ std::unique_ptr<RearGuardData> rear_guard;
+ std::unique_ptr<FreeTrackData> free_track;
+
+ private:
+ size_t extra_bytes_ = 0;
+
+ size_t pointer_offset_ = 0;
+ bool need_header_ = false;
+
+ Config config_;
+
+ DISALLOW_COPY_AND_ASSIGN(DebugData);
+};
+
+#endif // MALLOC_DEBUG_DEBUGDATA_H
diff --git a/libc/malloc_debug/FreeTrackData.cpp b/libc/malloc_debug/FreeTrackData.cpp
new file mode 100644
index 000000000..470f40bf8
--- /dev/null
+++ b/libc/malloc_debug/FreeTrackData.cpp
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdint.h>
+
+#include "backtrace.h"
+#include "Config.h"
+#include "DebugData.h"
+#include "debug_disable.h"
+#include "debug_log.h"
+#include "FreeTrackData.h"
+#include "malloc_debug.h"
+
+FreeTrackData::FreeTrackData(const Config& config)
+ : backtrace_num_frames_(config.free_track_backtrace_num_frames) {
+ cmp_mem_.resize(4096);
+ memset(cmp_mem_.data(), config.fill_free_value, cmp_mem_.size());
+}
+
+void FreeTrackData::LogFreeError(DebugData& debug, const Header* header,
+ const uint8_t* pointer) {
+ ScopedDisableDebugCalls disable;
+
+ error_log(LOG_DIVIDER);
+ error_log("+++ ALLOCATION %p USED AFTER FREE", pointer);
+ uint8_t fill_free_value = debug.config().fill_free_value;
+ for (size_t i = 0; i < header->usable_size; i++) {
+ if (pointer[i] != fill_free_value) {
+ error_log(" allocation[%zu] = 0x%02x (expected 0x%02x)", i, pointer[i], fill_free_value);
+ }
+ }
+ auto back_iter = backtraces_.find(header);
+ if (back_iter != backtraces_.end()) {
+ const BacktraceHeader* back_header = back_iter->second;
+ error_log("Backtrace at time of free:");
+ backtrace_log(&back_header->frames[0], back_header->num_frames);
+ }
+ error_log(LOG_DIVIDER);
+}
+
+void FreeTrackData::VerifyAndFree(DebugData& debug, const Header* header,
+ const void* pointer) {
+ ScopedDisableDebugCalls disable;
+
+ if (header->tag != DEBUG_FREE_TAG) {
+ error_log(LOG_DIVIDER);
+ error_log("+++ ALLOCATION %p HAS CORRUPTED HEADER TAG 0x%x AFTER FREE", pointer, header->tag);
+ error_log(LOG_DIVIDER);
+ } else {
+ const uint8_t* memory = reinterpret_cast<const uint8_t*>(pointer);
+ size_t bytes = header->usable_size;
+ bytes = (bytes < debug.config().fill_on_free_bytes) ? bytes : debug.config().fill_on_free_bytes;
+ while (bytes > 0) {
+ size_t bytes_to_cmp = (bytes < cmp_mem_.size()) ? bytes : cmp_mem_.size();
+ if (memcmp(memory, cmp_mem_.data(), bytes_to_cmp) != 0) {
+ LogFreeError(debug, header, reinterpret_cast<const uint8_t*>(pointer));
+ break;
+ }
+ bytes -= bytes_to_cmp;
+ memory = &memory[bytes_to_cmp];
+ }
+ }
+
+ auto back_iter = backtraces_.find(header);
+ if (back_iter != backtraces_.end()) {
+ g_dispatch->free(reinterpret_cast<void*>(back_iter->second));
+ backtraces_.erase(header);
+ }
+ g_dispatch->free(header->orig_pointer);
+}
+
+void FreeTrackData::Add(DebugData& debug, const Header* header) {
+ // Make sure the stl calls below don't call the debug_XXX functions.
+ ScopedDisableDebugCalls disable;
+
+ pthread_mutex_lock(&mutex_);
+ if (list_.size() == debug.config().free_track_allocations) {
+ const Header* old_header = list_.back();
+ VerifyAndFree(debug, old_header, debug.GetPointer(old_header));
+ list_.pop_back();
+ }
+
+ if (backtrace_num_frames_ > 0) {
+ BacktraceHeader* back_header = reinterpret_cast<BacktraceHeader*>(
+ g_dispatch->malloc(sizeof(BacktraceHeader) + backtrace_num_frames_ * sizeof(uintptr_t)));
+ if (back_header) {
+ back_header->num_frames = backtrace_get(&back_header->frames[0], backtrace_num_frames_);
+ backtraces_[header] = back_header;
+ }
+ }
+ list_.push_front(header);
+
+ pthread_mutex_unlock(&mutex_);
+}
+
+void FreeTrackData::VerifyAll(DebugData& debug) {
+ // Make sure the stl calls below don't call the debug_XXX functions.
+ ScopedDisableDebugCalls disable;
+
+ for (const auto& header : list_) {
+ VerifyAndFree(debug, header, debug.GetPointer(header));
+ }
+ list_.clear();
+}
+
+void FreeTrackData::LogBacktrace(const Header* header) {
+ ScopedDisableDebugCalls disable;
+
+ auto back_iter = backtraces_.find(header);
+ if (back_iter == backtraces_.end()) {
+ return;
+ }
+
+ error_log("Backtrace of original free:");
+ backtrace_log(&back_iter->second->frames[0], back_iter->second->num_frames);
+}
diff --git a/libc/malloc_debug/FreeTrackData.h b/libc/malloc_debug/FreeTrackData.h
new file mode 100644
index 000000000..804b5a6db
--- /dev/null
+++ b/libc/malloc_debug/FreeTrackData.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef DEBUG_MALLOC_FREETRACKDATA_H
+#define DEBUG_MALLOC_FREETRACKDATA_H
+
+#include <stdint.h>
+#include <pthread.h>
+
+#include <deque>
+#include <unordered_map>
+#include <vector>
+
+#include <private/bionic_macros.h>
+
+// Forward declarations.
+struct Header;
+class DebugData;
+struct Config;
+struct BacktraceHeader;
+
+class FreeTrackData {
+ public:
+ FreeTrackData(const Config& config);
+ virtual ~FreeTrackData() = default;
+
+ void Add(DebugData& debug, const Header* header);
+
+ void VerifyAll(DebugData& debug);
+
+ void LogBacktrace(const Header* header);
+
+ private:
+ void LogFreeError(DebugData& debug, const Header* header, const uint8_t* pointer);
+ void VerifyAndFree(DebugData& debug, const Header* header, const void* pointer);
+
+ pthread_mutex_t mutex_ = PTHREAD_MUTEX_INITIALIZER;
+ std::deque<const Header*> list_;
+ std::vector<uint8_t> cmp_mem_;
+ std::unordered_map<const Header*, BacktraceHeader*> backtraces_;
+ size_t backtrace_num_frames_;
+
+ DISALLOW_COPY_AND_ASSIGN(FreeTrackData);
+};
+
+#endif // DEBUG_MALLOC_FREETRACKDATA_H
diff --git a/libc/malloc_debug/GuardData.cpp b/libc/malloc_debug/GuardData.cpp
new file mode 100644
index 000000000..97b16ffad
--- /dev/null
+++ b/libc/malloc_debug/GuardData.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdint.h>
+#include <string.h>
+
+#include <vector>
+
+#include "backtrace.h"
+#include "Config.h"
+#include "debug_disable.h"
+#include "debug_log.h"
+#include "DebugData.h"
+#include "malloc_debug.h"
+#include "GuardData.h"
+
+GuardData::GuardData(int init_value, size_t num_bytes) {
+ // Create a buffer for fast comparisons of the front guard.
+ cmp_mem_.resize(num_bytes);
+ memset(cmp_mem_.data(), init_value, cmp_mem_.size());
+}
+
+void GuardData::LogFailure(const Header* header, const void* pointer, const void* data) {
+ ScopedDisableDebugCalls disable;
+
+ error_log(LOG_DIVIDER);
+ error_log("+++ ALLOCATION %p SIZE %zu HAS A CORRUPTED %s GUARD", pointer,
+ header->real_size(), GetTypeName());
+
+ // Log all of the failing bytes.
+ const uint8_t* expected = cmp_mem_.data();
+ int pointer_idx = reinterpret_cast<uintptr_t>(data) - reinterpret_cast<uintptr_t>(pointer);
+ const uint8_t* real = reinterpret_cast<const uint8_t*>(data);
+ for (size_t i = 0; i < cmp_mem_.size(); i++, pointer_idx++) {
+ if (real[i] != expected[i]) {
+ error_log(" allocation[%d] = 0x%02x (expected 0x%02x)", pointer_idx, real[i], expected[i]);
+ }
+ }
+
+ error_log("Backtrace at time of failure:");
+ std::vector<uintptr_t> frames(64);
+ size_t frame_num = backtrace_get(frames.data(), frames.size());
+ frames.resize(frame_num);
+ backtrace_log(frames.data(), frames.size());
+ error_log(LOG_DIVIDER);
+}
+
+FrontGuardData::FrontGuardData(const Config& config, size_t* offset)
+ : GuardData(config.front_guard_value, config.front_guard_bytes) {
+ // Create a buffer for fast comparisons of the front guard.
+ cmp_mem_.resize(config.front_guard_bytes);
+ memset(cmp_mem_.data(), config.front_guard_value, cmp_mem_.size());
+ // Assumes that front_bytes is a multiple of MINIMUM_ALIGNMENT_BYTES.
+ offset_ = *offset;
+ *offset += config.front_guard_bytes;
+}
+
+bool FrontGuardData::Valid(DebugData& debug, const Header* header) {
+ return GuardData::Valid(debug.GetFrontGuard(header));
+}
+
+void FrontGuardData::LogFailure(DebugData& debug, const Header* header) {
+ GuardData::LogFailure(header, debug.GetPointer(header), debug.GetFrontGuard(header));
+}
+
+RearGuardData::RearGuardData(const Config& config)
+ : GuardData(config.rear_guard_value, config.rear_guard_bytes) {
+}
+
+bool RearGuardData::Valid(DebugData& debug, const Header* header) {
+ return GuardData::Valid(debug.GetRearGuard(header));
+}
+
+void RearGuardData::LogFailure(DebugData& debug, const Header* header) {
+ GuardData::LogFailure(header, debug.GetPointer(header), debug.GetRearGuard(header));
+}
diff --git a/libc/malloc_debug/GuardData.h b/libc/malloc_debug/GuardData.h
new file mode 100644
index 000000000..4de270250
--- /dev/null
+++ b/libc/malloc_debug/GuardData.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef DEBUG_MALLOC_GUARDDATA_H
+#define DEBUG_MALLOC_GUARDDATA_H
+
+#include <stdint.h>
+#include <string.h>
+
+#include <vector>
+
+#include <private/bionic_macros.h>
+
+// Forward declarations.
+class DebugData;
+struct Header;
+struct Config;
+
+class GuardData {
+ public:
+ GuardData(int init_value, size_t num_bytes);
+ virtual ~GuardData() = default;
+
+ bool Valid(void* data) { return memcmp(data, cmp_mem_.data(), cmp_mem_.size()) == 0; }
+
+ void LogFailure(const Header* header, const void* pointer, const void* data);
+
+ protected:
+ std::vector<uint8_t> cmp_mem_;
+
+ virtual const char* GetTypeName() = 0;
+
+ DISALLOW_COPY_AND_ASSIGN(GuardData);
+};
+
+class FrontGuardData : public GuardData {
+ public:
+ FrontGuardData(const Config& config, size_t* offset);
+ virtual ~FrontGuardData() = default;
+
+ bool Valid(DebugData& debug, const Header* header);
+
+ void LogFailure(DebugData& debug, const Header* header);
+
+ size_t offset() { return offset_; }
+
+ private:
+ const char* GetTypeName() override { return "FRONT"; }
+
+ size_t offset_ = 0;
+
+ DISALLOW_COPY_AND_ASSIGN(FrontGuardData);
+};
+
+class RearGuardData : public GuardData {
+ public:
+ RearGuardData(const Config& config);
+ virtual ~RearGuardData() = default;
+
+ bool Valid(DebugData& debug, const Header* header);
+
+ void LogFailure(DebugData& debug, const Header* header);
+
+ private:
+ const char* GetTypeName() override { return "REAR"; }
+
+ DISALLOW_COPY_AND_ASSIGN(RearGuardData);
+};
+
+#endif // DEBUG_MALLOC_GUARDDATA_H
diff --git a/libc/malloc_debug/MapData.cpp b/libc/malloc_debug/MapData.cpp
new file mode 100644
index 000000000..d57017e34
--- /dev/null
+++ b/libc/malloc_debug/MapData.cpp
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ctype.h>
+#include <elf.h>
+#include <inttypes.h>
+#include <link.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <vector>
+
+#include "MapData.h"
+
+// Format of /proc/<PID>/maps:
+// 6f000000-6f01e000 rwxp 00000000 00:0c 16389419 /system/lib/libcomposer.so
+static MapEntry* parse_line(char* line) {
+ uintptr_t start;
+ uintptr_t end;
+ uintptr_t offset;
+ char permissions[5];
+ int name_pos;
+ if (sscanf(line, "%" PRIxPTR "-%" PRIxPTR " %4s %" PRIxPTR " %*x:%*x %*d %n", &start,
+ &end, permissions, &offset, &name_pos) < 2) {
+ return nullptr;
+ }
+
+ const char* name = line + name_pos;
+ size_t name_len = strlen(name);
+ if (name_len && name[name_len - 1] == '\n') {
+ name_len -= 1;
+ }
+
+ MapEntry* entry = new MapEntry(start, end, offset, name, name_len);
+ if (permissions[0] != 'r') {
+ // Any unreadable map will just get a zero load base.
+ entry->load_base = 0;
+ entry->load_base_read = true;
+ }
+ return entry;
+}
+
+template<typename T>
+static inline bool get_val(MapEntry* entry, uintptr_t addr, T* store) {
+ if (addr < entry->start || addr + sizeof(T) > entry->end) {
+ return false;
+ }
+ // Make sure the address is aligned properly.
+ if (addr & (sizeof(T)-1)) {
+ return false;
+ }
+ *store = *reinterpret_cast<T*>(addr);
+ return true;
+}
+
+static void read_loadbase(MapEntry* entry) {
+ entry->load_base = 0;
+ entry->load_base_read = true;
+ uintptr_t addr = entry->start;
+ ElfW(Ehdr) ehdr;
+ if (!get_val<ElfW(Half)>(entry, addr + offsetof(ElfW(Ehdr), e_phnum), &ehdr.e_phnum)) {
+ return;
+ }
+ if (!get_val<ElfW(Off)>(entry, addr + offsetof(ElfW(Ehdr), e_phoff), &ehdr.e_phoff)) {
+ return;
+ }
+ addr += ehdr.e_phoff;
+ for (size_t i = 0; i < ehdr.e_phnum; i++) {
+ ElfW(Phdr) phdr;
+ if (!get_val<ElfW(Word)>(entry, addr + offsetof(ElfW(Phdr), p_type), &phdr.p_type)) {
+ return;
+ }
+ if (!get_val<ElfW(Off)>(entry, addr + offsetof(ElfW(Phdr), p_offset), &phdr.p_offset)) {
+ return;
+ }
+ if (phdr.p_type == PT_LOAD && phdr.p_offset == entry->offset) {
+ if (!get_val<ElfW(Addr)>(entry, addr + offsetof(ElfW(Phdr), p_vaddr), &phdr.p_vaddr)) {
+ return;
+ }
+ entry->load_base = phdr.p_vaddr;
+ return;
+ }
+ addr += sizeof(phdr);
+ }
+}
+
+bool MapData::ReadMaps() {
+ FILE* fp = fopen("/proc/self/maps", "re");
+ if (fp == nullptr) {
+ return false;
+ }
+
+ std::vector<char> buffer(1024);
+ while (fgets(buffer.data(), buffer.size(), fp) != nullptr) {
+ MapEntry* entry = parse_line(buffer.data());
+ if (entry == nullptr) {
+ fclose(fp);
+ return false;
+ }
+
+ auto it = entries_.find(entry);
+ if (it == entries_.end()) {
+ entries_.insert(entry);
+ } else {
+ delete entry;
+ }
+ }
+ fclose(fp);
+ return true;
+}
+
+MapData::~MapData() {
+ for (auto* entry : entries_) {
+ delete entry;
+ }
+ entries_.clear();
+}
+
+// Find the containing map info for the PC.
+const MapEntry* MapData::find(uintptr_t pc, uintptr_t* rel_pc) {
+ MapEntry pc_entry(pc);
+
+ std::lock_guard<std::mutex> lock(m_);
+
+ auto it = entries_.find(&pc_entry);
+ if (it == entries_.end()) {
+ ReadMaps();
+ }
+ it = entries_.find(&pc_entry);
+ if (it == entries_.end()) {
+ return nullptr;
+ }
+
+ MapEntry *entry = *it;
+ if (!entry->load_base_read) {
+ read_loadbase(entry);
+ }
+ if (rel_pc) {
+ *rel_pc = pc - entry->start + entry->load_base;
+ }
+ return entry;
+}
diff --git a/libc/malloc_debug/MapData.h b/libc/malloc_debug/MapData.h
new file mode 100644
index 000000000..023813910
--- /dev/null
+++ b/libc/malloc_debug/MapData.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef DEBUG_MALLOC_MAPDATA_H
+#define DEBUG_MALLOC_MAPDATA_H
+
+#include <sys/cdefs.h>
+
+#include <mutex>
+#include <string>
+#include <set>
+
+#include <private/bionic_macros.h>
+
+struct MapEntry {
+ MapEntry(uintptr_t start, uintptr_t end, uintptr_t offset, const char* name, size_t name_len)
+ : start(start), end(end), offset(offset), name(name, name_len) {}
+
+ MapEntry(uintptr_t pc) : start(pc), end(pc) {}
+
+ uintptr_t start;
+ uintptr_t end;
+ uintptr_t offset;
+ uintptr_t load_base;
+ bool load_base_read = false;
+ std::string name;
+};
+
+
+// Ordering comparator that returns equivalence for overlapping entries
+struct compare_entries {
+ bool operator()(const MapEntry* a, const MapEntry* b) const {
+ return a->end <= b->start;
+ }
+};
+
+class MapData {
+ public:
+ MapData() = default;
+ ~MapData();
+
+ const MapEntry* find(uintptr_t pc, uintptr_t* rel_pc = nullptr);
+
+ private:
+ bool ReadMaps();
+
+ std::mutex m_;
+ std::set<MapEntry*, compare_entries> entries_;
+
+ DISALLOW_COPY_AND_ASSIGN(MapData);
+};
+
+#endif // DEBUG_MALLOC_MAPDATA_H
diff --git a/libc/malloc_debug/README.md b/libc/malloc_debug/README.md
new file mode 100644
index 000000000..3fc2305df
--- /dev/null
+++ b/libc/malloc_debug/README.md
@@ -0,0 +1,330 @@
+Malloc Debug
+============
+
+Malloc debug is a method of debugging native memory problems. It can help
+detect memory corruption, memory leaks, and use after free issues.
+
+Currently, malloc debug requires root to enable. When it is enabled, it works
+by adding a shim layer that replaces the normal allocation calls. The replaced
+calls are:
+
+<pre>
+malloc
+free
+calloc
+realloc
+posix_memalign
+memalign
+malloc_usable_size
+</pre>
+
+On 32 bit systems, these two deprecated functions are also replaced:
+
+<pre>
+pvalloc
+valloc
+</pre>
+
+Any errors detected by the library are reported in the log.
+
+Controlling Malloc Debug Behavior
+---------------------------------
+Malloc debug is controlled by individual options. Each option can be enabled
+individually, or in a group of other options. Every single option can be
+combined with every other option.
+
+Option Descriptions
+-------------------
+### front\_guard[=SIZE\_BYTES]
+Enables a small buffer placed before the allocated data. This is an attempt
+to find memory corruption occuring to a region before the original allocation.
+On first allocation, this front guard is written with a specific pattern (0xaa).
+When the allocation is freed, the guard is checked to verify it has not been
+modified. If any part of the front guard is modified, an error will be reported
+in the log indicating what bytes changed.
+
+If the backtrace option is also enabled, then any error message will include
+the backtrace of the allocation site.
+
+If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
+The default is 32 bytes, the max bytes is 16384. SIZE\_BYTES will be
+padded so that it is a multiple of 8 bytes on 32 bit systems and 16 bytes
+on 64 bit systems to make sure that the allocation returned is aligned
+properly.
+
+This option adds a special header to all allocations that contains the guard
+and information about the original allocation.
+
+Example error:
+
+<pre>
+04-10 12:00:45.621 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED FRONT GUARD
+04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[-32] = 0x00 (expected 0xaa)
+04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[-15] = 0x02 (expected 0xaa)
+</pre>
+
+### rear\_guard[=SIZE\_BYTES]
+Enables a small buffer placed after the allocated data. This is an attempt
+to find memory corruption occuring to a region after the original allocation.
+On first allocation, this rear guard is written with a specific pattern (0xbb).
+When the allocation is freed, the guard is checked to verify it has not been
+modified. If any part of the rear guard is modified, an error will be reported
+in the log indicating what bytes changed.
+
+If SIZE\_BYTES is present, it indicates the number of bytes in the guard.
+The default is 32 bytes, the max bytes is 16384.
+
+This option adds a special header to all allocations that contains
+information about the original allocation.
+
+Example error:
+
+<pre>
+04-10 12:00:45.621 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 SIZE 100 HAS A CORRUPTED REAR GUARD
+04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[130] = 0xbf (expected 0xbb)
+04-10 12:00:45.622 7412 7412 E malloc_debug: allocation[131] = 0x00 (expected 0xbb)
+</pre>
+
+### guard[=SIZE\_BYTES]
+Enables both a front guard and a rear guard on all allocations.
+
+If SIZE\_BYTES is present, it indicates the number of bytes in both guards.
+The default is 32 bytes, the max bytes is 16384.
+
+### backtrace[=MAX\_FRAMES]
+Enable capturing the backtrace of each allocation site.
+This option will slow down allocations by an order of magnitude. If the
+system runs too slowly with this option enabled, decreasing the maximum number
+of frames captured will speed the allocations up.
+
+Note that any backtrace frames that occur within the malloc backtrace library
+itself are not recorded.
+
+If MAX\_FRAMES is present, it indicates the maximum number of frames to
+capture in a backtrace. The default is 16 frames, the maximumum value
+this can be set to is 256.
+
+This option adds a special header to all allocations that contains the
+backtrace and information about the original allocation.
+
+### backtrace\_enable\_on\_signal[=MAX\_FRAMES]
+Enable capturing the backtrace of each allocation site. If the
+backtrace capture is toggled when the process receives the signal
+SIGRTMAX - 19 (which is 45 on most Android devices). When this
+option is used alone, backtrace capture starts out disabled until the signal
+is received. If both this option and the backtrace option are set, then
+backtrace capture is enabled until the signal is received.
+
+If MAX\_FRAMES is present, it indicates the maximum number of frames to
+capture in a backtrace. The default is 16 frames, the maximumum value
+this can be set to is 256.
+
+This option adds a special header to all allocations that contains the
+backtrace and information about the original allocation.
+
+### fill\_on\_alloc[=MAX\_FILLED\_BYTES]
+Any allocation routine, other than calloc, will result in the allocation being
+filled with the value 0xeb. When doing a realloc to a larger size, the bytes
+above the original usable size will be set to 0xeb.
+
+If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
+of bytes in the allocation. The default is to fill the entire allocation.
+
+### fill\_on\_free[=MAX\_FILLED\_BYTES]
+When an allocation is freed, fill it with 0xef.
+
+If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
+of bytes in the allocation. The default is to fill the entire allocation.
+
+### fill[=MAX\_FILLED\_BYTES]
+This enables both the fill\_on\_alloc option and the fill\_on\_free option.
+
+If MAX\_FILLED\_BYTES is present, it will only fill up to the specified number
+of bytes in the allocation. The default is to fill the entire allocation.
+
+### expand\_alloc[=EXPAND\_BYTES]
+Add an extra amount to allocate for every allocation.
+
+If XX is present, it is the number of bytes to expand the allocation by.
+The default is 16 bytes, the max bytes is 16384.
+
+### free\_track[=ALLOCATION\_COUNT]
+When a pointer is freed, do not free the memory right away, but add it to
+a list of freed allocations. In addition to being added to the list, the
+entire allocation is filled with the value 0xef, and the backtrace at
+the time of the free is recorded. The backtrace recording is completely
+separate from the backtrace option, and happens automatically if this
+option is enabled. By default, a maximum of 16 frames will be recorded,
+but this value can be changed using the free\_track\_backtrace\_num\_frames
+option. It can also be completely disabled by setting the option to zero.
+See the full description of this option below.
+
+When the list is full, an allocation is removed from the list and is
+checked to make sure that none of the contents have been modified since
+being placed on the list. When the program terminates, all of the allocations
+left on the list are verified.
+
+If ALLOCATION\_COUNT is present, it indicates the total number of allocations
+in the list. The default is to record 100 freed allocations, the max
+allocations to record is 16384.
+
+This option adds a special header to all allocations that contains
+information about the original allocation.
+
+Example error:
+
+<pre>
+04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE
+04-15 12:00:31.305 7412 7412 E malloc_debug: allocation[20] = 0xaf (expected 0xef)
+04-15 12:00:31.305 7412 7412 E malloc_debug: allocation[99] = 0x12 (expected 0xef)
+04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of free:
+04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
+04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
+</pre>
+
+In addition, there is another type of error message that can occur if
+an allocation has a special header applied, and the header is corrupted
+before the verification occurs. This is the error message that will be found
+in the log:
+
+<pre>
++++ ALLOCATION 0x12345678 HAS CORRUPTED HEADER TAG 0x1cc7dc00 AFTER FREE
+</pre>
+
+### free\_track\_backtrace\_num\_frames[=MAX\_FRAMES]
+This option only has meaning if free\_track is set. It indicates how many
+backtrace frames to capture when an allocation is freed.
+
+If MAX\_FRAMES is present, it indicates the number of frames to capture.
+If the value is set to zero, then no backtrace will be captured when the
+allocation is freed. The default is to record 16 frames, the max number of
+frames to to record is 256.
+
+### leak\_track
+Track all live allocations. When the program terminates, all of the live
+allocations will be dumped to the log. If the backtrace option was enabled,
+then the log will include the backtrace of the leaked allocations. This
+option is not useful when enabled globally because a lot of programs do not
+free everything before the program terminates.
+
+This option adds a special header to all allocations that contains
+information about the original allocation.
+
+Example leak error found in the log:
+
+<pre>
+04-15 12:35:33.304 7412 7412 E malloc_debug: +++ APP leaked block of size 100 at 0x2be3b0b0 (leak 1 of 2)
+04-15 12:35:33.304 7412 7412 E malloc_debug: Backtrace at time of allocation:
+04-15 12:35:33.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
+04-15 12:35:33.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
+04-15 12:35:33.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
+04-15 12:35:33.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
+04-15 12:35:33.305 7412 7412 E malloc_debug: +++ APP leaked block of size 24 at 0x7be32380 (leak 2 of 2)
+04-15 12:35:33.305 7412 7412 E malloc_debug: Backtrace at time of allocation:
+04-15 12:35:33.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
+04-15 12:35:33.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
+04-15 12:35:33.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
+04-15 12:35:33.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
+</pre>
+
+Additional Errors
+-----------------
+There are a few other error messages that might appear in the log.
+
+### Use After Free
+<pre>
+04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (free)
+04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace of original free:
+04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
+04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
+04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
+04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
+</pre>
+
+This indicates that code is attempting to free an already freed pointer. The
+name in parenthesis indicates that the application called the function
+<i>free</i> with the bad pointer.
+
+For example, this message:
+
+<pre>
+04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 USED AFTER FREE (realloc)
+</pre>
+
+Would indicate that the application called the <i>realloc</i> function
+with an already freed pointer.
+
+### Invalid Tag
+<pre>
+04-15 12:00:31.304 7412 7412 E malloc_debug: +++ ALLOCATION 0x12345678 HAS INVALID TAG 1ee7d000 (malloc_usable_size)
+04-15 12:00:31.305 7412 7412 E malloc_debug: Backtrace at time of failure:
+04-15 12:00:31.305 7412 7412 E malloc_debug: #00 pc 00029310 /system/lib/libc.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #01 pc 00021438 /system/lib/libc.so (newlocale+160)
+04-15 12:00:31.305 7412 7412 E malloc_debug: #02 pc 000a9e38 /system/lib/libc++.so
+04-15 12:00:31.305 7412 7412 E malloc_debug: #03 pc 000a28a8 /system/lib/libc++.so
+</pre>
+
+This indicates that a function (malloc\_usable\_size) was called with
+a pointer that is either not allocated memory, or that the memory of
+the pointer has been corrupted.
+
+As with the other error message, the function in parenthesis is the
+function that was called with the bad pointer.
+
+Examples
+========
+Enable backtrace tracking of all allocation for all processes:
+
+<pre>
+ adb shell stop
+ adb shell setprop libc.debug.malloc.options backtrace
+ adb shell start
+</pre>
+
+Enable backtrace tracking for a specific process (ls):
+
+<pre>
+ adb shell setprop libc.debug.malloc.options backtrace
+ adb shell setprop libc.debug.malloc.program ls
+ adb shell ls
+</pre>
+
+Enable backtrace tracking for the zygote and zygote based processes:
+
+<pre>
+ adb shell stop
+ adb shell setprop libc.debug.malloc.program app_process
+ adb shell setprop libc.debug.malloc.options backtrace
+ adb shell start
+</pre>
+
+Enable multiple options (backtrace and guards):
+
+<pre>
+ adb shell stop
+ adb shell setprop libc.debug.malloc.options "\"backtrace guards\""
+ adb shell start
+</pre>
+
+Enable malloc debug when multiple processes have the same name. This method
+can be used to enable malloc debug for only a very specific process if
+multiple processes have the same name.
+
+Note: The double quotes in the adb shell command are necessary. Otherwise,
+the setprop command will fail since the backtrace guards options will look
+like two arguments instead of one.
+
+<pre>
+ adb shell
+ # setprop libc.debug.malloc.env_enabled
+ # setprop libc.debug.malloc.options backtrace
+ # export LIBC_DEBUG_MALLOC_ENABLE 1
+ # ls
+</pre>
diff --git a/libc/malloc_debug/README_api.md b/libc/malloc_debug/README_api.md
new file mode 100644
index 000000000..cd04c32fc
--- /dev/null
+++ b/libc/malloc_debug/README_api.md
@@ -0,0 +1,64 @@
+Native Memory Tracking using libc Callbacks
+-------------------------------------------
+Malloc debug can be used to get information on all of the live allocations
+in a process. The libc library in Android exports two calls that can be
+used to gather this data from a process. This tracking can be enabled using
+either the backtrace option or the backtrace\_enabled\_on\_signal option.
+
+The function to gather the data:
+
+<pre>
+<b>
+extern "C" void get_malloc_leak_info(uint8_t** info, size_t* overall_size, size_t* info_size, size_t* total_memory, size_t* backtrace_size);
+</b>
+</pre>
+
+<i>info</i> is set to a buffer allocated by the call that contains all of
+the allocation information.
+<i>overall\_size</i> is set to the total size of the buffer returned. If this
+<i>info\_size</i>
+value is zero, then there are no allocation being tracked.
+<i>total\_memory</i> is set to the sum of all allocation sizes that are live at
+the point of the function call. This does not include the memory allocated
+by the malloc debug library itself.
+<i>backtrace\_size</i> is set to the maximum number of backtrace entries
+that are present for each allocation.
+
+In order to free the buffer allocated by the function, call:
+
+<pre>
+<b>
+extern "C" void free_malloc_leak_info(uint8_t* info);
+</b>
+</pre>
+
+### Format of info Buffer
+<pre>
+size_t size_of_original_allocation
+size_t num_backtrace_frames
+uintptr_t pc1
+uintptr_t pc2
+uintptr_t pc3
+.
+.
+.
+</pre>
+
+The number of <i>uintptr\_t</i> values is determined by the value
+<i>backtrace\_size</i> as returned by the original call to
+<i>get\_malloc\_leak\_info</i>. This value is not variable, it is the same
+for all the returned data. The value
+<i>num\_backtrace\_frames</i> contains the real number of frames found. The
+extra frames are set to zero. Each <i>uintptr\_t</i> is a pc of the callstack.
+The calls from within the malloc debug library are automatically removed.
+
+For 32 bit systems, <i>size\_t</i> and <i>uintptr\_t</i> are both 4 byte values.
+
+For 64 bit systems, <i>size\_t</i> and <i>uintptr\_t</i> are both 8 byte values.
+
+The total number of these structures returned in <i>info</i> is
+<i>overall\_size</i> divided by <i>info\_size</i>.
+
+Note, the size value in each allocation data structure will have bit 31 set
+if this allocation was created by the Zygote process. This helps to distinguish
+between native allocations created by the application.
diff --git a/libc/malloc_debug/TrackData.cpp b/libc/malloc_debug/TrackData.cpp
new file mode 100644
index 000000000..c9828d02f
--- /dev/null
+++ b/libc/malloc_debug/TrackData.cpp
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <pthread.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <algorithm>
+#include <vector>
+
+#include <private/ScopedPthreadMutexLocker.h>
+
+#include "backtrace.h"
+#include "BacktraceData.h"
+#include "Config.h"
+#include "DebugData.h"
+#include "debug_disable.h"
+#include "debug_log.h"
+#include "malloc_debug.h"
+#include "TrackData.h"
+
+void TrackData::GetList(std::vector<const Header*>* list) {
+ ScopedDisableDebugCalls disable;
+
+ for (const auto& header : headers_) {
+ list->push_back(header);
+ }
+
+ // Sort by the size of the allocation.
+ std::sort(list->begin(), list->end(), [](const Header* a, const Header* b) {
+ if (a->size == b->size) return a < b;
+ return a->size > b->size;
+ });
+}
+
+void TrackData::Add(const Header* header, bool backtrace_found) {
+ ScopedDisableDebugCalls disable;
+
+ pthread_mutex_lock(&mutex_);
+ if (backtrace_found) {
+ total_backtrace_allocs_++;
+ }
+ headers_.insert(header);
+ pthread_mutex_unlock(&mutex_);
+}
+
+void TrackData::Remove(const Header* header, bool backtrace_found) {
+ ScopedDisableDebugCalls disable;
+
+ pthread_mutex_lock(&mutex_);
+ headers_.erase(header);
+ if (backtrace_found) {
+ total_backtrace_allocs_--;
+ }
+ pthread_mutex_unlock(&mutex_);
+}
+
+bool TrackData::Contains(const Header* header) {
+ ScopedDisableDebugCalls disable;
+
+ pthread_mutex_lock(&mutex_);
+ bool found = headers_.count(header);
+ pthread_mutex_unlock(&mutex_);
+ return found;
+}
+
+void TrackData::DisplayLeaks(DebugData& debug) {
+ ScopedDisableDebugCalls disable;
+
+ std::vector<const Header*> list;
+ GetList(&list);
+
+ size_t track_count = 0;
+ for (const auto& header : list) {
+ error_log("+++ %s leaked block of size %zu at %p (leak %zu of %zu)", getprogname(),
+ header->real_size(), debug.GetPointer(header), ++track_count, list.size());
+ if (debug.config().options & BACKTRACE) {
+ BacktraceHeader* back_header = debug.GetAllocBacktrace(header);
+ if (back_header->num_frames > 0) {
+ error_log("Backtrace at time of allocation:");
+ backtrace_log(&back_header->frames[0], back_header->num_frames);
+ }
+ }
+ g_dispatch->free(header->orig_pointer);
+ }
+}
+
+void TrackData::GetInfo(DebugData& debug, uint8_t** info, size_t* overall_size,
+ size_t* info_size, size_t* total_memory, size_t* backtrace_size) {
+ ScopedPthreadMutexLocker scoped(&mutex_);
+
+ if (headers_.size() == 0 || total_backtrace_allocs_ == 0) {
+ return;
+ }
+
+ *backtrace_size = debug.config().backtrace_frames;
+ *info_size = sizeof(size_t) * 2 + sizeof(uintptr_t) * *backtrace_size;
+ *info = reinterpret_cast<uint8_t*>(g_dispatch->calloc(*info_size, total_backtrace_allocs_));
+ if (*info == nullptr) {
+ return;
+ }
+ *overall_size = *info_size * total_backtrace_allocs_;
+
+ std::vector<const Header*> list;
+ GetList(&list);
+
+ uint8_t* data = *info;
+ for (const auto& header : list) {
+ BacktraceHeader* back_header = debug.GetAllocBacktrace(header);
+ if (back_header->num_frames > 0) {
+ memcpy(data, &header->size, sizeof(size_t));
+ memcpy(&data[sizeof(size_t)], &back_header->num_frames, sizeof(size_t));
+ memcpy(&data[2 * sizeof(size_t)], &back_header->frames[0],
+ back_header->num_frames * sizeof(uintptr_t));
+
+ *total_memory += header->real_size();
+
+ data += *info_size;
+ }
+ }
+}
diff --git a/libc/malloc_debug/TrackData.h b/libc/malloc_debug/TrackData.h
new file mode 100644
index 000000000..1234316e4
--- /dev/null
+++ b/libc/malloc_debug/TrackData.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef DEBUG_MALLOC_TRACKDATA_H
+#define DEBUG_MALLOC_TRACKDATA_H
+
+#include <stdint.h>
+#include <pthread.h>
+
+#include <vector>
+#include <unordered_set>
+
+#include <private/bionic_macros.h>
+
+// Forward declarations.
+struct Header;
+struct Config;
+class DebugData;
+
+class TrackData {
+ public:
+ TrackData() = default;
+ virtual ~TrackData() = default;
+
+ void GetList(std::vector<const Header*>* list);
+
+ void Add(const Header* header, bool backtrace_found);
+
+ void Remove(const Header* header, bool backtrace_found);
+
+ bool Contains(const Header *header);
+
+ void GetInfo(DebugData& debug, uint8_t** info, size_t* overall_size,
+ size_t* info_size, size_t* total_memory, size_t* backtrace_size);
+
+ void DisplayLeaks(DebugData& debug);
+
+ void PrepareFork() { pthread_mutex_lock(&mutex_); }
+ void PostForkParent() { pthread_mutex_unlock(&mutex_); }
+ void PostForkChild() { pthread_mutex_init(&mutex_, NULL); }
+
+ private:
+ pthread_mutex_t mutex_ = PTHREAD_MUTEX_INITIALIZER;
+ std::unordered_set<const Header*> headers_;
+ size_t total_backtrace_allocs_ = 0;
+
+ DISALLOW_COPY_AND_ASSIGN(TrackData);
+};
+
+#endif // DEBUG_MALLOC_TRACKDATA_H
diff --git a/libc/malloc_debug/backtrace.cpp b/libc/malloc_debug/backtrace.cpp
new file mode 100644
index 000000000..18ce8b8d7
--- /dev/null
+++ b/libc/malloc_debug/backtrace.cpp
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <dlfcn.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <malloc.h>
+#include <pthread.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <unwind.h>
+
+#include "backtrace.h"
+#include "debug_log.h"
+#include "MapData.h"
+
+#if defined(__LP64__)
+#define PAD_PTR "016" PRIxPTR
+#else
+#define PAD_PTR "08" PRIxPTR
+#endif
+
+typedef struct _Unwind_Context __unwind_context;
+
+extern "C" char* __cxa_demangle(const char*, char*, size_t*, int*);
+
+static MapData g_map_data;
+static const MapEntry* g_current_code_map = nullptr;
+
+static _Unwind_Reason_Code find_current_map(__unwind_context* context, void*) {
+ uintptr_t ip = _Unwind_GetIP(context);
+
+ if (ip == 0) {
+ return _URC_END_OF_STACK;
+ }
+ g_current_code_map = g_map_data.find(ip);
+ return _URC_END_OF_STACK;
+}
+
+void backtrace_startup() {
+ _Unwind_Backtrace(find_current_map, nullptr);
+}
+
+void backtrace_shutdown() {
+}
+
+struct stack_crawl_state_t {
+ uintptr_t* frames;
+ size_t frame_count;
+ size_t cur_frame = 0;
+
+ stack_crawl_state_t(uintptr_t* frames, size_t frame_count)
+ : frames(frames), frame_count(frame_count) {}
+};
+
+static _Unwind_Reason_Code trace_function(__unwind_context* context, void* arg) {
+ stack_crawl_state_t* state = static_cast<stack_crawl_state_t*>(arg);
+
+ uintptr_t ip = _Unwind_GetIP(context);
+
+ // The instruction pointer is pointing at the instruction after the return
+ // call on all architectures.
+ // Modify the pc to point at the real function.
+ if (ip != 0) {
+#if defined(__arm__)
+ // If the ip is suspiciously low, do nothing to avoid a segfault trying
+ // to access this memory.
+ if (ip >= 4096) {
+ // Check bits [15:11] of the first halfword assuming the instruction
+ // is 32 bits long. If the bits are any of these values, then our
+ // assumption was correct:
+ // b11101
+ // b11110
+ // b11111
+ // Otherwise, this is a 16 bit instruction.
+ uint16_t value = (*reinterpret_cast<uint16_t*>(ip - 2)) >> 11;
+ if (value == 0x1f || value == 0x1e || value == 0x1d) {
+ ip -= 4;
+ } else {
+ ip -= 2;
+ }
+ }
+#elif defined(__aarch64__)
+ // All instructions are 4 bytes long, skip back one instruction.
+ ip -= 4;
+#elif defined(__i386__) || defined(__x86_64__)
+ // It's difficult to decode exactly where the previous instruction is,
+ // so subtract 1 to estimate where the instruction lives.
+ ip--;
+#endif
+
+ // Do not record the frames that fall in our own shared library.
+ if (g_current_code_map && (ip >= g_current_code_map->start) && ip < g_current_code_map->end) {
+ return _URC_NO_REASON;
+ }
+ }
+
+ state->frames[state->cur_frame++] = ip;
+ return (state->cur_frame >= state->frame_count) ? _URC_END_OF_STACK : _URC_NO_REASON;
+}
+
+size_t backtrace_get(uintptr_t* frames, size_t frame_count) {
+ stack_crawl_state_t state(frames, frame_count);
+ _Unwind_Backtrace(trace_function, &state);
+ return state.cur_frame;
+}
+
+std::string backtrace_string(const uintptr_t* frames, size_t frame_count) {
+ std::string str;
+
+ for (size_t frame_num = 0; frame_num < frame_count; frame_num++) {
+ uintptr_t offset = 0;
+ const char* symbol = nullptr;
+
+ Dl_info info;
+ if (dladdr(reinterpret_cast<void*>(frames[frame_num]), &info) != 0) {
+ offset = reinterpret_cast<uintptr_t>(info.dli_saddr);
+ symbol = info.dli_sname;
+ }
+
+ uintptr_t rel_pc = offset;
+ const MapEntry* entry = g_map_data.find(frames[frame_num], &rel_pc);
+
+ const char* soname = (entry != nullptr) ? entry->name.c_str() : info.dli_fname;
+ if (soname == nullptr) {
+ soname = "<unknown>";
+ }
+ char buf[1024];
+ if (symbol != nullptr) {
+ char* demangled_symbol = __cxa_demangle(symbol, nullptr, nullptr, nullptr);
+ const char* best_name = (demangled_symbol != nullptr) ? demangled_symbol : symbol;
+
+ __libc_format_buffer(buf, sizeof(buf),
+ " #%02zd pc %" PAD_PTR " %s (%s+%" PRIuPTR ")\n", frame_num,
+ rel_pc, soname, best_name, frames[frame_num] - offset);
+ free(demangled_symbol);
+ } else {
+ __libc_format_buffer(buf, sizeof(buf),
+ " #%02zd pc %" PAD_PTR " %s\n", frame_num, rel_pc, soname);
+ }
+ str += buf;
+ }
+
+ return str;
+}
+
+void backtrace_log(const uintptr_t* frames, size_t frame_count) {
+ error_log_string(backtrace_string(frames, frame_count).c_str());
+}
diff --git a/libc/bionic/debug_stacktrace.h b/libc/malloc_debug/backtrace.h
index 2cf8636d1..f5708737d 100644
--- a/libc/bionic/debug_stacktrace.h
+++ b/libc/malloc_debug/backtrace.h
@@ -26,15 +26,18 @@
* SUCH DAMAGE.
*/
-#ifndef DEBUG_STACKTRACE_H
-#define DEBUG_STACKTRACE_H
+#ifndef MALLOC_DEBUG_BACKTRACE_H
+#define MALLOC_DEBUG_BACKTRACE_H
#include <stdint.h>
#include <sys/cdefs.h>
-__LIBC_HIDDEN__ void backtrace_startup();
-__LIBC_HIDDEN__ void backtrace_shutdown();
-__LIBC_HIDDEN__ int get_backtrace(uintptr_t* stack_frames, size_t max_depth);
-__LIBC_HIDDEN__ void log_backtrace(uintptr_t* stack_frames, size_t frame_count);
+#include <string>
-#endif /* DEBUG_STACKTRACE_H */
+void backtrace_startup();
+void backtrace_shutdown();
+size_t backtrace_get(uintptr_t* frames, size_t frame_count);
+void backtrace_log(const uintptr_t* frames, size_t frame_count);
+std::string backtrace_string(const uintptr_t* frames, size_t frame_count);
+
+#endif // MALLOC_DEBUG_BACKTRACE_H
diff --git a/libc/malloc_debug/debug_disable.cpp b/libc/malloc_debug/debug_disable.cpp
new file mode 100644
index 000000000..af0264bd8
--- /dev/null
+++ b/libc/malloc_debug/debug_disable.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <pthread.h>
+
+#include "DebugData.h"
+#include "debug_disable.h"
+#include "debug_log.h"
+
+extern DebugData* g_debug;
+pthread_key_t g_disable_key;
+
+bool DebugCallsDisabled() {
+ if (g_debug == nullptr || pthread_getspecific(g_disable_key) != nullptr) {
+ return true;
+ }
+ return false;
+}
+
+bool DebugDisableInitialize() {
+ int error = pthread_key_create(&g_disable_key, nullptr);
+ if (error != 0) {
+ error_log("pthread_key_create failed: %s", strerror(error));
+ return false;
+ }
+ pthread_setspecific(g_disable_key, nullptr);
+
+ return true;
+}
+
+void DebugDisableFinalize() {
+ pthread_key_delete(g_disable_key);
+}
+
+void DebugDisableSet(bool disable) {
+ if (disable) {
+ pthread_setspecific(g_disable_key, reinterpret_cast<void*>(1));
+ } else {
+ pthread_setspecific(g_disable_key, nullptr);
+ }
+}
diff --git a/libc/bionic/malloc_debug_disable.h b/libc/malloc_debug/debug_disable.h
index 9503128c4..9edb4df8e 100644
--- a/libc/bionic/malloc_debug_disable.h
+++ b/libc/malloc_debug/debug_disable.h
@@ -29,29 +29,29 @@
#ifndef MALLOC_DEBUG_DISABLE_H
#define MALLOC_DEBUG_DISABLE_H
-#include <pthread.h>
+#include <sys/cdefs.h>
-#include "private/bionic_macros.h"
+#include <private/bionic_macros.h>
// =============================================================================
// Used to disable the debug allocation calls.
// =============================================================================
-extern pthread_key_t g_debug_calls_disabled;
+bool DebugDisableInitialize();
+void DebugDisableFinalize();
-static inline bool DebugCallsDisabled() {
- return pthread_getspecific(g_debug_calls_disabled) != NULL;
-}
+bool DebugCallsDisabled();
+void DebugDisableSet(bool disable);
class ScopedDisableDebugCalls {
public:
ScopedDisableDebugCalls() : disabled_(DebugCallsDisabled()) {
if (!disabled_) {
- pthread_setspecific(g_debug_calls_disabled, reinterpret_cast<const void*>(1));
+ DebugDisableSet(true);
}
}
~ScopedDisableDebugCalls() {
if (!disabled_) {
- pthread_setspecific(g_debug_calls_disabled, NULL);
+ DebugDisableSet(false);
}
}
diff --git a/libc/bionic/if_nametoindex.c b/libc/malloc_debug/debug_log.h
index d670e43e2..4df040805 100644
--- a/libc/bionic/if_nametoindex.c
+++ b/libc/malloc_debug/debug_log.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2009 The Android Open Source Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -26,33 +26,21 @@
* SUCH DAMAGE.
*/
-#include <string.h>
-#include <unistd.h>
-#include <linux/sockios.h>
-#include <net/if.h>
-#include <sys/socket.h>
-#include <sys/ioctl.h>
+#ifndef MALLOC_DEBUG_LOG_H
+#define MALLOC_DEBUG_LOG_H
-/*
- * Map an interface name into its corresponding index.
- * Returns 0 on error, as 0 is not a valid index.
- */
-unsigned int if_nametoindex(const char *ifname)
-{
- int index;
- int ctl_sock;
- struct ifreq ifr;
+#include <private/libc_logging.h>
- memset(&ifr, 0, sizeof(struct ifreq));
- strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
- ifr.ifr_name[IFNAMSIZ - 1] = 0;
+// =============================================================================
+// log functions
+// =============================================================================
+#define debug_log(format, ...) \
+ __libc_format_log(ANDROID_LOG_DEBUG, "malloc_debug", (format), ##__VA_ARGS__ )
+#define error_log(format, ...) \
+ __libc_format_log(ANDROID_LOG_ERROR, "malloc_debug", (format), ##__VA_ARGS__ )
+#define error_log_string(str) \
+ __libc_write_log(ANDROID_LOG_ERROR, "malloc_debug", (str))
+#define info_log(format, ...) \
+ __libc_format_log(ANDROID_LOG_INFO, "malloc_debug", (format), ##__VA_ARGS__ )
- index = 0;
- if ((ctl_sock = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
- if (ioctl(ctl_sock, SIOCGIFINDEX, &ifr) >= 0) {
- index = ifr.ifr_ifindex;
- }
- close(ctl_sock);
- }
- return index;
-}
+#endif // MALLOC_DEBUG_LOG_H
diff --git a/libc/malloc_debug/exported32.map b/libc/malloc_debug/exported32.map
new file mode 100644
index 000000000..a985ef9dd
--- /dev/null
+++ b/libc/malloc_debug/exported32.map
@@ -0,0 +1,24 @@
+LIBC_MALLOC_DEBUG {
+ global:
+ debug_calloc;
+ debug_finalize;
+ debug_free;
+ debug_free_malloc_leak_info;
+ debug_get_malloc_leak_info;
+ debug_initialize;
+ debug_iterate;
+ debug_mallinfo;
+ debug_malloc;
+ debug_malloc_backtrace;
+ debug_malloc_disable;
+ debug_malloc_enable;
+ debug_malloc_usable_size;
+ debug_memalign;
+ debug_posix_memalign;
+ debug_pvalloc;
+ debug_realloc;
+ debug_valloc;
+
+ local:
+ *;
+};
diff --git a/libc/malloc_debug/exported64.map b/libc/malloc_debug/exported64.map
new file mode 100644
index 000000000..1a6b30fae
--- /dev/null
+++ b/libc/malloc_debug/exported64.map
@@ -0,0 +1,22 @@
+LIBC_MALLOC_DEBUG {
+ global:
+ debug_calloc;
+ debug_finalize;
+ debug_free;
+ debug_free_malloc_leak_info;
+ debug_get_malloc_leak_info;
+ debug_initialize;
+ debug_iterate;
+ debug_mallinfo;
+ debug_malloc;
+ debug_malloc_backtrace;
+ debug_malloc_disable;
+ debug_malloc_enable;
+ debug_malloc_usable_size;
+ debug_memalign;
+ debug_posix_memalign;
+ debug_realloc;
+
+ local:
+ *;
+};
diff --git a/libc/malloc_debug/malloc_debug.cpp b/libc/malloc_debug/malloc_debug.cpp
new file mode 100644
index 000000000..1ee76897d
--- /dev/null
+++ b/libc/malloc_debug/malloc_debug.cpp
@@ -0,0 +1,699 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <inttypes.h>
+#include <malloc.h>
+#include <string.h>
+#include <sys/cdefs.h>
+#include <sys/param.h>
+#include <unistd.h>
+
+#include <vector>
+
+#include <private/bionic_malloc_dispatch.h>
+
+#include "backtrace.h"
+#include "Config.h"
+#include "DebugData.h"
+#include "debug_disable.h"
+#include "debug_log.h"
+#include "malloc_debug.h"
+
+// ------------------------------------------------------------------------
+// Global Data
+// ------------------------------------------------------------------------
+DebugData* g_debug;
+
+int* g_malloc_zygote_child;
+
+const MallocDispatch* g_dispatch;
+// ------------------------------------------------------------------------
+
+// ------------------------------------------------------------------------
+// Use C style prototypes for all exported functions. This makes it easy
+// to do dlsym lookups during libc initialization when malloc debug
+// is enabled.
+// ------------------------------------------------------------------------
+__BEGIN_DECLS
+
+bool debug_initialize(const MallocDispatch* malloc_dispatch, int* malloc_zygote_child);
+void debug_finalize();
+void debug_get_malloc_leak_info(
+ uint8_t** info, size_t* overall_size, size_t* info_size, size_t* total_memory,
+ size_t* backtrace_size);
+ssize_t debug_malloc_backtrace(void* pointer, uintptr_t* frames, size_t frame_count);
+void debug_free_malloc_leak_info(uint8_t* info);
+size_t debug_malloc_usable_size(void* pointer);
+void* debug_malloc(size_t size);
+void debug_free(void* pointer);
+void* debug_memalign(size_t alignment, size_t bytes);
+void* debug_realloc(void* pointer, size_t bytes);
+void* debug_calloc(size_t nmemb, size_t bytes);
+struct mallinfo debug_mallinfo();
+int debug_posix_memalign(void** memptr, size_t alignment, size_t size);
+int debug_iterate(uintptr_t base, size_t size,
+ void (*callback)(uintptr_t base, size_t size, void* arg), void* arg);
+void debug_malloc_disable();
+void debug_malloc_enable();
+
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+void* debug_pvalloc(size_t bytes);
+void* debug_valloc(size_t size);
+#endif
+
+__END_DECLS
+// ------------------------------------------------------------------------
+
+static void InitAtfork() {
+ static pthread_once_t atfork_init = PTHREAD_ONCE_INIT;
+ pthread_once(&atfork_init, [](){
+ pthread_atfork(
+ [](){
+ if (g_debug != nullptr) {
+ g_debug->PrepareFork();
+ }
+ },
+ [](){
+ if (g_debug != nullptr) {
+ g_debug->PostForkParent();
+ }
+ },
+ [](){
+ if (g_debug != nullptr) {
+ g_debug->PostForkChild();
+ }
+ }
+ );
+ });
+}
+
+static void LogTagError(const Header* header, const void* pointer, const char* name) {
+ ScopedDisableDebugCalls disable;
+
+ error_log(LOG_DIVIDER);
+ if (header->tag == DEBUG_FREE_TAG) {
+ error_log("+++ ALLOCATION %p USED AFTER FREE (%s)", pointer, name);
+ if (g_debug->config().options & FREE_TRACK) {
+ g_debug->free_track->LogBacktrace(header);
+ }
+ } else {
+ error_log("+++ ALLOCATION %p HAS INVALID TAG %" PRIx32 " (%s)", pointer, header->tag, name);
+ }
+ error_log("Backtrace at time of failure:");
+ std::vector<uintptr_t> frames(64);
+ size_t frame_num = backtrace_get(frames.data(), frames.size());
+ frames.resize(frame_num);
+ backtrace_log(frames.data(), frames.size());
+ error_log(LOG_DIVIDER);
+}
+
+static void* InitHeader(Header* header, void* orig_pointer, size_t size) {
+ header->tag = DEBUG_TAG;
+ header->orig_pointer = orig_pointer;
+ header->size = size;
+ if (*g_malloc_zygote_child) {
+ header->set_zygote();
+ }
+ header->usable_size = g_dispatch->malloc_usable_size(orig_pointer);
+ if (header->usable_size == 0) {
+ g_dispatch->free(orig_pointer);
+ return nullptr;
+ }
+ header->usable_size -= g_debug->pointer_offset() +
+ reinterpret_cast<uintptr_t>(header) - reinterpret_cast<uintptr_t>(orig_pointer);
+
+ if (g_debug->config().options & FRONT_GUARD) {
+ uint8_t* guard = g_debug->GetFrontGuard(header);
+ memset(guard, g_debug->config().front_guard_value, g_debug->config().front_guard_bytes);
+ }
+
+ if (g_debug->config().options & REAR_GUARD) {
+ uint8_t* guard = g_debug->GetRearGuard(header);
+ memset(guard, g_debug->config().rear_guard_value, g_debug->config().rear_guard_bytes);
+ // If the rear guard is enabled, set the usable size to the exact size
+ // of the allocation.
+ header->usable_size = header->real_size();
+ }
+
+ bool backtrace_found = false;
+ if (g_debug->config().options & BACKTRACE) {
+ BacktraceHeader* back_header = g_debug->GetAllocBacktrace(header);
+ if (g_debug->backtrace->enabled()) {
+ ScopedDisableDebugCalls disable;
+ back_header->num_frames = backtrace_get(
+ &back_header->frames[0], g_debug->config().backtrace_frames);
+ backtrace_found = back_header->num_frames > 0;
+ } else {
+ back_header->num_frames = 0;
+ }
+ }
+
+ if (g_debug->config().options & TRACK_ALLOCS) {
+ g_debug->track->Add(header, backtrace_found);
+ }
+
+ return g_debug->GetPointer(header);
+}
+
+bool debug_initialize(const MallocDispatch* malloc_dispatch, int* malloc_zygote_child) {
+ if (malloc_zygote_child == nullptr) {
+ return false;
+ }
+
+ InitAtfork();
+
+ g_malloc_zygote_child = malloc_zygote_child;
+
+ g_dispatch = malloc_dispatch;
+
+ if (!DebugDisableInitialize()) {
+ return false;
+ }
+
+ DebugData* debug = new DebugData();
+ if (!debug->Initialize()) {
+ delete debug;
+ DebugDisableFinalize();
+ return false;
+ }
+ g_debug = debug;
+
+ // Always enable the backtrace code since we will use it in a number
+ // of different error cases.
+ backtrace_startup();
+
+ return true;
+}
+
+void debug_finalize() {
+ if (g_debug == nullptr) {
+ return;
+ }
+
+ if (g_debug->config().options & FREE_TRACK) {
+ g_debug->free_track->VerifyAll(*g_debug);
+ }
+
+ if (g_debug->config().options & LEAK_TRACK) {
+ g_debug->track->DisplayLeaks(*g_debug);
+ }
+
+ DebugDisableSet(true);
+
+ backtrace_shutdown();
+
+ delete g_debug;
+ g_debug = nullptr;
+
+ DebugDisableFinalize();
+}
+
+void debug_get_malloc_leak_info(uint8_t** info, size_t* overall_size,
+ size_t* info_size, size_t* total_memory, size_t* backtrace_size) {
+ ScopedDisableDebugCalls disable;
+
+ // Verify the arguments.
+ if (info == nullptr || overall_size == nullptr || info_size == NULL ||
+ total_memory == nullptr || backtrace_size == nullptr) {
+ error_log("get_malloc_leak_info: At least one invalid parameter.");
+ return;
+ }
+
+ *info = nullptr;
+ *overall_size = 0;
+ *info_size = 0;
+ *total_memory = 0;
+ *backtrace_size = 0;
+
+ if (!(g_debug->config().options & BACKTRACE)) {
+ error_log("get_malloc_leak_info: Allocations not being tracked, to enable "
+ "set the option 'backtrace'.");
+ return;
+ }
+
+ g_debug->track->GetInfo(*g_debug, info, overall_size, info_size, total_memory, backtrace_size);
+}
+
+void debug_free_malloc_leak_info(uint8_t* info) {
+ g_dispatch->free(info);
+}
+
+size_t debug_malloc_usable_size(void* pointer) {
+ if (DebugCallsDisabled() || !g_debug->need_header() || pointer == nullptr) {
+ return g_dispatch->malloc_usable_size(pointer);
+ }
+
+ Header* header = g_debug->GetHeader(pointer);
+ if (header->tag != DEBUG_TAG) {
+ LogTagError(header, pointer, "malloc_usable_size");
+ return 0;
+ }
+
+ return header->usable_size;
+}
+
+void* debug_malloc(size_t size) {
+ if (DebugCallsDisabled()) {
+ return g_dispatch->malloc(size);
+ }
+
+ if (size == 0) {
+ size = 1;
+ }
+
+ size_t real_size = size + g_debug->extra_bytes();
+ if (real_size < size) {
+ // Overflow.
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ void* pointer;
+ if (g_debug->need_header()) {
+ if (size > Header::max_size()) {
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ Header* header = reinterpret_cast<Header*>(
+ g_dispatch->memalign(MINIMUM_ALIGNMENT_BYTES, real_size));
+ if (header == nullptr) {
+ return nullptr;
+ }
+ pointer = InitHeader(header, header, size);
+ } else {
+ pointer = g_dispatch->malloc(real_size);
+ }
+
+ if (pointer != nullptr && g_debug->config().options & FILL_ON_ALLOC) {
+ size_t bytes = debug_malloc_usable_size(pointer);
+ size_t fill_bytes = g_debug->config().fill_on_alloc_bytes;
+ bytes = (bytes < fill_bytes) ? bytes : fill_bytes;
+ memset(pointer, g_debug->config().fill_alloc_value, bytes);
+ }
+ return pointer;
+}
+
+void debug_free(void* pointer) {
+ if (DebugCallsDisabled() || pointer == nullptr) {
+ return g_dispatch->free(pointer);
+ }
+
+ void* free_pointer = pointer;
+ size_t bytes;
+ Header* header;
+ if (g_debug->need_header()) {
+ header = g_debug->GetHeader(pointer);
+ if (header->tag != DEBUG_TAG) {
+ LogTagError(header, pointer, "free");
+ return;
+ }
+ free_pointer = header->orig_pointer;
+
+ if (g_debug->config().options & FRONT_GUARD) {
+ if (!g_debug->front_guard->Valid(*g_debug, header)) {
+ g_debug->front_guard->LogFailure(*g_debug, header);
+ }
+ }
+ if (g_debug->config().options & REAR_GUARD) {
+ if (!g_debug->rear_guard->Valid(*g_debug, header)) {
+ g_debug->rear_guard->LogFailure(*g_debug, header);
+ }
+ }
+
+ if (g_debug->config().options & TRACK_ALLOCS) {
+ bool backtrace_found = false;
+ if (g_debug->config().options & BACKTRACE) {
+ BacktraceHeader* back_header = g_debug->GetAllocBacktrace(header);
+ backtrace_found = back_header->num_frames > 0;
+ }
+ g_debug->track->Remove(header, backtrace_found);
+ }
+ header->tag = DEBUG_FREE_TAG;
+
+ bytes = header->usable_size;
+ } else {
+ bytes = g_dispatch->malloc_usable_size(pointer);
+ }
+
+ if (g_debug->config().options & FILL_ON_FREE) {
+ size_t fill_bytes = g_debug->config().fill_on_free_bytes;
+ bytes = (bytes < fill_bytes) ? bytes : fill_bytes;
+ memset(pointer, g_debug->config().fill_free_value, bytes);
+ }
+
+ if (g_debug->config().options & FREE_TRACK) {
+ // Do not add the allocation until we are done modifying the pointer
+ // itself. This avoids a race if a lot of threads are all doing
+ // frees at the same time and we wind up trying to really free this
+ // pointer from another thread, while still trying to free it in
+ // this function.
+ g_debug->free_track->Add(*g_debug, header);
+ } else {
+ g_dispatch->free(free_pointer);
+ }
+}
+
+void* debug_memalign(size_t alignment, size_t bytes) {
+ if (DebugCallsDisabled()) {
+ return g_dispatch->memalign(alignment, bytes);
+ }
+
+ if (bytes == 0) {
+ bytes = 1;
+ }
+
+ void* pointer;
+ if (g_debug->need_header()) {
+ if (bytes > Header::max_size()) {
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ // Make the alignment a power of two.
+ if (!powerof2(alignment)) {
+ alignment = BIONIC_ROUND_UP_POWER_OF_2(alignment);
+ }
+ // Force the alignment to at least MINIMUM_ALIGNMENT_BYTES to guarantee
+ // that the header is aligned properly.
+ if (alignment < MINIMUM_ALIGNMENT_BYTES) {
+ alignment = MINIMUM_ALIGNMENT_BYTES;
+ }
+
+ // We don't have any idea what the natural alignment of
+ // the underlying native allocator is, so we always need to
+ // over allocate.
+ size_t real_size = alignment + bytes + g_debug->extra_bytes();
+ if (real_size < bytes) {
+ // Overflow.
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ pointer = g_dispatch->malloc(real_size);
+ if (pointer == nullptr) {
+ return nullptr;
+ }
+
+ uintptr_t value = reinterpret_cast<uintptr_t>(pointer) + g_debug->pointer_offset();
+ // Now align the pointer.
+ value += (-value % alignment);
+
+ Header* header = g_debug->GetHeader(reinterpret_cast<void*>(value));
+ pointer = InitHeader(header, pointer, bytes);
+ } else {
+ size_t real_size = bytes + g_debug->extra_bytes();
+ if (real_size < bytes) {
+ // Overflow.
+ errno = ENOMEM;
+ return nullptr;
+ }
+ pointer = g_dispatch->memalign(alignment, real_size);
+ }
+
+ if (pointer != nullptr && g_debug->config().options & FILL_ON_ALLOC) {
+ size_t bytes = debug_malloc_usable_size(pointer);
+ size_t fill_bytes = g_debug->config().fill_on_alloc_bytes;
+ bytes = (bytes < fill_bytes) ? bytes : fill_bytes;
+ memset(pointer, g_debug->config().fill_alloc_value, bytes);
+ }
+ return pointer;
+}
+
+void* debug_realloc(void* pointer, size_t bytes) {
+ if (DebugCallsDisabled()) {
+ return g_dispatch->realloc(pointer, bytes);
+ }
+
+ if (pointer == nullptr) {
+ return debug_malloc(bytes);
+ }
+
+ if (bytes == 0) {
+ debug_free(pointer);
+ return nullptr;
+ }
+
+ size_t real_size = bytes;
+ if (g_debug->config().options & EXPAND_ALLOC) {
+ real_size += g_debug->config().expand_alloc_bytes;
+ if (real_size < bytes) {
+ // Overflow.
+ errno = ENOMEM;
+ return nullptr;
+ }
+ }
+
+ void* new_pointer;
+ size_t prev_size;
+ if (g_debug->need_header()) {
+ if (bytes > Header::max_size()) {
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ Header* header = g_debug->GetHeader(pointer);
+ if (header->tag != DEBUG_TAG) {
+ LogTagError(header, pointer, "realloc");
+ return nullptr;
+ }
+
+ // Same size, do nothing.
+ if (real_size == header->real_size()) {
+ return pointer;
+ }
+
+ // Allocation is shrinking.
+ if (real_size < header->usable_size) {
+ header->size = real_size;
+ if (*g_malloc_zygote_child) {
+ header->set_zygote();
+ }
+ if (g_debug->config().options & REAR_GUARD) {
+ // Don't bother allocating a smaller pointer in this case, simply
+ // change the header usable_size and reset the rear guard.
+ header->usable_size = header->real_size();
+ memset(g_debug->GetRearGuard(header), g_debug->config().rear_guard_value,
+ g_debug->config().rear_guard_bytes);
+ }
+ return pointer;
+ }
+
+ // Allocate the new size.
+ new_pointer = debug_malloc(bytes);
+ if (new_pointer == nullptr) {
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ prev_size = header->usable_size;
+ memcpy(new_pointer, pointer, prev_size);
+ debug_free(pointer);
+ } else {
+ prev_size = g_dispatch->malloc_usable_size(pointer);
+ new_pointer = g_dispatch->realloc(pointer, real_size);
+ if (new_pointer == nullptr) {
+ return nullptr;
+ }
+ }
+
+ if (g_debug->config().options & FILL_ON_ALLOC) {
+ size_t bytes = debug_malloc_usable_size(new_pointer);
+ if (bytes > g_debug->config().fill_on_alloc_bytes) {
+ bytes = g_debug->config().fill_on_alloc_bytes;
+ }
+ if (bytes > prev_size) {
+ memset(reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(new_pointer) + prev_size),
+ g_debug->config().fill_alloc_value, bytes - prev_size);
+ }
+ }
+
+ return new_pointer;
+}
+
+void* debug_calloc(size_t nmemb, size_t bytes) {
+ if (DebugCallsDisabled()) {
+ return g_dispatch->calloc(nmemb, bytes);
+ }
+
+ size_t size;
+ if (__builtin_mul_overflow(nmemb, bytes, &size)) {
+ // Overflow
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ if (size == 0) {
+ size = 1;
+ }
+
+ size_t real_size;
+ if (__builtin_add_overflow(size, g_debug->extra_bytes(), &real_size)) {
+ // Overflow.
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ if (g_debug->need_header()) {
+ // The above check will guarantee the multiply will not overflow.
+ if (size > Header::max_size()) {
+ errno = ENOMEM;
+ return nullptr;
+ }
+
+ // Need to guarantee the alignment of the header.
+ Header* header = reinterpret_cast<Header*>(
+ g_dispatch->memalign(MINIMUM_ALIGNMENT_BYTES, real_size));
+ if (header == nullptr) {
+ return nullptr;
+ }
+ memset(header, 0, g_dispatch->malloc_usable_size(header));
+ return InitHeader(header, header, size);
+ } else {
+ return g_dispatch->calloc(1, real_size);
+ }
+}
+
+struct mallinfo debug_mallinfo() {
+ return g_dispatch->mallinfo();
+}
+
+int debug_posix_memalign(void** memptr, size_t alignment, size_t size) {
+ if (DebugCallsDisabled()) {
+ return g_dispatch->posix_memalign(memptr, alignment, size);
+ }
+
+ if (!powerof2(alignment)) {
+ return EINVAL;
+ }
+ int saved_errno = errno;
+ *memptr = debug_memalign(alignment, size);
+ errno = saved_errno;
+ return (*memptr != nullptr) ? 0 : ENOMEM;
+}
+
+int debug_iterate(uintptr_t base, size_t size,
+ void (*callback)(uintptr_t base, size_t size, void* arg), void* arg) {
+ // Can't allocate, malloc is disabled
+ // Manual capture of the arguments to pass to the lambda below as void* arg
+ struct iterate_ctx {
+ decltype(callback) callback;
+ decltype(arg) arg;
+ } ctx = { callback, arg };
+
+ return g_dispatch->iterate(base, size,
+ [](uintptr_t base, size_t size, void* arg) {
+ const iterate_ctx* ctx = reinterpret_cast<iterate_ctx*>(arg);
+ const void* pointer = reinterpret_cast<void*>(base);
+ if (g_debug->need_header()) {
+ const Header* header = reinterpret_cast<const Header*>(pointer);
+ if (g_debug->config().options & TRACK_ALLOCS) {
+ if (g_debug->track->Contains(header)) {
+ // Return just the body of the allocation if we're sure the header exists
+ ctx->callback(reinterpret_cast<uintptr_t>(g_debug->GetPointer(header)),
+ header->usable_size, ctx->arg);
+ return;
+ }
+ }
+ }
+ // Fall back to returning the whole allocation
+ ctx->callback(base, size, ctx->arg);
+ }, &ctx);
+}
+
+void debug_malloc_disable() {
+ g_dispatch->malloc_disable();
+ if (g_debug->track) {
+ g_debug->track->PrepareFork();
+ }
+}
+
+void debug_malloc_enable() {
+ if (g_debug->track) {
+ g_debug->track->PostForkParent();
+ }
+ g_dispatch->malloc_enable();
+}
+
+ssize_t debug_malloc_backtrace(void* pointer, uintptr_t* frames, size_t frame_count) {
+ if (DebugCallsDisabled() || pointer == nullptr) {
+ return 0;
+ }
+
+ if (g_debug->need_header()) {
+ Header* header;
+ if (g_debug->config().options & TRACK_ALLOCS) {
+ header = g_debug->GetHeader(pointer);
+ if (!g_debug->track->Contains(header)) {
+ return 0;
+ }
+ } else {
+ header = reinterpret_cast<Header*>(pointer);
+ }
+ if (header->tag != DEBUG_TAG) {
+ return 0;
+ }
+ if (g_debug->config().options & BACKTRACE) {
+ BacktraceHeader* back_header = g_debug->GetAllocBacktrace(header);
+ if (back_header->num_frames > 0) {
+ if (frame_count > back_header->num_frames) {
+ frame_count = back_header->num_frames;
+ }
+ memcpy(frames, &back_header->frames[0], frame_count * sizeof(uintptr_t));
+ return frame_count;
+ }
+ }
+ }
+
+ return 0;
+}
+
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+void* debug_pvalloc(size_t bytes) {
+ if (DebugCallsDisabled()) {
+ return g_dispatch->pvalloc(bytes);
+ }
+
+ size_t pagesize = getpagesize();
+ size_t size = BIONIC_ALIGN(bytes, pagesize);
+ if (size < bytes) {
+ // Overflow
+ errno = ENOMEM;
+ return nullptr;
+ }
+ return debug_memalign(pagesize, size);
+}
+
+void* debug_valloc(size_t size) {
+ if (DebugCallsDisabled()) {
+ return g_dispatch->valloc(size);
+ }
+ return debug_memalign(getpagesize(), size);
+}
+#endif
diff --git a/libc/malloc_debug/malloc_debug.h b/libc/malloc_debug/malloc_debug.h
new file mode 100644
index 000000000..347fae236
--- /dev/null
+++ b/libc/malloc_debug/malloc_debug.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef MALLOC_DEBUG_H
+#define MALLOC_DEBUG_H
+
+#include <stdint.h>
+
+#include <private/bionic_malloc_dispatch.h>
+
+// Allocations that require a header include a variable length header.
+// This is the order that data structures will be found. If an optional
+// part of the header does not exist, the other parts of the header
+// will still be in this order.
+// Header (Required)
+// BacktraceHeader (Optional: For the allocation backtrace)
+// uint8_t data (Optional: Front guard, will be a multiple of MINIMUM_ALIGNMENT_BYTES)
+// allocation data
+// uint8_t data (Optional: End guard)
+//
+// If backtracing is enabled, then both BacktraceHeaders will be present.
+//
+// In the initialization function, offsets into the header will be set
+// for each different header location. The offsets are always from the
+// beginning of the Header section.
+struct Header {
+ uint32_t tag;
+ void* orig_pointer;
+ size_t size;
+ size_t usable_size;
+ size_t real_size() const { return size & ~(1U << 31); }
+ void set_zygote() { size |= 1U << 31; }
+ static size_t max_size() { return (1U << 31) - 1; }
+} __attribute__((packed));
+
+struct BacktraceHeader {
+ size_t num_frames;
+ uintptr_t frames[0];
+} __attribute__((packed));
+
+constexpr uint32_t DEBUG_TAG = 0x1ee7d00d;
+constexpr uint32_t DEBUG_FREE_TAG = 0x1cc7dccd;
+constexpr char LOG_DIVIDER[] = "*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***";
+constexpr size_t FREE_TRACK_MEM_BUFFER_SIZE = 4096;
+
+extern const MallocDispatch* g_dispatch;
+
+#endif // MALLOC_DEBUG_H
diff --git a/libc/malloc_debug/tests/backtrace_fake.cpp b/libc/malloc_debug/tests/backtrace_fake.cpp
new file mode 100644
index 000000000..db542e5e2
--- /dev/null
+++ b/libc/malloc_debug/tests/backtrace_fake.cpp
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdint.h>
+
+#include <deque>
+#include <vector>
+#include <utility>
+
+#include "backtrace.h"
+#include "backtrace_fake.h"
+#include "debug_log.h"
+
+static std::deque<std::vector<uintptr_t>> g_fake_backtrace;
+
+void backtrace_fake_clear_all() {
+ g_fake_backtrace.clear();
+}
+
+void backtrace_fake_add(const std::vector<uintptr_t>& ips) {
+ g_fake_backtrace.push_back(ips);
+}
+
+void backtrace_startup() {
+}
+
+void backtrace_shutdown() {
+}
+
+size_t backtrace_get(uintptr_t* frames, size_t frame_num) {
+ if (frame_num == 0 || g_fake_backtrace.size() == 0) {
+ return 0;
+ }
+
+ size_t ips_size = g_fake_backtrace[0].size();
+ size_t total_frames = (frame_num < ips_size) ? frame_num : ips_size;
+ memcpy(frames, g_fake_backtrace[0].data(), sizeof(uintptr_t) * total_frames);
+ g_fake_backtrace.pop_front();
+ return total_frames;
+}
+
+void backtrace_log(const uintptr_t* frames, size_t frame_count) {
+ for (size_t i = 0; i < frame_count; i++) {
+ error_log(" #%02zd pc %p", i, reinterpret_cast<void*>(frames[i]));
+ }
+}
diff --git a/libc/malloc_debug/tests/backtrace_fake.h b/libc/malloc_debug/tests/backtrace_fake.h
new file mode 100644
index 000000000..f2aa7a0e6
--- /dev/null
+++ b/libc/malloc_debug/tests/backtrace_fake.h
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MALLOC_DEBUG_TESTS_BACKTRACE_FAKE_H
+#define MALLOC_DEBUG_TESTS_BACKTRACE_FAKE_H
+
+#include <stdint.h>
+
+#include <vector>
+
+void backtrace_fake_clear_all();
+void backtrace_fake_add(const std::vector<uintptr_t>& ips);
+
+#endif // MALLOC_DEBUG_TESTS_BACKTRACE_FAKE_H
diff --git a/libc/malloc_debug/tests/libc_fake.cpp b/libc/malloc_debug/tests/libc_fake.cpp
new file mode 100644
index 000000000..45ace4d31
--- /dev/null
+++ b/libc/malloc_debug/tests/libc_fake.cpp
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+extern "C" const char* getprogname() {
+ return "malloc_testing";
+}
diff --git a/libc/malloc_debug/tests/log_fake.cpp b/libc/malloc_debug/tests/log_fake.cpp
new file mode 100644
index 000000000..7350ea0df
--- /dev/null
+++ b/libc/malloc_debug/tests/log_fake.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdarg.h>
+
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <log/log.h>
+#include <log/logger.h>
+
+// Forward declarations.
+class Backtrace;
+struct EventTagMap;
+struct AndroidLogEntry;
+
+std::string g_fake_log_buf;
+
+std::string g_fake_log_print;
+
+void resetLogs() {
+ g_fake_log_buf = "";
+ g_fake_log_print = "";
+}
+
+std::string getFakeLogBuf() {
+ return g_fake_log_buf;
+}
+
+std::string getFakeLogPrint() {
+ return g_fake_log_print;
+}
+
+extern "C" int __libc_format_log(int priority, const char* tag, const char* format, ...) {
+ g_fake_log_print += std::to_string(priority) + ' ';
+ g_fake_log_print += tag;
+ g_fake_log_print += ' ';
+
+ va_list ap;
+ va_start(ap, format);
+ android::base::StringAppendV(&g_fake_log_print, format, ap);
+ va_end(ap);
+
+ g_fake_log_print += '\n';
+
+ return 0;
+}
+
+extern "C" int __android_log_buf_write(int bufId, int prio, const char* tag, const char* msg) {
+ g_fake_log_buf += std::to_string(bufId) + ' ' + std::to_string(prio) + ' ';
+ g_fake_log_buf += tag;
+ g_fake_log_buf += ' ';
+ g_fake_log_buf += msg;
+ return 1;
+}
+
+extern "C" int __android_log_print(int prio, const char* tag, const char* fmt, ...) {
+ g_fake_log_print += std::to_string(prio) + ' ';
+ g_fake_log_print += tag;
+ g_fake_log_print += ' ';
+
+ va_list ap;
+ va_start(ap, fmt);
+ android::base::StringAppendV(&g_fake_log_print, fmt, ap);
+ va_end(ap);
+
+ g_fake_log_print += '\n';
+
+ return 1;
+}
+
+extern "C" log_id_t android_name_to_log_id(const char*) {
+ return LOG_ID_SYSTEM;
+}
+
+extern "C" struct logger_list* android_logger_list_open(log_id_t, int, unsigned int, pid_t) {
+ errno = EACCES;
+ return nullptr;
+}
+
+extern "C" int android_logger_list_read(struct logger_list*, struct log_msg*) {
+ return 0;
+}
+
+extern "C" EventTagMap* android_openEventTagMap(const char*) {
+ return nullptr;
+}
+
+extern "C" int android_log_processBinaryLogBuffer(
+ struct logger_entry*,
+ AndroidLogEntry*, const EventTagMap*, char*, int) {
+ return 0;
+}
+
+extern "C" void android_logger_list_free(struct logger_list*) {
+}
diff --git a/benchmarks/utils.h b/libc/malloc_debug/tests/log_fake.h
index c3c64bab2..1ea72f85f 100644
--- a/benchmarks/utils.h
+++ b/libc/malloc_debug/tests/log_fake.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-#ifndef BENCHMARKS_UTILS_H
-#define BENCHMARKS_UTILS_H
+#ifndef MALLOC_DEBUG_TESTS_LOG_FAKE_H
+#define MALLOC_DEBUG_TESTS_LOG_FAKE_H
-#include <stddef.h>
#include <string>
-int Round(int n);
-std::string PrettyInt(long value, size_t base);
+void resetLogs();
+std::string getFakeLogBuf();
+std::string getFakeLogPrint();
-#endif // BENCHMARKS_UTILS_H
+#endif // MALLOC_DEBUG_TESTS_LOG_FAKE_H
diff --git a/libc/malloc_debug/tests/malloc_debug_config_tests.cpp b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
new file mode 100644
index 000000000..85d5cb582
--- /dev/null
+++ b/libc/malloc_debug/tests/malloc_debug_config_tests.cpp
@@ -0,0 +1,628 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <limits.h>
+
+#include <memory>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include "Config.h"
+
+#include "log_fake.h"
+
+extern "C" int property_set(const char*, const char*);
+
+class MallocDebugConfigTest : public ::testing::Test {
+ protected:
+ void SetUp() override {
+ resetLogs();
+ }
+
+ void TearDown() override {
+ }
+
+ std::unique_ptr<Config> config;
+
+ bool InitConfig(const char* property_value) {
+ config.reset(new Config);
+ property_set("libc.debug.malloc.options", property_value);
+ return config->SetFromProperties();
+ }
+};
+
+std::string usage_string(
+ "6 malloc_debug malloc debug options usage:\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug front_guard[=XX]\n"
+ "6 malloc_debug Enables a front guard on all allocations. If XX is set\n"
+ "6 malloc_debug it sets the number of bytes in the guard. The default is\n"
+ "6 malloc_debug 32 bytes, the max bytes is 16384.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug rear_guard[=XX]\n"
+ "6 malloc_debug Enables a rear guard on all allocations. If XX is set\n"
+ "6 malloc_debug it sets the number of bytes in the guard. The default is\n"
+ "6 malloc_debug 32 bytes, the max bytes is 16384.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug guard[=XX]\n"
+ "6 malloc_debug Enables both a front guard and a rear guard on all allocations.\n"
+ "6 malloc_debug If XX is set it sets the number of bytes in both guards.\n"
+ "6 malloc_debug The default is 32 bytes, the max bytes is 16384.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug backtrace[=XX]\n"
+ "6 malloc_debug Enable capturing the backtrace at the point of allocation.\n"
+ "6 malloc_debug If XX is set it sets the number of backtrace frames.\n"
+ "6 malloc_debug The default is 16 frames, the max number of frames is 256.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug backtrace_enable_on_signal[=XX]\n"
+ "6 malloc_debug Enable capturing the backtrace at the point of allocation.\n"
+ "6 malloc_debug The backtrace capture is not enabled until the process\n"
+ "6 malloc_debug receives a signal. If XX is set it sets the number of backtrace\n"
+ "6 malloc_debug frames. The default is 16 frames, the max number of frames is 256.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug fill_on_alloc[=XX]\n"
+ "6 malloc_debug On first allocation, fill with the value 0xeb.\n"
+ "6 malloc_debug If XX is set it will only fill up to XX bytes of the\n"
+ "6 malloc_debug allocation. The default is to fill the entire allocation.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug fill_on_free[=XX]\n"
+ "6 malloc_debug On free, fill with the value 0xef. If XX is set it will\n"
+ "6 malloc_debug only fill up to XX bytes of the allocation. The default is to\n"
+ "6 malloc_debug fill the entire allocation.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug fill[=XX]\n"
+ "6 malloc_debug On both first allocation free, fill with the value 0xeb on\n"
+ "6 malloc_debug first allocation and the value 0xef. If XX is set, only fill\n"
+ "6 malloc_debug up to XX bytes. The default is to fill the entire allocation.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug expand_alloc[=XX]\n"
+ "6 malloc_debug Allocate an extra number of bytes for every allocation call.\n"
+ "6 malloc_debug If XX is set, that is the number of bytes to expand the\n"
+ "6 malloc_debug allocation by. The default is 16 bytes, the max bytes is 16384.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug free_track[=XX]\n"
+ "6 malloc_debug When a pointer is freed, do not free the memory right away.\n"
+ "6 malloc_debug Instead, keep XX of these allocations around and then verify\n"
+ "6 malloc_debug that they have not been modified when the total number of freed\n"
+ "6 malloc_debug allocations exceeds the XX amount. When the program terminates,\n"
+ "6 malloc_debug the rest of these allocations are verified. When this option is\n"
+ "6 malloc_debug enabled, it automatically records the backtrace at the time of the free.\n"
+ "6 malloc_debug The default is to record 100 allocations, the max allocations\n"
+ "6 malloc_debug to record is 16384.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug free_track_backtrace_num_frames[=XX]\n"
+ "6 malloc_debug This option only has meaning if free_track is set. This indicates\n"
+ "6 malloc_debug how many backtrace frames to capture when an allocation is freed.\n"
+ "6 malloc_debug If XX is set, that is the number of frames to capture. If XX\n"
+ "6 malloc_debug is set to zero, then no backtrace will be captured.\n"
+ "6 malloc_debug The default is to record 16 frames, the max number of frames is 256.\n"
+ "6 malloc_debug \n"
+ "6 malloc_debug leak_track\n"
+ "6 malloc_debug Enable the leak tracking of memory allocations.\n"
+);
+
+TEST_F(MallocDebugConfigTest, unknown_option) {
+
+ ASSERT_FALSE(InitConfig("unknown_option"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg("6 malloc_debug malloc_testing: unknown option unknown_option\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, good_option_and_bad_option) {
+ ASSERT_FALSE(InitConfig("backtrace unknown_option"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg("6 malloc_debug malloc_testing: unknown option unknown_option\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, unparseable_number) {
+ ASSERT_FALSE(InitConfig("backtrace=XXX"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg("6 malloc_debug malloc_testing: bad value for option 'backtrace'\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, illegal_value_zero) {
+ ASSERT_FALSE(InitConfig("backtrace=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace', value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, no_space) {
+ ASSERT_FALSE(InitConfig("backtrace=10front_guard"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace', "
+ "non space found after option: front_guard\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, illegal_value_negative) {
+ ASSERT_FALSE(InitConfig("backtrace=-1"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace', "
+ "value cannot be negative: -1\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, overflow) {
+ ASSERT_FALSE(InitConfig("backtrace=99999999999999999999"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace': "
+ "Math result not representable\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, set_value_error) {
+ ASSERT_FALSE(InitConfig("leak_track=12"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: value set for option 'leak_track' "
+ "which does not take a value\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, space_before_equal) {
+ ASSERT_TRUE(InitConfig("backtrace =10"));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options);
+ ASSERT_EQ(10U, config->backtrace_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, space_after_equal) {
+ ASSERT_TRUE(InitConfig("backtrace= 10"));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options);
+ ASSERT_EQ(10U, config->backtrace_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, extra_space) {
+ ASSERT_TRUE(InitConfig(" backtrace=64 "));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options);
+ ASSERT_EQ(64U, config->backtrace_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, multiple_options) {
+ ASSERT_TRUE(InitConfig(" backtrace=64 front_guard=48"));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS | FRONT_GUARD, config->options);
+ ASSERT_EQ(64U, config->backtrace_frames);
+ ASSERT_EQ(48U, config->front_guard_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, front_guard) {
+ ASSERT_TRUE(InitConfig("front_guard=48"));
+ ASSERT_EQ(FRONT_GUARD, config->options);
+ ASSERT_EQ(48U, config->front_guard_bytes);
+
+ ASSERT_TRUE(InitConfig("front_guard"));
+ ASSERT_EQ(FRONT_GUARD, config->options);
+ ASSERT_EQ(32U, config->front_guard_bytes);
+
+ ASSERT_TRUE(InitConfig("front_guard=39"));
+ ASSERT_EQ(FRONT_GUARD, config->options);
+#if defined(__LP64__)
+ ASSERT_EQ(48U, config->front_guard_bytes);
+#else
+ ASSERT_EQ(40U, config->front_guard_bytes);
+#endif
+
+ ASSERT_TRUE(InitConfig("front_guard=41"));
+ ASSERT_EQ(FRONT_GUARD, config->options);
+ ASSERT_EQ(48U, config->front_guard_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, rear_guard) {
+ ASSERT_TRUE(InitConfig("rear_guard=50"));
+ ASSERT_EQ(REAR_GUARD, config->options);
+ ASSERT_EQ(50U, config->rear_guard_bytes);
+
+ ASSERT_TRUE(InitConfig("rear_guard"));
+ ASSERT_EQ(REAR_GUARD, config->options);
+ ASSERT_EQ(32U, config->rear_guard_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, guard) {
+ ASSERT_TRUE(InitConfig("guard=32"));
+ ASSERT_EQ(FRONT_GUARD | REAR_GUARD, config->options);
+ ASSERT_EQ(32U, config->front_guard_bytes);
+ ASSERT_EQ(32U, config->rear_guard_bytes);
+
+ ASSERT_TRUE(InitConfig("guard"));
+ ASSERT_EQ(FRONT_GUARD | REAR_GUARD, config->options);
+ ASSERT_EQ(32U, config->front_guard_bytes);
+ ASSERT_EQ(32U, config->rear_guard_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, backtrace) {
+ ASSERT_TRUE(InitConfig("backtrace=64"));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options);
+ ASSERT_EQ(64U, config->backtrace_frames);
+
+ ASSERT_TRUE(InitConfig("backtrace"));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options);
+ ASSERT_EQ(16U, config->backtrace_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, backtrace_enable_on_signal) {
+ ASSERT_TRUE(InitConfig("backtrace_enable_on_signal=64"));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options);
+ ASSERT_EQ(64U, config->backtrace_frames);
+
+ ASSERT_TRUE(InitConfig("backtrace_enable_on_signal"));
+ ASSERT_EQ(BACKTRACE | TRACK_ALLOCS, config->options);
+ ASSERT_EQ(16U, config->backtrace_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, fill_on_alloc) {
+ ASSERT_TRUE(InitConfig("fill_on_alloc=64"));
+ ASSERT_EQ(FILL_ON_ALLOC, config->options);
+ ASSERT_EQ(64U, config->fill_on_alloc_bytes);
+
+ ASSERT_TRUE(InitConfig("fill_on_alloc"));
+ ASSERT_EQ(FILL_ON_ALLOC, config->options);
+ ASSERT_EQ(SIZE_MAX, config->fill_on_alloc_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, fill_on_free) {
+ ASSERT_TRUE(InitConfig("fill_on_free=64"));
+ ASSERT_EQ(FILL_ON_FREE, config->options);
+ ASSERT_EQ(64U, config->fill_on_free_bytes);
+
+ ASSERT_TRUE(InitConfig("fill_on_free"));
+ ASSERT_EQ(FILL_ON_FREE, config->options);
+ ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, fill) {
+ ASSERT_TRUE(InitConfig("fill=64"));
+ ASSERT_EQ(FILL_ON_ALLOC | FILL_ON_FREE, config->options);
+ ASSERT_EQ(64U, config->fill_on_alloc_bytes);
+ ASSERT_EQ(64U, config->fill_on_free_bytes);
+
+ ASSERT_TRUE(InitConfig("fill"));
+ ASSERT_EQ(FILL_ON_ALLOC | FILL_ON_FREE, config->options);
+ ASSERT_EQ(SIZE_MAX, config->fill_on_alloc_bytes);
+ ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, expand_alloc) {
+ ASSERT_TRUE(InitConfig("expand_alloc=1234"));
+ ASSERT_EQ(EXPAND_ALLOC, config->options);
+ ASSERT_EQ(1234U, config->expand_alloc_bytes);
+
+ ASSERT_TRUE(InitConfig("expand_alloc"));
+ ASSERT_EQ(EXPAND_ALLOC, config->options);
+ ASSERT_EQ(16U, config->expand_alloc_bytes);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track) {
+ ASSERT_TRUE(InitConfig("free_track=1234"));
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options);
+ ASSERT_EQ(1234U, config->free_track_allocations);
+ ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes);
+ ASSERT_EQ(16U, config->free_track_backtrace_num_frames);
+
+ ASSERT_TRUE(InitConfig("free_track"));
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options);
+ ASSERT_EQ(100U, config->free_track_allocations);
+ ASSERT_EQ(SIZE_MAX, config->fill_on_free_bytes);
+ ASSERT_EQ(16U, config->free_track_backtrace_num_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track_and_fill_on_free) {
+ ASSERT_TRUE(InitConfig("free_track=1234 fill_on_free=32"));
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options);
+ ASSERT_EQ(1234U, config->free_track_allocations);
+ ASSERT_EQ(32U, config->fill_on_free_bytes);
+ ASSERT_EQ(16U, config->free_track_backtrace_num_frames);
+
+ ASSERT_TRUE(InitConfig("free_track fill_on_free=60"));
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options);
+ ASSERT_EQ(100U, config->free_track_allocations);
+ ASSERT_EQ(60U, config->fill_on_free_bytes);
+ ASSERT_EQ(16U, config->free_track_backtrace_num_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames) {
+ ASSERT_TRUE(InitConfig("free_track_backtrace_num_frames=123"));
+
+ ASSERT_EQ(0U, config->options);
+ ASSERT_EQ(123U, config->free_track_backtrace_num_frames);
+
+ ASSERT_TRUE(InitConfig("free_track_backtrace_num_frames"));
+ ASSERT_EQ(0U, config->options);
+ ASSERT_EQ(16U, config->free_track_backtrace_num_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_zero) {
+ ASSERT_TRUE(InitConfig("free_track_backtrace_num_frames=0"));
+
+ ASSERT_EQ(0U, config->options);
+ ASSERT_EQ(0U, config->free_track_backtrace_num_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_and_free_track) {
+ ASSERT_TRUE(InitConfig("free_track free_track_backtrace_num_frames=123"));
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options);
+ ASSERT_EQ(123U, config->free_track_backtrace_num_frames);
+
+ ASSERT_TRUE(InitConfig("free_track free_track_backtrace_num_frames"));
+ ASSERT_EQ(FREE_TRACK | FILL_ON_FREE, config->options);
+ ASSERT_EQ(16U, config->free_track_backtrace_num_frames);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, leak_track) {
+ ASSERT_TRUE(InitConfig("leak_track"));
+ ASSERT_EQ(LEAK_TRACK | TRACK_ALLOCS, config->options);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, leak_track_fail) {
+ ASSERT_FALSE(InitConfig("leak_track=100"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: value set for option 'leak_track' "
+ "which does not take a value\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, guard_min_error) {
+ ASSERT_FALSE(InitConfig("guard=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'guard', value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, guard_max_error) {
+ ASSERT_FALSE(InitConfig("guard=20000"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'guard', "
+ "value must be <= 16384: 20000\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, front_guard_min_error) {
+ ASSERT_FALSE(InitConfig("front_guard=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'front_guard', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, front_guard_max_error) {
+ ASSERT_FALSE(InitConfig("front_guard=20000"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'front_guard', "
+ "value must be <= 16384: 20000\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, rear_guard_min_error) {
+ ASSERT_FALSE(InitConfig("rear_guard=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'rear_guard', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, rear_guard_max_error) {
+ ASSERT_FALSE(InitConfig("rear_guard=20000"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'rear_guard', "
+ "value must be <= 16384: 20000\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, fill_min_error) {
+ ASSERT_FALSE(InitConfig("fill=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'fill', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, fill_on_alloc_min_error) {
+ ASSERT_FALSE(InitConfig("fill_on_alloc=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'fill_on_alloc', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, fill_on_free_min_error) {
+ ASSERT_FALSE(InitConfig("fill_on_free=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'fill_on_free', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, backtrace_min_error) {
+ ASSERT_FALSE(InitConfig("backtrace=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, backtrace_max_error) {
+ ASSERT_FALSE(InitConfig("backtrace=300"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace', "
+ "value must be <= 256: 300\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, backtrace_enable_on_signal_min_error) {
+ ASSERT_FALSE(InitConfig("backtrace_enable_on_signal=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace_enable_on_signal', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, backtrace_enable_on_signal_max_error) {
+ ASSERT_FALSE(InitConfig("backtrace_enable_on_signal=300"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'backtrace_enable_on_signal', "
+ "value must be <= 256: 300\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, expand_alloc_min_error) {
+ ASSERT_FALSE(InitConfig("expand_alloc=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'expand_alloc', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, expand_alloc_max_error) {
+ ASSERT_FALSE(InitConfig("expand_alloc=21000"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'expand_alloc', "
+ "value must be <= 16384: 21000\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track_min_error) {
+ ASSERT_FALSE(InitConfig("free_track=0"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'free_track', "
+ "value must be >= 1: 0\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track_max_error) {
+ ASSERT_FALSE(InitConfig("free_track=21000"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'free_track', "
+ "value must be <= 16384: 21000\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugConfigTest, free_track_backtrace_num_frames_max_error) {
+ ASSERT_FALSE(InitConfig("free_track_backtrace_num_frames=400"));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string log_msg(
+ "6 malloc_debug malloc_testing: bad value for option 'free_track_backtrace_num_frames', "
+ "value must be <= 256: 400\n");
+ ASSERT_STREQ((log_msg + usage_string).c_str(), getFakeLogPrint().c_str());
+}
diff --git a/libc/malloc_debug/tests/malloc_debug_unit_tests.cpp b/libc/malloc_debug/tests/malloc_debug_unit_tests.cpp
new file mode 100644
index 000000000..014b91352
--- /dev/null
+++ b/libc/malloc_debug/tests/malloc_debug_unit_tests.cpp
@@ -0,0 +1,1514 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <malloc.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/cdefs.h>
+#include <sys/param.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <algorithm>
+#include <thread>
+#include <vector>
+#include <utility>
+
+#include <gtest/gtest.h>
+
+#include <android-base/stringprintf.h>
+
+#include <private/bionic_macros.h>
+#include <private/bionic_malloc_dispatch.h>
+
+#include "Config.h"
+#include "malloc_debug.h"
+
+#include "log_fake.h"
+#include "backtrace_fake.h"
+
+__BEGIN_DECLS
+
+int property_set(const char*, const char*);
+bool debug_initialize(const MallocDispatch*, int*);
+void debug_finalize();
+
+void* debug_malloc(size_t);
+void debug_free(void*);
+void* debug_calloc(size_t, size_t);
+void* debug_realloc(void*, size_t);
+int debug_posix_memalign(void**, size_t, size_t);
+void* debug_memalign(size_t, size_t);
+size_t debug_malloc_usable_size(void*);
+void debug_get_malloc_leak_info(uint8_t**, size_t*, size_t*, size_t*, size_t*);
+void debug_free_malloc_leak_info(uint8_t*);
+
+struct mallinfo debug_mallinfo();
+
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+void* debug_pvalloc(size_t);
+void* debug_valloc(size_t);
+#endif
+
+__END_DECLS
+
+constexpr char DIVIDER[] =
+ "6 malloc_debug *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***\n";
+
+constexpr uint32_t BACKTRACE_HEADER = 0x1;
+
+static size_t get_tag_offset(uint32_t flags = 0, size_t backtrace_frames = 0) {
+ size_t offset = BIONIC_ALIGN(sizeof(Header), MINIMUM_ALIGNMENT_BYTES);
+ if (flags & BACKTRACE_HEADER) {
+ offset += BIONIC_ALIGN(sizeof(BacktraceHeader) + sizeof(uintptr_t) * backtrace_frames, MINIMUM_ALIGNMENT_BYTES);
+ }
+ return offset;
+}
+
+class MallocDebugTest : public ::testing::Test {
+ protected:
+ void SetUp() override {
+ initialized = false;
+ resetLogs();
+ backtrace_fake_clear_all();
+ }
+
+ void TearDown() override {
+ if (initialized) {
+ debug_finalize();
+ }
+ }
+
+ void Init(const char* property_value) {
+ property_set("libc.debug.malloc.options", property_value);
+ zygote = 0;
+ ASSERT_TRUE(debug_initialize(&dispatch, &zygote));
+ initialized = true;
+ }
+
+ bool initialized;
+
+ int zygote;
+
+ static MallocDispatch dispatch;
+};
+
+MallocDispatch MallocDebugTest::dispatch = {
+ calloc,
+ free,
+ mallinfo,
+ malloc,
+ malloc_usable_size,
+ memalign,
+ posix_memalign,
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+ nullptr,
+#endif
+ realloc,
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+ nullptr,
+#endif
+ nullptr,
+ nullptr,
+ nullptr,
+};
+
+void VerifyAllocCalls() {
+ size_t alloc_size = 1024;
+
+ // Verify debug_malloc.
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(alloc_size));
+ ASSERT_TRUE(pointer != nullptr);
+ for (size_t i = 0; i < debug_malloc_usable_size(pointer); i++) {
+ ASSERT_EQ(0xeb, pointer[i]);
+ }
+ debug_free(pointer);
+
+ // Verify debug_calloc.
+ pointer = reinterpret_cast<uint8_t*>(debug_calloc(1, alloc_size));
+ ASSERT_TRUE(pointer != nullptr);
+ for (size_t i = 0; i < debug_malloc_usable_size(pointer); i++) {
+ ASSERT_EQ(0, pointer[i]) << "Failed at byte " << i;
+ }
+ debug_free(pointer);
+
+ pointer = reinterpret_cast<uint8_t*>(debug_memalign(128, alloc_size));
+ ASSERT_TRUE(pointer != nullptr);
+ for (size_t i = 0; i < debug_malloc_usable_size(pointer); i++) {
+ ASSERT_EQ(0xeb, pointer[i]) << "Failed at byte " << i;
+ }
+ debug_free(pointer);
+
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(nullptr, alloc_size));
+ ASSERT_TRUE(pointer != nullptr);
+ for (size_t i = 0; i < debug_malloc_usable_size(pointer); i++) {
+ ASSERT_EQ(0xeb, pointer[i]) << "Failed at byte " << i;
+ }
+ memset(pointer, 0xff, alloc_size);
+ // Increase the size, verify the extra length is initialized to 0xeb,
+ // but the rest is 0xff.
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, alloc_size * 2));
+ ASSERT_TRUE(pointer != nullptr);
+ for (size_t i = 0; i < alloc_size; i++) {
+ ASSERT_EQ(0xff, pointer[i]) << "Failed at byte " << i;
+ }
+ for (size_t i = alloc_size; i < debug_malloc_usable_size(pointer); i++) {
+ ASSERT_EQ(0xeb, pointer[i]) << "Failed at byte " << i;
+ }
+ memset(pointer, 0xff, debug_malloc_usable_size(pointer));
+ // Shrink the size and verify nothing changes.
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, alloc_size));
+ ASSERT_TRUE(pointer != nullptr);
+ for (size_t i = 0; i < debug_malloc_usable_size(pointer); i++) {
+ ASSERT_EQ(0xff, pointer[i]) << "Failed at byte " << i;
+ }
+ // This should free the pointer.
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, 0));
+ ASSERT_TRUE(pointer == nullptr);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, fill_generic) {
+ Init("fill");
+ VerifyAllocCalls();
+}
+
+TEST_F(MallocDebugTest, fill_on_alloc_generic) {
+ Init("fill_on_alloc");
+ VerifyAllocCalls();
+}
+
+TEST_F(MallocDebugTest, fill_on_alloc_partial) {
+ Init("fill_on_alloc=25");
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ for (size_t i = 0; i < 25; i++) {
+ ASSERT_EQ(0xeb, pointer[i]) << "Failed at byte " << i;
+ }
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, fill_on_free) {
+ Init("fill_on_free free_track free_track_backtrace_num_frames=0");
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ size_t usable_size = debug_malloc_usable_size(pointer);
+ memset(pointer, 0, usable_size);
+ debug_free(pointer);
+
+ for (size_t i = 0; i < usable_size; i++) {
+ ASSERT_EQ(0xef, pointer[i]) << "Failed at byte " << i;
+ }
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, fill_on_free_partial) {
+ Init("fill_on_free=30 free_track free_track_backtrace_num_frames=0");
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ size_t usable_size = debug_malloc_usable_size(pointer);
+ memset(pointer, 0, usable_size);
+ debug_free(pointer);
+
+ for (size_t i = 0; i < 30; i++) {
+ ASSERT_EQ(0xef, pointer[i]) << "Failed to fill on free at byte " << i;
+ }
+ for (size_t i = 30; i < usable_size; i++) {
+ ASSERT_EQ(0, pointer[i]) << "Filled too much on byte " << i;
+ }
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_partial) {
+ Init("fill_on_free=30 free_track free_track_backtrace_num_frames=0");
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ size_t usable_size = debug_malloc_usable_size(pointer);
+ memset(pointer, 0, usable_size);
+ debug_free(pointer);
+
+ for (size_t i = 0; i < 30; i++) {
+ ASSERT_EQ(0xef, pointer[i]) << "Failed to fill on free at byte " << i;
+ }
+ for (size_t i = 30; i < usable_size; i++) {
+ ASSERT_EQ(0, pointer[i]) << "Filled too much on byte " << i;
+ }
+
+ debug_finalize();
+ initialized = false;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, all_options) {
+ Init("guard backtrace fill expand_alloc free_track leak_track");
+ VerifyAllocCalls();
+}
+
+TEST_F(MallocDebugTest, expand_alloc) {
+ Init("expand_alloc=1024");
+
+ void* pointer = debug_malloc(10);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_LE(1034U, debug_malloc_usable_size(pointer));
+ debug_free(pointer);
+
+ pointer = debug_calloc(1, 20);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_LE(1044U, debug_malloc_usable_size(pointer));
+ debug_free(pointer);
+
+ pointer = debug_memalign(128, 15);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_LE(1039U, debug_malloc_usable_size(pointer));
+ debug_free(pointer);
+
+ pointer = debug_realloc(nullptr, 30);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_LE(1054U, debug_malloc_usable_size(pointer));
+ pointer = debug_realloc(pointer, 100);
+ ASSERT_LE(1124U, debug_malloc_usable_size(pointer));
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, front_guard) {
+ Init("front_guard=32");
+
+ // Create a buffer for doing comparisons.
+ std::vector<uint8_t> buffer(32);
+ memset(buffer.data(), 0xaa, buffer.size());
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[-buffer.size()], buffer.size()) == 0);
+ memset(pointer, 0xff, 100);
+ debug_free(pointer);
+
+ // Loop through a bunch alignments.
+ for (size_t alignment = 1; alignment <= 256; alignment++) {
+ pointer = reinterpret_cast<uint8_t*>(debug_memalign(alignment, 100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[-buffer.size()], buffer.size()) == 0);
+ size_t alignment_mask = alignment - 1;
+ if (!powerof2(alignment)) {
+ alignment_mask = BIONIC_ROUND_UP_POWER_OF_2(alignment) - 1;
+ }
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(pointer) & alignment_mask);
+ memset(pointer, 0xff, 100);
+ debug_free(pointer);
+ }
+
+ pointer = reinterpret_cast<uint8_t*>(debug_calloc(1, 100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[-buffer.size()], buffer.size()) == 0);
+ for (size_t i = 0; i < 100; i++) {
+ ASSERT_EQ(0, pointer[i]) << "debug_calloc non-zero byte at " << i;
+ }
+ debug_free(pointer);
+
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(nullptr, 100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[-buffer.size()], buffer.size()) == 0);
+ memset(pointer, 0xff, 100);
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, 200));
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[-buffer.size()], buffer.size()) == 0);
+ memset(pointer, 0xff, 200);
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, 0));
+ ASSERT_TRUE(pointer == nullptr);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, realloc_memalign_memory) {
+ Init("rear_guard");
+
+ void* pointer = debug_memalign(1024, 100);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 100);
+
+ pointer = debug_realloc(pointer, 1024);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(1024U, debug_malloc_usable_size(pointer));
+ memset(pointer, 0, 1024);
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, front_guard_corrupted) {
+ Init("front_guard=32");
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x1, 0x2, 0x3});
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ pointer[-32] = 0x00;
+ pointer[-15] = 0x02;
+ debug_free(pointer);
+
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p SIZE 100 HAS A CORRUPTED FRONT GUARD\n", pointer);
+ expected_log += "6 malloc_debug allocation[-32] = 0x00 (expected 0xaa)\n";
+ expected_log += "6 malloc_debug allocation[-15] = 0x02 (expected 0xaa)\n";
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0x1\n";
+ expected_log += "6 malloc_debug #01 pc 0x2\n";
+ expected_log += "6 malloc_debug #02 pc 0x3\n";
+ expected_log += DIVIDER;
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, rear_guard) {
+ Init("rear_guard=32");
+
+ // Create a buffer for doing comparisons.
+ std::vector<uint8_t> buffer(32);
+ memset(buffer.data(), 0xbb, buffer.size());
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(100U, debug_malloc_usable_size(pointer));
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[100], buffer.size()) == 0);
+ memset(pointer, 0xff, 100);
+ debug_free(pointer);
+
+ // Loop through a bunch alignments.
+ for (size_t alignment = 1; alignment <= 256; alignment++) {
+ pointer = reinterpret_cast<uint8_t*>(debug_memalign(alignment, 100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(100U, debug_malloc_usable_size(pointer));
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[100], buffer.size()) == 0);
+ size_t alignment_mask = alignment - 1;
+ if (!powerof2(alignment)) {
+ alignment_mask = BIONIC_ROUND_UP_POWER_OF_2(alignment) - 1;
+ }
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(pointer) & alignment_mask)
+ << "Failed at alignment " << alignment << " mask " << alignment_mask;
+ memset(pointer, 0xff, 100);
+ debug_free(pointer);
+ }
+
+ pointer = reinterpret_cast<uint8_t*>(debug_calloc(1, 100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(100U, debug_malloc_usable_size(pointer));
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[100], buffer.size()) == 0);
+ for (size_t i = 0; i < 100; i++) {
+ ASSERT_EQ(0, pointer[i]) << "debug_calloc non-zero byte at " << i;
+ }
+ debug_free(pointer);
+
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(nullptr, 100));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[100], buffer.size()) == 0);
+ memset(pointer, 0xff, 100);
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, 200));
+ ASSERT_TRUE(memcmp(buffer.data(), &pointer[200], buffer.size()) == 0);
+ for (size_t i = 0; i < 100; i++) {
+ ASSERT_EQ(0xff, pointer[i]) << "debug_realloc not copied byte at " << i;
+ }
+ memset(pointer, 0xff, 200);
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, 0));
+ ASSERT_TRUE(pointer == nullptr);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, rear_guard_corrupted) {
+ Init("rear_guard=32");
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x100, 0x200, 0x300});
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ pointer[130] = 0xbf;
+ pointer[131] = 0x00;
+ debug_free(pointer);
+
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p SIZE 100 HAS A CORRUPTED REAR GUARD\n", pointer);
+ expected_log += "6 malloc_debug allocation[130] = 0xbf (expected 0xbb)\n";
+ expected_log += "6 malloc_debug allocation[131] = 0x00 (expected 0xbb)\n";
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0x100\n";
+ expected_log += "6 malloc_debug #01 pc 0x200\n";
+ expected_log += "6 malloc_debug #02 pc 0x300\n";
+ expected_log += DIVIDER;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, rear_guard_corrupted_after_realloc_shrink) {
+ Init("rear_guard=32");
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x100, 0x200, 0x300});
+
+ void* pointer = debug_malloc(200);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 200);
+
+ uint8_t* pointer_shrink = reinterpret_cast<uint8_t*>(debug_realloc(pointer, 100));
+ pointer_shrink[130] = 0xbf;
+ pointer_shrink[131] = 0x00;
+ debug_free(pointer);
+
+ // When shrinking sizes, the same pointer should be returned.
+ ASSERT_EQ(pointer, pointer_shrink);
+
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p SIZE 100 HAS A CORRUPTED REAR GUARD\n", pointer);
+ expected_log += "6 malloc_debug allocation[130] = 0xbf (expected 0xbb)\n";
+ expected_log += "6 malloc_debug allocation[131] = 0x00 (expected 0xbb)\n";
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0x100\n";
+ expected_log += "6 malloc_debug #01 pc 0x200\n";
+ expected_log += "6 malloc_debug #02 pc 0x300\n";
+ expected_log += DIVIDER;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, tag_corrupted) {
+ Init("rear_guard=32");
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xa, 0xb, 0xc});
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xaa, 0xbb, 0xcc});
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xaaa, 0xbbb, 0xccc});
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ uint8_t saved = pointer[-get_tag_offset()];
+ pointer[-get_tag_offset()] = 0x00;
+ ASSERT_EQ(0U, debug_malloc_usable_size(pointer));
+ ASSERT_TRUE(debug_realloc(pointer, 200) == nullptr);
+ debug_free(pointer);
+
+ // Fix the pointer and really free it.
+ pointer[-get_tag_offset()] = saved;
+ debug_free(pointer);
+
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p HAS INVALID TAG 1ee7d000 (malloc_usable_size)\n",
+ pointer);
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0xa\n";
+ expected_log += "6 malloc_debug #01 pc 0xb\n";
+ expected_log += "6 malloc_debug #02 pc 0xc\n";
+ expected_log += DIVIDER;
+
+ expected_log += DIVIDER;
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p HAS INVALID TAG 1ee7d000 (realloc)\n",
+ pointer);
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0xaa\n";
+ expected_log += "6 malloc_debug #01 pc 0xbb\n";
+ expected_log += "6 malloc_debug #02 pc 0xcc\n";
+ expected_log += DIVIDER;
+
+ expected_log += DIVIDER;
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p HAS INVALID TAG 1ee7d000 (free)\n",
+ pointer);
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0xaaa\n";
+ expected_log += "6 malloc_debug #01 pc 0xbbb\n";
+ expected_log += "6 malloc_debug #02 pc 0xccc\n";
+ expected_log += DIVIDER;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, leak_track_no_frees) {
+ Init("leak_track");
+
+ void* pointer1 = debug_malloc(200);
+ ASSERT_TRUE(pointer1 != nullptr);
+ memset(pointer1, 0, 200);
+
+ void* pointer2 = debug_malloc(128);
+ ASSERT_TRUE(pointer2 != nullptr);
+ memset(pointer2, 0, 128);
+
+ void* pointer3 = debug_malloc(1024);
+ ASSERT_TRUE(pointer3 != nullptr);
+ memset(pointer3, 0, 1024);
+
+ debug_finalize();
+ initialized = false;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log = android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 1024 at %p (leak 1 of 3)\n",
+ pointer3);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 200 at %p (leak 2 of 3)\n",
+ pointer1);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 128 at %p (leak 3 of 3)\n",
+ pointer2);
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, leak_track_no_frees_with_backtrace) {
+ Init("leak_track backtrace");
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x1000, 0x2000, 0x3000});
+
+ void* pointer1 = debug_malloc(100);
+ ASSERT_TRUE(pointer1 != nullptr);
+ memset(pointer1, 0, 100);
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xa000, 0xb000, 0xc000, 0xd000});
+
+ void* pointer2 = debug_malloc(128);
+ ASSERT_TRUE(pointer2 != nullptr);
+ memset(pointer2, 0, 128);
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xfe000, 0xde000, 0xce000, 0xbe000, 0xae000});
+
+ void* pointer3 = debug_malloc(1024);
+ ASSERT_TRUE(pointer3 != nullptr);
+ memset(pointer3, 0, 1024);
+
+ debug_finalize();
+ initialized = false;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log = android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 1024 at %p (leak 1 of 3)\n",
+ pointer3);
+ expected_log += "6 malloc_debug Backtrace at time of allocation:\n";
+ expected_log += "6 malloc_debug #00 pc 0xfe000\n";
+ expected_log += "6 malloc_debug #01 pc 0xde000\n";
+ expected_log += "6 malloc_debug #02 pc 0xce000\n";
+ expected_log += "6 malloc_debug #03 pc 0xbe000\n";
+ expected_log += "6 malloc_debug #04 pc 0xae000\n";
+
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 128 at %p (leak 2 of 3)\n",
+ pointer2);
+ expected_log += "6 malloc_debug Backtrace at time of allocation:\n";
+ expected_log += "6 malloc_debug #00 pc 0xa000\n";
+ expected_log += "6 malloc_debug #01 pc 0xb000\n";
+ expected_log += "6 malloc_debug #02 pc 0xc000\n";
+ expected_log += "6 malloc_debug #03 pc 0xd000\n";
+
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 100 at %p (leak 3 of 3)\n",
+ pointer1);
+ expected_log += "6 malloc_debug Backtrace at time of allocation:\n";
+ expected_log += "6 malloc_debug #00 pc 0x1000\n";
+ expected_log += "6 malloc_debug #01 pc 0x2000\n";
+ expected_log += "6 malloc_debug #02 pc 0x3000\n";
+
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, leak_track_frees) {
+ Init("leak_track");
+
+ void* pointer1 = debug_malloc(390);
+ ASSERT_TRUE(pointer1 != nullptr);
+ memset(pointer1, 0, 390);
+ debug_free(pointer1);
+
+ pointer1 = debug_malloc(100);
+ ASSERT_TRUE(pointer1 != nullptr);
+ memset(pointer1, 0, 100);
+
+ void* pointer2 = debug_malloc(250);
+ ASSERT_TRUE(pointer2 != nullptr);
+ memset(pointer2, 0, 250);
+ debug_free(pointer2);
+
+ pointer2 = debug_malloc(450);
+ ASSERT_TRUE(pointer2 != nullptr);
+ memset(pointer2, 0, 450);
+
+ void* pointer3 = debug_malloc(999);
+ ASSERT_TRUE(pointer3 != nullptr);
+ memset(pointer3, 0, 999);
+ debug_free(pointer2);
+
+ debug_finalize();
+ initialized = false;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log = android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 999 at %p (leak 1 of 2)\n",
+ pointer3);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ malloc_testing leaked block of size 100 at %p (leak 2 of 2)\n",
+ pointer1);
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track) {
+ Init("free_track=5 free_track_backtrace_num_frames=0");
+
+ void* pointers[10];
+ for (size_t i = 0; i < sizeof(pointers) / sizeof(void*); i++) {
+ pointers[i] = debug_malloc(100 + i);
+ ASSERT_TRUE(pointers[i] != nullptr);
+ memset(pointers[i], 0, 100 + i);
+ debug_free(pointers[i]);
+ }
+
+ // Large allocations (> 4096) to verify large allocation checks.
+ void* pointer = debug_malloc(8192);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 8192);
+ debug_free(pointer);
+
+ pointer = debug_malloc(9000);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 9000);
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_use_after_free) {
+ Init("free_track=5 free_track_backtrace_num_frames=0");
+
+ uint8_t* pointers[5];
+ for (size_t i = 0; i < sizeof(pointers) / sizeof(void*); i++) {
+ pointers[i] = reinterpret_cast<uint8_t*>(debug_malloc(100 + i));
+ ASSERT_TRUE(pointers[i] != nullptr);
+ memset(pointers[i], 0, 100 + i);
+ debug_free(pointers[i]);
+ }
+
+ // Stomp on the data.
+ pointers[0][20] = 0xaf;
+ pointers[0][99] = 0x12;
+
+ pointers[3][3] = 0x34;
+
+ // Large allocations (> 4096) to verify large allocation checks.
+ uint8_t* pointer1_large = reinterpret_cast<uint8_t*>(debug_malloc(8192));
+ ASSERT_TRUE(pointer1_large != nullptr);
+ memset(pointer1_large, 0, 8192);
+ debug_free(pointer1_large);
+
+ pointer1_large[4095] = 0x90;
+ pointer1_large[4100] = 0x56;
+ pointer1_large[8191] = 0x89;
+
+ uint8_t* pointer2_large = reinterpret_cast<uint8_t*>(debug_malloc(9000));
+ ASSERT_TRUE(pointer2_large != nullptr);
+ memset(pointer2_large, 0, 9000);
+ debug_free(pointer2_large);
+
+ pointer2_large[8200] = 0x78;
+
+ // Do a bunch of alloc and free to verify the above frees are checked.
+ for (size_t i = 0; i < 10; i++) {
+ void* flush_pointer = debug_malloc(100+i);
+ ASSERT_TRUE(flush_pointer != nullptr);
+ memset(flush_pointer, 0, 100 + i);
+ debug_free(flush_pointer);
+ }
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf("6 malloc_debug +++ ALLOCATION %p USED AFTER FREE\n", pointers[0]);
+ expected_log += "6 malloc_debug allocation[20] = 0xaf (expected 0xef)\n";
+ expected_log += "6 malloc_debug allocation[99] = 0x12 (expected 0xef)\n";
+ expected_log += DIVIDER;
+ expected_log += DIVIDER;
+ expected_log += android::base::StringPrintf("6 malloc_debug +++ ALLOCATION %p USED AFTER FREE\n", pointers[3]);
+ expected_log += "6 malloc_debug allocation[3] = 0x34 (expected 0xef)\n";
+ expected_log += DIVIDER;
+ expected_log += DIVIDER;
+ expected_log += android::base::StringPrintf("6 malloc_debug +++ ALLOCATION %p USED AFTER FREE\n", pointer1_large);
+ expected_log += "6 malloc_debug allocation[4095] = 0x90 (expected 0xef)\n";
+ expected_log += "6 malloc_debug allocation[4100] = 0x56 (expected 0xef)\n";
+ expected_log += "6 malloc_debug allocation[8191] = 0x89 (expected 0xef)\n";
+ expected_log += DIVIDER;
+ expected_log += DIVIDER;
+ expected_log += android::base::StringPrintf("6 malloc_debug +++ ALLOCATION %p USED AFTER FREE\n", pointer2_large);
+ expected_log += "6 malloc_debug allocation[8200] = 0x78 (expected 0xef)\n";
+ expected_log += DIVIDER;
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_use_after_free_finalize) {
+ Init("free_track=100 free_track_backtrace_num_frames=0");
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 100);
+ debug_free(pointer);
+
+ pointer[56] = 0x91;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+
+ debug_finalize();
+ initialized = false;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf("6 malloc_debug +++ ALLOCATION %p USED AFTER FREE\n", pointer);
+ expected_log += "6 malloc_debug allocation[56] = 0x91 (expected 0xef)\n";
+ expected_log += DIVIDER;
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_use_after_free_with_backtrace) {
+ Init("free_track=100");
+
+ // Free backtrace.
+ backtrace_fake_add(std::vector<uintptr_t> {0xfa, 0xeb, 0xdc});
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(200));
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 200);
+ debug_free(pointer);
+
+ pointer[101] = 0xab;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+
+ debug_finalize();
+ initialized = false;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf("6 malloc_debug +++ ALLOCATION %p USED AFTER FREE\n", pointer);
+ expected_log += "6 malloc_debug allocation[101] = 0xab (expected 0xef)\n";
+ expected_log += "6 malloc_debug Backtrace at time of free:\n";
+ expected_log += "6 malloc_debug #00 pc 0xfa\n";
+ expected_log += "6 malloc_debug #01 pc 0xeb\n";
+ expected_log += "6 malloc_debug #02 pc 0xdc\n";
+ expected_log += DIVIDER;
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_use_after_free_call_realloc) {
+ Init("free_track=100");
+
+ // Free backtrace.
+ backtrace_fake_add(std::vector<uintptr_t> {0xfa, 0xeb, 0xdc});
+ // Backtrace at realloc.
+ backtrace_fake_add(std::vector<uintptr_t> {0x12, 0x22, 0x32, 0x42});
+
+ void* pointer = debug_malloc(200);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 200);
+ debug_free(pointer);
+
+ // Choose a size that should not trigger a realloc to verify tag is
+ // verified early.
+ ASSERT_TRUE(debug_realloc(pointer, 200) == nullptr);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p USED AFTER FREE (realloc)\n", pointer);
+ expected_log += "6 malloc_debug Backtrace of original free:\n";
+ expected_log += "6 malloc_debug #00 pc 0xfa\n";
+ expected_log += "6 malloc_debug #01 pc 0xeb\n";
+ expected_log += "6 malloc_debug #02 pc 0xdc\n";
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0x12\n";
+ expected_log += "6 malloc_debug #01 pc 0x22\n";
+ expected_log += "6 malloc_debug #02 pc 0x32\n";
+ expected_log += "6 malloc_debug #03 pc 0x42\n";
+ expected_log += DIVIDER;
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_use_after_free_call_free) {
+ Init("free_track=100");
+
+ // Free backtrace.
+ backtrace_fake_add(std::vector<uintptr_t> {0xfa, 0xeb, 0xdc});
+ // Backtrace at second free.
+ backtrace_fake_add(std::vector<uintptr_t> {0x12, 0x22, 0x32, 0x42});
+
+ void* pointer = debug_malloc(200);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 200);
+ debug_free(pointer);
+
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p USED AFTER FREE (free)\n", pointer);
+ expected_log += "6 malloc_debug Backtrace of original free:\n";
+ expected_log += "6 malloc_debug #00 pc 0xfa\n";
+ expected_log += "6 malloc_debug #01 pc 0xeb\n";
+ expected_log += "6 malloc_debug #02 pc 0xdc\n";
+ expected_log += "6 malloc_debug Backtrace at time of failure:\n";
+ expected_log += "6 malloc_debug #00 pc 0x12\n";
+ expected_log += "6 malloc_debug #01 pc 0x22\n";
+ expected_log += "6 malloc_debug #02 pc 0x32\n";
+ expected_log += "6 malloc_debug #03 pc 0x42\n";
+ expected_log += DIVIDER;
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_header_tag_corrupted) {
+ Init("free_track=100 free_track_backtrace_num_frames=0");
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(100));
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, 100);
+ debug_free(pointer);
+
+ pointer[-get_tag_offset()] = 0x00;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+
+ debug_finalize();
+ initialized = false;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log(DIVIDER);
+ expected_log += android::base::StringPrintf(
+ "6 malloc_debug +++ ALLOCATION %p HAS CORRUPTED HEADER TAG 0x1cc7dc00 AFTER FREE\n",
+ pointer);
+ expected_log += DIVIDER;
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, free_track_multiple_thread) {
+ Init("free_track=10 free_track_backtrace_num_frames=0");
+
+ std::vector<std::thread*> threads(1000);
+ for (size_t i = 0; i < threads.size(); i++) {
+ threads[i] = new std::thread([](){
+ for (size_t j = 0; j < 100; j++) {
+ void* mem = debug_malloc(100);
+ write(0, mem, 0);
+ debug_free(mem);
+ }
+ });
+ }
+ for (size_t i = 0; i < threads.size(); i++) {
+ threads[i]->join();
+ delete threads[i];
+ }
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, get_malloc_leak_info_invalid) {
+ Init("fill");
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ std::string expected_log("6 malloc_debug get_malloc_leak_info: At least one invalid parameter.\n");
+
+ debug_get_malloc_leak_info(nullptr, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+
+ resetLogs();
+ debug_get_malloc_leak_info(&info, nullptr, &info_size, &total_memory, &backtrace_size);
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+
+ resetLogs();
+ debug_get_malloc_leak_info(&info, &overall_size, nullptr, &total_memory, &backtrace_size);
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+
+ resetLogs();
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, nullptr, &backtrace_size);
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+
+ resetLogs();
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, nullptr);
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, get_malloc_leak_info_not_enabled) {
+ Init("fill");
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ std::string expected_log(
+ "6 malloc_debug get_malloc_leak_info: Allocations not being tracked, to enable "
+ "set the option 'backtrace'.\n");
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+struct InfoEntry {
+ size_t size;
+ size_t num_frames;
+ uintptr_t frames[0];
+} __attribute__((packed));
+
+TEST_F(MallocDebugTest, get_malloc_leak_info_empty) {
+ Init("backtrace");
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_TRUE(info == nullptr);
+ ASSERT_EQ(0U, overall_size);
+ ASSERT_EQ(0U, info_size);
+ ASSERT_EQ(0U, total_memory);
+ ASSERT_EQ(0U, backtrace_size);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, get_malloc_leak_info_single) {
+ Init("backtrace");
+
+ // Create the expected info buffer.
+ size_t individual_size = 2 * sizeof(size_t) + 16 * sizeof(uintptr_t);
+ std::vector<uint8_t> expected_info(individual_size);
+ memset(expected_info.data(), 0, individual_size);
+
+ InfoEntry* entry = reinterpret_cast<InfoEntry*>(expected_info.data());
+ entry->size = 200;
+ entry->num_frames = 3;
+ entry->frames[0] = 0xf;
+ entry->frames[1] = 0xe;
+ entry->frames[2] = 0xd;
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xf, 0xe, 0xd});
+
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(entry->size));
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0, entry->size);
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_TRUE(info != nullptr);
+ ASSERT_EQ(individual_size, overall_size);
+ ASSERT_EQ(individual_size, info_size);
+ ASSERT_EQ(200U, total_memory);
+ ASSERT_EQ(16U, backtrace_size);
+ ASSERT_TRUE(memcmp(expected_info.data(), info, overall_size) == 0);
+
+ debug_free_malloc_leak_info(info);
+
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, get_malloc_leak_info_multi) {
+ Init("backtrace=16");
+
+ // Create the expected info buffer.
+ size_t individual_size = 2 * sizeof(size_t) + 16 * sizeof(uintptr_t);
+ std::vector<uint8_t> expected_info(individual_size * 3);
+ memset(expected_info.data(), 0, individual_size * 3);
+
+ InfoEntry* entry0 = reinterpret_cast<InfoEntry*>(expected_info.data());
+ InfoEntry* entry1 = reinterpret_cast<InfoEntry*>(
+ reinterpret_cast<uintptr_t>(entry0) + individual_size);
+ InfoEntry* entry2 = reinterpret_cast<InfoEntry*>(
+ reinterpret_cast<uintptr_t>(entry1) + individual_size);
+
+ // These values will be in the reverse order that we create.
+ entry2->size = 500;
+ entry2->num_frames = 4;
+ entry2->frames[0] = 0xf;
+ entry2->frames[1] = 0xe;
+ entry2->frames[2] = 0xd;
+ entry2->frames[3] = 0xc;
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xf, 0xe, 0xd, 0xc});
+
+ uint8_t* pointers[3];
+
+ pointers[0] = reinterpret_cast<uint8_t*>(debug_malloc(entry2->size));
+ ASSERT_TRUE(pointers[0] != nullptr);
+ memset(pointers[0], 0, entry2->size);
+
+ entry1->size = 4100;
+ entry1->num_frames = 16;
+ for (size_t i = 0; i < 16; i++) {
+ entry1->frames[i] = 0xbc000 + i;
+ }
+
+ backtrace_fake_add(
+ std::vector<uintptr_t> {0xbc000, 0xbc001, 0xbc002, 0xbc003, 0xbc004, 0xbc005,
+ 0xbc006, 0xbc007, 0xbc008, 0xbc009, 0xbc00a, 0xbc00b,
+ 0xbc00c, 0xbc00d, 0xbc00e, 0xbc00f, 0xffff});
+
+ pointers[1] = reinterpret_cast<uint8_t*>(debug_malloc(entry1->size));
+ ASSERT_TRUE(pointers[1] != nullptr);
+ memset(pointers[1], 0, entry1->size);
+
+ entry0->size = 9000;
+ entry0->num_frames = 1;
+
+ entry0->frames[0] = 0x104;
+ backtrace_fake_add(std::vector<uintptr_t> {0x104});
+
+ pointers[2] = reinterpret_cast<uint8_t*>(debug_malloc(entry0->size));
+ ASSERT_TRUE(pointers[2] != nullptr);
+ memset(pointers[2], 0, entry0->size);
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_TRUE(info != nullptr);
+ ASSERT_EQ(individual_size * 3, overall_size);
+ ASSERT_EQ(individual_size, info_size);
+ ASSERT_EQ(500U + 4100U + 9000U, total_memory);
+ ASSERT_EQ(16U, backtrace_size);
+ ASSERT_TRUE(memcmp(expected_info.data(), info, overall_size) == 0);
+
+ debug_free_malloc_leak_info(info);
+
+ debug_free(pointers[0]);
+ debug_free(pointers[1]);
+ debug_free(pointers[2]);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, get_malloc_leak_info_multi_skip_empty_backtrace) {
+ Init("backtrace=16");
+
+ // Create the expected info buffer.
+ size_t individual_size = 2 * sizeof(size_t) + 16 * sizeof(uintptr_t);
+ std::vector<uint8_t> expected_info(individual_size * 2);
+ memset(expected_info.data(), 0, individual_size * 2);
+
+ InfoEntry* entry0 = reinterpret_cast<InfoEntry*>(expected_info.data());
+ InfoEntry* entry1 = reinterpret_cast<InfoEntry*>(
+ reinterpret_cast<uintptr_t>(entry0) + individual_size);
+
+ // These values will be in the reverse order that we create.
+ entry1->size = 500;
+ entry1->num_frames = 4;
+ entry1->frames[0] = 0xf;
+ entry1->frames[1] = 0xe;
+ entry1->frames[2] = 0xd;
+ entry1->frames[3] = 0xc;
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xf, 0xe, 0xd, 0xc});
+
+ uint8_t* pointers[3];
+
+ pointers[0] = reinterpret_cast<uint8_t*>(debug_malloc(entry1->size));
+ ASSERT_TRUE(pointers[0] != nullptr);
+ memset(pointers[0], 0, entry1->size);
+
+ entry0->size = 4100;
+ entry0->num_frames = 16;
+ for (size_t i = 0; i < 16; i++) {
+ entry0->frames[i] = 0xbc000 + i;
+ }
+
+ backtrace_fake_add(
+ std::vector<uintptr_t> {0xbc000, 0xbc001, 0xbc002, 0xbc003, 0xbc004, 0xbc005,
+ 0xbc006, 0xbc007, 0xbc008, 0xbc009, 0xbc00a, 0xbc00b,
+ 0xbc00c, 0xbc00d, 0xbc00e, 0xbc00f, 0xffff});
+
+ pointers[1] = reinterpret_cast<uint8_t*>(debug_malloc(entry0->size));
+ ASSERT_TRUE(pointers[1] != nullptr);
+ memset(pointers[1], 0, entry0->size);
+
+ pointers[2] = reinterpret_cast<uint8_t*>(debug_malloc(10000));
+ ASSERT_TRUE(pointers[2] != nullptr);
+ memset(pointers[2], 0, 10000);
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_TRUE(info != nullptr);
+ ASSERT_EQ(individual_size * 2, overall_size);
+ ASSERT_EQ(individual_size, info_size);
+ ASSERT_EQ(500U + 4100U, total_memory);
+ ASSERT_EQ(16U, backtrace_size);
+ ASSERT_TRUE(memcmp(expected_info.data(), info, overall_size) == 0);
+
+ debug_free_malloc_leak_info(info);
+
+ debug_free(pointers[0]);
+ debug_free(pointers[1]);
+ debug_free(pointers[2]);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, realloc_usable_size) {
+ Init("front_guard");
+
+ // Verify that if the usable size > size of alloc, that realloc
+ // copies the bytes in the usable size not just the size.
+ // This assumes that an allocation of size 1 returns usable size > 1.
+ // If this isn't true, this test is not going to do anything.
+ uint8_t* pointer = reinterpret_cast<uint8_t*>(debug_malloc(1));
+ ASSERT_TRUE(pointer != nullptr);
+ size_t usable_size = debug_malloc_usable_size(pointer);
+ memset(pointer, 0xaa, usable_size);
+ pointer = reinterpret_cast<uint8_t*>(debug_realloc(pointer, usable_size + 10));
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_LE(usable_size + 10, debug_malloc_usable_size(pointer));
+ for (size_t i = 0; i < usable_size; i++) {
+ ASSERT_EQ(0xaa, pointer[i]) << "Failed compare at byte " << i;
+ }
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, backtrace_enable_on_signal) {
+ Init("backtrace_enable_on_signal=20");
+
+ size_t individual_size = 2 * sizeof(size_t) + 20 * sizeof(uintptr_t);
+
+ backtrace_fake_add(std::vector<uintptr_t> {0xbc000, 0xecd00, 0x12000});
+ backtrace_fake_add(std::vector<uintptr_t> {0x100, 0x200, 0x300, 0x400});
+ backtrace_fake_add(std::vector<uintptr_t> {0x500, 0xa00, 0xb00});
+
+ // First allocation should not actually attempt to get the backtrace.
+ void* pointer = debug_malloc(10);
+ ASSERT_TRUE(pointer != nullptr);
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_TRUE(info == nullptr);
+ ASSERT_EQ(0U, overall_size);
+ ASSERT_EQ(0U, info_size);
+ ASSERT_EQ(0U, total_memory);
+ ASSERT_EQ(0U, backtrace_size);
+ debug_free(pointer);
+
+ debug_free_malloc_leak_info(info);
+
+ // Send the signal to enable.
+ ASSERT_TRUE(kill(getpid(), SIGRTMIN + 10) == 0);
+ sleep(1);
+
+ pointer = debug_malloc(100);
+ ASSERT_TRUE(pointer != nullptr);
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_TRUE(info != nullptr);
+ ASSERT_EQ(individual_size, overall_size);
+ ASSERT_EQ(individual_size, info_size);
+ ASSERT_EQ(100U, total_memory);
+ ASSERT_EQ(20U, backtrace_size);
+ uintptr_t* ips = reinterpret_cast<uintptr_t*>(&info[2 * sizeof(size_t)]);
+ ASSERT_EQ(0xbc000U, ips[0]);
+ ASSERT_EQ(0xecd00U, ips[1]);
+ ASSERT_EQ(0x12000U, ips[2]);
+ for (size_t i = 3; i < 20; i++) {
+ ASSERT_EQ(0U, ips[i]);
+ }
+
+ debug_free(pointer);
+
+ debug_free_malloc_leak_info(info);
+
+ // Send the signal to disable.
+ ASSERT_TRUE(kill(getpid(), SIGRTMIN + 10) == 0);
+ sleep(1);
+
+ pointer = debug_malloc(200);
+ ASSERT_TRUE(pointer != nullptr);
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_TRUE(info == nullptr);
+ ASSERT_EQ(0U, overall_size);
+ ASSERT_EQ(0U, info_size);
+ ASSERT_EQ(0U, total_memory);
+ ASSERT_EQ(0U, backtrace_size);
+
+ debug_free(pointer);
+
+ debug_free_malloc_leak_info(info);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ std::string expected_log = android::base::StringPrintf(
+ "4 malloc_debug malloc_testing: Run: 'kill -%d %d' to enable backtracing.\n",
+ SIGRTMIN + 10, getpid());
+ ASSERT_STREQ(expected_log.c_str(), getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, overflow) {
+ Init("guard fill_on_free");
+
+ void* pointer = debug_malloc(SIZE_MAX);
+ ASSERT_TRUE(pointer == nullptr);
+ ASSERT_EQ(ENOMEM, errno);
+
+ pointer = debug_calloc(1, SIZE_MAX);
+ ASSERT_TRUE(pointer == nullptr);
+ ASSERT_EQ(ENOMEM, errno);
+
+ pointer = debug_calloc(SIZE_MAX, 1);
+ ASSERT_TRUE(pointer == nullptr);
+ ASSERT_EQ(ENOMEM, errno);
+
+ pointer = debug_calloc(SIZE_MAX/100, 100);
+ ASSERT_TRUE(pointer == nullptr);
+ ASSERT_EQ(ENOMEM, errno);
+
+ pointer = debug_calloc(100, SIZE_MAX/100);
+ ASSERT_TRUE(pointer == nullptr);
+ ASSERT_EQ(ENOMEM, errno);
+
+ const size_t size_t_bits = sizeof(size_t) * 8;
+ const size_t sqrt_size_t = 1ULL << (size_t_bits/2);
+ pointer = debug_calloc(sqrt_size_t + 1, sqrt_size_t);
+ ASSERT_TRUE(pointer == nullptr);
+ ASSERT_EQ(ENOMEM, errno);
+
+ pointer = debug_realloc(nullptr, SIZE_MAX);
+ ASSERT_TRUE(pointer == nullptr);
+ ASSERT_EQ(ENOMEM, errno);
+
+ pointer = debug_malloc(100);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0xd0, 100);
+
+ void* realloc_pointer = debug_realloc(pointer, SIZE_MAX);
+ ASSERT_TRUE(realloc_pointer == nullptr);
+ // Verify the pointer was not freed.
+ for (size_t i = 0; i < 100; i++) {
+ ASSERT_EQ(0xd0, reinterpret_cast<uint8_t*>(pointer)[i]) << "Failed checking byte " << i;
+ }
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+static void VerifyZygoteSet(size_t memory_bytes) {
+ size_t expected_info_size = 2 * sizeof(size_t) + 16 * sizeof(uintptr_t);
+ std::vector<uint8_t> expected_info(expected_info_size);
+ memset(expected_info.data(), 0, expected_info_size);
+ InfoEntry* entry = reinterpret_cast<InfoEntry*>(expected_info.data());
+ entry->size = memory_bytes | (1U << 31);
+ entry->num_frames = 1;
+ entry->frames[0] = 0x1;
+
+ uint8_t* info;
+ size_t overall_size;
+ size_t info_size;
+ size_t total_memory;
+ size_t backtrace_size;
+
+ debug_get_malloc_leak_info(&info, &overall_size, &info_size, &total_memory, &backtrace_size);
+ ASSERT_EQ(expected_info_size, overall_size);
+ ASSERT_EQ(expected_info_size, info_size);
+ ASSERT_EQ(memory_bytes, total_memory);
+ ASSERT_EQ(16U, backtrace_size);
+ ASSERT_TRUE(memcmp(info, expected_info.data(), expected_info_size) == 0);
+
+ debug_free_malloc_leak_info(info);
+}
+
+TEST_F(MallocDebugTest, zygote_set) {
+ // Set all of the options.
+ Init("guard fill backtrace leak_track free_track=2");
+
+ zygote = 1;
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x1});
+
+ void* pointer = debug_malloc(100);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(100U, debug_malloc_usable_size(pointer));
+ memset(pointer, 0, 100);
+ VerifyZygoteSet(100);
+ debug_free(pointer);
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x1});
+ pointer = debug_calloc(10, 20);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(200U, debug_malloc_usable_size(pointer));
+ VerifyZygoteSet(200);
+ debug_free(pointer);
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x1});
+ pointer = debug_memalign(128, 300);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(300U, debug_malloc_usable_size(pointer));
+ memset(pointer, 0, 300);
+ VerifyZygoteSet(300);
+ debug_free(pointer);
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x1});
+ pointer = debug_malloc(500);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(500U, debug_malloc_usable_size(pointer));
+ memset(pointer, 0, 500);
+ VerifyZygoteSet(500);
+
+ backtrace_fake_add(std::vector<uintptr_t> {0x1});
+ pointer = debug_realloc(pointer, 300);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(300U, debug_malloc_usable_size(pointer));
+ VerifyZygoteSet(300);
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, max_size) {
+ Init("guard");
+
+ void* pointer = debug_malloc(1U << 31);
+ ASSERT_TRUE(pointer == nullptr);
+
+ pointer = debug_calloc(1, 1U << 31);
+ ASSERT_TRUE(pointer == nullptr);
+
+ pointer = debug_calloc(1U << 31, 1);
+ ASSERT_TRUE(pointer == nullptr);
+
+ pointer = debug_memalign(16, 1U << 31);
+ ASSERT_TRUE(pointer == nullptr);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, debug_mallinfo) {
+ Init("guard");
+
+ void* pointer = debug_malloc(150);
+ ASSERT_TRUE(pointer != nullptr);
+
+ struct mallinfo mi = debug_mallinfo();
+ EXPECT_NE(0U, mi.uordblks);
+
+ debug_free(pointer);
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+TEST_F(MallocDebugTest, debug_posix_memalign) {
+ Init("guard");
+
+ void* pointer;
+ ASSERT_EQ(0, debug_posix_memalign(&pointer, 32, 300));
+ ASSERT_TRUE(pointer != nullptr);
+ debug_free(pointer);
+
+ ASSERT_EQ(EINVAL, debug_posix_memalign(&pointer, 11, 300));
+
+ ASSERT_EQ(ENOMEM, debug_posix_memalign(&pointer, 16, SIZE_MAX));
+
+ ASSERT_STREQ("", getFakeLogBuf().c_str());
+ ASSERT_STREQ("", getFakeLogPrint().c_str());
+}
+
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+TEST_F(MallocDebugTest, debug_pvalloc) {
+ Init("guard");
+
+ size_t pagesize = getpagesize();
+ void* pointer = debug_pvalloc(1);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(pagesize, debug_malloc_usable_size(pointer));
+ uintptr_t value = reinterpret_cast<uintptr_t>(pointer) & (pagesize - 1);
+ ASSERT_EQ(0U, value);
+ debug_free(pointer);
+}
+
+TEST_F(MallocDebugTest, debug_valloc) {
+ Init("guard");
+
+ size_t pagesize = getpagesize();
+ void* pointer = debug_valloc(100);
+ ASSERT_TRUE(pointer != nullptr);
+ ASSERT_EQ(100U, debug_malloc_usable_size(pointer));
+ uintptr_t value = reinterpret_cast<uintptr_t>(pointer) & (pagesize - 1);
+ ASSERT_EQ(0U, value);
+ debug_free(pointer);
+}
+#endif
diff --git a/libc/malloc_debug/tests/property_fake.cpp b/libc/malloc_debug/tests/property_fake.cpp
new file mode 100644
index 000000000..d9f0ad897
--- /dev/null
+++ b/libc/malloc_debug/tests/property_fake.cpp
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string.h>
+
+#include <string>
+#include <unordered_map>
+
+#include <sys/system_properties.h>
+
+std::unordered_map<std::string, std::string> g_properties;
+
+extern "C" int property_set(const char* name, const char* value) {
+ if (g_properties.count(name) != 0) {
+ g_properties.erase(name);
+ }
+ g_properties[name] = value;
+ return 0;
+}
+
+extern "C" int property_get(const char* key, char* value, const char* default_value) {
+ if (g_properties.count(key) == 0) {
+ if (default_value == nullptr) {
+ return 0;
+ }
+ strncpy(value, default_value, PROP_VALUE_MAX-1);
+ } else {
+ strncpy(value, g_properties[key].c_str(), PROP_VALUE_MAX-1);
+ }
+ value[PROP_VALUE_MAX-1] = '\0';
+ return strlen(value);
+}
+
+extern "C" int __system_property_get(const char* key, char* value) {
+ if (g_properties.count(key) == 0) {
+ return 0;
+ } else {
+ strncpy(value, g_properties[key].c_str(), PROP_VALUE_MAX-1);
+ }
+ value[PROP_VALUE_MAX-1] = '\0';
+ return strlen(value);
+}
diff --git a/libc/private/KernelArgumentBlock.h b/libc/private/KernelArgumentBlock.h
index c8ea4977a..68d499999 100644
--- a/libc/private/KernelArgumentBlock.h
+++ b/libc/private/KernelArgumentBlock.h
@@ -38,32 +38,25 @@ class KernelArgumentBlock {
argv = reinterpret_cast<char**>(args + 1);
envp = argv + argc + 1;
- // Skip over all environment variable definitions to find aux vector.
- // The end of the environment block is marked by two NULL pointers.
+ // Skip over all environment variable definitions to find the aux vector.
+ // The end of the environment block is marked by a NULL pointer.
char** p = envp;
while (*p != NULL) {
++p;
}
- ++p; // Skip second NULL;
+ ++p; // Skip the NULL itself.
auxv = reinterpret_cast<ElfW(auxv_t)*>(p);
}
// Similar to ::getauxval but doesn't require the libc global variables to be set up,
- // so it's safe to call this really early on. This function also lets you distinguish
- // between the inability to find the given type and its value just happening to be 0.
- unsigned long getauxval(unsigned long type, bool* found_match = NULL) {
+ // so it's safe to call this really early on.
+ unsigned long getauxval(unsigned long type) {
for (ElfW(auxv_t)* v = auxv; v->a_type != AT_NULL; ++v) {
if (v->a_type == type) {
- if (found_match != NULL) {
- *found_match = true;
- }
return v->a_un.a_val;
}
}
- if (found_match != NULL) {
- *found_match = false;
- }
return 0;
}
diff --git a/libc/private/ScopedPthreadMutexLocker.h b/libc/private/ScopedPthreadMutexLocker.h
index 43dbdc115..58462e38b 100644
--- a/libc/private/ScopedPthreadMutexLocker.h
+++ b/libc/private/ScopedPthreadMutexLocker.h
@@ -34,7 +34,7 @@ class ScopedPthreadMutexLocker {
private:
pthread_mutex_t* mu_;
- DISALLOW_COPY_AND_ASSIGN(ScopedPthreadMutexLocker);
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedPthreadMutexLocker);
};
#endif // SCOPED_PTHREAD_MUTEX_LOCKER_H
diff --git a/libc/private/ScopedReaddir.h b/libc/private/ScopedReaddir.h
index 84c1b93a4..3d77a40b6 100644
--- a/libc/private/ScopedReaddir.h
+++ b/libc/private/ScopedReaddir.h
@@ -23,8 +23,11 @@
class ScopedReaddir {
public:
- ScopedReaddir(const char* path) {
- dir_ = opendir(path);
+ ScopedReaddir(const char* path) : ScopedReaddir(opendir(path)) {
+ }
+
+ ScopedReaddir(DIR* dir) {
+ dir_ = dir;
}
~ScopedReaddir() {
diff --git a/libc/private/WriteProtected.h b/libc/private/WriteProtected.h
new file mode 100644
index 000000000..1133e2a9b
--- /dev/null
+++ b/libc/private/WriteProtected.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _PRIVATE_WRITEPROTECTED_H
+#define _PRIVATE_WRITEPROTECTED_H
+
+#include <errno.h>
+#include <string.h>
+#include <sys/cdefs.h>
+#include <sys/mman.h>
+#include <sys/user.h>
+
+#include "private/bionic_macros.h"
+#include "private/bionic_prctl.h"
+#include "private/libc_logging.h"
+
+template <typename T>
+union WriteProtectedContents {
+ T value;
+ char padding[PAGE_SIZE];
+
+ WriteProtectedContents() = default;
+ DISALLOW_COPY_AND_ASSIGN(WriteProtectedContents);
+} __attribute__((aligned(PAGE_SIZE)));
+
+// Write protected wrapper class that aligns its contents to a page boundary,
+// and sets the memory protection to be non-writable, except when being modified
+// explicitly.
+template <typename T>
+class WriteProtected {
+ static_assert(sizeof(T) < PAGE_SIZE,
+ "WriteProtected only supports contents up to PAGE_SIZE");
+ static_assert(__is_pod(T), "WriteProtected only supports POD contents");
+
+ WriteProtectedContents<T> contents;
+
+ public:
+ WriteProtected() = default;
+ DISALLOW_COPY_AND_ASSIGN(WriteProtected);
+
+ void initialize() {
+ // Not strictly necessary, but this will hopefully segfault if we initialize
+ // multiple times by accident.
+ memset(&contents, 0, sizeof(contents));
+
+ if (mprotect(&contents, PAGE_SIZE, PROT_READ)) {
+ __libc_fatal("failed to make WriteProtected nonwritable in initialize");
+ }
+ }
+
+ const T* operator->() {
+ return &contents.value;
+ }
+
+ const T& operator*() {
+ return contents.value;
+ }
+
+ template <typename Mutator>
+ void mutate(Mutator mutator) {
+ if (mprotect(&contents, PAGE_SIZE, PROT_READ | PROT_WRITE) != 0) {
+ __libc_fatal("failed to make WriteProtected writable in mutate: %s",
+ strerror(errno));
+ }
+ mutator(&contents.value);
+ if (mprotect(&contents, PAGE_SIZE, PROT_READ) != 0) {
+ __libc_fatal("failed to make WriteProtected nonwritable in mutate: %s",
+ strerror(errno));
+ }
+ }
+};
+
+#endif
diff --git a/libc/private/bionic_asm.h b/libc/private/bionic_asm.h
index 5fca222c4..e2084d438 100644
--- a/libc/private/bionic_asm.h
+++ b/libc/private/bionic_asm.h
@@ -38,25 +38,36 @@
#include <machine/asm.h>
-#define ENTRY(f) \
+#define ENTRY_NO_DWARF(f) \
.text; \
.globl f; \
.align __bionic_asm_align; \
.type f, __bionic_asm_function_type; \
f: \
__bionic_asm_custom_entry(f); \
+
+#define ENTRY(f) \
+ ENTRY_NO_DWARF(f) \
.cfi_startproc \
-#define END(f) \
- .cfi_endproc; \
+#define END_NO_DWARF(f) \
.size f, .-f; \
__bionic_asm_custom_end(f) \
+#define END(f) \
+ .cfi_endproc; \
+ END_NO_DWARF(f) \
+
/* Like ENTRY, but with hidden visibility. */
#define ENTRY_PRIVATE(f) \
ENTRY(f); \
.hidden f \
+/* Like ENTRY_NO_DWARF, but with hidden visibility. */
+#define ENTRY_PRIVATE_NO_DWARF(f) \
+ ENTRY_NO_DWARF(f); \
+ .hidden f \
+
#define ALIAS_SYMBOL(alias, original) \
.globl alias; \
.equ alias, original
diff --git a/libc/private/bionic_futex.h b/libc/private/bionic_futex.h
index 401577ab8..946d9dd1f 100644
--- a/libc/private/bionic_futex.h
+++ b/libc/private/bionic_futex.h
@@ -40,10 +40,12 @@ __BEGIN_DECLS
struct timespec;
-static inline __always_inline int __futex(volatile void* ftx, int op, int value, const struct timespec* timeout) {
+static inline __always_inline int __futex(volatile void* ftx, int op, int value,
+ const struct timespec* timeout,
+ int bitset) {
// Our generated syscall assembler sets errno, but our callers (pthread functions) don't want to.
int saved_errno = errno;
- int result = syscall(__NR_futex, ftx, op, value, timeout);
+ int result = syscall(__NR_futex, ftx, op, value, timeout, NULL, bitset);
if (__predict_false(result == -1)) {
result = -errno;
errno = saved_errno;
@@ -52,19 +54,22 @@ static inline __always_inline int __futex(volatile void* ftx, int op, int value,
}
static inline int __futex_wake(volatile void* ftx, int count) {
- return __futex(ftx, FUTEX_WAKE, count, NULL);
+ return __futex(ftx, FUTEX_WAKE, count, NULL, 0);
}
static inline int __futex_wake_ex(volatile void* ftx, bool shared, int count) {
- return __futex(ftx, shared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, count, NULL);
+ return __futex(ftx, shared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, count, NULL, 0);
}
static inline int __futex_wait(volatile void* ftx, int value, const struct timespec* timeout) {
- return __futex(ftx, FUTEX_WAIT, value, timeout);
+ return __futex(ftx, FUTEX_WAIT, value, timeout, 0);
}
-static inline int __futex_wait_ex(volatile void* ftx, bool shared, int value, const struct timespec* timeout) {
- return __futex(ftx, shared ? FUTEX_WAIT : FUTEX_WAIT_PRIVATE, value, timeout);
+static inline int __futex_wait_ex(volatile void* ftx, bool shared, int value,
+ bool use_realtime_clock, const struct timespec* abs_timeout) {
+ return __futex(ftx, (shared ? FUTEX_WAIT_BITSET : FUTEX_WAIT_BITSET_PRIVATE) |
+ (use_realtime_clock ? FUTEX_CLOCK_REALTIME : 0), value, abs_timeout,
+ FUTEX_BITSET_MATCH_ANY);
}
__END_DECLS
diff --git a/libc/private/bionic_globals.h b/libc/private/bionic_globals.h
new file mode 100644
index 000000000..b45c0c370
--- /dev/null
+++ b/libc/private/bionic_globals.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _PRIVATE_BIONIC_GLOBALS_H
+#define _PRIVATE_BIONIC_GLOBALS_H
+
+#include <sys/cdefs.h>
+
+#include "private/bionic_malloc_dispatch.h"
+#include "private/bionic_vdso.h"
+#include "private/WriteProtected.h"
+
+struct libc_globals {
+ vdso_entry vdso[VDSO_END];
+ long setjmp_cookie;
+ MallocDispatch malloc_dispatch;
+};
+
+__LIBC_HIDDEN__ extern WriteProtected<libc_globals> __libc_globals;
+
+class KernelArgumentBlock;
+__LIBC_HIDDEN__ void __libc_init_global_stack_chk_guard(KernelArgumentBlock& args);
+__LIBC_HIDDEN__ void __libc_init_malloc(libc_globals* globals);
+__LIBC_HIDDEN__ void __libc_init_setjmp_cookie(libc_globals* globals, KernelArgumentBlock& args);
+__LIBC_HIDDEN__ void __libc_init_vdso(libc_globals* globals, KernelArgumentBlock& args);
+
+#if defined(__i386__)
+__LIBC_HIDDEN__ extern void* __libc_sysinfo;
+__LIBC_HIDDEN__ void __libc_init_sysinfo(KernelArgumentBlock& args);
+#endif
+
+#endif
diff --git a/libc/private/bionic_lock.h b/libc/private/bionic_lock.h
index 6a0fd06ad..3dbafe07e 100644
--- a/libc/private/bionic_lock.h
+++ b/libc/private/bionic_lock.h
@@ -30,7 +30,10 @@
#include <stdatomic.h>
#include "private/bionic_futex.h"
+#include "private/bionic_macros.h"
+// Lock is used in places like pthread_rwlock_t, which can be initialized without calling
+// an initialization function. So make sure Lock can be initialized by setting its memory to 0.
class Lock {
private:
enum LockState {
@@ -42,15 +45,17 @@ class Lock {
bool process_shared;
public:
- Lock(bool process_shared = false) {
- init(process_shared);
- }
-
void init(bool process_shared) {
atomic_init(&state, Unlocked);
this->process_shared = process_shared;
}
+ bool trylock() {
+ LockState old_state = Unlocked;
+ return __predict_true(atomic_compare_exchange_strong_explicit(&state, &old_state,
+ LockedWithoutWaiter, memory_order_acquire, memory_order_relaxed));
+ }
+
void lock() {
LockState old_state = Unlocked;
if (__predict_true(atomic_compare_exchange_strong_explicit(&state, &old_state,
@@ -59,7 +64,7 @@ class Lock {
}
while (atomic_exchange_explicit(&state, LockedWithWaiter, memory_order_acquire) != Unlocked) {
// TODO: As the critical section is brief, it is a better choice to spin a few times befor sleeping.
- __futex_wait_ex(&state, process_shared, LockedWithWaiter, NULL);
+ __futex_wait_ex(&state, process_shared, LockedWithWaiter, false, nullptr);
}
return;
}
diff --git a/libc/private/bionic_macros.h b/libc/private/bionic_macros.h
index 4f3cf8997..4969bd95f 100644
--- a/libc/private/bionic_macros.h
+++ b/libc/private/bionic_macros.h
@@ -42,8 +42,8 @@
(((value) + (alignment) - 1) & ~((alignment) - 1))
#define BIONIC_ROUND_UP_POWER_OF_2(value) \
- (sizeof(value) == 8) \
+ ((sizeof(value) == 8) \
? (1UL << (64 - __builtin_clzl(static_cast<unsigned long>(value)))) \
- : (1UL << (32 - __builtin_clz(static_cast<unsigned int>(value))))
+ : (1UL << (32 - __builtin_clz(static_cast<unsigned int>(value)))))
#endif // _BIONIC_MACROS_H_
diff --git a/libc/private/bionic_malloc_dispatch.h b/libc/private/bionic_malloc_dispatch.h
new file mode 100644
index 000000000..02a092f40
--- /dev/null
+++ b/libc/private/bionic_malloc_dispatch.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _PRIVATE_BIONIC_MALLOC_DISPATCH_H
+#define _PRIVATE_BIONIC_MALLOC_DISPATCH_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <private/bionic_config.h>
+
+// Entry in malloc dispatch table.
+typedef void* (*MallocCalloc)(size_t, size_t);
+typedef void (*MallocFree)(void*);
+typedef struct mallinfo (*MallocMallinfo)();
+typedef void* (*MallocMalloc)(size_t);
+typedef size_t (*MallocMallocUsableSize)(const void*);
+typedef void* (*MallocMemalign)(size_t, size_t);
+typedef int (*MallocPosixMemalign)(void**, size_t, size_t);
+typedef void* (*MallocRealloc)(void*, size_t);
+typedef int (*MallocIterate)(uintptr_t, size_t, void (*)(uintptr_t, size_t, void*), void*);
+typedef void (*MallocMallocDisable)();
+typedef void (*MallocMallocEnable)();
+
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+typedef void* (*MallocPvalloc)(size_t);
+typedef void* (*MallocValloc)(size_t);
+#endif
+
+struct MallocDispatch {
+ MallocCalloc calloc;
+ MallocFree free;
+ MallocMallinfo mallinfo;
+ MallocMalloc malloc;
+ MallocMallocUsableSize malloc_usable_size;
+ MallocMemalign memalign;
+ MallocPosixMemalign posix_memalign;
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+ MallocPvalloc pvalloc;
+#endif
+ MallocRealloc realloc;
+#if defined(HAVE_DEPRECATED_MALLOC_FUNCS)
+ MallocValloc valloc;
+#endif
+ MallocIterate iterate;
+ MallocMallocDisable malloc_disable;
+ MallocMallocEnable malloc_enable;
+} __attribute__((aligned(32)));
+
+#endif
diff --git a/libc/private/bionic_page.h b/libc/private/bionic_page.h
new file mode 100644
index 000000000..0beb70843
--- /dev/null
+++ b/libc/private/bionic_page.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _BIONIC_PAGE_H_
+#define _BIONIC_PAGE_H_
+
+// Get PAGE_SIZE and PAGE_MASK.
+#include <sys/user.h>
+
+// Returns the address of the page containing address 'x'.
+#define PAGE_START(x) ((x) & PAGE_MASK)
+
+// Returns the offset of address 'x' in its page.
+#define PAGE_OFFSET(x) ((x) & ~PAGE_MASK)
+
+// Returns the address of the next page after address 'x', unless 'x' is
+// itself at the start of a page.
+#define PAGE_END(x) PAGE_START((x) + (PAGE_SIZE-1))
+
+#endif // _BIONIC_PAGE_H_
diff --git a/libc/private/bionic_sdk_version.h b/libc/private/bionic_sdk_version.h
new file mode 100644
index 000000000..871d25c9e
--- /dev/null
+++ b/libc/private/bionic_sdk_version.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _BIONIC_SDK_VERSION_H_
+#define _BIONIC_SDK_VERSION_H_
+
+#include <stdint.h>
+
+uint32_t bionic_get_application_target_sdk_version();
+
+#endif // _BIONIC_SDK_VERSION_H_
diff --git a/libc/private/bionic_time_conversions.h b/libc/private/bionic_time_conversions.h
index cf0046ae9..a83484370 100644
--- a/libc/private/bionic_time_conversions.h
+++ b/libc/private/bionic_time_conversions.h
@@ -29,9 +29,12 @@
#ifndef _BIONIC_TIME_CONVERSIONS_H
#define _BIONIC_TIME_CONVERSIONS_H
+#include <errno.h>
#include <time.h>
#include <sys/cdefs.h>
+#include "private/bionic_constants.h"
+
__BEGIN_DECLS
__LIBC_HIDDEN__ bool timespec_from_timeval(timespec& ts, const timeval& tv);
@@ -39,8 +42,24 @@ __LIBC_HIDDEN__ void timespec_from_ms(timespec& ts, const int ms);
__LIBC_HIDDEN__ void timeval_from_timespec(timeval& tv, const timespec& ts);
-__LIBC_HIDDEN__ bool timespec_from_absolute_timespec(timespec& ts, const timespec& abs_ts, clockid_t clock);
+__LIBC_HIDDEN__ void absolute_timespec_from_timespec(timespec& abs_ts, const timespec& ts,
+ clockid_t clock);
__END_DECLS
+static inline int check_timespec(const timespec* ts, bool null_allowed) {
+ if (null_allowed && ts == nullptr) {
+ return 0;
+ }
+ // glibc just segfaults if you pass a null timespec.
+ // That seems a lot more likely to catch bad code than returning EINVAL.
+ if (ts->tv_nsec < 0 || ts->tv_nsec >= NS_PER_S) {
+ return EINVAL;
+ }
+ if (ts->tv_sec < 0) {
+ return ETIMEDOUT;
+ }
+ return 0;
+}
+
#endif
diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h
index 30dc0eb3e..c61e2ffdd 100644
--- a/libc/private/bionic_tls.h
+++ b/libc/private/bionic_tls.h
@@ -30,7 +30,7 @@
#define __BIONIC_PRIVATE_BIONIC_TLS_H_
#include <sys/cdefs.h>
-#include <sys/limits.h>
+
#include "bionic_macros.h"
#include "__get_tls.h"
@@ -67,6 +67,13 @@ enum {
TLS_SLOT_STACK_GUARD = 5, // GCC requires this specific slot for x86.
TLS_SLOT_DLERROR,
+ // Fast storage for Thread::Current() in ART.
+ TLS_SLOT_ART_THREAD_SELF,
+
+ // Lets TSAN avoid using pthread_getspecific for finding the current thread
+ // state.
+ TLS_SLOT_TSAN,
+
BIONIC_TLS_SLOTS // Must come last!
};
@@ -96,13 +103,9 @@ enum {
#define LIBC_PTHREAD_KEY_RESERVED_COUNT 12
-#if defined(USE_JEMALLOC)
/* Internally, jemalloc uses a single key for per thread data. */
#define JEMALLOC_PTHREAD_KEY_RESERVED_COUNT 1
#define BIONIC_PTHREAD_KEY_RESERVED_COUNT (LIBC_PTHREAD_KEY_RESERVED_COUNT + JEMALLOC_PTHREAD_KEY_RESERVED_COUNT)
-#else
-#define BIONIC_PTHREAD_KEY_RESERVED_COUNT LIBC_PTHREAD_KEY_RESERVED_COUNT
-#endif
/*
* Maximum number of pthread keys allocated.
@@ -114,7 +117,7 @@ __END_DECLS
#if defined(__cplusplus)
class KernelArgumentBlock;
-extern __LIBC_HIDDEN__ void __libc_init_tls(KernelArgumentBlock& args);
+extern void __libc_init_main_thread(KernelArgumentBlock&);
#endif
#endif /* __BIONIC_PRIVATE_BIONIC_TLS_H_ */
diff --git a/libc/private/bionic_vdso.h b/libc/private/bionic_vdso.h
new file mode 100644
index 000000000..5400de5da
--- /dev/null
+++ b/libc/private/bionic_vdso.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _PRIVATE_BIONIC_VDSO_H
+#define _PRIVATE_BIONIC_VDSO_H
+
+#include <time.h>
+
+#if defined(__aarch64__)
+#define VDSO_CLOCK_GETTIME_SYMBOL "__kernel_clock_gettime"
+#define VDSO_GETTIMEOFDAY_SYMBOL "__kernel_gettimeofday"
+#elif defined(__x86_64__) || defined(__i386__)
+#define VDSO_CLOCK_GETTIME_SYMBOL "__vdso_clock_gettime"
+#define VDSO_GETTIMEOFDAY_SYMBOL "__vdso_gettimeofday"
+#endif
+
+extern "C" int __clock_gettime(int, timespec*);
+extern "C" int __gettimeofday(timeval*, struct timezone*);
+
+struct vdso_entry {
+ const char* name;
+ void* fn;
+};
+
+enum {
+ VDSO_CLOCK_GETTIME = 0,
+ VDSO_GETTIMEOFDAY,
+ VDSO_END
+};
+
+#endif // _PRIVATE_BIONIC_VDSO_H
diff --git a/libc/private/get_cpu_count_from_string.h b/libc/private/get_cpu_count_from_string.h
new file mode 100644
index 000000000..a0cb95de0
--- /dev/null
+++ b/libc/private/get_cpu_count_from_string.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+
+// Parse a string like: 0, 2-4, 6.
+static int GetCpuCountFromString(const char* s) {
+ int cpu_count = 0;
+ int last_cpu = -1;
+ while (*s != '\0') {
+ if (isdigit(*s)) {
+ int cpu = static_cast<int>(strtol(s, const_cast<char**>(&s), 10));
+ if (last_cpu != -1) {
+ cpu_count += cpu - last_cpu;
+ } else {
+ cpu_count++;
+ }
+ last_cpu = cpu;
+ } else {
+ if (*s == ',') {
+ last_cpu = -1;
+ }
+ s++;
+ }
+ }
+ return cpu_count;
+}
diff --git a/libc/private/libc_logging.h b/libc/private/libc_logging.h
index da2192bba..e389565f5 100644
--- a/libc/private/libc_logging.h
+++ b/libc/private/libc_logging.h
@@ -101,6 +101,8 @@ __LIBC_HIDDEN__ int __libc_format_log(int priority, const char* tag, const char*
__LIBC_HIDDEN__ int __libc_format_log_va_list(int priority, const char* tag, const char* format,
va_list ap);
+__LIBC_HIDDEN__ int __libc_write_log(int priority, const char* tag, const char* msg);
+
//
// Event logging.
//
diff --git a/libc/stdio/fileext.h b/libc/stdio/fileext.h
deleted file mode 100644
index 6cacc0f84..000000000
--- a/libc/stdio/fileext.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/* $OpenBSD: fileext.h,v 1.2 2005/06/17 20:40:32 espie Exp $ */
-/* $NetBSD: fileext.h,v 1.5 2003/07/18 21:46:41 nathanw Exp $ */
-
-/*-
- * Copyright (c)2001 Citrus Project,
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Citrus$
- */
-
-#ifndef _FILEEXT_H_
-#define _FILEEXT_H_
-
-#include <pthread.h>
-#include <stdbool.h>
-
-__BEGIN_DECLS
-
-/*
- * file extension
- */
-struct __sfileext {
- struct __sbuf _ub; /* ungetc buffer */
- struct wchar_io_data _wcio; /* wide char io status */
- pthread_mutex_t _lock; /* file lock */
- bool _stdio_handles_locking; /* __fsetlocking support */
-};
-
-#if defined(__cplusplus)
-#define _EXT(fp) reinterpret_cast<__sfileext*>((fp)->_ext._base)
-#else
-#define _EXT(fp) ((struct __sfileext *)((fp)->_ext._base))
-#endif
-
-#define _UB(fp) _EXT(fp)->_ub
-#define _FLOCK(fp) _EXT(fp)->_lock
-
-#define _FILEEXT_INIT(fp) \
-do { \
- _UB(fp)._base = NULL; \
- _UB(fp)._size = 0; \
- WCIO_INIT(fp); \
- pthread_mutexattr_t attr; \
- pthread_mutexattr_init(&attr); \
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \
- pthread_mutex_init(&_FLOCK(fp), &attr); \
- pthread_mutexattr_destroy(&attr); \
- _EXT(fp)->_stdio_handles_locking = true; \
-} while (0)
-
-#define _FILEEXT_SETUP(f, fext) \
-do { \
- (f)->_ext._base = (unsigned char *)(fext); \
- _FILEEXT_INIT(f); \
-} while (0)
-
-__END_DECLS
-
-#endif /* _FILEEXT_H_ */
diff --git a/libc/stdio/findfp.c b/libc/stdio/findfp.c
deleted file mode 100644
index 5e51198a7..000000000
--- a/libc/stdio/findfp.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/* $OpenBSD: findfp.c,v 1.15 2013/12/17 16:33:27 deraadt Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-#include "local.h"
-#include "glue.h"
-#include "private/thread_private.h"
-
-#define ALIGNBYTES (sizeof(uintptr_t) - 1)
-#define ALIGN(p) (((uintptr_t)(p) + ALIGNBYTES) &~ ALIGNBYTES)
-
-int __sdidinit;
-
-#define NDYNAMIC 10 /* add ten more whenever necessary */
-
-#define std(flags, file) \
- {0,0,0,flags,file,{0,0},0,__sF+file,__sclose,__sread,__sseek,__swrite, \
- {(unsigned char *)(__sFext+file), 0},NULL,0,{0},{0},{0,0},0,0}
-
- /* the usual - (stdin + stdout + stderr) */
-static FILE usual[FOPEN_MAX - 3];
-static struct __sfileext usualext[FOPEN_MAX - 3];
-static struct glue uglue = { 0, FOPEN_MAX - 3, usual };
-static struct glue *lastglue = &uglue;
-_THREAD_PRIVATE_MUTEX(__sfp_mutex);
-
-static struct __sfileext __sFext[3];
-FILE __sF[3] = {
- std(__SRD, STDIN_FILENO), /* stdin */
- std(__SWR, STDOUT_FILENO), /* stdout */
- std(__SWR|__SNBF, STDERR_FILENO) /* stderr */
-};
-FILE* stdin = &__sF[0];
-FILE* stdout = &__sF[1];
-FILE* stderr = &__sF[2];
-struct glue __sglue = { &uglue, 3, __sF };
-
-static struct glue *
-moreglue(int n)
-{
- struct glue *g;
- FILE *p;
- struct __sfileext *pext;
- static FILE empty;
- char *data;
-
- data = malloc(sizeof(*g) + ALIGNBYTES + n * sizeof(FILE)
- + n * sizeof(struct __sfileext));
- if (data == NULL)
- return (NULL);
- g = (struct glue *)data;
- p = (FILE *)ALIGN(data + sizeof(*g));
- pext = (struct __sfileext *)
- (ALIGN(data + sizeof(*g)) + n * sizeof(FILE));
- g->next = NULL;
- g->niobs = n;
- g->iobs = p;
- while (--n >= 0) {
- *p = empty;
- _FILEEXT_SETUP(p, pext);
- p++;
- pext++;
- }
- return (g);
-}
-
-/*
- * Find a free FILE for fopen et al.
- */
-FILE *
-__sfp(void)
-{
- FILE *fp;
- int n;
- struct glue *g;
-
- if (!__sdidinit)
- __sinit();
-
- _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex);
- for (g = &__sglue; g != NULL; g = g->next) {
- for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
- if (fp->_flags == 0)
- goto found;
- }
-
- /* release lock while mallocing */
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex);
- if ((g = moreglue(NDYNAMIC)) == NULL)
- return (NULL);
- _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex);
- lastglue->next = g;
- lastglue = g;
- fp = g->iobs;
-found:
- fp->_flags = 1; /* reserve this slot; caller sets real flags */
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex);
- fp->_p = NULL; /* no current pointer */
- fp->_w = 0; /* nothing to read or write */
- fp->_r = 0;
- fp->_bf._base = NULL; /* no buffer */
- fp->_bf._size = 0;
- fp->_lbfsize = 0; /* not line buffered */
- fp->_file = -1; /* no file */
-/* fp->_cookie = <any>; */ /* caller sets cookie, _read/_write etc */
- fp->_lb._base = NULL; /* no line buffer */
- fp->_lb._size = 0;
- _FILEEXT_INIT(fp);
- return (fp);
-}
-
-/*
- * exit() and abort() call _cleanup() through the callback registered
- * with __atexit_register_cleanup(), set whenever we open or buffer a
- * file. This chicanery is done so that programs that do not use stdio
- * need not link it all in.
- *
- * The name `_cleanup' is, alas, fairly well known outside stdio.
- */
-void
-_cleanup(void)
-{
- /* (void) _fwalk(fclose); */
- (void) _fwalk(__sflush); /* `cheating' */
-}
-
-/*
- * __sinit() is called whenever stdio's internal variables must be set up.
- */
-void
-__sinit(void)
-{
- _THREAD_PRIVATE_MUTEX(__sinit_mutex);
-
- _THREAD_PRIVATE_MUTEX_LOCK(__sinit_mutex);
- if (__sdidinit) {
- /* bail out if caller lost the race */
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sinit_mutex);
- return;
- }
-
- /* Initialize stdin/stdout/stderr (for the recursive mutex). http://b/18208568. */
- for (size_t i = 0; i < 3; ++i) {
- _FILEEXT_SETUP(__sF+i, __sFext+i);
- }
- /* Initialize the pre-allocated (but initially unused) streams. */
- for (size_t i = 0; i < FOPEN_MAX - 3; ++i) {
- _FILEEXT_SETUP(usual+i, usualext+i);
- }
-
- /* make sure we clean up on exit */
- __atexit_register_cleanup(_cleanup); /* conservative */
- __sdidinit = 1;
-
- _THREAD_PRIVATE_MUTEX_UNLOCK(__sinit_mutex);
-}
diff --git a/libc/stdio/glue.h b/libc/stdio/glue.h
index a9e5d1030..cb1d18203 100644
--- a/libc/stdio/glue.h
+++ b/libc/stdio/glue.h
@@ -47,6 +47,6 @@ struct glue {
};
/* This was referenced by a couple of different pieces of middleware and the Crystax NDK. */
-__LIBC64_HIDDEN__ extern struct glue __sglue;
+__LIBC32_LEGACY_PUBLIC__ extern struct glue __sglue;
__END_DECLS
diff --git a/libc/stdio/local.h b/libc/stdio/local.h
index ce0414129..7fe339ac7 100644
--- a/libc/stdio/local.h
+++ b/libc/stdio/local.h
@@ -32,48 +32,178 @@
* SUCH DAMAGE.
*/
+#ifndef __BIONIC_STDIO_LOCAL_H__
+#define __BIONIC_STDIO_LOCAL_H__
+
+#include <pthread.h>
+#include <stdbool.h>
+#include <wchar.h>
+#include "wcio.h"
+
/*
* Information local to this implementation of stdio,
* in particular, macros and private variables.
*/
-#include <wchar.h>
-#include "wcio.h"
-#include "fileext.h"
-
__BEGIN_DECLS
+struct __sbuf {
+ unsigned char* _base;
+#if defined(__LP64__)
+ size_t _size;
+#else
+ int _size;
+#endif
+};
+
+struct __sFILE {
+ unsigned char *_p; /* current position in (some) buffer */
+ int _r; /* read space left for getc() */
+ int _w; /* write space left for putc() */
+#if defined(__LP64__)
+ int _flags; /* flags, below; this FILE is free if 0 */
+ int _file; /* fileno, if Unix descriptor, else -1 */
+#else
+ short _flags; /* flags, below; this FILE is free if 0 */
+ short _file; /* fileno, if Unix descriptor, else -1 */
+#endif
+ struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
+ int _lbfsize; /* 0 or -_bf._size, for inline putc */
+
+ // Function pointers used by `funopen`.
+ // Note that `_seek` is ignored if `_seek64` (in __sfileext) is set.
+ // TODO: NetBSD has `funopen2` which corrects the `int`s to `size_t`s.
+ // TODO: glibc has `fopencookie` which passes the function pointers in a struct.
+ void* _cookie; /* cookie passed to io functions */
+ int (*_close)(void*);
+ int (*_read)(void*, char*, int);
+ fpos_t (*_seek)(void*, fpos_t, int);
+ int (*_write)(void*, const char*, int);
+
+ /* extension data, to avoid further ABI breakage */
+ struct __sbuf _ext;
+ /* data for long sequences of ungetc() */
+ unsigned char *_up; /* saved _p when _p is doing ungetc data */
+ int _ur; /* saved _r when _r is counting ungetc data */
+
+ /* tricks to meet minimum requirements even when malloc() fails */
+ unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */
+ unsigned char _nbuf[1]; /* guarantee a getc() buffer */
+
+ /* separate buffer for fgetln() when line crosses buffer boundary */
+ struct __sbuf _lb; /* buffer for fgetln() */
+
+ /* Unix stdio files get aligned to block boundaries on fseek() */
+ int _blksize; /* stat.st_blksize (may be != _bf._size) */
+
+ fpos_t _unused_0; // This was the `_offset` field (see below).
+
+ // Do not add new fields here. (Or remove or change the size of any above.)
+ // Although bionic currently exports `stdin`, `stdout`, and `stderr` symbols,
+ // that still hasn't made it to the NDK. All NDK-built apps index directly
+ // into an array of this struct (which was in <stdio.h> historically), so if
+ // you need to make any changes, they need to be in the `__sfileext` struct
+ // below, and accessed via `_EXT`.
+};
+
+struct __sfileext {
+ // ungetc buffer.
+ struct __sbuf _ub;
+
+ // Wide char io status.
+ struct wchar_io_data _wcio;
+
+ // File lock.
+ pthread_mutex_t _lock;
+
+ // __fsetlocking support.
+ bool _caller_handles_locking;
+
+ // Equivalent to `_seek` but for _FILE_OFFSET_BITS=64.
+ // Callers should use this but fall back to `__sFILE::_seek`.
+ off64_t (*_seek64)(void*, off64_t, int);
+};
+
+// Values for `__sFILE::_flags`.
+#define __SLBF 0x0001 // Line buffered.
+#define __SNBF 0x0002 // Unbuffered.
+// RD and WR are never simultaneously asserted: use _SRW instead.
+#define __SRD 0x0004 // OK to read.
+#define __SWR 0x0008 // OK to write.
+#define __SRW 0x0010 // Open for reading & writing.
+#define __SEOF 0x0020 // Found EOF.
+#define __SERR 0x0040 // Found error.
+#define __SMBF 0x0080 // `_buf` is from malloc.
+#define __SAPP 0x0100 // fdopen()ed in append mode.
+#define __SSTR 0x0200 // This is an sprintf/snprintf string.
+// #define __SOPT 0x0400 --- historical (do fseek() optimization).
+// #define __SNPT 0x0800 --- historical (do not do fseek() optimization).
+// #define __SOFF 0x1000 --- historical (set iff _offset is in fact correct).
+#define __SMOD 0x2000 // true => fgetln modified _p text.
+#define __SALC 0x4000 // Allocate string space dynamically.
+#define __SIGN 0x8000 // Ignore this file in _fwalk.
+
+// TODO: remove remaining references to these obsolete flags.
+#define __SNPT 0
+#define __SOPT 0
+
+#if defined(__cplusplus)
+#define _EXT(fp) reinterpret_cast<__sfileext*>((fp)->_ext._base)
+#else
+#define _EXT(fp) ((struct __sfileext *)((fp)->_ext._base))
+#endif
+
+#define _UB(fp) _EXT(fp)->_ub
+#define _FLOCK(fp) _EXT(fp)->_lock
+
+#define _FILEEXT_INIT(fp) \
+do { \
+ _UB(fp)._base = NULL; \
+ _UB(fp)._size = 0; \
+ WCIO_INIT(fp); \
+ pthread_mutexattr_t attr; \
+ pthread_mutexattr_init(&attr); \
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); \
+ pthread_mutex_init(&_FLOCK(fp), &attr); \
+ pthread_mutexattr_destroy(&attr); \
+ _EXT(fp)->_caller_handles_locking = false; \
+} while (0)
+
+#define _FILEEXT_SETUP(f, fext) \
+do { \
+ (f)->_ext._base = (unsigned char *)(fext); \
+ _FILEEXT_INIT(f); \
+} while (0)
+
/*
* Android <= KitKat had getc/putc macros in <stdio.h> that referred
* to __srget/__swbuf, so those symbols need to be public for LP32
* but can be hidden for LP64.
*/
-__LIBC64_HIDDEN__ int __srget(FILE*);
-__LIBC64_HIDDEN__ int __swbuf(int, FILE*);
-__LIBC64_HIDDEN__ int __srefill(FILE*);
+__LIBC32_LEGACY_PUBLIC__ int __srget(FILE*);
+__LIBC32_LEGACY_PUBLIC__ int __swbuf(int, FILE*);
+__LIBC32_LEGACY_PUBLIC__ int __srefill(FILE*);
/* This was referenced by the apportable middleware for LP32. */
-__LIBC64_HIDDEN__ int __swsetup(FILE*);
+__LIBC32_LEGACY_PUBLIC__ int __swsetup(FILE*);
/* These were referenced by a couple of different pieces of middleware and the Crystax NDK. */
-__LIBC64_HIDDEN__ extern int __sdidinit;
-__LIBC64_HIDDEN__ int __sflags(const char*, int*);
-__LIBC64_HIDDEN__ FILE* __sfp(void);
-__LIBC64_HIDDEN__ void __sinit(void);
-__LIBC64_HIDDEN__ void __smakebuf(FILE*);
+__LIBC32_LEGACY_PUBLIC__ int __sflags(const char*, int*);
+__LIBC32_LEGACY_PUBLIC__ FILE* __sfp(void);
+__LIBC32_LEGACY_PUBLIC__ void __smakebuf(FILE*);
/* These are referenced by the Greed for Glory franchise. */
-__LIBC64_HIDDEN__ int __sflush(FILE *);
-__LIBC64_HIDDEN__ int __sread(void *, char *, int);
-__LIBC64_HIDDEN__ int __swrite(void *, const char *, int);
-__LIBC64_HIDDEN__ fpos_t __sseek(void *, fpos_t, int);
-__LIBC64_HIDDEN__ int __sclose(void *);
-__LIBC64_HIDDEN__ int _fwalk(int (*)(FILE *));
+__LIBC32_LEGACY_PUBLIC__ int __sflush(FILE *);
+__LIBC32_LEGACY_PUBLIC__ int __sread(void *, char *, int);
+__LIBC32_LEGACY_PUBLIC__ int __swrite(void *, const char *, int);
+__LIBC32_LEGACY_PUBLIC__ fpos_t __sseek(void *, fpos_t, int);
+__LIBC32_LEGACY_PUBLIC__ int __sclose(void *);
+__LIBC32_LEGACY_PUBLIC__ int _fwalk(int (*)(FILE *));
#pragma GCC visibility push(hidden)
+off64_t __sseek64(void*, off64_t, int);
int __sflush_locked(FILE *);
-void _cleanup(void);
int __swhatbuf(FILE *, size_t *, int *);
wint_t __fgetwc_unlock(FILE *);
wint_t __ungetwc(wint_t, FILE *);
@@ -82,8 +212,6 @@ int __svfscanf(FILE * __restrict, const char * __restrict, __va_list);
int __vfwprintf(FILE * __restrict, const wchar_t * __restrict, __va_list);
int __vfwscanf(FILE * __restrict, const wchar_t * __restrict, __va_list);
-extern void __atexit_register_cleanup(void (*)(void));
-
/*
* Return true if the given FILE cannot be written now.
*/
@@ -111,8 +239,8 @@ extern void __atexit_register_cleanup(void (*)(void));
(fp)->_lb._base = NULL; \
}
-#define FLOCKFILE(fp) if (_EXT(fp)->_stdio_handles_locking) flockfile(fp)
-#define FUNLOCKFILE(fp) if (_EXT(fp)->_stdio_handles_locking) funlockfile(fp)
+#define FLOCKFILE(fp) if (!_EXT(fp)->_caller_handles_locking) flockfile(fp)
+#define FUNLOCKFILE(fp) if (!_EXT(fp)->_caller_handles_locking) funlockfile(fp)
#define FLOATING_POINT
#define PRINTF_WIDE_CHAR
@@ -123,7 +251,6 @@ extern void __atexit_register_cleanup(void (*)(void));
#define __sfeof(p) (((p)->_flags & __SEOF) != 0)
#define __sferror(p) (((p)->_flags & __SERR) != 0)
#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF)))
-#define __sfileno(p) ((p)->_file)
#if !defined(__cplusplus)
#define __sgetc(p) (--(p)->_r < 0 ? __srget(p) : (int)(*(p)->_p++))
static __inline int __sputc(int _c, FILE* _p) {
@@ -140,6 +267,12 @@ struct __suio;
extern int __sfvwrite(FILE *, struct __suio *);
wint_t __fputwc_unlock(wchar_t wc, FILE *fp);
+/* Remove the if (!__sdidinit) __sinit() idiom from untouched upstream stdio code. */
+extern void __sinit(void); // Not actually implemented.
+#define __sdidinit 1
+
#pragma GCC visibility pop
__END_DECLS
+
+#endif
diff --git a/libc/upstream-openbsd/lib/libc/stdio/refill.c b/libc/stdio/refill.c
index 165c72a64..5b0811f6a 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/refill.c
+++ b/libc/stdio/refill.c
@@ -51,16 +51,13 @@ lflush(FILE *fp)
int
__srefill(FILE *fp)
{
-
- /* make sure stdio is set up */
- if (!__sdidinit)
- __sinit();
-
fp->_r = 0; /* largely a convenience for callers */
+#if !defined(__ANDROID__)
/* SysV does not make this test; take it out for compatibility */
if (fp->_flags & __SEOF)
return (EOF);
+#endif
/* if not already reading, have to be reading and writing */
if ((fp->_flags & __SRD) == 0) {
diff --git a/libc/stdio/stdio.c b/libc/stdio/stdio.c
deleted file mode 100644
index fc2115e9b..000000000
--- a/libc/stdio/stdio.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/* $OpenBSD: stdio.c,v 1.9 2005/08/08 08:05:36 espie Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <errno.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <stdio.h>
-#include "local.h"
-
-/*
- * Small standard I/O/seek/close functions.
- * These maintain the `known seek offset' for seek optimisation.
- */
-int
-__sread(void *cookie, char *buf, int n)
-{
- FILE *fp = cookie;
- int ret;
-
- ret = TEMP_FAILURE_RETRY(read(fp->_file, buf, n));
- /* if the read succeeded, update the current offset */
- if (ret >= 0)
- fp->_offset += ret;
- else
- fp->_flags &= ~__SOFF; /* paranoia */
- return (ret);
-}
-
-int
-__swrite(void *cookie, const char *buf, int n)
-{
- FILE *fp = cookie;
-
- if (fp->_flags & __SAPP)
- (void) TEMP_FAILURE_RETRY(lseek(fp->_file, (off_t)0, SEEK_END));
- fp->_flags &= ~__SOFF; /* in case FAPPEND mode is set */
- return TEMP_FAILURE_RETRY(write(fp->_file, buf, n));
-}
-
-fpos_t
-__sseek(void *cookie, fpos_t offset, int whence)
-{
- FILE *fp = cookie;
- off_t ret;
-
- ret = TEMP_FAILURE_RETRY(lseek(fp->_file, (off_t)offset, whence));
- if (ret == (off_t)-1)
- fp->_flags &= ~__SOFF;
- else {
- fp->_flags |= __SOFF;
- fp->_offset = ret;
- }
- return (ret);
-}
-
-int
-__sclose(void *cookie)
-{
- return close(((FILE *)cookie)->_file);
-}
diff --git a/libc/stdio/stdio.cpp b/libc/stdio/stdio.cpp
new file mode 100644
index 000000000..1c31a277f
--- /dev/null
+++ b/libc/stdio/stdio.cpp
@@ -0,0 +1,600 @@
+/* $OpenBSD: findfp.c,v 1.15 2013/12/17 16:33:27 deraadt Exp $ */
+/*-
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "local.h"
+#include "glue.h"
+#include "private/ErrnoRestorer.h"
+#include "private/thread_private.h"
+
+#define ALIGNBYTES (sizeof(uintptr_t) - 1)
+#define ALIGN(p) (((uintptr_t)(p) + ALIGNBYTES) &~ ALIGNBYTES)
+
+#define NDYNAMIC 10 /* add ten more whenever necessary */
+
+#define std(flags, file) \
+ {0,0,0,flags,file,{0,0},0,__sF+file,__sclose,__sread,nullptr,__swrite, \
+ {(unsigned char *)(__sFext+file), 0},nullptr,0,{0},{0},{0,0},0,0}
+
+_THREAD_PRIVATE_MUTEX(__sfp_mutex);
+
+// TODO: when we no longer have to support both clang and GCC, we can simplify all this.
+#define SBUF_INIT {0,0}
+#if defined(__LP64__)
+#define MBSTATE_T_INIT {{0},{0}}
+#else
+#define MBSTATE_T_INIT {{0}}
+#endif
+#define WCHAR_IO_DATA_INIT {MBSTATE_T_INIT,MBSTATE_T_INIT,{0},0,0}
+
+static struct __sfileext __sFext[3] = {
+ { SBUF_INIT, WCHAR_IO_DATA_INIT, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, false, __sseek64 },
+ { SBUF_INIT, WCHAR_IO_DATA_INIT, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, false, __sseek64 },
+ { SBUF_INIT, WCHAR_IO_DATA_INIT, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, false, __sseek64 },
+};
+
+// __sF is exported for backwards compatibility. Until M, we didn't have symbols
+// for stdin/stdout/stderr; they were macros accessing __sF.
+FILE __sF[3] = {
+ std(__SRD, STDIN_FILENO),
+ std(__SWR, STDOUT_FILENO),
+ std(__SWR|__SNBF, STDERR_FILENO),
+};
+
+FILE* stdin = &__sF[0];
+FILE* stdout = &__sF[1];
+FILE* stderr = &__sF[2];
+
+struct glue __sglue = { NULL, 3, __sF };
+static struct glue* lastglue = &__sglue;
+
+class ScopedFileLock {
+ public:
+ ScopedFileLock(FILE* fp) : fp_(fp) {
+ FLOCKFILE(fp_);
+ }
+ ~ScopedFileLock() {
+ FUNLOCKFILE(fp_);
+ }
+
+ private:
+ FILE* fp_;
+};
+
+static glue* moreglue(int n) {
+ static FILE empty;
+
+ char* data = new char[sizeof(glue) + ALIGNBYTES + n * sizeof(FILE) + n * sizeof(__sfileext)];
+ if (data == nullptr) return nullptr;
+
+ glue* g = reinterpret_cast<glue*>(data);
+ FILE* p = reinterpret_cast<FILE*>(ALIGN(data + sizeof(*g)));
+ __sfileext* pext = reinterpret_cast<__sfileext*>(ALIGN(data + sizeof(*g)) + n * sizeof(FILE));
+ g->next = NULL;
+ g->niobs = n;
+ g->iobs = p;
+ while (--n >= 0) {
+ *p = empty;
+ _FILEEXT_SETUP(p, pext);
+ p++;
+ pext++;
+ }
+ return g;
+}
+
+/*
+ * Find a free FILE for fopen et al.
+ */
+FILE* __sfp(void) {
+ FILE *fp;
+ int n;
+ struct glue *g;
+
+ _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex);
+ for (g = &__sglue; g != NULL; g = g->next) {
+ for (fp = g->iobs, n = g->niobs; --n >= 0; fp++)
+ if (fp->_flags == 0)
+ goto found;
+ }
+
+ /* release lock while mallocing */
+ _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex);
+ if ((g = moreglue(NDYNAMIC)) == NULL)
+ return (NULL);
+ _THREAD_PRIVATE_MUTEX_LOCK(__sfp_mutex);
+ lastglue->next = g;
+ lastglue = g;
+ fp = g->iobs;
+found:
+ fp->_flags = 1; /* reserve this slot; caller sets real flags */
+ _THREAD_PRIVATE_MUTEX_UNLOCK(__sfp_mutex);
+ fp->_p = NULL; /* no current pointer */
+ fp->_w = 0; /* nothing to read or write */
+ fp->_r = 0;
+ fp->_bf._base = NULL; /* no buffer */
+ fp->_bf._size = 0;
+ fp->_lbfsize = 0; /* not line buffered */
+ fp->_file = -1; /* no file */
+
+ fp->_lb._base = NULL; /* no line buffer */
+ fp->_lb._size = 0;
+ _FILEEXT_INIT(fp);
+
+ // Caller sets cookie, _read/_write etc.
+ // We explicitly clear _seek and _seek64 to prevent subtle bugs.
+ fp->_seek = nullptr;
+ _EXT(fp)->_seek64 = nullptr;
+
+ return fp;
+}
+
+extern "C" __LIBC_HIDDEN__ void __libc_stdio_cleanup(void) {
+ // Equivalent to fflush(nullptr), but without all the locking since we're shutting down anyway.
+ _fwalk(__sflush);
+}
+
+static FILE* __fopen(int fd, int flags) {
+#if !defined(__LP64__)
+ if (fd > SHRT_MAX) {
+ errno = EMFILE;
+ return nullptr;
+ }
+#endif
+
+ FILE* fp = __sfp();
+ if (fp != nullptr) {
+ fp->_file = fd;
+ fp->_flags = flags;
+ fp->_cookie = fp;
+ fp->_read = __sread;
+ fp->_write = __swrite;
+ fp->_close = __sclose;
+ _EXT(fp)->_seek64 = __sseek64;
+ }
+ return fp;
+}
+
+FILE* fopen(const char* file, const char* mode) {
+ int oflags;
+ int flags = __sflags(mode, &oflags);
+ if (flags == 0) return nullptr;
+
+ int fd = open(file, oflags, DEFFILEMODE);
+ if (fd == -1) {
+ return nullptr;
+ }
+
+ FILE* fp = __fopen(fd, flags);
+ if (fp == nullptr) {
+ ErrnoRestorer errno_restorer;
+ close(fd);
+ return nullptr;
+ }
+
+ // When opening in append mode, even though we use O_APPEND,
+ // we need to seek to the end so that ftell() gets the right
+ // answer. If the user then alters the seek pointer, or
+ // the file extends, this will fail, but there is not much
+ // we can do about this. (We could set __SAPP and check in
+ // fseek and ftell.)
+ // TODO: check in __sseek instead.
+ if (oflags & O_APPEND) __sseek64(fp, 0, SEEK_END);
+
+ return fp;
+}
+__strong_alias(fopen64, fopen);
+
+FILE* fdopen(int fd, const char* mode) {
+ int oflags;
+ int flags = __sflags(mode, &oflags);
+ if (flags == 0) return nullptr;
+
+ // Make sure the mode the user wants is a subset of the actual mode.
+ int fdflags = fcntl(fd, F_GETFL, 0);
+ if (fdflags < 0) return nullptr;
+ int tmp = fdflags & O_ACCMODE;
+ if (tmp != O_RDWR && (tmp != (oflags & O_ACCMODE))) {
+ errno = EINVAL;
+ return nullptr;
+ }
+
+ // If opened for appending, but underlying descriptor does not have
+ // O_APPEND bit set, assert __SAPP so that __swrite() will lseek to
+ // end before each write.
+ // TODO: use fcntl(2) to set O_APPEND instead.
+ if ((oflags & O_APPEND) && !(fdflags & O_APPEND)) flags |= __SAPP;
+
+ // If close-on-exec was requested, then turn it on if not already.
+ if ((oflags & O_CLOEXEC) && !((tmp = fcntl(fd, F_GETFD)) & FD_CLOEXEC)) {
+ fcntl(fd, F_SETFD, tmp | FD_CLOEXEC);
+ }
+
+ return __fopen(fd, flags);
+}
+
+// Re-direct an existing, open (probably) file to some other file.
+// ANSI is written such that the original file gets closed if at
+// all possible, no matter what.
+// TODO: rewrite this mess completely.
+FILE* freopen(const char* file, const char* mode, FILE* fp) {
+ int oflags;
+ int flags = __sflags(mode, &oflags);
+ if (flags == 0) {
+ fclose(fp);
+ return nullptr;
+ }
+
+ ScopedFileLock sfl(fp);
+
+ // There are actually programs that depend on being able to "freopen"
+ // descriptors that weren't originally open. Keep this from breaking.
+ // Remember whether the stream was open to begin with, and which file
+ // descriptor (if any) was associated with it. If it was attached to
+ // a descriptor, defer closing it; freopen("/dev/stdin", "r", stdin)
+ // should work. This is unnecessary if it was not a Unix file.
+ int isopen, wantfd;
+ if (fp->_flags == 0) {
+ fp->_flags = __SEOF; // Hold on to it.
+ isopen = 0;
+ wantfd = -1;
+ } else {
+ // Flush the stream; ANSI doesn't require this.
+ if (fp->_flags & __SWR) __sflush(fp);
+
+ // If close is NULL, closing is a no-op, hence pointless.
+ isopen = fp->_close != NULL;
+ if ((wantfd = fp->_file) < 0 && isopen) {
+ (*fp->_close)(fp->_cookie);
+ isopen = 0;
+ }
+ }
+
+ // Get a new descriptor to refer to the new file.
+ int fd = open(file, oflags, DEFFILEMODE);
+ if (fd < 0 && isopen) {
+ // If out of fd's close the old one and try again.
+ if (errno == ENFILE || errno == EMFILE) {
+ (*fp->_close)(fp->_cookie);
+ isopen = 0;
+ fd = open(file, oflags, DEFFILEMODE);
+ }
+ }
+
+ int sverrno = errno;
+
+ // Finish closing fp. Even if the open succeeded above, we cannot
+ // keep fp->_base: it may be the wrong size. This loses the effect
+ // of any setbuffer calls, but stdio has always done this before.
+ if (isopen && fd != wantfd) (*fp->_close)(fp->_cookie);
+ if (fp->_flags & __SMBF) free(fp->_bf._base);
+ fp->_w = 0;
+ fp->_r = 0;
+ fp->_p = NULL;
+ fp->_bf._base = NULL;
+ fp->_bf._size = 0;
+ fp->_lbfsize = 0;
+ if (HASUB(fp)) FREEUB(fp);
+ _UB(fp)._size = 0;
+ WCIO_FREE(fp);
+ if (HASLB(fp)) FREELB(fp);
+ fp->_lb._size = 0;
+
+ if (fd < 0) { // Did not get it after all.
+ fp->_flags = 0; // Release.
+ errno = sverrno; // Restore errno in case _close clobbered it.
+ return nullptr;
+ }
+
+ // If reopening something that was open before on a real file, try
+ // to maintain the descriptor. Various C library routines (perror)
+ // assume stderr is always fd STDERR_FILENO, even if being freopen'd.
+ if (wantfd >= 0 && fd != wantfd) {
+ if (dup3(fd, wantfd, oflags & O_CLOEXEC) >= 0) {
+ close(fd);
+ fd = wantfd;
+ }
+ }
+
+ // _file is only a short.
+ if (fd > SHRT_MAX) {
+ fp->_flags = 0; // Release.
+ errno = EMFILE;
+ return nullptr;
+ }
+
+ fp->_flags = flags;
+ fp->_file = fd;
+ fp->_cookie = fp;
+ fp->_read = __sread;
+ fp->_write = __swrite;
+ fp->_close = __sclose;
+ _EXT(fp)->_seek64 = __sseek64;
+
+ // When opening in append mode, even though we use O_APPEND,
+ // we need to seek to the end so that ftell() gets the right
+ // answer. If the user then alters the seek pointer, or
+ // the file extends, this will fail, but there is not much
+ // we can do about this. (We could set __SAPP and check in
+ // fseek and ftell.)
+ if (oflags & O_APPEND) __sseek64(fp, 0, SEEK_END);
+ return fp;
+}
+__strong_alias(freopen64, freopen);
+
+int fclose(FILE* fp) {
+ if (fp->_flags == 0) {
+ // Already freed!
+ errno = EBADF;
+ return EOF;
+ }
+
+ ScopedFileLock sfl(fp);
+ WCIO_FREE(fp);
+ int r = fp->_flags & __SWR ? __sflush(fp) : 0;
+ if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0) {
+ r = EOF;
+ }
+ if (fp->_flags & __SMBF) free(fp->_bf._base);
+ if (HASUB(fp)) FREEUB(fp);
+ if (HASLB(fp)) FREELB(fp);
+
+ // Poison this FILE so accesses after fclose will be obvious.
+ fp->_file = -1;
+ fp->_r = fp->_w = 0;
+
+ // Release this FILE for reuse.
+ fp->_flags = 0;
+ return r;
+}
+
+int fileno(FILE* fp) {
+ ScopedFileLock sfl(fp);
+ return fileno_unlocked(fp);
+}
+
+int __sread(void* cookie, char* buf, int n) {
+ FILE* fp = reinterpret_cast<FILE*>(cookie);
+ return TEMP_FAILURE_RETRY(read(fp->_file, buf, n));
+}
+
+int __swrite(void* cookie, const char* buf, int n) {
+ FILE* fp = reinterpret_cast<FILE*>(cookie);
+ if (fp->_flags & __SAPP) {
+ // The FILE* is in append mode, but the underlying fd doesn't have O_APPEND set.
+ // We need to seek manually.
+ // TODO: use fcntl(2) to set O_APPEND in fdopen(3) instead?
+ TEMP_FAILURE_RETRY(lseek64(fp->_file, 0, SEEK_END));
+ }
+ return TEMP_FAILURE_RETRY(write(fp->_file, buf, n));
+}
+
+fpos_t __sseek(void* cookie, fpos_t offset, int whence) {
+ FILE* fp = reinterpret_cast<FILE*>(cookie);
+ return TEMP_FAILURE_RETRY(lseek(fp->_file, offset, whence));
+}
+
+off64_t __sseek64(void* cookie, off64_t offset, int whence) {
+ FILE* fp = reinterpret_cast<FILE*>(cookie);
+ return TEMP_FAILURE_RETRY(lseek64(fp->_file, offset, whence));
+}
+
+int __sclose(void* cookie) {
+ FILE* fp = reinterpret_cast<FILE*>(cookie);
+ return close(fp->_file);
+}
+
+static off64_t __seek_unlocked(FILE* fp, off64_t offset, int whence) {
+ // Use `_seek64` if set, but fall back to `_seek`.
+ if (_EXT(fp)->_seek64 != nullptr) {
+ return (*_EXT(fp)->_seek64)(fp->_cookie, offset, whence);
+ } else if (fp->_seek != nullptr) {
+ off64_t result = (*fp->_seek)(fp->_cookie, offset, whence);
+#if !defined(__LP64__)
+ // Avoid sign extension if off64_t is larger than off_t.
+ if (result != -1) result &= 0xffffffff;
+#endif
+ return result;
+ } else {
+ errno = ESPIPE;
+ return -1;
+ }
+}
+
+static off64_t __ftello64_unlocked(FILE* fp) {
+ // Find offset of underlying I/O object, then adjust for buffered bytes.
+ __sflush(fp); // May adjust seek offset on append stream.
+ off64_t result = __seek_unlocked(fp, 0, SEEK_CUR);
+ if (result == -1) {
+ return -1;
+ }
+
+ if (fp->_flags & __SRD) {
+ // Reading. Any unread characters (including
+ // those from ungetc) cause the position to be
+ // smaller than that in the underlying object.
+ result -= fp->_r;
+ if (HASUB(fp)) result -= fp->_ur;
+ } else if (fp->_flags & __SWR && fp->_p != NULL) {
+ // Writing. Any buffered characters cause the
+ // position to be greater than that in the
+ // underlying object.
+ result += fp->_p - fp->_bf._base;
+ }
+ return result;
+}
+
+int __fseeko64(FILE* fp, off64_t offset, int whence, int off_t_bits) {
+ ScopedFileLock sfl(fp);
+
+ // Change any SEEK_CUR to SEEK_SET, and check `whence` argument.
+ // After this, whence is either SEEK_SET or SEEK_END.
+ if (whence == SEEK_CUR) {
+ fpos64_t current_offset = __ftello64_unlocked(fp);
+ if (current_offset == -1) {
+ return -1;
+ }
+ offset += current_offset;
+ whence = SEEK_SET;
+ } else if (whence != SEEK_SET && whence != SEEK_END) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ // If our caller has a 32-bit interface, refuse to go past a 32-bit file offset.
+ if (off_t_bits == 32 && offset > LONG_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+
+ if (fp->_bf._base == NULL) __smakebuf(fp);
+
+ // Flush unwritten data and attempt the seek.
+ if (__sflush(fp) || __seek_unlocked(fp, offset, whence) == -1) {
+ return -1;
+ }
+
+ // Success: clear EOF indicator and discard ungetc() data.
+ if (HASUB(fp)) FREEUB(fp);
+ fp->_p = fp->_bf._base;
+ fp->_r = 0;
+ /* fp->_w = 0; */ /* unnecessary (I think...) */
+ fp->_flags &= ~__SEOF;
+ return 0;
+}
+
+int fseeko(FILE* fp, off_t offset, int whence) {
+ static_assert(sizeof(off_t) == sizeof(long), "sizeof(off_t) != sizeof(long)");
+ return __fseeko64(fp, offset, whence, 8*sizeof(off_t));
+}
+__strong_alias(fseek, fseeko);
+
+int fseeko64(FILE* fp, off64_t offset, int whence) {
+ return __fseeko64(fp, offset, whence, 8*sizeof(off_t));
+}
+
+int fsetpos(FILE* fp, const fpos_t* pos) {
+ return fseeko(fp, *pos, SEEK_SET);
+}
+
+int fsetpos64(FILE* fp, const fpos64_t* pos) {
+ return fseeko64(fp, *pos, SEEK_SET);
+}
+
+off_t ftello(FILE* fp) {
+ static_assert(sizeof(off_t) == sizeof(long), "sizeof(off_t) != sizeof(long)");
+ off64_t result = ftello64(fp);
+ if (result > LONG_MAX) {
+ errno = EOVERFLOW;
+ return -1;
+ }
+ return result;
+}
+__strong_alias(ftell, ftello);
+
+off64_t ftello64(FILE* fp) {
+ ScopedFileLock sfl(fp);
+ return __ftello64_unlocked(fp);
+}
+
+int fgetpos(FILE* fp, fpos_t* pos) {
+ *pos = ftello(fp);
+ return (*pos == -1) ? -1 : 0;
+}
+
+int fgetpos64(FILE* fp, fpos64_t* pos) {
+ *pos = ftello64(fp);
+ return (*pos == -1) ? -1 : 0;
+}
+
+static FILE* __funopen(const void* cookie,
+ int (*read_fn)(void*, char*, int),
+ int (*write_fn)(void*, const char*, int),
+ int (*close_fn)(void*)) {
+ if (read_fn == nullptr && write_fn == nullptr) {
+ errno = EINVAL;
+ return nullptr;
+ }
+
+ FILE* fp = __sfp();
+ if (fp == nullptr) return nullptr;
+
+ if (read_fn != nullptr && write_fn != nullptr) {
+ fp->_flags = __SRW;
+ } else if (read_fn != nullptr) {
+ fp->_flags = __SRD;
+ } else if (write_fn != nullptr) {
+ fp->_flags = __SWR;
+ }
+
+ fp->_file = -1;
+ fp->_cookie = const_cast<void*>(cookie); // The funopen(3) API is incoherent.
+ fp->_read = read_fn;
+ fp->_write = write_fn;
+ fp->_close = close_fn;
+
+ return fp;
+}
+
+FILE* funopen(const void* cookie,
+ int (*read_fn)(void*, char*, int),
+ int (*write_fn)(void*, const char*, int),
+ fpos_t (*seek_fn)(void*, fpos_t, int),
+ int (*close_fn)(void*)) {
+ FILE* fp = __funopen(cookie, read_fn, write_fn, close_fn);
+ if (fp != nullptr) {
+ fp->_seek = seek_fn;
+ }
+ return fp;
+}
+
+FILE* funopen64(const void* cookie,
+ int (*read_fn)(void*, char*, int),
+ int (*write_fn)(void*, const char*, int),
+ fpos64_t (*seek_fn)(void*, fpos64_t, int),
+ int (*close_fn)(void*)) {
+ FILE* fp = __funopen(cookie, read_fn, write_fn, close_fn);
+ if (fp != nullptr) {
+ _EXT(fp)->_seek64 = seek_fn;
+ }
+ return fp;
+}
diff --git a/libc/stdio/stdio_ext.cpp b/libc/stdio/stdio_ext.cpp
index fea44f68b..88e59510d 100644
--- a/libc/stdio/stdio_ext.cpp
+++ b/libc/stdio/stdio_ext.cpp
@@ -27,6 +27,8 @@
*/
#include <stdio_ext.h>
+
+#include <errno.h>
#include <stdlib.h>
#include "local.h"
@@ -74,7 +76,7 @@ void _flushlbf() {
}
int __fsetlocking(FILE* fp, int type) {
- int old_state = _EXT(fp)->_stdio_handles_locking ? FSETLOCKING_INTERNAL : FSETLOCKING_BYCALLER;
+ int old_state = _EXT(fp)->_caller_handles_locking ? FSETLOCKING_BYCALLER : FSETLOCKING_INTERNAL;
if (type == FSETLOCKING_QUERY) {
return old_state;
}
@@ -84,7 +86,7 @@ int __fsetlocking(FILE* fp, int type) {
__libc_fatal("Bad type (%d) passed to __fsetlocking", type);
}
- _EXT(fp)->_stdio_handles_locking = (type == FSETLOCKING_INTERNAL);
+ _EXT(fp)->_caller_handles_locking = (type == FSETLOCKING_BYCALLER);
return old_state;
}
@@ -99,3 +101,12 @@ int feof_unlocked(FILE* fp) {
int ferror_unlocked(FILE* fp) {
return __sferror(fp);
}
+
+int fileno_unlocked(FILE* fp) {
+ int fd = fp->_file;
+ if (fd == -1) {
+ errno = EBADF;
+ return -1;
+ }
+ return fd;
+}
diff --git a/libc/stdlib/atexit.c b/libc/stdlib/atexit.c
index a6970dd5d..c817b631c 100644
--- a/libc/stdlib/atexit.c
+++ b/libc/stdlib/atexit.c
@@ -37,6 +37,10 @@
#include "atexit.h"
#include "private/thread_private.h"
+/* BEGIN android-changed */
+#include "private/bionic_prctl.h"
+/* END android-changed */
+
struct atexit {
struct atexit *next; /* next in list */
int ind; /* next index in this table */
@@ -95,6 +99,10 @@ __cxa_atexit(void (*func)(void *), void *arg, void *dso)
MAP_ANON | MAP_PRIVATE, -1, 0);
if (p == MAP_FAILED)
goto unlock;
+/* BEGIN android-changed */
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, p, pgsize,
+ "atexit handlers");
+/* END android-changed */
if (__atexit == NULL) {
memset(&p->fns[0], 0, sizeof(p->fns[0]));
p->ind = 1;
@@ -177,47 +185,12 @@ restart:
}
_ATEXIT_UNLOCK();
+ extern void __libc_stdio_cleanup(void);
+ __libc_stdio_cleanup();
+
/* BEGIN android-changed: call __unregister_atfork if dso is not null */
if (dso != NULL) {
__unregister_atfork(dso);
}
/* END android-changed */
}
-
-/*
- * Register the cleanup function
- */
-void
-__atexit_register_cleanup(void (*func)(void))
-{
- struct atexit *p;
- size_t pgsize = getpagesize();
-
- if (pgsize < sizeof(*p))
- return;
- _ATEXIT_LOCK();
- p = __atexit;
- while (p != NULL && p->next != NULL)
- p = p->next;
- if (p == NULL) {
- p = mmap(NULL, pgsize, PROT_READ | PROT_WRITE,
- MAP_ANON | MAP_PRIVATE, -1, 0);
- if (p == MAP_FAILED)
- goto unlock;
- p->ind = 1;
- p->max = (pgsize - ((char *)&p->fns[0] - (char *)p)) /
- sizeof(p->fns[0]);
- p->next = NULL;
- __atexit = p;
- } else {
- if (mprotect(p, pgsize, PROT_READ | PROT_WRITE))
- goto unlock;
- }
- p->fns[0].fn_ptr = (void (*)(void *))func;
- p->fns[0].fn_arg = NULL;
- p->fns[0].fn_dso = NULL;
- mprotect(p, pgsize, PROT_READ);
- restartloop = 1;
-unlock:
- _ATEXIT_UNLOCK();
-}
diff --git a/libc/tools/check-symbols-glibc.py b/libc/tools/check-symbols-glibc.py
index 2c352b2eb..c5dbdcf22 100755
--- a/libc/tools/check-symbols-glibc.py
+++ b/libc/tools/check-symbols-glibc.py
@@ -71,11 +71,15 @@ glibc = set(map(MangleGlibcNameToBionic, glibc))
# bionic includes various BSD symbols to ease porting other BSD-licensed code.
bsd_stuff = set([
+ 'arc4random',
+ 'arc4random_buf',
+ 'arc4random_uniform',
'basename_r',
'dirname_r',
'fgetln',
'fpurge',
'funopen',
+ 'funopen64',
'gamma_r',
'gammaf_r',
'getprogname',
@@ -91,6 +95,11 @@ FORTIFY_stuff = set([
'__FD_CLR_chk',
'__FD_ISSET_chk',
'__FD_SET_chk',
+ '__fwrite_chk',
+ '__memchr_chk',
+ '__memrchr_chk',
+ '__pwrite64_chk',
+ '__pwrite_chk',
'__stack_chk_guard',
'__stpncpy_chk2',
'__strchr_chk',
@@ -100,6 +109,7 @@ FORTIFY_stuff = set([
'__strncpy_chk2',
'__strrchr_chk',
'__umask_chk'
+ '__write_chk',
])
# Some symbols are used to implement public macros.
macro_stuff = set([
diff --git a/libc/tools/check-symbols.py b/libc/tools/check-symbols.py
index a217ff725..a6cf50c52 100755
--- a/libc/tools/check-symbols.py
+++ b/libc/tools/check-symbols.py
@@ -13,9 +13,21 @@ arch = re.sub(r'.*/linux-x86/([^/]+)/.*', r'\1', toolchain)
sys.stderr.write('Checking symbols for arch "%s"...\n' % arch)
def GetSymbols(library, functions_or_variables):
+ global api
+ global arch
+
api = '9'
if library == 'libm' and arch == 'arm':
api = '3'
+
+ # There were no 64-bit ABIs before API level 21.
+ if '64' in arch:
+ api = '21'
+
+ # What GCC calls aarch64, Android calls arm64.
+ if arch == 'aarch64':
+ arch = 'arm64'
+
path = '%s/development/ndk/platforms/android-%s/arch-%s/symbols/%s.so.%s.txt' % (os.environ['ANDROID_BUILD_TOP'], api, arch, library, functions_or_variables)
symbols = set()
for line in open(path, 'r'):
@@ -26,7 +38,11 @@ def GetSymbols(library, functions_or_variables):
def CheckSymbols(library, functions_or_variables):
expected_symbols = GetSymbols(library, functions_or_variables)
- so_file = '%s/system/lib/%s.so' % (os.environ['ANDROID_PRODUCT_OUT'], library)
+ lib_dir = 'lib'
+ if '64' in arch:
+ lib_dir = 'lib64'
+
+ so_file = '%s/system/%s/%s.so' % (os.environ['ANDROID_PRODUCT_OUT'], lib_dir, library)
# Example readelf output:
# 264: 0001623c 4 FUNC GLOBAL DEFAULT 8 cabsf
@@ -38,7 +54,7 @@ def CheckSymbols(library, functions_or_variables):
r = re.compile(r' +\d+: [0-9a-f]+ +\d+ (FUNC|OBJECT) +\S+ +\S+ +\d+ (\S+)')
actual_symbols = set()
- for line in subprocess.check_output(['readelf', '--dyn-syms', so_file]).split('\n'):
+ for line in subprocess.check_output(['readelf', '-W', '--dyn-syms', so_file]).split('\n'):
m = r.match(line)
if m:
symbol = string.split(m.group(2), '@')[0]
@@ -55,6 +71,12 @@ def CheckSymbols(library, functions_or_variables):
for miss in sorted(missing):
sys.stderr.write(' %s\n' % miss)
+ extra = actual_symbols - expected_symbols
+ if len(extra) > 0:
+ sys.stderr.write('%d extra %s in %s for %s:\n' % (len(extra), functions_or_variables, library, arch))
+ for s in sorted(extra):
+ sys.stderr.write(' %s\n' % s)
+
return len(missing) == 0
CheckSymbols("libc", "functions")
diff --git a/libc/tools/gensyscalls.py b/libc/tools/gensyscalls.py
index 4d0afe20f..04ccf3978 100755
--- a/libc/tools/gensyscalls.py
+++ b/libc/tools/gensyscalls.py
@@ -62,9 +62,11 @@ ENTRY(%(func)s)
arm_eabi_call_default = syscall_stub_header + """\
mov ip, r7
+ .cfi_register r7, ip
ldr r7, =%(__NR_name)s
swi #0
mov r7, ip
+ .cfi_restore r7
cmn r0, #(MAX_ERRNO + 1)
bxls lr
neg r0, r0
@@ -166,9 +168,20 @@ END(%(func)s)
x86_registers = [ "ebx", "ecx", "edx", "esi", "edi", "ebp" ]
+x86_call_prepare = """\
+
+ call __kernel_syscall
+ pushl %eax
+ .cfi_adjust_cfa_offset 4
+ .cfi_rel_offset eax, 0
+
+"""
+
x86_call = """\
movl $%(__NR_name)s, %%eax
- int $0x80
+ call *(%%esp)
+ addl $4, %%esp
+
cmpl $-MAX_ERRNO, %%eax
jb 1f
negl %%eax
@@ -311,7 +324,7 @@ def x86_genstub(syscall):
result = syscall_stub_header % syscall
numparams = count_generic_param_registers(syscall["params"])
- stack_bias = numparams*4 + 4
+ stack_bias = numparams*4 + 8
offset = 0
mov_result = ""
first_push = True
@@ -327,6 +340,7 @@ def x86_genstub(syscall):
mov_result += " mov %d(%%esp), %%%s\n" % (stack_bias+offset, register)
offset += 4
+ result += x86_call_prepare
result += mov_result
result += x86_call % syscall
@@ -352,7 +366,9 @@ def x86_genstub_socketcall(syscall):
result += " pushl %ecx\n"
result += " .cfi_adjust_cfa_offset 4\n"
result += " .cfi_rel_offset ecx, 0\n"
- stack_bias = 12
+ stack_bias = 16
+
+ result += x86_call_prepare
# set the call id (%ebx)
result += " mov $%d, %%ebx\n" % syscall["socketcall_id"]
diff --git a/libc/tools/genversion-scripts.py b/libc/tools/genversion-scripts.py
new file mode 100755
index 000000000..e15c04e5f
--- /dev/null
+++ b/libc/tools/genversion-scripts.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+# This tool is used to generate the version scripts for libc and libm
+# for every architecture.
+
+import atexit
+import os.path
+import shutil
+import tempfile
+
+
+all_arches = ["arm", "arm64", "mips", "mips64", "x86", "x86_64"]
+bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc")
+bionic_libm_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libm")
+bionic_libdl_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libdl")
+libc_script = os.path.join(bionic_libc_root, "libc.map.txt")
+libm_script = os.path.join(bionic_libm_root, "libm.map.txt")
+libdl_script = os.path.join(bionic_libdl_root, "libdl.map.txt")
+
+# TODO (dimity): generate architecture-specific version scripts as part of build
+
+# temp directory where we store all intermediate files
+bionic_temp = tempfile.mkdtemp(prefix="bionic_genversionscripts")
+# Make sure the directory is deleted when the script exits.
+atexit.register(shutil.rmtree, bionic_temp)
+
+bionic_libc_root = os.path.join(os.environ["ANDROID_BUILD_TOP"], "bionic/libc")
+
+warning = "Generated by genversionscripts.py. Do not edit."
+
+
+class VersionScriptGenerator(object):
+
+ def run(self):
+ for script in [libc_script, libm_script, libdl_script]:
+ basename = os.path.basename(script)
+ dirname = os.path.dirname(script)
+ for arch in all_arches:
+ for brillo in [False, True]:
+ has_nobrillo = False
+ name = basename.split(".")[0] + "." + arch + (".brillo" if brillo else "") + ".map"
+ tmp_path = os.path.join(bionic_temp, name)
+ dest_path = os.path.join(dirname, name)
+ with open(tmp_path, "w") as fout:
+ with open(script, "r") as fin:
+ fout.write("# %s\n" % warning)
+ for line in fin:
+ index = line.find("#")
+ if index != -1:
+ tags = line[index+1:].split()
+ if arch not in tags:
+ continue
+ if brillo and "nobrillo" in tags:
+ has_nobrillo = True
+ continue
+ fout.write(line)
+ if not brillo or has_nobrillo:
+ shutil.copyfile(tmp_path, dest_path)
+
+
+generator = VersionScriptGenerator()
+generator.run()
+
diff --git a/libc/tools/zoneinfo/ZoneCompactor.java b/libc/tools/zoneinfo/ZoneCompactor.java
deleted file mode 100644
index 2d598fec0..000000000
--- a/libc/tools/zoneinfo/ZoneCompactor.java
+++ /dev/null
@@ -1,192 +0,0 @@
-
-import java.io.*;
-import java.util.*;
-
-// usage: java ZoneCompiler <setup file> <data directory> <output directory> <tzdata version>
-//
-// Compile a set of tzfile-formatted files into a single file containing an index.
-//
-// The compilation is controlled by a setup file, which is provided as a
-// command-line argument. The setup file has the form:
-//
-// Link <toName> <fromName>
-// ...
-// <zone filename>
-// ...
-//
-// Note that the links must be declared prior to the zone names.
-// A zone name is a filename relative to the source directory such as
-// 'GMT', 'Africa/Dakar', or 'America/Argentina/Jujuy'.
-//
-// Use the 'zic' command-line tool to convert from flat files
-// (such as 'africa' or 'northamerica') to a directory
-// hierarchy suitable for this tool (containing files such as 'data/Africa/Abidjan').
-//
-
-public class ZoneCompactor {
- // Maximum number of characters in a zone name, including '\0' terminator.
- private static final int MAXNAME = 40;
-
- // Zone name synonyms.
- private Map<String,String> links = new HashMap<String,String>();
-
- // File offsets by zone name.
- private Map<String,Integer> offsets = new HashMap<String,Integer>();
-
- // File lengths by zone name.
- private Map<String,Integer> lengths = new HashMap<String,Integer>();
-
- // Concatenate the contents of 'inFile' onto 'out'.
- private static void copyFile(File inFile, OutputStream out) throws Exception {
- byte[] ret = new byte[0];
-
- InputStream in = new FileInputStream(inFile);
- byte[] buf = new byte[8192];
- while (true) {
- int nbytes = in.read(buf);
- if (nbytes == -1) {
- break;
- }
- out.write(buf, 0, nbytes);
-
- byte[] nret = new byte[ret.length + nbytes];
- System.arraycopy(ret, 0, nret, 0, ret.length);
- System.arraycopy(buf, 0, nret, ret.length, nbytes);
- ret = nret;
- }
- out.flush();
- }
-
- public ZoneCompactor(String setupFile, String dataDirectory, String zoneTabFile, String outputDirectory, String version) throws Exception {
- // Read the setup file and concatenate all the data.
- ByteArrayOutputStream allData = new ByteArrayOutputStream();
- BufferedReader reader = new BufferedReader(new FileReader(setupFile));
- String s;
- int offset = 0;
- while ((s = reader.readLine()) != null) {
- s = s.trim();
- if (s.startsWith("Link")) {
- StringTokenizer st = new StringTokenizer(s);
- st.nextToken();
- String to = st.nextToken();
- String from = st.nextToken();
- links.put(from, to);
- } else {
- String link = links.get(s);
- if (link == null) {
- File sourceFile = new File(dataDirectory, s);
- long length = sourceFile.length();
- offsets.put(s, offset);
- lengths.put(s, (int) length);
-
- offset += length;
- copyFile(sourceFile, allData);
- }
- }
- }
- reader.close();
-
- // Fill in fields for links.
- Iterator<String> it = links.keySet().iterator();
- while (it.hasNext()) {
- String from = it.next();
- String to = links.get(from);
-
- offsets.put(from, offsets.get(to));
- lengths.put(from, lengths.get(to));
- }
-
- // Create/truncate the destination file.
- RandomAccessFile f = new RandomAccessFile(new File(outputDirectory, "tzdata"), "rw");
- f.setLength(0);
-
- // Write the header.
-
- // byte[12] tzdata_version -- 'tzdata2012f\0'
- // int index_offset -- so we can slip in extra header fields in a backwards-compatible way
- // int data_offset
- // int zonetab_offset
-
- // tzdata_version
- f.write(toAscii(new byte[12], version));
-
- // Write dummy values for the three offsets, and remember where we need to seek back to later
- // when we have the real values.
- int index_offset_offset = (int) f.getFilePointer();
- f.writeInt(0);
- int data_offset_offset = (int) f.getFilePointer();
- f.writeInt(0);
- int zonetab_offset_offset = (int) f.getFilePointer();
- f.writeInt(0);
-
- int index_offset = (int) f.getFilePointer();
-
- // Write the index.
- ArrayList<String> sortedOlsonIds = new ArrayList<String>();
- sortedOlsonIds.addAll(offsets.keySet());
- Collections.sort(sortedOlsonIds);
- it = sortedOlsonIds.iterator();
- while (it.hasNext()) {
- String zoneName = it.next();
- if (zoneName.length() >= MAXNAME) {
- throw new RuntimeException("zone filename too long: " + zoneName.length());
- }
-
- // Follow the chain of links to work out where the real data for this zone lives.
- String actualZoneName = zoneName;
- while (links.get(actualZoneName) != null) {
- actualZoneName = links.get(actualZoneName);
- }
-
- f.write(toAscii(new byte[MAXNAME], zoneName));
- f.writeInt(offsets.get(actualZoneName));
- f.writeInt(lengths.get(actualZoneName));
- f.writeInt(0); // Used to be raw GMT offset. No longer used.
- }
-
- int data_offset = (int) f.getFilePointer();
-
- // Write the data.
- f.write(allData.toByteArray());
-
- int zonetab_offset = (int) f.getFilePointer();
-
- // Copy the zone.tab.
- reader = new BufferedReader(new FileReader(zoneTabFile));
- while ((s = reader.readLine()) != null) {
- if (!s.startsWith("#")) {
- f.writeBytes(s);
- f.write('\n');
- }
- }
- reader.close();
-
- // Go back and fix up the offsets in the header.
- f.seek(index_offset_offset);
- f.writeInt(index_offset);
- f.seek(data_offset_offset);
- f.writeInt(data_offset);
- f.seek(zonetab_offset_offset);
- f.writeInt(zonetab_offset);
-
- f.close();
- }
-
- private static byte[] toAscii(byte[] dst, String src) {
- for (int i = 0; i < src.length(); ++i) {
- if (src.charAt(i) > '~') {
- throw new RuntimeException("non-ASCII string: " + src);
- }
- dst[i] = (byte) src.charAt(i);
- }
- return dst;
- }
-
- public static void main(String[] args) throws Exception {
- if (args.length != 5) {
- System.err.println("usage: java ZoneCompactor <setup file> <data directory> <zone.tab file> <output directory> <tzdata version>");
- System.exit(0);
- }
- new ZoneCompactor(args[0], args[1], args[2], args[3], args[4]);
- }
-}
diff --git a/libc/tools/zoneinfo/update-tzdata.py b/libc/tools/zoneinfo/update-tzdata.py
deleted file mode 100755
index 68a5ff51c..000000000
--- a/libc/tools/zoneinfo/update-tzdata.py
+++ /dev/null
@@ -1,262 +0,0 @@
-#!/usr/bin/python
-
-"""Updates the timezone data held in bionic and ICU."""
-
-import ftplib
-import glob
-import httplib
-import os
-import re
-import shutil
-import subprocess
-import sys
-import tarfile
-import tempfile
-
-regions = ['africa', 'antarctica', 'asia', 'australasia',
- 'etcetera', 'europe', 'northamerica', 'southamerica',
- # These two deliberately come last so they override what came
- # before (and each other).
- 'backward', 'backzone' ]
-
-def CheckDirExists(dir, dirname):
- if not os.path.isdir(dir):
- print "Couldn't find %s (%s)!" % (dirname, dir)
- sys.exit(1)
-
-bionic_libc_tools_zoneinfo_dir = os.path.realpath(os.path.dirname(sys.argv[0]))
-
-# Find the bionic directory, searching upward from this script.
-bionic_dir = os.path.realpath('%s/../../..' % bionic_libc_tools_zoneinfo_dir)
-bionic_libc_zoneinfo_dir = '%s/libc/zoneinfo' % bionic_dir
-CheckDirExists(bionic_libc_zoneinfo_dir, 'bionic/libc/zoneinfo')
-CheckDirExists(bionic_libc_tools_zoneinfo_dir, 'bionic/libc/tools/zoneinfo')
-print 'Found bionic in %s ...' % bionic_dir
-
-# Find the icu directory.
-icu_dir = os.path.realpath('%s/../external/icu' % bionic_dir)
-icu4c_dir = os.path.realpath('%s/icu4c/source' % icu_dir)
-icu4j_dir = os.path.realpath('%s/icu4j' % icu_dir)
-CheckDirExists(icu4c_dir, 'external/icu/icu4c/source')
-CheckDirExists(icu4j_dir, 'external/icu/icu4j')
-print 'Found icu in %s ...' % icu_dir
-
-
-def GetCurrentTzDataVersion():
- return open('%s/tzdata' % bionic_libc_zoneinfo_dir).read().split('\x00', 1)[0]
-
-
-def WriteSetupFile():
- """Writes the list of zones that ZoneCompactor should process."""
- links = []
- zones = []
- for region in regions:
- for line in open('extracted/%s' % region):
- fields = line.split()
- if fields:
- if fields[0] == 'Link':
- links.append('%s %s %s' % (fields[0], fields[1], fields[2]))
- zones.append(fields[2])
- elif fields[0] == 'Zone':
- zones.append(fields[1])
- zones.sort()
-
- setup = open('setup', 'w')
- for link in sorted(set(links)):
- setup.write('%s\n' % link)
- for zone in sorted(set(zones)):
- setup.write('%s\n' % zone)
- setup.close()
-
-
-def SwitchToNewTemporaryDirectory():
- tmp_dir = tempfile.mkdtemp('-tzdata')
- os.chdir(tmp_dir)
- print 'Created temporary directory "%s"...' % tmp_dir
-
-
-def FtpRetrieveFile(ftp, filename):
- ftp.retrbinary('RETR %s' % filename, open(filename, 'wb').write)
-
-
-def FtpRetrieveFileAndSignature(ftp, data_filename):
- """Downloads and repackages the given data from the given FTP server."""
- print 'Downloading data...'
- FtpRetrieveFile(ftp, data_filename)
-
- print 'Downloading signature...'
- signature_filename = '%s.asc' % data_filename
- FtpRetrieveFile(ftp, signature_filename)
-
-
-def HttpRetrieveFile(http, path, output_filename):
- http.request("GET", path)
- f = open(output_filename, 'wb')
- f.write(http.getresponse().read())
- f.close()
-
-
-def HttpRetrieveFileAndSignature(http, data_filename):
- """Downloads and repackages the given data from the given HTTP server."""
- path = "/time-zones/repository/releases/%s" % data_filename
-
- print 'Downloading data...'
- HttpRetrieveFile(http, path, data_filename)
-
- print 'Downloading signature...'
- signature_filename = '%s.asc' % data_filename
- HttpRetrievefile(http, "%s.asc" % path, signature_filename)
-
-
-def BuildIcuToolsAndData(data_filename):
- # Keep track of the original cwd so we can go back to it at the end.
- original_working_dir = os.getcwd()
-
- # Create a directory to run 'make' from.
- icu_working_dir = '%s/icu' % original_working_dir
- os.mkdir(icu_working_dir)
- os.chdir(icu_working_dir)
-
- # Build the ICU tools.
- print 'Configuring ICU tools...'
- subprocess.check_call(['%s/runConfigureICU' % icu4c_dir, 'Linux'])
-
- # Run the ICU tools.
- os.chdir('tools/tzcode')
-
- # The tz2icu tool only picks up icuregions and icuzones in they are in the CWD
- for icu_data_file in [ 'icuregions', 'icuzones']:
- icu_data_file_source = '%s/tools/tzcode/%s' % (icu4c_dir, icu_data_file)
- icu_data_file_symlink = './%s' % icu_data_file
- os.symlink(icu_data_file_source, icu_data_file_symlink)
-
- shutil.copyfile('%s/%s' % (original_working_dir, data_filename), data_filename)
- print 'Making ICU data...'
- # The Makefile assumes the existence of the bin directory.
- os.mkdir('%s/bin' % icu_working_dir)
- subprocess.check_call(['make'])
-
- # Copy the source file to its ultimate destination.
- icu_txt_data_dir = '%s/data/misc' % icu4c_dir
- print 'Copying zoneinfo64.txt to %s ...' % icu_txt_data_dir
- shutil.copy('zoneinfo64.txt', icu_txt_data_dir)
-
- # Regenerate the .dat file.
- os.chdir(icu_working_dir)
- subprocess.check_call(['make', 'INCLUDE_UNI_CORE_DATA=1', '-j32'])
-
- # Copy the .dat file to its ultimate destination.
- icu_dat_data_dir = '%s/stubdata' % icu4c_dir
- datfiles = glob.glob('data/out/tmp/icudt??l.dat')
- if len(datfiles) != 1:
- print 'ERROR: Unexpectedly found %d .dat files (%s). Halting.' % (len(datfiles), datfiles)
- sys.exit(1)
- datfile = datfiles[0]
- print 'Copying %s to %s ...' % (datfile, icu_dat_data_dir)
- shutil.copy(datfile, icu_dat_data_dir)
-
- # Generate the ICU4J .jar files
- os.chdir('%s/data' % icu_working_dir)
- subprocess.check_call(['make', 'icu4j-data'])
-
- # Copy the ICU4J .jar files to their ultimate destination.
- icu_jar_data_dir = '%s/main/shared/data' % icu4j_dir
- jarfiles = glob.glob('out/icu4j/*.jar')
- if len(jarfiles) != 2:
- print 'ERROR: Unexpectedly found %d .jar files (%s). Halting.' % (len(jarfiles), jarfiles)
- sys.exit(1)
- for jarfile in jarfiles:
- print 'Copying %s to %s ...' % (jarfile, icu_jar_data_dir)
- shutil.copy(jarfile, icu_jar_data_dir)
-
- # Switch back to the original working cwd.
- os.chdir(original_working_dir)
-
-
-def CheckSignature(data_filename):
- signature_filename = '%s.asc' % data_filename
- print 'Verifying signature...'
- # If this fails for you, you probably need to import Paul Eggert's public key:
- # gpg --recv-keys ED97E90E62AA7E34
- subprocess.check_call(['gpg', '--trusted-key=ED97E90E62AA7E34', '--verify',
- signature_filename, data_filename])
-
-
-def BuildBionicToolsAndData(data_filename):
- new_version = re.search('(tzdata.+)\\.tar\\.gz', data_filename).group(1)
-
- print 'Extracting...'
- os.mkdir('extracted')
- tar = tarfile.open(data_filename, 'r')
- tar.extractall('extracted')
-
- print 'Calling zic(1)...'
- os.mkdir('data')
- zic_inputs = [ 'extracted/%s' % x for x in regions ]
- zic_cmd = ['zic', '-d', 'data' ]
- zic_cmd.extend(zic_inputs)
- subprocess.check_call(zic_cmd)
-
- WriteSetupFile()
-
- print 'Calling ZoneCompactor to update bionic to %s...' % new_version
- subprocess.check_call(['javac', '-d', '.',
- '%s/ZoneCompactor.java' % bionic_libc_tools_zoneinfo_dir])
- subprocess.check_call(['java', 'ZoneCompactor',
- 'setup', 'data', 'extracted/zone.tab',
- bionic_libc_zoneinfo_dir, new_version])
-
-
-# Run with no arguments from any directory, with no special setup required.
-# See http://www.iana.org/time-zones/ for more about the source of this data.
-def main():
- print 'Looking for new tzdata...'
-
- tzdata_filenames = []
-
- # The FTP server lets you download intermediate releases, and also lets you
- # download the signatures for verification, so it's your best choice.
- use_ftp = True
-
- if use_ftp:
- ftp = ftplib.FTP('ftp.iana.org')
- ftp.login()
- ftp.cwd('tz/releases')
- for filename in ftp.nlst():
- if filename.startswith('tzdata20') and filename.endswith('.tar.gz'):
- tzdata_filenames.append(filename)
- tzdata_filenames.sort()
- else:
- http = httplib.HTTPConnection('www.iana.org')
- http.request("GET", "/time-zones")
- index_lines = http.getresponse().read().split('\n')
- for line in index_lines:
- m = re.compile('.*href="/time-zones/repository/releases/(tzdata20\d\d\c\.tar\.gz)".*').match(line)
- if m:
- tzdata_filenames.append(m.group(1))
-
- # If you're several releases behind, we'll walk you through the upgrades
- # one by one.
- current_version = GetCurrentTzDataVersion()
- current_filename = '%s.tar.gz' % current_version
- for filename in tzdata_filenames:
- if filename > current_filename:
- print 'Found new tzdata: %s' % filename
- SwitchToNewTemporaryDirectory()
- if use_ftp:
- FtpRetrieveFileAndSignature(ftp, filename)
- else:
- HttpRetrieveFileAndSignature(http, filename)
-
- CheckSignature(filename)
- BuildIcuToolsAndData(filename)
- BuildBionicToolsAndData(filename)
- print 'Look in %s and %s for new data files' % (bionic_dir, icu_dir)
- sys.exit(0)
-
- print 'You already have the latest tzdata (%s)!' % current_version
- sys.exit(0)
-
-
-if __name__ == '__main__':
- main()
diff --git a/libc/tzcode/asctime.c b/libc/tzcode/asctime.c
index fea24e479..337a31375 100644
--- a/libc/tzcode/asctime.c
+++ b/libc/tzcode/asctime.c
@@ -55,7 +55,7 @@
** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n
** (two three-character abbreviations, five strings denoting integers,
** seven explicit spaces, two explicit colons, a newline,
-** and a trailing ASCII nul).
+** and a trailing NUL byte).
** The values above are for systems where an int is 32 bits and are provided
** as an example; the define below calculates the maximum for the system at
** hand.
@@ -99,11 +99,11 @@ asctime_r(register const struct tm *timeptr, char *buf)
** Assume that strftime is unaffected by other out-of-range members
** (e.g., timeptr->tm_mday) when processing "%Y".
*/
- (void) strftime(year, sizeof year, "%Y", timeptr);
+ strftime(year, sizeof year, "%Y", timeptr);
/*
** We avoid using snprintf since it's not available on all systems.
*/
- (void) snprintf(result, sizeof(result), /* Android change: use snprintf. */
+ snprintf(result, sizeof(result), /* Android change: use snprintf. */
((strlen(year) <= 4) ? ASCTIME_FMT : ASCTIME_FMT_B),
wn, mn,
timeptr->tm_mday, timeptr->tm_hour,
@@ -112,11 +112,7 @@ asctime_r(register const struct tm *timeptr, char *buf)
if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime)
return strcpy(buf, result);
else {
-#ifdef EOVERFLOW
errno = EOVERFLOW;
-#else /* !defined EOVERFLOW */
- errno = EINVAL;
-#endif /* !defined EOVERFLOW */
return NULL;
}
}
diff --git a/libc/tzcode/difftime.c b/libc/tzcode/difftime.c
index 449cdf05d..ba2fd0377 100644
--- a/libc/tzcode/difftime.c
+++ b/libc/tzcode/difftime.c
@@ -7,42 +7,52 @@
#include "private.h" /* for time_t and TYPE_SIGNED */
+/* Return -X as a double. Using this avoids casting to 'double'. */
+static double
+dminus(double x)
+{
+ return -x;
+}
+
double ATTRIBUTE_CONST
-difftime(const time_t time1, const time_t time0)
+difftime(time_t time1, time_t time0)
{
/*
- ** If (sizeof (double) > sizeof (time_t)) simply convert and subtract
+ ** If double is large enough, simply convert and subtract
** (assuming that the larger type has more precision).
*/
- if (sizeof (double) > sizeof (time_t))
- return (double) time1 - (double) time0;
- if (!TYPE_SIGNED(time_t)) {
- /*
- ** The difference of two unsigned values can't overflow
- ** if the minuend is greater than or equal to the subtrahend.
- */
- if (time1 >= time0)
- return time1 - time0;
- else return -(double) (time0 - time1);
+ if (sizeof (time_t) < sizeof (double)) {
+ double t1 = time1, t0 = time0;
+ return t1 - t0;
}
+
+ /*
+ ** The difference of two unsigned values can't overflow
+ ** if the minuend is greater than or equal to the subtrahend.
+ */
+ if (!TYPE_SIGNED(time_t))
+ return time0 <= time1 ? time1 - time0 : dminus(time0 - time1);
+
+ /* Use uintmax_t if wide enough. */
+ if (sizeof (time_t) <= sizeof (uintmax_t)) {
+ uintmax_t t1 = time1, t0 = time0;
+ return time0 <= time1 ? t1 - t0 : dminus(t0 - t1);
+ }
+
/*
** Handle cases where both time1 and time0 have the same sign
** (meaning that their difference cannot overflow).
*/
if ((time1 < 0) == (time0 < 0))
- return time1 - time0;
+ return time1 - time0;
+
/*
- ** time1 and time0 have opposite signs.
- ** Punt if uintmax_t is too narrow.
+ ** The values have opposite signs and uintmax_t is too narrow.
** This suffers from double rounding; attempt to lessen that
** by using long double temporaries.
*/
- if (sizeof (uintmax_t) < sizeof (time_t))
- return (long double) time1 - (long double) time0;
- /*
- ** Stay calm...decent optimizers will eliminate the complexity below.
- */
- if (time1 >= 0 /* && time0 < 0 */)
- return (uintmax_t) time1 + (uintmax_t) (-1 - time0) + 1;
- return -(double) ((uintmax_t) time0 + (uintmax_t) (-1 - time1) + 1);
+ {
+ long double t1 = time1, t0 = time0;
+ return t1 - t0;
+ }
}
diff --git a/libc/tzcode/localtime.c b/libc/tzcode/localtime.c
index bf09c5e0e..f370e8798 100644
--- a/libc/tzcode/localtime.c
+++ b/libc/tzcode/localtime.c
@@ -10,10 +10,30 @@
/*LINTLIBRARY*/
+#define LOCALTIME_IMPLEMENTATION
#include "private.h"
+
#include "tzfile.h"
#include "fcntl.h"
+#if THREAD_SAFE
+# include <pthread.h>
+static pthread_mutex_t locallock = PTHREAD_MUTEX_INITIALIZER;
+static int lock(void) { return pthread_mutex_lock(&locallock); }
+static void unlock(void) { pthread_mutex_unlock(&locallock); }
+#else
+static int lock(void) { return 0; }
+static void unlock(void) { }
+#endif
+
+/* NETBSD_INSPIRED_EXTERN functions are exported to callers if
+ NETBSD_INSPIRED is defined, and are private otherwise. */
+#if NETBSD_INSPIRED
+# define NETBSD_INSPIRED_EXTERN
+#else
+# define NETBSD_INSPIRED_EXTERN static
+#endif
+
#ifndef TZ_ABBR_MAX_LEN
#define TZ_ABBR_MAX_LEN 16
#endif /* !defined TZ_ABBR_MAX_LEN */
@@ -38,19 +58,6 @@
#define OPEN_MODE O_RDONLY
#endif /* !defined O_BINARY */
-#if 0
-# define XLOG(xx) printf xx , fflush(stdout)
-#else
-# define XLOG(x) do{}while (0)
-#endif
-
-/* BEGIN android-added: thread-safety. */
-#include <pthread.h>
-static pthread_mutex_t _tzMutex = PTHREAD_MUTEX_INITIALIZER;
-static inline void _tzLock(void) { pthread_mutex_lock(&_tzMutex); }
-static inline void _tzUnlock(void) { pthread_mutex_unlock(&_tzMutex); }
-/* END android-added */
-
#ifndef WILDABBR
/*
** Someone might make incorrect use of a time zone abbreviation:
@@ -91,10 +98,10 @@ static const char gmt[] = "GMT";
struct ttinfo { /* time type information */
int_fast32_t tt_gmtoff; /* UT offset in seconds */
- int tt_isdst; /* used to set tm_isdst */
+ bool tt_isdst; /* used to set tm_isdst */
int tt_abbrind; /* abbreviation list index */
- int tt_ttisstd; /* TRUE if transition is std time */
- int tt_ttisgmt; /* TRUE if transition is UT */
+ bool tt_ttisstd; /* transition is std time */
+ bool tt_ttisgmt; /* transition is UT */
};
struct lsinfo { /* leap second information */
@@ -102,6 +109,7 @@ struct lsinfo { /* leap second information */
int_fast64_t ls_corr; /* correction to apply */
};
+#define SMALLEST(a, b) (((a) < (b)) ? (a) : (b))
#define BIGGEST(a, b) (((a) > (b)) ? (a) : (b))
#ifdef TZNAME_MAX
@@ -116,8 +124,8 @@ struct state {
int timecnt;
int typecnt;
int charcnt;
- int goback;
- int goahead;
+ bool goback;
+ bool goahead;
time_t ats[TZ_MAX_TIMES];
unsigned char types[TZ_MAX_TIMES];
struct ttinfo ttis[TZ_MAX_TYPES];
@@ -127,74 +135,29 @@ struct state {
int defaulttype; /* for early times or if no transitions */
};
+enum r_type {
+ JULIAN_DAY, /* Jn = Julian day */
+ DAY_OF_YEAR, /* n = day of year */
+ MONTH_NTH_DAY_OF_WEEK /* Mm.n.d = month, week, day of week */
+};
+
struct rule {
- int r_type; /* type of rule; see below */
+ enum r_type r_type; /* type of rule */
int r_day; /* day number of rule */
int r_week; /* week number of rule */
int r_mon; /* month number of rule */
int_fast32_t r_time; /* transition time of rule */
};
-#define JULIAN_DAY 0 /* Jn = Julian day */
-#define DAY_OF_YEAR 1 /* n = day of year */
-#define MONTH_NTH_DAY_OF_WEEK 2 /* Mm.n.d = month, week, day of week */
-
-/*
-** Prototypes for static functions.
-*/
-
-/* NOTE: all internal functions assume that _tzLock() was already called */
-
-static int __bionic_open_tzdata(const char*, int*);
-static int_fast32_t detzcode(const char * codep);
-static int_fast64_t detzcode64(const char * codep);
-static int differ_by_repeat(time_t t1, time_t t0);
-static const char * getzname(const char * strp) ATTRIBUTE_PURE;
-static const char * getqzname(const char * strp, const int delim)
- ATTRIBUTE_PURE;
-static const char * getnum(const char * strp, int * nump, int min,
- int max);
-static const char * getsecs(const char * strp, int_fast32_t * secsp);
-static const char * getoffset(const char * strp, int_fast32_t * offsetp);
-static const char * getrule(const char * strp, struct rule * rulep);
-static void gmtload(struct state * sp);
-static struct tm * gmtsub(const time_t * timep, int_fast32_t offset,
- struct tm * tmp, struct state * sp); // android-changed: added sp.
-static struct tm * localsub(const time_t * timep, int_fast32_t offset,
- struct tm * tmp, struct state * sp); // android-changed: added sp.
-static int increment_overflow(int * number, int delta);
-static int leaps_thru_end_of(int y) ATTRIBUTE_PURE;
-static int increment_overflow32(int_fast32_t * number, int delta);
-static int increment_overflow_time(time_t *t, int_fast32_t delta);
-static int normalize_overflow32(int_fast32_t * tensptr,
- int * unitsptr, int base);
-static int normalize_overflow(int * tensptr, int * unitsptr,
- int base);
-static void settzname(void);
-static time_t time1(struct tm * tmp,
- struct tm * (*funcp)(const time_t *,
- int_fast32_t, struct tm *, struct state *), // android-changed: added state*.
- int_fast32_t, struct state * sp); // android-changed: added sp.
-static time_t time2(struct tm * tmp,
- struct tm * (*funcp)(const time_t *,
- int_fast32_t, struct tm*, struct state *), // android-changed: added state*.
- int_fast32_t offset, int * okayp, struct state * sp); // android-changed: added sp.
-static time_t time2sub(struct tm *tmp,
- struct tm * (*funcp) (const time_t *,
- int_fast32_t, struct tm*, struct state *), // android-changed: added state*.
- int_fast32_t offset, int * okayp, int do_norm_secs, struct state * sp); // android-change: added sp.
-static struct tm * timesub(const time_t * timep, int_fast32_t offset,
- const struct state * sp, struct tm * tmp);
-static int tmcomp(const struct tm * atmp,
- const struct tm * btmp);
-static int_fast32_t transtime(int year, const struct rule * rulep,
- int_fast32_t offset)
- ATTRIBUTE_PURE;
-static int typesequiv(const struct state * sp, int a, int b);
-static int tzload(const char * name, struct state * sp,
- int doextend);
-static int tzparse(const char * name, struct state * sp,
- int lastditch);
+static struct tm *gmtsub(struct state const *, time_t const *, int_fast32_t,
+ struct tm *);
+static bool increment_overflow(int *, int);
+static bool increment_overflow_time(time_t *, int_fast32_t);
+static bool normalize_overflow32(int_fast32_t *, int *, int);
+static struct tm *timesub(time_t const *, int_fast32_t, struct state const *,
+ struct tm *);
+static bool typesequiv(struct state const *, int, int);
+static bool tzparse(char const *, struct state *, bool);
#ifdef ALL_STATE
static struct state * lclptr;
@@ -214,7 +177,6 @@ static struct state gmtmem;
static char lcl_TZname[TZ_STRLEN_MAX + 1];
static int lcl_is_set;
-static int gmt_is_set;
char * tzname[2] = {
(char *) wildabbr,
@@ -229,427 +191,539 @@ char * tzname[2] = {
** Thanks to Paul Eggert for noting this.
*/
-static struct tm tmGlobal;
+static struct tm tm;
#ifdef USG_COMPAT
-long timezone = 0;
-int daylight = 0;
+long timezone;
+int daylight;
#endif /* defined USG_COMPAT */
#ifdef ALTZONE
-long altzone = 0;
+long altzone;
#endif /* defined ALTZONE */
+/* Initialize *S to a value based on GMTOFF, ISDST, and ABBRIND. */
+static void
+init_ttinfo(struct ttinfo *s, int_fast32_t gmtoff, bool isdst, int abbrind)
+{
+ s->tt_gmtoff = gmtoff;
+ s->tt_isdst = isdst;
+ s->tt_abbrind = abbrind;
+ s->tt_ttisstd = false;
+ s->tt_ttisgmt = false;
+}
+
static int_fast32_t
detzcode(const char *const codep)
{
- register int_fast32_t result;
- register int i;
-
- result = (codep[0] & 0x80) ? -1 : 0;
- for (i = 0; i < 4; ++i)
- result = (result << 8) | (codep[i] & 0xff);
- return result;
+ register int_fast32_t result;
+ register int i;
+ int_fast32_t one = 1;
+ int_fast32_t halfmaxval = one << (32 - 2);
+ int_fast32_t maxval = halfmaxval - 1 + halfmaxval;
+ int_fast32_t minval = -1 - maxval;
+
+ result = codep[0] & 0x7f;
+ for (i = 1; i < 4; ++i)
+ result = (result << 8) | (codep[i] & 0xff);
+
+ if (codep[0] & 0x80) {
+ /* Do two's-complement negation even on non-two's-complement machines.
+ If the result would be minval - 1, return minval. */
+ result -= !TWOS_COMPLEMENT(int_fast32_t) && result != 0;
+ result += minval;
+ }
+ return result;
}
static int_fast64_t
detzcode64(const char *const codep)
{
- register int_fast64_t result;
- register int i;
+ register uint_fast64_t result;
+ register int i;
+ int_fast64_t one = 1;
+ int_fast64_t halfmaxval = one << (64 - 2);
+ int_fast64_t maxval = halfmaxval - 1 + halfmaxval;
+ int_fast64_t minval = -TWOS_COMPLEMENT(int_fast64_t) - maxval;
+
+ result = codep[0] & 0x7f;
+ for (i = 1; i < 8; ++i)
+ result = (result << 8) | (codep[i] & 0xff);
+
+ if (codep[0] & 0x80) {
+ /* Do two's-complement negation even on non-two's-complement machines.
+ If the result would be minval - 1, return minval. */
+ result -= !TWOS_COMPLEMENT(int_fast64_t) && result != 0;
+ result += minval;
+ }
+ return result;
+}
- result = (codep[0] & 0x80) ? -1 : 0;
- for (i = 0; i < 8; ++i)
- result = (result << 8) | (codep[i] & 0xff);
- return result;
+static void
+update_tzname_etc(struct state const *sp, struct ttinfo const *ttisp)
+{
+ tzname[ttisp->tt_isdst] = (char *) &sp->chars[ttisp->tt_abbrind];
+#ifdef USG_COMPAT
+ if (!ttisp->tt_isdst)
+ timezone = - ttisp->tt_gmtoff;
+#endif
+#ifdef ALTZONE
+ if (ttisp->tt_isdst)
+ altzone = - ttisp->tt_gmtoff;
+#endif
}
static void
settzname(void)
{
- register struct state * const sp = lclptr;
- register int i;
+ register struct state * const sp = lclptr;
+ register int i;
- tzname[0] = tzname[1] = (char *) wildabbr;
+ tzname[0] = tzname[1] = (char *) wildabbr;
#ifdef USG_COMPAT
- daylight = 0;
- timezone = 0;
+ daylight = 0;
+ timezone = 0;
#endif /* defined USG_COMPAT */
#ifdef ALTZONE
- altzone = 0;
+ altzone = 0;
#endif /* defined ALTZONE */
- if (sp == NULL) {
- tzname[0] = tzname[1] = (char *) gmt;
- return;
- }
- /*
- ** And to get the latest zone names into tzname. . .
- */
- for (i = 0; i < sp->typecnt; ++i) {
- register const struct ttinfo * const ttisp = &sp->ttis[i];
-
- tzname[ttisp->tt_isdst] = &sp->chars[ttisp->tt_abbrind];
- }
- for (i = 0; i < sp->timecnt; ++i) {
- register const struct ttinfo * const ttisp =
- &sp->ttis[
- sp->types[i]];
-
- tzname[ttisp->tt_isdst] =
- &sp->chars[ttisp->tt_abbrind];
+ if (sp == NULL) {
+ tzname[0] = tzname[1] = (char *) gmt;
+ return;
+ }
+ /*
+ ** And to get the latest zone names into tzname. . .
+ */
+ for (i = 0; i < sp->typecnt; ++i) {
+ register const struct ttinfo * const ttisp = &sp->ttis[i];
+ update_tzname_etc(sp, ttisp);
+ }
+ for (i = 0; i < sp->timecnt; ++i) {
+ register const struct ttinfo * const ttisp =
+ &sp->ttis[
+ sp->types[i]];
+ update_tzname_etc(sp, ttisp);
#ifdef USG_COMPAT
- if (ttisp->tt_isdst)
- daylight = 1;
- if (!ttisp->tt_isdst)
- timezone = -(ttisp->tt_gmtoff);
+ if (ttisp->tt_isdst)
+ daylight = 1;
#endif /* defined USG_COMPAT */
-#ifdef ALTZONE
- if (ttisp->tt_isdst)
- altzone = -(ttisp->tt_gmtoff);
-#endif /* defined ALTZONE */
- }
- /*
- ** Finally, scrub the abbreviations.
- ** First, replace bogus characters.
- */
- for (i = 0; i < sp->charcnt; ++i)
- if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL)
- sp->chars[i] = TZ_ABBR_ERR_CHAR;
- /*
- ** Second, truncate long abbreviations.
- */
- for (i = 0; i < sp->typecnt; ++i) {
- register const struct ttinfo * const ttisp = &sp->ttis[i];
- register char * cp = &sp->chars[ttisp->tt_abbrind];
+ }
+}
- if (strlen(cp) > TZ_ABBR_MAX_LEN &&
- strcmp(cp, GRANDPARENTED) != 0)
- *(cp + TZ_ABBR_MAX_LEN) = '\0';
- }
+static void
+scrub_abbrs(struct state *sp)
+{
+ int i;
+ /*
+ ** First, replace bogus characters.
+ */
+ for (i = 0; i < sp->charcnt; ++i)
+ if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL)
+ sp->chars[i] = TZ_ABBR_ERR_CHAR;
+ /*
+ ** Second, truncate long abbreviations.
+ */
+ for (i = 0; i < sp->typecnt; ++i) {
+ register const struct ttinfo * const ttisp = &sp->ttis[i];
+ register char * cp = &sp->chars[ttisp->tt_abbrind];
+
+ if (strlen(cp) > TZ_ABBR_MAX_LEN &&
+ strcmp(cp, GRANDPARENTED) != 0)
+ *(cp + TZ_ABBR_MAX_LEN) = '\0';
+ }
}
-static int
-differ_by_repeat(const time_t t1 __unused, const time_t t0 __unused)
+static bool
+differ_by_repeat(const time_t t1, const time_t t0)
{
if (TYPE_BIT(time_t) - TYPE_SIGNED(time_t) < SECSPERREPEAT_BITS)
return 0;
-#if defined(__LP64__) // 32-bit Android only has a signed 32-bit time_t; 64-bit Android is fixed.
+#if defined(__LP64__) // 32-bit Android/glibc has a signed 32-bit time_t; 64-bit doesn't.
return t1 - t0 == SECSPERREPEAT;
#endif
}
+/* Input buffer for data read from a compiled tz file. */
+union input_buffer {
+ /* The first part of the buffer, interpreted as a header. */
+ struct tzhead tzhead;
+
+ /* The entire buffer. */
+ char buf[2 * sizeof(struct tzhead) + 2 * sizeof (struct state)
+ + 4 * TZ_MAX_TIMES];
+};
+
+/* Local storage needed for 'tzloadbody'. */
+union local_storage {
+ /* The file name to be opened. */
+ char fullname[FILENAME_MAX + 1];
+
+ /* The results of analyzing the file's contents after it is opened. */
+ struct {
+ /* The input buffer. */
+ union input_buffer u;
+
+ /* A temporary state used for parsing a TZ string in the file. */
+ struct state st;
+ } u;
+};
+
+static int __bionic_open_tzdata(const char*);
+
+/* Load tz data from the file named NAME into *SP. Read extended
+ format if DOEXTEND. Use *LSP for temporary storage. Return 0 on
+ success, an errno value on failure. */
static int
-tzload(register const char* name, register struct state* const sp,
- register const int doextend)
+tzloadbody(char const *name, struct state *sp, bool doextend,
+ union local_storage *lsp)
{
- register const char * p;
- register int i;
- register int fid;
- register int stored;
- register int nread;
- typedef union {
- struct tzhead tzhead;
- char buf[2 * sizeof(struct tzhead) +
- 2 * sizeof *sp +
- 4 * TZ_MAX_TIMES];
- } u_t;
- union local_storage {
- /*
- ** Section 4.9.1 of the C standard says that
- ** "FILENAME_MAX expands to an integral constant expression
- ** that is the size needed for an array of char large enough
- ** to hold the longest file name string that the implementation
- ** guarantees can be opened."
- */
- //char fullname[FILENAME_MAX + 1];
-
- /* The main part of the storage for this function. */
- struct {
- u_t u;
- struct state st;
- } u;
- };
- //register char *fullname;
- register u_t *up;
- register union local_storage *lsp;
-#ifdef ALL_STATE
- lsp = malloc(sizeof *lsp);
- if (!lsp)
- return -1;
-#else /* !defined ALL_STATE */
- union local_storage ls;
- lsp = &ls;
-#endif /* !defined ALL_STATE */
- //fullname = lsp->fullname;
- up = &lsp->u.u;
-
- sp->goback = sp->goahead = FALSE;
-
- if (! name) {
- name = TZDEFAULT;
- if (! name)
- goto oops;
- }
+ register int i;
+ register int fid;
+ register int stored;
+ register ssize_t nread;
+#if !defined(__ANDROID__)
+ register bool doaccess;
+ register char *fullname = lsp->fullname;
+#endif
+ register union input_buffer *up = &lsp->u.u;
+ register int tzheadsize = sizeof (struct tzhead);
- int toread;
- fid = __bionic_open_tzdata(name, &toread);
- if (fid < 0)
- goto oops;
-
- nread = read(fid, up->buf, sizeof up->buf);
- if (close(fid) < 0 || nread <= 0)
- goto oops;
- for (stored = 4; stored <= 8; stored *= 2) {
- int ttisstdcnt;
- int ttisgmtcnt;
- int timecnt;
-
- ttisstdcnt = (int) detzcode(up->tzhead.tzh_ttisstdcnt);
- ttisgmtcnt = (int) detzcode(up->tzhead.tzh_ttisgmtcnt);
- sp->leapcnt = (int) detzcode(up->tzhead.tzh_leapcnt);
- sp->timecnt = (int) detzcode(up->tzhead.tzh_timecnt);
- sp->typecnt = (int) detzcode(up->tzhead.tzh_typecnt);
- sp->charcnt = (int) detzcode(up->tzhead.tzh_charcnt);
- p = up->tzhead.tzh_charcnt + sizeof up->tzhead.tzh_charcnt;
- if (sp->leapcnt < 0 || sp->leapcnt > TZ_MAX_LEAPS ||
- sp->typecnt <= 0 || sp->typecnt > TZ_MAX_TYPES ||
- sp->timecnt < 0 || sp->timecnt > TZ_MAX_TIMES ||
- sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS ||
- (ttisstdcnt != sp->typecnt && ttisstdcnt != 0) ||
- (ttisgmtcnt != sp->typecnt && ttisgmtcnt != 0))
- goto oops;
- if (nread - (p - up->buf) <
- sp->timecnt * stored + /* ats */
- sp->timecnt + /* types */
- sp->typecnt * 6 + /* ttinfos */
- sp->charcnt + /* chars */
- sp->leapcnt * (stored + 4) + /* lsinfos */
- ttisstdcnt + /* ttisstds */
- ttisgmtcnt) /* ttisgmts */
- goto oops;
- timecnt = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- int_fast64_t at
- = stored == 4 ? detzcode(p) : detzcode64(p);
- sp->types[i] = ((TYPE_SIGNED(time_t)
- ? time_t_min <= at
- : 0 <= at)
- && at <= time_t_max);
- if (sp->types[i]) {
- if (i && !timecnt && at != time_t_min) {
- /*
- ** Keep the earlier record, but tweak
- ** it so that it starts with the
- ** minimum time_t value.
- */
- sp->types[i - 1] = 1;
- sp->ats[timecnt++] = time_t_min;
- }
- sp->ats[timecnt++] = at;
- }
- p += stored;
- }
- timecnt = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- unsigned char typ = *p++;
- if (sp->typecnt <= typ)
- goto oops;
- if (sp->types[i])
- sp->types[timecnt++] = typ;
- }
- sp->timecnt = timecnt;
- for (i = 0; i < sp->typecnt; ++i) {
- register struct ttinfo * ttisp;
-
- ttisp = &sp->ttis[i];
- ttisp->tt_gmtoff = detzcode(p);
- p += 4;
- ttisp->tt_isdst = (unsigned char) *p++;
- if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1)
- goto oops;
- ttisp->tt_abbrind = (unsigned char) *p++;
- if (ttisp->tt_abbrind < 0 ||
- ttisp->tt_abbrind > sp->charcnt)
- goto oops;
- }
- for (i = 0; i < sp->charcnt; ++i)
- sp->chars[i] = *p++;
- sp->chars[i] = '\0'; /* ensure '\0' at end */
- for (i = 0; i < sp->leapcnt; ++i) {
- register struct lsinfo * lsisp;
-
- lsisp = &sp->lsis[i];
- lsisp->ls_trans = (stored == 4) ?
- detzcode(p) : detzcode64(p);
- p += stored;
- lsisp->ls_corr = detzcode(p);
- p += 4;
- }
- for (i = 0; i < sp->typecnt; ++i) {
- register struct ttinfo * ttisp;
-
- ttisp = &sp->ttis[i];
- if (ttisstdcnt == 0)
- ttisp->tt_ttisstd = FALSE;
- else {
- ttisp->tt_ttisstd = *p++;
- if (ttisp->tt_ttisstd != TRUE &&
- ttisp->tt_ttisstd != FALSE)
- goto oops;
- }
- }
- for (i = 0; i < sp->typecnt; ++i) {
- register struct ttinfo * ttisp;
-
- ttisp = &sp->ttis[i];
- if (ttisgmtcnt == 0)
- ttisp->tt_ttisgmt = FALSE;
- else {
- ttisp->tt_ttisgmt = *p++;
- if (ttisp->tt_ttisgmt != TRUE &&
- ttisp->tt_ttisgmt != FALSE)
- goto oops;
- }
- }
- /*
- ** If this is an old file, we're done.
- */
- if (up->tzhead.tzh_version[0] == '\0')
- break;
- nread -= p - up->buf;
- for (i = 0; i < nread; ++i)
- up->buf[i] = p[i];
- /*
- ** If this is a signed narrow time_t system, we're done.
- */
- if (TYPE_SIGNED(time_t) && stored >= (int) sizeof(time_t))
- break;
- }
- if (doextend && nread > 2 &&
- up->buf[0] == '\n' && up->buf[nread - 1] == '\n' &&
- sp->typecnt + 2 <= TZ_MAX_TYPES) {
- struct state *ts = &lsp->u.st;
- register int result;
-
- up->buf[nread - 1] = '\0';
- result = tzparse(&up->buf[1], ts, FALSE);
- if (result == 0 && ts->typecnt == 2 &&
- sp->charcnt + ts->charcnt <= TZ_MAX_CHARS) {
- for (i = 0; i < 2; ++i)
- ts->ttis[i].tt_abbrind +=
- sp->charcnt;
- for (i = 0; i < ts->charcnt; ++i)
- sp->chars[sp->charcnt++] =
- ts->chars[i];
- i = 0;
- while (i < ts->timecnt &&
- ts->ats[i] <=
- sp->ats[sp->timecnt - 1])
- ++i;
- while (i < ts->timecnt &&
- sp->timecnt < TZ_MAX_TIMES) {
- sp->ats[sp->timecnt] =
- ts->ats[i];
- sp->types[sp->timecnt] =
- sp->typecnt +
- ts->types[i];
- ++sp->timecnt;
- ++i;
- }
- sp->ttis[sp->typecnt++] = ts->ttis[0];
- sp->ttis[sp->typecnt++] = ts->ttis[1];
- }
- }
- if (sp->timecnt > 1) {
- for (i = 1; i < sp->timecnt; ++i)
- if (typesequiv(sp, sp->types[i], sp->types[0]) &&
- differ_by_repeat(sp->ats[i], sp->ats[0])) {
- sp->goback = TRUE;
- break;
- }
- for (i = sp->timecnt - 2; i >= 0; --i)
- if (typesequiv(sp, sp->types[sp->timecnt - 1],
- sp->types[i]) &&
- differ_by_repeat(sp->ats[sp->timecnt - 1],
- sp->ats[i])) {
- sp->goahead = TRUE;
- break;
- }
- }
- /*
- ** If type 0 is is unused in transitions,
- ** it's the type to use for early times.
- */
- for (i = 0; i < sp->typecnt; ++i)
- if (sp->types[i] == 0)
- break;
- i = (i >= sp->typecnt) ? 0 : -1;
- /*
- ** Absent the above,
- ** if there are transition times
- ** and the first transition is to a daylight time
- ** find the standard type less than and closest to
- ** the type of the first transition.
- */
- if (i < 0 && sp->timecnt > 0 && sp->ttis[sp->types[0]].tt_isdst) {
- i = sp->types[0];
- while (--i >= 0)
- if (!sp->ttis[i].tt_isdst)
- break;
- }
- /*
- ** If no result yet, find the first standard type.
- ** If there is none, punt to type zero.
- */
- if (i < 0) {
- i = 0;
- while (sp->ttis[i].tt_isdst)
- if (++i >= sp->typecnt) {
- i = 0;
- break;
- }
- }
- sp->defaulttype = i;
-#ifdef ALL_STATE
- free(up);
-#endif /* defined ALL_STATE */
- return 0;
-oops:
-#ifdef ALL_STATE
- free(up);
-#endif /* defined ALL_STATE */
- return -1;
+ sp->goback = sp->goahead = false;
+
+ if (! name) {
+ name = TZDEFAULT;
+ if (! name)
+ return EINVAL;
+ }
+
+#if defined(__ANDROID__)
+ fid = __bionic_open_tzdata(name);
+#else
+ if (name[0] == ':')
+ ++name;
+ doaccess = name[0] == '/';
+ if (!doaccess) {
+ char const *p = TZDIR;
+ if (! p)
+ return EINVAL;
+ if (sizeof lsp->fullname - 1 <= strlen(p) + strlen(name))
+ return ENAMETOOLONG;
+ strcpy(fullname, p);
+ strcat(fullname, "/");
+ strcat(fullname, name);
+ /* Set doaccess if '.' (as in "../") shows up in name. */
+ if (strchr(name, '.'))
+ doaccess = true;
+ name = fullname;
+ }
+ if (doaccess && access(name, R_OK) != 0)
+ return errno;
+ fid = open(name, OPEN_MODE);
+#endif
+ if (fid < 0)
+ return errno;
+
+ nread = read(fid, up->buf, sizeof up->buf);
+ if (nread < tzheadsize) {
+ int err = nread < 0 ? errno : EINVAL;
+ close(fid);
+ return err;
+ }
+ if (close(fid) < 0)
+ return errno;
+ for (stored = 4; stored <= 8; stored *= 2) {
+ int_fast32_t ttisstdcnt = detzcode(up->tzhead.tzh_ttisstdcnt);
+ int_fast32_t ttisgmtcnt = detzcode(up->tzhead.tzh_ttisgmtcnt);
+ int_fast32_t leapcnt = detzcode(up->tzhead.tzh_leapcnt);
+ int_fast32_t timecnt = detzcode(up->tzhead.tzh_timecnt);
+ int_fast32_t typecnt = detzcode(up->tzhead.tzh_typecnt);
+ int_fast32_t charcnt = detzcode(up->tzhead.tzh_charcnt);
+ char const *p = up->buf + tzheadsize;
+ if (! (0 <= leapcnt && leapcnt < TZ_MAX_LEAPS
+ && 0 < typecnt && typecnt < TZ_MAX_TYPES
+ && 0 <= timecnt && timecnt < TZ_MAX_TIMES
+ && 0 <= charcnt && charcnt < TZ_MAX_CHARS
+ && (ttisstdcnt == typecnt || ttisstdcnt == 0)
+ && (ttisgmtcnt == typecnt || ttisgmtcnt == 0)))
+ return EINVAL;
+ if (nread
+ < (tzheadsize /* struct tzhead */
+ + timecnt * stored /* ats */
+ + timecnt /* types */
+ + typecnt * 6 /* ttinfos */
+ + charcnt /* chars */
+ + leapcnt * (stored + 4) /* lsinfos */
+ + ttisstdcnt /* ttisstds */
+ + ttisgmtcnt)) /* ttisgmts */
+ return EINVAL;
+ sp->leapcnt = leapcnt;
+ sp->timecnt = timecnt;
+ sp->typecnt = typecnt;
+ sp->charcnt = charcnt;
+
+ /* Read transitions, discarding those out of time_t range.
+ But pretend the last transition before time_t_min
+ occurred at time_t_min. */
+ timecnt = 0;
+ for (i = 0; i < sp->timecnt; ++i) {
+ int_fast64_t at
+ = stored == 4 ? detzcode(p) : detzcode64(p);
+ sp->types[i] = at <= time_t_max;
+ if (sp->types[i]) {
+ time_t attime
+ = ((TYPE_SIGNED(time_t) ? at < time_t_min : at < 0)
+ ? time_t_min : at);
+ if (timecnt && attime <= sp->ats[timecnt - 1]) {
+ if (attime < sp->ats[timecnt - 1])
+ return EINVAL;
+ sp->types[i - 1] = 0;
+ timecnt--;
+ }
+ sp->ats[timecnt++] = attime;
+ }
+ p += stored;
+ }
+
+ timecnt = 0;
+ for (i = 0; i < sp->timecnt; ++i) {
+ unsigned char typ = *p++;
+ if (sp->typecnt <= typ)
+ return EINVAL;
+ if (sp->types[i])
+ sp->types[timecnt++] = typ;
+ }
+ sp->timecnt = timecnt;
+ for (i = 0; i < sp->typecnt; ++i) {
+ register struct ttinfo * ttisp;
+ unsigned char isdst, abbrind;
+
+ ttisp = &sp->ttis[i];
+ ttisp->tt_gmtoff = detzcode(p);
+ p += 4;
+ isdst = *p++;
+ if (! (isdst < 2))
+ return EINVAL;
+ ttisp->tt_isdst = isdst;
+ abbrind = *p++;
+ if (! (abbrind < sp->charcnt))
+ return EINVAL;
+ ttisp->tt_abbrind = abbrind;
+ }
+ for (i = 0; i < sp->charcnt; ++i)
+ sp->chars[i] = *p++;
+ sp->chars[i] = '\0'; /* ensure '\0' at end */
+
+ /* Read leap seconds, discarding those out of time_t range. */
+ leapcnt = 0;
+ for (i = 0; i < sp->leapcnt; ++i) {
+ int_fast64_t tr = stored == 4 ? detzcode(p) : detzcode64(p);
+ int_fast32_t corr = detzcode(p + stored);
+ p += stored + 4;
+ if (tr <= time_t_max) {
+ time_t trans
+ = ((TYPE_SIGNED(time_t) ? tr < time_t_min : tr < 0)
+ ? time_t_min : tr);
+ if (leapcnt && trans <= sp->lsis[leapcnt - 1].ls_trans) {
+ if (trans < sp->lsis[leapcnt - 1].ls_trans)
+ return EINVAL;
+ leapcnt--;
+ }
+ sp->lsis[leapcnt].ls_trans = trans;
+ sp->lsis[leapcnt].ls_corr = corr;
+ leapcnt++;
+ }
+ }
+ sp->leapcnt = leapcnt;
+
+ for (i = 0; i < sp->typecnt; ++i) {
+ register struct ttinfo * ttisp;
+
+ ttisp = &sp->ttis[i];
+ if (ttisstdcnt == 0)
+ ttisp->tt_ttisstd = false;
+ else {
+ if (*p != true && *p != false)
+ return EINVAL;
+ ttisp->tt_ttisstd = *p++;
+ }
+ }
+ for (i = 0; i < sp->typecnt; ++i) {
+ register struct ttinfo * ttisp;
+
+ ttisp = &sp->ttis[i];
+ if (ttisgmtcnt == 0)
+ ttisp->tt_ttisgmt = false;
+ else {
+ if (*p != true && *p != false)
+ return EINVAL;
+ ttisp->tt_ttisgmt = *p++;
+ }
+ }
+ /*
+ ** If this is an old file, we're done.
+ */
+ if (up->tzhead.tzh_version[0] == '\0')
+ break;
+ nread -= p - up->buf;
+ memmove(up->buf, p, nread);
+ }
+ if (doextend && nread > 2 &&
+ up->buf[0] == '\n' && up->buf[nread - 1] == '\n' &&
+ sp->typecnt + 2 <= TZ_MAX_TYPES) {
+ struct state *ts = &lsp->u.st;
+
+ up->buf[nread - 1] = '\0';
+ if (tzparse(&up->buf[1], ts, false)
+ && ts->typecnt == 2) {
+
+ /* Attempt to reuse existing abbreviations.
+ Without this, America/Anchorage would stop
+ working after 2037 when TZ_MAX_CHARS is 50, as
+ sp->charcnt equals 42 (for LMT CAT CAWT CAPT AHST
+ AHDT YST AKDT AKST) and ts->charcnt equals 10
+ (for AKST AKDT). Reusing means sp->charcnt can
+ stay 42 in this example. */
+ int gotabbr = 0;
+ int charcnt = sp->charcnt;
+ for (i = 0; i < 2; i++) {
+ char *tsabbr = ts->chars + ts->ttis[i].tt_abbrind;
+ int j;
+ for (j = 0; j < charcnt; j++)
+ if (strcmp(sp->chars + j, tsabbr) == 0) {
+ ts->ttis[i].tt_abbrind = j;
+ gotabbr++;
+ break;
+ }
+ if (! (j < charcnt)) {
+ int tsabbrlen = strlen(tsabbr);
+ if (j + tsabbrlen < TZ_MAX_CHARS) {
+ strcpy(sp->chars + j, tsabbr);
+ charcnt = j + tsabbrlen + 1;
+ ts->ttis[i].tt_abbrind = j;
+ gotabbr++;
+ }
+ }
+ }
+ if (gotabbr == 2) {
+ sp->charcnt = charcnt;
+ for (i = 0; i < ts->timecnt; i++)
+ if (sp->ats[sp->timecnt - 1] < ts->ats[i])
+ break;
+ while (i < ts->timecnt
+ && sp->timecnt < TZ_MAX_TIMES) {
+ sp->ats[sp->timecnt] = ts->ats[i];
+ sp->types[sp->timecnt] = (sp->typecnt
+ + ts->types[i]);
+ sp->timecnt++;
+ i++;
+ }
+ sp->ttis[sp->typecnt++] = ts->ttis[0];
+ sp->ttis[sp->typecnt++] = ts->ttis[1];
+ }
+ }
+ }
+ if (sp->timecnt > 1) {
+ for (i = 1; i < sp->timecnt; ++i)
+ if (typesequiv(sp, sp->types[i], sp->types[0]) &&
+ differ_by_repeat(sp->ats[i], sp->ats[0])) {
+ sp->goback = true;
+ break;
+ }
+ for (i = sp->timecnt - 2; i >= 0; --i)
+ if (typesequiv(sp, sp->types[sp->timecnt - 1],
+ sp->types[i]) &&
+ differ_by_repeat(sp->ats[sp->timecnt - 1],
+ sp->ats[i])) {
+ sp->goahead = true;
+ break;
+ }
+ }
+ /*
+ ** If type 0 is is unused in transitions,
+ ** it's the type to use for early times.
+ */
+ for (i = 0; i < sp->timecnt; ++i)
+ if (sp->types[i] == 0)
+ break;
+ i = i < sp->timecnt ? -1 : 0;
+ /*
+ ** Absent the above,
+ ** if there are transition times
+ ** and the first transition is to a daylight time
+ ** find the standard type less than and closest to
+ ** the type of the first transition.
+ */
+ if (i < 0 && sp->timecnt > 0 && sp->ttis[sp->types[0]].tt_isdst) {
+ i = sp->types[0];
+ while (--i >= 0)
+ if (!sp->ttis[i].tt_isdst)
+ break;
+ }
+ /*
+ ** If no result yet, find the first standard type.
+ ** If there is none, punt to type zero.
+ */
+ if (i < 0) {
+ i = 0;
+ while (sp->ttis[i].tt_isdst)
+ if (++i >= sp->typecnt) {
+ i = 0;
+ break;
+ }
+ }
+ sp->defaulttype = i;
+ return 0;
}
+/* Load tz data from the file named NAME into *SP. Read extended
+ format if DOEXTEND. Return 0 on success, an errno value on failure. */
static int
-typesequiv(const struct state *const sp, const int a, const int b)
+tzload(char const *name, struct state *sp, bool doextend)
{
- register int result;
-
- if (sp == NULL ||
- a < 0 || a >= sp->typecnt ||
- b < 0 || b >= sp->typecnt)
- result = FALSE;
- else {
- register const struct ttinfo * ap = &sp->ttis[a];
- register const struct ttinfo * bp = &sp->ttis[b];
- result = ap->tt_gmtoff == bp->tt_gmtoff &&
- ap->tt_isdst == bp->tt_isdst &&
- ap->tt_ttisstd == bp->tt_ttisstd &&
- ap->tt_ttisgmt == bp->tt_ttisgmt &&
- strcmp(&sp->chars[ap->tt_abbrind],
- &sp->chars[bp->tt_abbrind]) == 0;
- }
- return result;
+#ifdef ALL_STATE
+ union local_storage *lsp = malloc(sizeof *lsp);
+ if (!lsp)
+ return errno;
+ else {
+ int err = tzloadbody(name, sp, doextend, lsp);
+ free(lsp);
+ return err;
+ }
+#else
+ union local_storage ls;
+ return tzloadbody(name, sp, doextend, &ls);
+#endif
}
-static const int mon_lengths[2][MONSPERYEAR] = {
- { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
- { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+static bool
+typesequiv(const struct state *sp, int a, int b)
+{
+ register bool result;
+
+ if (sp == NULL ||
+ a < 0 || a >= sp->typecnt ||
+ b < 0 || b >= sp->typecnt)
+ result = false;
+ else {
+ register const struct ttinfo * ap = &sp->ttis[a];
+ register const struct ttinfo * bp = &sp->ttis[b];
+ result = ap->tt_gmtoff == bp->tt_gmtoff &&
+ ap->tt_isdst == bp->tt_isdst &&
+ ap->tt_ttisstd == bp->tt_ttisstd &&
+ ap->tt_ttisgmt == bp->tt_ttisgmt &&
+ strcmp(&sp->chars[ap->tt_abbrind],
+ &sp->chars[bp->tt_abbrind]) == 0;
+ }
+ return result;
+}
+
+static const int mon_lengths[2][MONSPERYEAR] = {
+ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
-static const int year_lengths[2] = {
- DAYSPERNYEAR, DAYSPERLYEAR
+static const int year_lengths[2] = {
+ DAYSPERNYEAR, DAYSPERLYEAR
};
/*
@@ -658,15 +732,15 @@ static const int year_lengths[2] = {
** character.
*/
-static const char *
-getzname(register const char * strp)
+static const char * ATTRIBUTE_PURE
+getzname(register const char *strp)
{
- register char c;
+ register char c;
- while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' &&
- c != '+')
- ++strp;
- return strp;
+ while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' &&
+ c != '+')
+ ++strp;
+ return strp;
}
/*
@@ -678,14 +752,14 @@ getzname(register const char * strp)
** We don't do any checking here; checking is done later in common-case code.
*/
-static const char *
+static const char * ATTRIBUTE_PURE
getqzname(register const char *strp, const int delim)
{
- register int c;
+ register int c;
- while ((c = *strp) != '\0' && c != delim)
- ++strp;
- return strp;
+ while ((c = *strp) != '\0' && c != delim)
+ ++strp;
+ return strp;
}
/*
@@ -696,24 +770,24 @@ getqzname(register const char *strp, const int delim)
*/
static const char *
-getnum(register const char * strp, int * const nump, const int min, const int max)
+getnum(register const char *strp, int *const nump, const int min, const int max)
{
- register char c;
- register int num;
-
- if (strp == NULL || !is_digit(c = *strp))
- return NULL;
- num = 0;
- do {
- num = num * 10 + (c - '0');
- if (num > max)
- return NULL; /* illegal value */
- c = *++strp;
- } while (is_digit(c));
- if (num < min)
- return NULL; /* illegal value */
- *nump = num;
- return strp;
+ register char c;
+ register int num;
+
+ if (strp == NULL || !is_digit(c = *strp))
+ return NULL;
+ num = 0;
+ do {
+ num = num * 10 + (c - '0');
+ if (num > max)
+ return NULL; /* illegal value */
+ c = *++strp;
+ } while (is_digit(c));
+ if (num < min)
+ return NULL; /* illegal value */
+ *nump = num;
+ return strp;
}
/*
@@ -727,34 +801,34 @@ getnum(register const char * strp, int * const nump, const int min, const int ma
static const char *
getsecs(register const char *strp, int_fast32_t *const secsp)
{
- int num;
-
- /*
- ** 'HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like
- ** "M10.4.6/26", which does not conform to Posix,
- ** but which specifies the equivalent of
- ** "02:00 on the first Sunday on or after 23 Oct".
- */
- strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1);
- if (strp == NULL)
- return NULL;
- *secsp = num * (int_fast32_t) SECSPERHOUR;
- if (*strp == ':') {
- ++strp;
- strp = getnum(strp, &num, 0, MINSPERHOUR - 1);
- if (strp == NULL)
- return NULL;
- *secsp += num * SECSPERMIN;
- if (*strp == ':') {
- ++strp;
- /* 'SECSPERMIN' allows for leap seconds. */
- strp = getnum(strp, &num, 0, SECSPERMIN);
- if (strp == NULL)
- return NULL;
- *secsp += num;
- }
- }
- return strp;
+ int num;
+
+ /*
+ ** 'HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like
+ ** "M10.4.6/26", which does not conform to Posix,
+ ** but which specifies the equivalent of
+ ** "02:00 on the first Sunday on or after 23 Oct".
+ */
+ strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1);
+ if (strp == NULL)
+ return NULL;
+ *secsp = num * (int_fast32_t) SECSPERHOUR;
+ if (*strp == ':') {
+ ++strp;
+ strp = getnum(strp, &num, 0, MINSPERHOUR - 1);
+ if (strp == NULL)
+ return NULL;
+ *secsp += num * SECSPERMIN;
+ if (*strp == ':') {
+ ++strp;
+ /* 'SECSPERMIN' allows for leap seconds. */
+ strp = getnum(strp, &num, 0, SECSPERMIN);
+ if (strp == NULL)
+ return NULL;
+ *secsp += num;
+ }
+ }
+ return strp;
}
/*
@@ -767,19 +841,19 @@ getsecs(register const char *strp, int_fast32_t *const secsp)
static const char *
getoffset(register const char *strp, int_fast32_t *const offsetp)
{
- register int neg = 0;
-
- if (*strp == '-') {
- neg = 1;
- ++strp;
- } else if (*strp == '+')
- ++strp;
- strp = getsecs(strp, offsetp);
- if (strp == NULL)
- return NULL; /* illegal time */
- if (neg)
- *offsetp = -*offsetp;
- return strp;
+ register bool neg = false;
+
+ if (*strp == '-') {
+ neg = true;
+ ++strp;
+ } else if (*strp == '+')
+ ++strp;
+ strp = getsecs(strp, offsetp);
+ if (strp == NULL)
+ return NULL; /* illegal time */
+ if (neg)
+ *offsetp = -*offsetp;
+ return strp;
}
/*
@@ -790,49 +864,49 @@ getoffset(register const char *strp, int_fast32_t *const offsetp)
*/
static const char *
-getrule(const char * strp, register struct rule * const rulep)
+getrule(const char *strp, register struct rule *const rulep)
{
- if (*strp == 'J') {
- /*
- ** Julian day.
- */
- rulep->r_type = JULIAN_DAY;
- ++strp;
- strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);
- } else if (*strp == 'M') {
- /*
- ** Month, week, day.
- */
- rulep->r_type = MONTH_NTH_DAY_OF_WEEK;
- ++strp;
- strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);
- if (strp == NULL)
- return NULL;
- if (*strp++ != '.')
- return NULL;
- strp = getnum(strp, &rulep->r_week, 1, 5);
- if (strp == NULL)
- return NULL;
- if (*strp++ != '.')
- return NULL;
- strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);
- } else if (is_digit(*strp)) {
- /*
- ** Day of year.
- */
- rulep->r_type = DAY_OF_YEAR;
- strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);
- } else return NULL; /* invalid format */
- if (strp == NULL)
- return NULL;
- if (*strp == '/') {
- /*
- ** Time specified.
- */
- ++strp;
- strp = getoffset(strp, &rulep->r_time);
- } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */
- return strp;
+ if (*strp == 'J') {
+ /*
+ ** Julian day.
+ */
+ rulep->r_type = JULIAN_DAY;
+ ++strp;
+ strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);
+ } else if (*strp == 'M') {
+ /*
+ ** Month, week, day.
+ */
+ rulep->r_type = MONTH_NTH_DAY_OF_WEEK;
+ ++strp;
+ strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);
+ if (strp == NULL)
+ return NULL;
+ if (*strp++ != '.')
+ return NULL;
+ strp = getnum(strp, &rulep->r_week, 1, 5);
+ if (strp == NULL)
+ return NULL;
+ if (*strp++ != '.')
+ return NULL;
+ strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);
+ } else if (is_digit(*strp)) {
+ /*
+ ** Day of year.
+ */
+ rulep->r_type = DAY_OF_YEAR;
+ strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);
+ } else return NULL; /* invalid format */
+ if (strp == NULL)
+ return NULL;
+ if (*strp == '/') {
+ /*
+ ** Time specified.
+ */
+ ++strp;
+ strp = getoffset(strp, &rulep->r_time);
+ } else rulep->r_time = 2 * SECSPERHOUR; /* default = 2:00:00 */
+ return strp;
}
/*
@@ -840,11 +914,11 @@ getrule(const char * strp, register struct rule * const rulep)
** effect, calculate the year-relative time that rule takes effect.
*/
-static int_fast32_t
+static int_fast32_t ATTRIBUTE_PURE
transtime(const int year, register const struct rule *const rulep,
const int_fast32_t offset)
{
- register int leapyear;
+ register bool leapyear;
register int_fast32_t value;
register int i;
int d, m1, yy0, yy1, yy2, dow;
@@ -931,457 +1005,542 @@ transtime(const int year, register const struct rule *const rulep,
** appropriate.
*/
+static bool
+tzparse(const char *name, struct state *sp, bool lastditch)
+{
+ const char * stdname;
+ const char * dstname;
+ size_t stdlen;
+ size_t dstlen;
+ size_t charcnt;
+ int_fast32_t stdoffset;
+ int_fast32_t dstoffset;
+ register char * cp;
+ register bool load_ok;
+
+ stdname = name;
+ if (lastditch) {
+ stdlen = sizeof gmt - 1;
+ name += stdlen;
+ stdoffset = 0;
+ } else {
+ if (*name == '<') {
+ name++;
+ stdname = name;
+ name = getqzname(name, '>');
+ if (*name != '>')
+ return false;
+ stdlen = name - stdname;
+ name++;
+ } else {
+ name = getzname(name);
+ stdlen = name - stdname;
+ }
+ if (!stdlen)
+ return false;
+ name = getoffset(name, &stdoffset);
+ if (name == NULL)
+ return false;
+ }
+ charcnt = stdlen + 1;
+ if (sizeof sp->chars < charcnt)
+ return false;
+ load_ok = tzload(TZDEFRULES, sp, false) == 0;
+ if (!load_ok)
+ sp->leapcnt = 0; /* so, we're off a little */
+ if (*name != '\0') {
+ if (*name == '<') {
+ dstname = ++name;
+ name = getqzname(name, '>');
+ if (*name != '>')
+ return false;
+ dstlen = name - dstname;
+ name++;
+ } else {
+ dstname = name;
+ name = getzname(name);
+ dstlen = name - dstname; /* length of DST zone name */
+ }
+ if (!dstlen)
+ return false;
+ charcnt += dstlen + 1;
+ if (sizeof sp->chars < charcnt)
+ return false;
+ if (*name != '\0' && *name != ',' && *name != ';') {
+ name = getoffset(name, &dstoffset);
+ if (name == NULL)
+ return false;
+ } else dstoffset = stdoffset - SECSPERHOUR;
+ if (*name == '\0' && !load_ok)
+ name = TZDEFRULESTRING;
+ if (*name == ',' || *name == ';') {
+ struct rule start;
+ struct rule end;
+ register int year;
+ register int yearlim;
+ register int timecnt;
+ time_t janfirst;
+
+ ++name;
+ if ((name = getrule(name, &start)) == NULL)
+ return false;
+ if (*name++ != ',')
+ return false;
+ if ((name = getrule(name, &end)) == NULL)
+ return false;
+ if (*name != '\0')
+ return false;
+ sp->typecnt = 2; /* standard time and DST */
+ /*
+ ** Two transitions per year, from EPOCH_YEAR forward.
+ */
+ init_ttinfo(&sp->ttis[0], -dstoffset, true, stdlen + 1);
+ init_ttinfo(&sp->ttis[1], -stdoffset, false, 0);
+ sp->defaulttype = 0;
+ timecnt = 0;
+ janfirst = 0;
+ yearlim = EPOCH_YEAR + YEARSPERREPEAT;
+ for (year = EPOCH_YEAR; year < yearlim; year++) {
+ int_fast32_t
+ starttime = transtime(year, &start, stdoffset),
+ endtime = transtime(year, &end, dstoffset);
+ int_fast32_t
+ yearsecs = (year_lengths[isleap(year)]
+ * SECSPERDAY);
+ bool reversed = endtime < starttime;
+ if (reversed) {
+ int_fast32_t swap = starttime;
+ starttime = endtime;
+ endtime = swap;
+ }
+ if (reversed
+ || (starttime < endtime
+ && (endtime - starttime
+ < (yearsecs
+ + (stdoffset - dstoffset))))) {
+ if (TZ_MAX_TIMES - 2 < timecnt)
+ break;
+ yearlim = year + YEARSPERREPEAT + 1;
+ sp->ats[timecnt] = janfirst;
+ if (increment_overflow_time
+ (&sp->ats[timecnt], starttime))
+ break;
+ sp->types[timecnt++] = reversed;
+ sp->ats[timecnt] = janfirst;
+ if (increment_overflow_time
+ (&sp->ats[timecnt], endtime))
+ break;
+ sp->types[timecnt++] = !reversed;
+ }
+ if (increment_overflow_time(&janfirst, yearsecs))
+ break;
+ }
+ sp->timecnt = timecnt;
+ if (!timecnt)
+ sp->typecnt = 1; /* Perpetual DST. */
+ } else {
+ register int_fast32_t theirstdoffset;
+ register int_fast32_t theirdstoffset;
+ register int_fast32_t theiroffset;
+ register bool isdst;
+ register int i;
+ register int j;
+
+ if (*name != '\0')
+ return false;
+ /*
+ ** Initial values of theirstdoffset and theirdstoffset.
+ */
+ theirstdoffset = 0;
+ for (i = 0; i < sp->timecnt; ++i) {
+ j = sp->types[i];
+ if (!sp->ttis[j].tt_isdst) {
+ theirstdoffset =
+ -sp->ttis[j].tt_gmtoff;
+ break;
+ }
+ }
+ theirdstoffset = 0;
+ for (i = 0; i < sp->timecnt; ++i) {
+ j = sp->types[i];
+ if (sp->ttis[j].tt_isdst) {
+ theirdstoffset =
+ -sp->ttis[j].tt_gmtoff;
+ break;
+ }
+ }
+ /*
+ ** Initially we're assumed to be in standard time.
+ */
+ isdst = false;
+ theiroffset = theirstdoffset;
+ /*
+ ** Now juggle transition times and types
+ ** tracking offsets as you do.
+ */
+ for (i = 0; i < sp->timecnt; ++i) {
+ j = sp->types[i];
+ sp->types[i] = sp->ttis[j].tt_isdst;
+ if (sp->ttis[j].tt_ttisgmt) {
+ /* No adjustment to transition time */
+ } else {
+ /*
+ ** If summer time is in effect, and the
+ ** transition time was not specified as
+ ** standard time, add the summer time
+ ** offset to the transition time;
+ ** otherwise, add the standard time
+ ** offset to the transition time.
+ */
+ /*
+ ** Transitions from DST to DDST
+ ** will effectively disappear since
+ ** POSIX provides for only one DST
+ ** offset.
+ */
+ if (isdst && !sp->ttis[j].tt_ttisstd) {
+ sp->ats[i] += dstoffset -
+ theirdstoffset;
+ } else {
+ sp->ats[i] += stdoffset -
+ theirstdoffset;
+ }
+ }
+ theiroffset = -sp->ttis[j].tt_gmtoff;
+ if (sp->ttis[j].tt_isdst)
+ theirdstoffset = theiroffset;
+ else theirstdoffset = theiroffset;
+ }
+ /*
+ ** Finally, fill in ttis.
+ */
+ init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
+ init_ttinfo(&sp->ttis[1], -dstoffset, true, stdlen + 1);
+ sp->typecnt = 2;
+ sp->defaulttype = 0;
+ }
+ } else {
+ dstlen = 0;
+ sp->typecnt = 1; /* only standard time */
+ sp->timecnt = 0;
+ init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
+ sp->defaulttype = 0;
+ }
+ sp->charcnt = charcnt;
+ cp = sp->chars;
+ memcpy(cp, stdname, stdlen);
+ cp += stdlen;
+ *cp++ = '\0';
+ if (dstlen != 0) {
+ memcpy(cp, dstname, dstlen);
+ *(cp + dstlen) = '\0';
+ }
+ return true;
+}
+
+static void
+gmtload(struct state *const sp)
+{
+ if (tzload(gmt, sp, true) != 0)
+ tzparse(gmt, sp, true);
+}
+
+/* Initialize *SP to a value appropriate for the TZ setting NAME.
+ Return 0 on success, an errno value on failure. */
static int
-tzparse(const char * name, register struct state * const sp,
- const int lastditch)
+zoneinit(struct state *sp, char const *name)
{
- const char * stdname;
- const char * dstname;
- size_t stdlen;
- size_t dstlen;
- int_fast32_t stdoffset;
- int_fast32_t dstoffset;
- register char * cp;
- register int load_result;
- static struct ttinfo zttinfo;
-
- stdname = name;
- if (lastditch) {
- stdlen = strlen(name); /* length of standard zone name */
- name += stdlen;
- if (stdlen >= sizeof sp->chars)
- stdlen = (sizeof sp->chars) - 1;
- stdoffset = 0;
- } else {
- if (*name == '<') {
- name++;
- stdname = name;
- name = getqzname(name, '>');
- if (*name != '>')
- return (-1);
- stdlen = name - stdname;
- name++;
- } else {
- name = getzname(name);
- stdlen = name - stdname;
- }
- if (*name == '\0')
- return -1;
- name = getoffset(name, &stdoffset);
- if (name == NULL)
- return -1;
- }
- load_result = tzload(TZDEFRULES, sp, FALSE);
- if (load_result != 0)
- sp->leapcnt = 0; /* so, we're off a little */
- if (*name != '\0') {
- if (*name == '<') {
- dstname = ++name;
- name = getqzname(name, '>');
- if (*name != '>')
- return -1;
- dstlen = name - dstname;
- name++;
- } else {
- dstname = name;
- name = getzname(name);
- dstlen = name - dstname; /* length of DST zone name */
- }
- if (*name != '\0' && *name != ',' && *name != ';') {
- name = getoffset(name, &dstoffset);
- if (name == NULL)
- return -1;
- } else dstoffset = stdoffset - SECSPERHOUR;
- if (*name == '\0' && load_result != 0)
- name = TZDEFRULESTRING;
- if (*name == ',' || *name == ';') {
- struct rule start;
- struct rule end;
- register int year;
- register int yearlim;
- register int timecnt;
- time_t janfirst;
-
- ++name;
- if ((name = getrule(name, &start)) == NULL)
- return -1;
- if (*name++ != ',')
- return -1;
- if ((name = getrule(name, &end)) == NULL)
- return -1;
- if (*name != '\0')
- return -1;
- sp->typecnt = 2; /* standard time and DST */
- /*
- ** Two transitions per year, from EPOCH_YEAR forward.
- */
- sp->ttis[0] = sp->ttis[1] = zttinfo;
- sp->ttis[0].tt_gmtoff = -dstoffset;
- sp->ttis[0].tt_isdst = 1;
- sp->ttis[0].tt_abbrind = stdlen + 1;
- sp->ttis[1].tt_gmtoff = -stdoffset;
- sp->ttis[1].tt_isdst = 0;
- sp->ttis[1].tt_abbrind = 0;
- sp->defaulttype = 0;
- timecnt = 0;
- janfirst = 0;
- yearlim = EPOCH_YEAR + YEARSPERREPEAT;
- for (year = EPOCH_YEAR; year < yearlim; year++) {
- int_fast32_t
- starttime = transtime(year, &start, stdoffset),
- endtime = transtime(year, &end, dstoffset);
- int_fast32_t
- yearsecs = (year_lengths[isleap(year)]
- * SECSPERDAY);
- int reversed = endtime < starttime;
- if (reversed) {
- int_fast32_t swap = starttime;
- starttime = endtime;
- endtime = swap;
- }
- if (reversed
- || (starttime < endtime
- && (endtime - starttime
- < (yearsecs
- + (stdoffset - dstoffset))))) {
- if (TZ_MAX_TIMES - 2 < timecnt)
- break;
- yearlim = year + YEARSPERREPEAT + 1;
- sp->ats[timecnt] = janfirst;
- if (increment_overflow_time
- (&sp->ats[timecnt], starttime))
- break;
- sp->types[timecnt++] = reversed;
- sp->ats[timecnt] = janfirst;
- if (increment_overflow_time
- (&sp->ats[timecnt], endtime))
- break;
- sp->types[timecnt++] = !reversed;
- }
- if (increment_overflow_time(&janfirst, yearsecs))
- break;
- }
- sp->timecnt = timecnt;
- if (!timecnt)
- sp->typecnt = 1; /* Perpetual DST. */
- } else {
- register int_fast32_t theirstdoffset;
- register int_fast32_t theirdstoffset;
- register int_fast32_t theiroffset;
- register int isdst;
- register int i;
- register int j;
-
- if (*name != '\0')
- return -1;
- /*
- ** Initial values of theirstdoffset and theirdstoffset.
- */
- theirstdoffset = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- j = sp->types[i];
- if (!sp->ttis[j].tt_isdst) {
- theirstdoffset =
- -sp->ttis[j].tt_gmtoff;
- break;
- }
- }
- theirdstoffset = 0;
- for (i = 0; i < sp->timecnt; ++i) {
- j = sp->types[i];
- if (sp->ttis[j].tt_isdst) {
- theirdstoffset =
- -sp->ttis[j].tt_gmtoff;
- break;
- }
- }
- /*
- ** Initially we're assumed to be in standard time.
- */
- isdst = FALSE;
- theiroffset = theirstdoffset;
- /*
- ** Now juggle transition times and types
- ** tracking offsets as you do.
- */
- for (i = 0; i < sp->timecnt; ++i) {
- j = sp->types[i];
- sp->types[i] = sp->ttis[j].tt_isdst;
- if (sp->ttis[j].tt_ttisgmt) {
- /* No adjustment to transition time */
- } else {
- /*
- ** If summer time is in effect, and the
- ** transition time was not specified as
- ** standard time, add the summer time
- ** offset to the transition time;
- ** otherwise, add the standard time
- ** offset to the transition time.
- */
- /*
- ** Transitions from DST to DDST
- ** will effectively disappear since
- ** POSIX provides for only one DST
- ** offset.
- */
- if (isdst && !sp->ttis[j].tt_ttisstd) {
- sp->ats[i] += dstoffset -
- theirdstoffset;
- } else {
- sp->ats[i] += stdoffset -
- theirstdoffset;
- }
- }
- theiroffset = -sp->ttis[j].tt_gmtoff;
- if (sp->ttis[j].tt_isdst)
- theirdstoffset = theiroffset;
- else theirstdoffset = theiroffset;
- }
- /*
- ** Finally, fill in ttis.
- */
- sp->ttis[0] = sp->ttis[1] = zttinfo;
- sp->ttis[0].tt_gmtoff = -stdoffset;
- sp->ttis[0].tt_isdst = FALSE;
- sp->ttis[0].tt_abbrind = 0;
- sp->ttis[1].tt_gmtoff = -dstoffset;
- sp->ttis[1].tt_isdst = TRUE;
- sp->ttis[1].tt_abbrind = stdlen + 1;
- sp->typecnt = 2;
- sp->defaulttype = 0;
- }
- } else {
- dstlen = 0;
- sp->typecnt = 1; /* only standard time */
- sp->timecnt = 0;
- sp->ttis[0] = zttinfo;
- sp->ttis[0].tt_gmtoff = -stdoffset;
- sp->ttis[0].tt_isdst = 0;
- sp->ttis[0].tt_abbrind = 0;
- sp->defaulttype = 0;
- }
- sp->charcnt = stdlen + 1;
- if (dstlen != 0)
- sp->charcnt += dstlen + 1;
- if ((size_t) sp->charcnt > sizeof sp->chars)
- return -1;
- cp = sp->chars;
- (void) strncpy(cp, stdname, stdlen);
- cp += stdlen;
- *cp++ = '\0';
- if (dstlen != 0) {
- (void) strncpy(cp, dstname, dstlen);
- *(cp + dstlen) = '\0';
- }
+ if (name && ! name[0]) {
+ /*
+ ** User wants it fast rather than right.
+ */
+ sp->leapcnt = 0; /* so, we're off a little */
+ sp->timecnt = 0;
+ sp->typecnt = 0;
+ sp->charcnt = 0;
+ sp->goback = sp->goahead = false;
+ init_ttinfo(&sp->ttis[0], 0, false, 0);
+ strcpy(sp->chars, gmt);
+ sp->defaulttype = 0;
return 0;
+ } else {
+ int err = tzload(name, sp, true);
+ if (err != 0 && name && name[0] != ':' && tzparse(name, sp, false))
+ err = 0;
+ if (err == 0)
+ scrub_abbrs(sp);
+ return err;
+ }
}
static void
-gmtload(struct state * const sp)
+tzsetlcl(char const *name)
{
- if (tzload(gmt, sp, TRUE) != 0)
- (void) tzparse(gmt, sp, TRUE);
+ struct state *sp = lclptr;
+ int lcl = name ? strlen(name) < sizeof lcl_TZname : -1;
+ if (lcl < 0
+ ? lcl_is_set < 0
+ : 0 < lcl_is_set && strcmp(lcl_TZname, name) == 0)
+ return;
+#ifdef ALL_STATE
+ if (! sp)
+ lclptr = sp = malloc(sizeof *lclptr);
+#endif /* defined ALL_STATE */
+ if (sp) {
+ if (zoneinit(sp, name) != 0)
+ zoneinit(sp, "");
+ if (0 < lcl)
+ strcpy(lcl_TZname, name);
+ }
+ settzname();
+ lcl_is_set = lcl;
}
-#ifndef STD_INSPIRED
-/*
-** A non-static declaration of tzsetwall in a system header file
-** may cause a warning about this upcoming static declaration...
-*/
-static
-#endif /* !defined STD_INSPIRED */
+#ifdef STD_INSPIRED
void
tzsetwall(void)
{
- if (lcl_is_set < 0)
- return;
- lcl_is_set = -1;
-
-#ifdef ALL_STATE
- if (lclptr == NULL) {
- lclptr = malloc(sizeof *lclptr);
- if (lclptr == NULL) {
- settzname(); /* all we can do */
- return;
- }
- }
-#endif /* defined ALL_STATE */
- if (tzload(NULL, lclptr, TRUE) != 0)
- gmtload(lclptr);
- settzname();
+ if (lock() != 0)
+ return;
+ tzsetlcl(NULL);
+ unlock();
}
+#endif
-#include <sys/system_properties.h> // For __system_property_get.
+#if defined(__ANDROID__)
+#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
+#include <sys/_system_properties.h> // For __system_property_serial.
+#endif
static void
-tzset_locked(void)
+tzset_unlocked(void)
{
- register const char * name;
+#if defined(__ANDROID__)
+ // The TZ environment variable is meant to override the system-wide setting.
+ const char * name = getenv("TZ");
- name = getenv("TZ");
+ // If that's not set, look at the "persist.sys.timezone" system property.
+ if (name == NULL) {
+ static const prop_info *pi;
- // try the "persist.sys.timezone" system property first
- static char buf[PROP_VALUE_MAX];
- if (name == NULL && __system_property_get("persist.sys.timezone", buf) > 0) {
+ if (!pi) {
+ pi = __system_property_find("persist.sys.timezone");
+ }
+ if (pi) {
+ static char buf[PROP_VALUE_MAX];
+ static uint32_t s = -1;
+ static bool ok = false;
+ uint32_t serial = __system_property_serial(pi);
+ if (serial != s) {
+ ok = __system_property_read(pi, 0, buf) > 0;
+ s = serial;
+ }
+ if (ok) {
name = buf;
+ }
}
+ }
- if (name == NULL) {
- tzsetwall();
- return;
- }
+ // If that's not available (because you're running AOSP on a WiFi-only
+ // device, say), fall back to GMT.
+ if (name == NULL) name = gmt;
- if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0)
- return;
- lcl_is_set = strlen(name) < sizeof lcl_TZname;
- if (lcl_is_set)
- (void) strcpy(lcl_TZname, name);
+ tzsetlcl(name);
+#else
+ tzsetlcl(getenv("TZ"));
+#endif
+}
+void
+tzset(void)
+{
+ if (lock() != 0)
+ return;
+ tzset_unlocked();
+ unlock();
+}
+
+static void
+gmtcheck(void)
+{
+ static bool gmt_is_set;
+ if (lock() != 0)
+ return;
+ if (! gmt_is_set) {
#ifdef ALL_STATE
- if (lclptr == NULL) {
- lclptr = malloc(sizeof *lclptr);
- if (lclptr == NULL) {
- settzname(); /* all we can do */
- return;
- }
+ gmtptr = malloc(sizeof *gmtptr);
+#endif
+ if (gmtptr)
+ gmtload(gmtptr);
+ gmt_is_set = true;
+ }
+ unlock();
+}
+
+#if NETBSD_INSPIRED
+
+timezone_t
+tzalloc(char const *name)
+{
+ timezone_t sp = malloc(sizeof *sp);
+ if (sp) {
+ int err = zoneinit(sp, name);
+ if (err != 0) {
+ free(sp);
+ errno = err;
+ return NULL;
}
-#endif /* defined ALL_STATE */
- if (*name == '\0') {
- /*
- ** User wants it fast rather than right.
- */
- lclptr->leapcnt = 0; /* so, we're off a little */
- lclptr->timecnt = 0;
- lclptr->typecnt = 0;
- lclptr->ttis[0].tt_isdst = 0;
- lclptr->ttis[0].tt_gmtoff = 0;
- lclptr->ttis[0].tt_abbrind = 0;
- (void) strcpy(lclptr->chars, gmt);
- lclptr->defaulttype = 0;
- } else if (tzload(name, lclptr, TRUE) != 0)
- if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0)
- (void) gmtload(lclptr);
- settzname();
+ }
+ return sp;
}
void
-tzset(void)
+tzfree(timezone_t sp)
{
- _tzLock();
- tzset_locked();
- _tzUnlock();
+ free(sp);
}
/*
+** NetBSD 6.1.4 has ctime_rz, but omit it because POSIX says ctime and
+** ctime_r are obsolescent and have potential security problems that
+** ctime_rz would share. Callers can instead use localtime_rz + strftime.
+**
+** NetBSD 6.1.4 has tzgetname, but omit it because it doesn't work
+** in zones with three or more time zone abbreviations.
+** Callers can instead use localtime_rz + strftime.
+*/
+
+#endif
+
+/*
** The easy way to behave "as if no library function calls" localtime
-** is to not call it--so we drop its guts into "localsub", which can be
-** freely called. (And no, the PANS doesn't require the above behavior--
+** is to not call it, so we drop its guts into "localsub", which can be
+** freely called. (And no, the PANS doesn't require the above behavior,
** but it *is* desirable.)
**
-** The unused offset argument is for the benefit of mktime variants.
+** If successful and SETNAME is nonzero,
+** set the applicable parts of tzname, timezone and altzone;
+** however, it's OK to omit this step if the time zone is POSIX-compatible,
+** since in that case tzset should have already done this step correctly.
+** SETNAME's type is intfast32_t for compatibility with gmtsub,
+** but it is actually a boolean and its value should be 0 or 1.
*/
/*ARGSUSED*/
static struct tm *
-localsub(const time_t * const timep, const int_fast32_t offset,
- struct tm * const tmp, struct state * sp) // android-changed: added sp.
+localsub(struct state const *sp, time_t const *timep, int_fast32_t setname,
+ struct tm *const tmp)
{
- register const struct ttinfo * ttisp;
- register int i;
- register struct tm * result;
- const time_t t = *timep;
-
- // BEGIN android-changed: support user-supplied sp.
- if (sp == NULL) {
- sp = lclptr;
- }
- // END android-changed
- if (sp == NULL)
- return gmtsub(timep, offset, tmp, sp); // android-changed: added sp.
- if ((sp->goback && t < sp->ats[0]) ||
- (sp->goahead && t > sp->ats[sp->timecnt - 1])) {
- time_t newt = t;
- register time_t seconds;
- register time_t years;
-
- if (t < sp->ats[0])
- seconds = sp->ats[0] - t;
- else seconds = t - sp->ats[sp->timecnt - 1];
- --seconds;
- years = (seconds / SECSPERREPEAT + 1) * YEARSPERREPEAT;
- seconds = years * AVGSECSPERYEAR;
- if (t < sp->ats[0])
- newt += seconds;
- else newt -= seconds;
- if (newt < sp->ats[0] ||
- newt > sp->ats[sp->timecnt - 1])
- return NULL; /* "cannot happen" */
- result = localsub(&newt, offset, tmp, sp); // android-changed: added sp.
- if (result == tmp) {
- register time_t newy;
-
- newy = tmp->tm_year;
- if (t < sp->ats[0])
- newy -= years;
- else newy += years;
- tmp->tm_year = newy;
- if (tmp->tm_year != newy)
- return NULL;
- }
- return result;
- }
- if (sp->timecnt == 0 || t < sp->ats[0]) {
- i = sp->defaulttype;
- } else {
- register int lo = 1;
- register int hi = sp->timecnt;
-
- while (lo < hi) {
- register int mid = (lo + hi) >> 1;
-
- if (t < sp->ats[mid])
- hi = mid;
- else lo = mid + 1;
- }
- i = (int) sp->types[lo - 1];
- }
- ttisp = &sp->ttis[i];
- /*
- ** To get (wrong) behavior that's compatible with System V Release 2.0
- ** you'd replace the statement below with
- ** t += ttisp->tt_gmtoff;
- ** timesub(&t, 0L, sp, tmp);
- */
- result = timesub(&t, ttisp->tt_gmtoff, sp, tmp);
- tmp->tm_isdst = ttisp->tt_isdst;
- tzname[tmp->tm_isdst] = &sp->chars[ttisp->tt_abbrind];
+ register const struct ttinfo * ttisp;
+ register int i;
+ register struct tm * result;
+ const time_t t = *timep;
+
+ if (sp == NULL) {
+ /* Don't bother to set tzname etc.; tzset has already done it. */
+ return gmtsub(gmtptr, timep, 0, tmp);
+ }
+ if ((sp->goback && t < sp->ats[0]) ||
+ (sp->goahead && t > sp->ats[sp->timecnt - 1])) {
+ time_t newt = t;
+ register time_t seconds;
+ register time_t years;
+
+ if (t < sp->ats[0])
+ seconds = sp->ats[0] - t;
+ else seconds = t - sp->ats[sp->timecnt - 1];
+ --seconds;
+ years = (seconds / SECSPERREPEAT + 1) * YEARSPERREPEAT;
+ seconds = years * AVGSECSPERYEAR;
+ if (t < sp->ats[0])
+ newt += seconds;
+ else newt -= seconds;
+ if (newt < sp->ats[0] ||
+ newt > sp->ats[sp->timecnt - 1])
+ return NULL; /* "cannot happen" */
+ result = localsub(sp, &newt, setname, tmp);
+ if (result) {
+ register int_fast64_t newy;
+
+ newy = result->tm_year;
+ if (t < sp->ats[0])
+ newy -= years;
+ else newy += years;
+ if (! (INT_MIN <= newy && newy <= INT_MAX))
+ return NULL;
+ result->tm_year = newy;
+ }
+ return result;
+ }
+ if (sp->timecnt == 0 || t < sp->ats[0]) {
+ i = sp->defaulttype;
+ } else {
+ register int lo = 1;
+ register int hi = sp->timecnt;
+
+ while (lo < hi) {
+ register int mid = (lo + hi) >> 1;
+
+ if (t < sp->ats[mid])
+ hi = mid;
+ else lo = mid + 1;
+ }
+ i = (int) sp->types[lo - 1];
+ }
+ ttisp = &sp->ttis[i];
+ /*
+ ** To get (wrong) behavior that's compatible with System V Release 2.0
+ ** you'd replace the statement below with
+ ** t += ttisp->tt_gmtoff;
+ ** timesub(&t, 0L, sp, tmp);
+ */
+ result = timesub(&t, ttisp->tt_gmtoff, sp, tmp);
+ if (result) {
+ result->tm_isdst = ttisp->tt_isdst;
#ifdef TM_ZONE
- tmp->TM_ZONE = &sp->chars[ttisp->tt_abbrind];
+ result->TM_ZONE = (char *) &sp->chars[ttisp->tt_abbrind];
#endif /* defined TM_ZONE */
- return result;
+ if (setname)
+ update_tzname_etc(sp, ttisp);
+ }
+ return result;
}
+#if NETBSD_INSPIRED
+
struct tm *
-localtime(const time_t * const timep)
+localtime_rz(struct state *sp, time_t const *timep, struct tm *tmp)
{
- return localtime_r(timep, &tmGlobal);
+ return localsub(sp, timep, 0, tmp);
}
-/*
-** Re-entrant version of localtime.
-*/
+#endif
-struct tm *
-localtime_r(const time_t * const timep, struct tm * tmp)
+static struct tm *
+localtime_tzset(time_t const *timep, struct tm *tmp, bool setname)
{
- struct tm* result;
+ int err = lock();
+ if (err) {
+ errno = err;
+ return NULL;
+ }
+ if (setname || !lcl_is_set)
+ tzset_unlocked();
+ tmp = localsub(lclptr, timep, setname, tmp);
+ unlock();
+ return tmp;
+}
- _tzLock();
- tzset_locked();
- result = localsub(timep, 0L, tmp, NULL); // android-changed: extra parameter.
- _tzUnlock();
+struct tm *
+localtime(const time_t *timep)
+{
+ return localtime_tzset(timep, &tm, true);
+}
- return result;
+struct tm *
+localtime_r(const time_t *timep, struct tm *tmp)
+{
+ return localtime_tzset(timep, tmp, false);
}
/*
@@ -1389,37 +1548,22 @@ localtime_r(const time_t * const timep, struct tm * tmp)
*/
static struct tm *
-gmtsub(const time_t * const timep, const int_fast32_t offset,
- struct tm *const tmp, struct state * sp __unused) // android-changed: added sp.
+gmtsub(struct state const *sp, time_t const *timep, int_fast32_t offset,
+ struct tm *tmp)
{
- register struct tm * result;
+ register struct tm * result;
- if (!gmt_is_set) {
-#ifdef ALL_STATE
- gmtptr = malloc(sizeof *gmtptr);
- gmt_is_set = gmtptr != NULL;
-#else
- gmt_is_set = TRUE;
-#endif /* defined ALL_STATE */
- if (gmt_is_set)
- gmtload(gmtptr);
- }
- result = timesub(timep, offset, gmtptr, tmp);
+ result = timesub(timep, offset, gmtptr, tmp);
#ifdef TM_ZONE
- /*
- ** Could get fancy here and deliver something such as
- ** "UT+xxxx" or "UT-xxxx" if offset is non-zero,
- ** but this is no time for a treasure hunt.
- */
- tmp->TM_ZONE = offset ? wildabbr : gmtptr ? gmtptr->chars : gmt;
+ /*
+ ** Could get fancy here and deliver something such as
+ ** "UT+xxxx" or "UT-xxxx" if offset is non-zero,
+ ** but this is no time for a treasure hunt.
+ */
+ tmp->TM_ZONE = ((char *)
+ (offset ? wildabbr : gmtptr ? gmtptr->chars : gmt));
#endif /* defined TM_ZONE */
- return result;
-}
-
-struct tm *
-gmtime(const time_t * const timep)
-{
- return gmtime_r(timep, &tmGlobal);
+ return result;
}
/*
@@ -1427,23 +1571,25 @@ gmtime(const time_t * const timep)
*/
struct tm *
-gmtime_r(const time_t * const timep, struct tm * tmp)
+gmtime_r(const time_t *timep, struct tm *tmp)
{
- struct tm* result;
-
- _tzLock();
- result = gmtsub(timep, 0L, tmp, NULL); // android-changed: extra parameter.
- _tzUnlock();
+ gmtcheck();
+ return gmtsub(gmtptr, timep, 0, tmp);
+}
- return result;
+struct tm *
+gmtime(const time_t *timep)
+{
+ return gmtime_r(timep, &tm);
}
#ifdef STD_INSPIRED
struct tm *
-offtime(const time_t *const timep, const long offset)
+offtime(const time_t *timep, long offset)
{
- return gmtsub(timep, offset, &tmGlobal, NULL); // android-changed: extra parameter.
+ gmtcheck();
+ return gmtsub(gmtptr, timep, offset, &tm);
}
#endif /* defined STD_INSPIRED */
@@ -1453,596 +1599,609 @@ offtime(const time_t *const timep, const long offset)
** where, to make the math easy, the answer for year zero is defined as zero.
*/
-static int
+static int ATTRIBUTE_PURE
leaps_thru_end_of(register const int y)
{
- return (y >= 0) ? (y / 4 - y / 100 + y / 400) :
- -(leaps_thru_end_of(-(y + 1)) + 1);
+ return (y >= 0) ? (y / 4 - y / 100 + y / 400) :
+ -(leaps_thru_end_of(-(y + 1)) + 1);
}
static struct tm *
-timesub(const time_t *const timep, const int_fast32_t offset,
- register const struct state *const sp,
- register struct tm *const tmp)
+timesub(const time_t *timep, int_fast32_t offset,
+ const struct state *sp, struct tm *tmp)
{
- register const struct lsinfo * lp;
- register time_t tdays;
- register int idays; /* unsigned would be so 2003 */
- register int_fast64_t rem;
- int y;
- register const int * ip;
- register int_fast64_t corr;
- register int hit;
- register int i;
-
- corr = 0;
- hit = 0;
- i = (sp == NULL) ? 0 : sp->leapcnt;
- while (--i >= 0) {
- lp = &sp->lsis[i];
- if (*timep >= lp->ls_trans) {
- if (*timep == lp->ls_trans) {
- hit = ((i == 0 && lp->ls_corr > 0) ||
- lp->ls_corr > sp->lsis[i - 1].ls_corr);
- if (hit)
- while (i > 0 &&
- sp->lsis[i].ls_trans ==
- sp->lsis[i - 1].ls_trans + 1 &&
- sp->lsis[i].ls_corr ==
- sp->lsis[i - 1].ls_corr + 1) {
- ++hit;
- --i;
- }
- }
- corr = lp->ls_corr;
- break;
- }
- }
- y = EPOCH_YEAR;
- tdays = *timep / SECSPERDAY;
- rem = *timep - tdays * SECSPERDAY;
- while (tdays < 0 || tdays >= year_lengths[isleap(y)]) {
- int newy;
- register time_t tdelta;
- register int idelta;
- register int leapdays;
-
- tdelta = tdays / DAYSPERLYEAR;
- if (! ((! TYPE_SIGNED(time_t) || INT_MIN <= tdelta)
- && tdelta <= INT_MAX))
- return NULL;
- idelta = tdelta;
- if (idelta == 0)
- idelta = (tdays < 0) ? -1 : 1;
- newy = y;
- if (increment_overflow(&newy, idelta))
- return NULL;
- leapdays = leaps_thru_end_of(newy - 1) -
- leaps_thru_end_of(y - 1);
- tdays -= ((time_t) newy - y) * DAYSPERNYEAR;
- tdays -= leapdays;
- y = newy;
- }
- {
- register int_fast32_t seconds;
-
- seconds = tdays * SECSPERDAY;
- tdays = seconds / SECSPERDAY;
- rem += seconds - tdays * SECSPERDAY;
- }
- /*
- ** Given the range, we can now fearlessly cast...
- */
- idays = tdays;
- rem += offset - corr;
- while (rem < 0) {
- rem += SECSPERDAY;
- --idays;
- }
- while (rem >= SECSPERDAY) {
- rem -= SECSPERDAY;
- ++idays;
- }
- while (idays < 0) {
- if (increment_overflow(&y, -1))
- return NULL;
- idays += year_lengths[isleap(y)];
- }
- while (idays >= year_lengths[isleap(y)]) {
- idays -= year_lengths[isleap(y)];
- if (increment_overflow(&y, 1))
- return NULL;
- }
- tmp->tm_year = y;
- if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE))
- return NULL;
- tmp->tm_yday = idays;
- /*
- ** The "extra" mods below avoid overflow problems.
- */
- tmp->tm_wday = EPOCH_WDAY +
- ((y - EPOCH_YEAR) % DAYSPERWEEK) *
- (DAYSPERNYEAR % DAYSPERWEEK) +
- leaps_thru_end_of(y - 1) -
- leaps_thru_end_of(EPOCH_YEAR - 1) +
- idays;
- tmp->tm_wday %= DAYSPERWEEK;
- if (tmp->tm_wday < 0)
- tmp->tm_wday += DAYSPERWEEK;
- tmp->tm_hour = (int) (rem / SECSPERHOUR);
- rem %= SECSPERHOUR;
- tmp->tm_min = (int) (rem / SECSPERMIN);
- /*
- ** A positive leap second requires a special
- ** representation. This uses "... ??:59:60" et seq.
- */
- tmp->tm_sec = (int) (rem % SECSPERMIN) + hit;
- ip = mon_lengths[isleap(y)];
- for (tmp->tm_mon = 0; idays >= ip[tmp->tm_mon]; ++(tmp->tm_mon))
- idays -= ip[tmp->tm_mon];
- tmp->tm_mday = (int) (idays + 1);
- tmp->tm_isdst = 0;
+ register const struct lsinfo * lp;
+ register time_t tdays;
+ register int idays; /* unsigned would be so 2003 */
+ register int_fast64_t rem;
+ int y;
+ register const int * ip;
+ register int_fast64_t corr;
+ register bool hit;
+ register int i;
+
+ corr = 0;
+ hit = false;
+ i = (sp == NULL) ? 0 : sp->leapcnt;
+ while (--i >= 0) {
+ lp = &sp->lsis[i];
+ if (*timep >= lp->ls_trans) {
+ if (*timep == lp->ls_trans) {
+ hit = ((i == 0 && lp->ls_corr > 0) ||
+ lp->ls_corr > sp->lsis[i - 1].ls_corr);
+ if (hit)
+ while (i > 0 &&
+ sp->lsis[i].ls_trans ==
+ sp->lsis[i - 1].ls_trans + 1 &&
+ sp->lsis[i].ls_corr ==
+ sp->lsis[i - 1].ls_corr + 1) {
+ ++hit;
+ --i;
+ }
+ }
+ corr = lp->ls_corr;
+ break;
+ }
+ }
+ y = EPOCH_YEAR;
+ tdays = *timep / SECSPERDAY;
+ rem = *timep % SECSPERDAY;
+ while (tdays < 0 || tdays >= year_lengths[isleap(y)]) {
+ int newy;
+ register time_t tdelta;
+ register int idelta;
+ register int leapdays;
+
+ tdelta = tdays / DAYSPERLYEAR;
+ if (! ((! TYPE_SIGNED(time_t) || INT_MIN <= tdelta)
+ && tdelta <= INT_MAX))
+ goto out_of_range;
+ idelta = tdelta;
+ if (idelta == 0)
+ idelta = (tdays < 0) ? -1 : 1;
+ newy = y;
+ if (increment_overflow(&newy, idelta))
+ goto out_of_range;
+ leapdays = leaps_thru_end_of(newy - 1) -
+ leaps_thru_end_of(y - 1);
+ tdays -= ((time_t) newy - y) * DAYSPERNYEAR;
+ tdays -= leapdays;
+ y = newy;
+ }
+ /*
+ ** Given the range, we can now fearlessly cast...
+ */
+ idays = tdays;
+ rem += offset - corr;
+ while (rem < 0) {
+ rem += SECSPERDAY;
+ --idays;
+ }
+ while (rem >= SECSPERDAY) {
+ rem -= SECSPERDAY;
+ ++idays;
+ }
+ while (idays < 0) {
+ if (increment_overflow(&y, -1))
+ goto out_of_range;
+ idays += year_lengths[isleap(y)];
+ }
+ while (idays >= year_lengths[isleap(y)]) {
+ idays -= year_lengths[isleap(y)];
+ if (increment_overflow(&y, 1))
+ goto out_of_range;
+ }
+ tmp->tm_year = y;
+ if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE))
+ goto out_of_range;
+ tmp->tm_yday = idays;
+ /*
+ ** The "extra" mods below avoid overflow problems.
+ */
+ tmp->tm_wday = EPOCH_WDAY +
+ ((y - EPOCH_YEAR) % DAYSPERWEEK) *
+ (DAYSPERNYEAR % DAYSPERWEEK) +
+ leaps_thru_end_of(y - 1) -
+ leaps_thru_end_of(EPOCH_YEAR - 1) +
+ idays;
+ tmp->tm_wday %= DAYSPERWEEK;
+ if (tmp->tm_wday < 0)
+ tmp->tm_wday += DAYSPERWEEK;
+ tmp->tm_hour = (int) (rem / SECSPERHOUR);
+ rem %= SECSPERHOUR;
+ tmp->tm_min = (int) (rem / SECSPERMIN);
+ /*
+ ** A positive leap second requires a special
+ ** representation. This uses "... ??:59:60" et seq.
+ */
+ tmp->tm_sec = (int) (rem % SECSPERMIN) + hit;
+ ip = mon_lengths[isleap(y)];
+ for (tmp->tm_mon = 0; idays >= ip[tmp->tm_mon]; ++(tmp->tm_mon))
+ idays -= ip[tmp->tm_mon];
+ tmp->tm_mday = (int) (idays + 1);
+ tmp->tm_isdst = 0;
#ifdef TM_GMTOFF
- tmp->TM_GMTOFF = offset;
+ tmp->TM_GMTOFF = offset;
#endif /* defined TM_GMTOFF */
- return tmp;
+ return tmp;
+
+ out_of_range:
+ errno = EOVERFLOW;
+ return NULL;
}
char *
-ctime(const time_t * const timep)
+ctime(const time_t *timep)
{
/*
** Section 4.12.3.2 of X3.159-1989 requires that
-** The ctime function converts the calendar time pointed to by timer
-** to local time in the form of a string. It is equivalent to
-** asctime(localtime(timer))
+** The ctime function converts the calendar time pointed to by timer
+** to local time in the form of a string. It is equivalent to
+** asctime(localtime(timer))
*/
- return asctime(localtime(timep));
+ struct tm *tmp = localtime(timep);
+ return tmp ? asctime(tmp) : NULL;
}
char *
-ctime_r(const time_t * const timep, char * buf)
+ctime_r(const time_t *timep, char *buf)
{
- struct tm mytm;
-
- return asctime_r(localtime_r(timep, &mytm), buf);
+ struct tm mytm;
+ struct tm *tmp = localtime_r(timep, &mytm);
+ return tmp ? asctime_r(tmp, buf) : NULL;
}
/*
** Adapted from code provided by Robert Elz, who writes:
-** The "best" way to do mktime I think is based on an idea of Bob
-** Kridle's (so its said...) from a long time ago.
-** It does a binary search of the time_t space. Since time_t's are
-** just 32 bits, its a max of 32 iterations (even at 64 bits it
-** would still be very reasonable).
+** The "best" way to do mktime I think is based on an idea of Bob
+** Kridle's (so its said...) from a long time ago.
+** It does a binary search of the time_t space. Since time_t's are
+** just 32 bits, its a max of 32 iterations (even at 64 bits it
+** would still be very reasonable).
*/
#ifndef WRONG
-#define WRONG (-1)
+#define WRONG (-1)
#endif /* !defined WRONG */
/*
** Normalize logic courtesy Paul Eggert.
*/
-static int
-increment_overflow(int *const ip, int j)
+static bool
+increment_overflow(int *ip, int j)
{
- register int const i = *ip;
-
- /*
- ** If i >= 0 there can only be overflow if i + j > INT_MAX
- ** or if j > INT_MAX - i; given i >= 0, INT_MAX - i cannot overflow.
- ** If i < 0 there can only be overflow if i + j < INT_MIN
- ** or if j < INT_MIN - i; given i < 0, INT_MIN - i cannot overflow.
- */
- if ((i >= 0) ? (j > INT_MAX - i) : (j < INT_MIN - i))
- return TRUE;
- *ip += j;
- return FALSE;
+ register int const i = *ip;
+
+ /*
+ ** If i >= 0 there can only be overflow if i + j > INT_MAX
+ ** or if j > INT_MAX - i; given i >= 0, INT_MAX - i cannot overflow.
+ ** If i < 0 there can only be overflow if i + j < INT_MIN
+ ** or if j < INT_MIN - i; given i < 0, INT_MIN - i cannot overflow.
+ */
+ if ((i >= 0) ? (j > INT_MAX - i) : (j < INT_MIN - i))
+ return true;
+ *ip += j;
+ return false;
}
-static int
+static bool
increment_overflow32(int_fast32_t *const lp, int const m)
{
- register int_fast32_t const l = *lp;
+ register int_fast32_t const l = *lp;
- if ((l >= 0) ? (m > INT_FAST32_MAX - l) : (m < INT_FAST32_MIN - l))
- return TRUE;
- *lp += m;
- return FALSE;
+ if ((l >= 0) ? (m > INT_FAST32_MAX - l) : (m < INT_FAST32_MIN - l))
+ return true;
+ *lp += m;
+ return false;
}
-static int
+static bool
increment_overflow_time(time_t *tp, int_fast32_t j)
{
- /*
- ** This is like
- ** 'if (! (time_t_min <= *tp + j && *tp + j <= time_t_max)) ...',
- ** except that it does the right thing even if *tp + j would overflow.
- */
- if (! (j < 0
- ? (TYPE_SIGNED(time_t) ? time_t_min - j <= *tp : -1 - j < *tp)
- : *tp <= time_t_max - j))
- return TRUE;
- *tp += j;
- return FALSE;
+ /*
+ ** This is like
+ ** 'if (! (time_t_min <= *tp + j && *tp + j <= time_t_max)) ...',
+ ** except that it does the right thing even if *tp + j would overflow.
+ */
+ if (! (j < 0
+ ? (TYPE_SIGNED(time_t) ? time_t_min - j <= *tp : -1 - j < *tp)
+ : *tp <= time_t_max - j))
+ return true;
+ *tp += j;
+ return false;
}
-static int
+static bool
normalize_overflow(int *const tensptr, int *const unitsptr, const int base)
{
- register int tensdelta;
+ register int tensdelta;
- tensdelta = (*unitsptr >= 0) ?
- (*unitsptr / base) :
- (-1 - (-1 - *unitsptr) / base);
- *unitsptr -= tensdelta * base;
- return increment_overflow(tensptr, tensdelta);
+ tensdelta = (*unitsptr >= 0) ?
+ (*unitsptr / base) :
+ (-1 - (-1 - *unitsptr) / base);
+ *unitsptr -= tensdelta * base;
+ return increment_overflow(tensptr, tensdelta);
}
-static int
-normalize_overflow32(int_fast32_t *const tensptr, int *const unitsptr,
- const int base)
+static bool
+normalize_overflow32(int_fast32_t *tensptr, int *unitsptr, int base)
{
- register int tensdelta;
+ register int tensdelta;
- tensdelta = (*unitsptr >= 0) ?
- (*unitsptr / base) :
- (-1 - (-1 - *unitsptr) / base);
- *unitsptr -= tensdelta * base;
- return increment_overflow32(tensptr, tensdelta);
+ tensdelta = (*unitsptr >= 0) ?
+ (*unitsptr / base) :
+ (-1 - (-1 - *unitsptr) / base);
+ *unitsptr -= tensdelta * base;
+ return increment_overflow32(tensptr, tensdelta);
}
static int
-tmcomp(register const struct tm * const atmp,
- register const struct tm * const btmp)
+tmcomp(register const struct tm *const atmp,
+ register const struct tm *const btmp)
{
- register int result;
-
- if (atmp->tm_year != btmp->tm_year)
- return atmp->tm_year < btmp->tm_year ? -1 : 1;
- if ((result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
- (result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
- (result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
- (result = (atmp->tm_min - btmp->tm_min)) == 0)
- result = atmp->tm_sec - btmp->tm_sec;
- return result;
+ register int result;
+
+ if (atmp->tm_year != btmp->tm_year)
+ return atmp->tm_year < btmp->tm_year ? -1 : 1;
+ if ((result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
+ (result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
+ (result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
+ (result = (atmp->tm_min - btmp->tm_min)) == 0)
+ result = atmp->tm_sec - btmp->tm_sec;
+ return result;
}
static time_t
-time2sub(struct tm * const tmp,
- struct tm *(*const funcp)(const time_t*, int_fast32_t, struct tm*, struct state*),
- const int_fast32_t offset,
- int * const okayp,
- const int do_norm_secs, struct state * sp) // android-changed: added sp
+time2sub(struct tm *const tmp,
+ struct tm *(*funcp)(struct state const *, time_t const *,
+ int_fast32_t, struct tm *),
+ struct state const *sp,
+ const int_fast32_t offset,
+ bool *okayp,
+ bool do_norm_secs)
{
- register int dir;
- register int i, j;
- register int saved_seconds;
- register int_fast32_t li;
- register time_t lo;
- register time_t hi;
- int_fast32_t y;
- time_t newt;
- time_t t;
- struct tm yourtm, mytm;
-
- *okayp = FALSE;
- yourtm = *tmp;
- if (do_norm_secs) {
- if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec,
- SECSPERMIN))
- return WRONG;
- }
- if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR))
- return WRONG;
- if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY))
- return WRONG;
- y = yourtm.tm_year;
- if (normalize_overflow32(&y, &yourtm.tm_mon, MONSPERYEAR))
- return WRONG;
- /*
- ** Turn y into an actual year number for now.
- ** It is converted back to an offset from TM_YEAR_BASE later.
- */
- if (increment_overflow32(&y, TM_YEAR_BASE))
- return WRONG;
- while (yourtm.tm_mday <= 0) {
- if (increment_overflow32(&y, -1))
- return WRONG;
- li = y + (1 < yourtm.tm_mon);
- yourtm.tm_mday += year_lengths[isleap(li)];
- }
- while (yourtm.tm_mday > DAYSPERLYEAR) {
- li = y + (1 < yourtm.tm_mon);
- yourtm.tm_mday -= year_lengths[isleap(li)];
- if (increment_overflow32(&y, 1))
- return WRONG;
- }
- for ( ; ; ) {
- i = mon_lengths[isleap(y)][yourtm.tm_mon];
- if (yourtm.tm_mday <= i)
- break;
- yourtm.tm_mday -= i;
- if (++yourtm.tm_mon >= MONSPERYEAR) {
- yourtm.tm_mon = 0;
- if (increment_overflow32(&y, 1))
- return WRONG;
- }
- }
- if (increment_overflow32(&y, -TM_YEAR_BASE))
- return WRONG;
- yourtm.tm_year = y;
- if (yourtm.tm_year != y)
- return WRONG;
- if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN)
- saved_seconds = 0;
- else if (y + TM_YEAR_BASE < EPOCH_YEAR) {
- /*
- ** We can't set tm_sec to 0, because that might push the
- ** time below the minimum representable time.
- ** Set tm_sec to 59 instead.
- ** This assumes that the minimum representable time is
- ** not in the same minute that a leap second was deleted from,
- ** which is a safer assumption than using 58 would be.
- */
- if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN))
- return WRONG;
- saved_seconds = yourtm.tm_sec;
- yourtm.tm_sec = SECSPERMIN - 1;
- } else {
- saved_seconds = yourtm.tm_sec;
- yourtm.tm_sec = 0;
- }
- /*
- ** Do a binary search (this works whatever time_t's type is).
- */
- if (!TYPE_SIGNED(time_t)) {
- lo = 0;
- hi = lo - 1;
- } else {
- lo = 1;
- for (i = 0; i < (int) TYPE_BIT(time_t) - 1; ++i)
- lo *= 2;
- hi = -(lo + 1);
- }
- for ( ; ; ) {
- t = lo / 2 + hi / 2;
- if (t < lo)
- t = lo;
- else if (t > hi)
- t = hi;
- if ((*funcp)(&t, offset, &mytm, sp) == NULL) { // android-changed: added sp.
- /*
- ** Assume that t is too extreme to be represented in
- ** a struct tm; arrange things so that it is less
- ** extreme on the next pass.
- */
- dir = (t > 0) ? 1 : -1;
- } else dir = tmcomp(&mytm, &yourtm);
- if (dir != 0) {
- if (t == lo) {
- if (t == time_t_max)
- return WRONG;
- ++t;
- ++lo;
- } else if (t == hi) {
- if (t == time_t_min)
- return WRONG;
- --t;
- --hi;
- }
- if (lo > hi)
- return WRONG;
- if (dir > 0)
- hi = t;
- else lo = t;
- continue;
- }
- if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)
- break;
- /*
- ** Right time, wrong type.
- ** Hunt for right time, right type.
- ** It's okay to guess wrong since the guess
- ** gets checked.
- */
- // BEGIN android-changed: support user-supplied sp
- if (sp == NULL) {
- sp = (struct state *)
- ((funcp == localsub) ? lclptr : gmtptr);
- }
- // END android-changed
- if (sp == NULL)
- return WRONG;
- for (i = sp->typecnt - 1; i >= 0; --i) {
- if (sp->ttis[i].tt_isdst != yourtm.tm_isdst)
- continue;
- for (j = sp->typecnt - 1; j >= 0; --j) {
- if (sp->ttis[j].tt_isdst == yourtm.tm_isdst)
- continue;
- newt = t + sp->ttis[j].tt_gmtoff -
- sp->ttis[i].tt_gmtoff;
- if ((*funcp)(&newt, offset, &mytm, sp) == NULL) // android-changed: added sp.
- continue;
- if (tmcomp(&mytm, &yourtm) != 0)
- continue;
- if (mytm.tm_isdst != yourtm.tm_isdst)
- continue;
- /*
- ** We have a match.
- */
- t = newt;
- goto label;
- }
- }
- return WRONG;
- }
+ register int dir;
+ register int i, j;
+ register int saved_seconds;
+ register int_fast32_t li;
+ register time_t lo;
+ register time_t hi;
+ int_fast32_t y;
+ time_t newt;
+ time_t t;
+ struct tm yourtm, mytm;
+
+ *okayp = false;
+ yourtm = *tmp;
+ if (do_norm_secs) {
+ if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec,
+ SECSPERMIN))
+ return WRONG;
+ }
+ if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR))
+ return WRONG;
+ if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY))
+ return WRONG;
+ y = yourtm.tm_year;
+ if (normalize_overflow32(&y, &yourtm.tm_mon, MONSPERYEAR))
+ return WRONG;
+ /*
+ ** Turn y into an actual year number for now.
+ ** It is converted back to an offset from TM_YEAR_BASE later.
+ */
+ if (increment_overflow32(&y, TM_YEAR_BASE))
+ return WRONG;
+ while (yourtm.tm_mday <= 0) {
+ if (increment_overflow32(&y, -1))
+ return WRONG;
+ li = y + (1 < yourtm.tm_mon);
+ yourtm.tm_mday += year_lengths[isleap(li)];
+ }
+ while (yourtm.tm_mday > DAYSPERLYEAR) {
+ li = y + (1 < yourtm.tm_mon);
+ yourtm.tm_mday -= year_lengths[isleap(li)];
+ if (increment_overflow32(&y, 1))
+ return WRONG;
+ }
+ for ( ; ; ) {
+ i = mon_lengths[isleap(y)][yourtm.tm_mon];
+ if (yourtm.tm_mday <= i)
+ break;
+ yourtm.tm_mday -= i;
+ if (++yourtm.tm_mon >= MONSPERYEAR) {
+ yourtm.tm_mon = 0;
+ if (increment_overflow32(&y, 1))
+ return WRONG;
+ }
+ }
+ if (increment_overflow32(&y, -TM_YEAR_BASE))
+ return WRONG;
+ if (! (INT_MIN <= y && y <= INT_MAX))
+ return WRONG;
+ yourtm.tm_year = y;
+ if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN)
+ saved_seconds = 0;
+ else if (y + TM_YEAR_BASE < EPOCH_YEAR) {
+ /*
+ ** We can't set tm_sec to 0, because that might push the
+ ** time below the minimum representable time.
+ ** Set tm_sec to 59 instead.
+ ** This assumes that the minimum representable time is
+ ** not in the same minute that a leap second was deleted from,
+ ** which is a safer assumption than using 58 would be.
+ */
+ if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN))
+ return WRONG;
+ saved_seconds = yourtm.tm_sec;
+ yourtm.tm_sec = SECSPERMIN - 1;
+ } else {
+ saved_seconds = yourtm.tm_sec;
+ yourtm.tm_sec = 0;
+ }
+ /*
+ ** Do a binary search (this works whatever time_t's type is).
+ */
+ lo = time_t_min;
+ hi = time_t_max;
+ for ( ; ; ) {
+ t = lo / 2 + hi / 2;
+ if (t < lo)
+ t = lo;
+ else if (t > hi)
+ t = hi;
+ if (! funcp(sp, &t, offset, &mytm)) {
+ /*
+ ** Assume that t is too extreme to be represented in
+ ** a struct tm; arrange things so that it is less
+ ** extreme on the next pass.
+ */
+ dir = (t > 0) ? 1 : -1;
+ } else dir = tmcomp(&mytm, &yourtm);
+ if (dir != 0) {
+ if (t == lo) {
+ if (t == time_t_max)
+ return WRONG;
+ ++t;
+ ++lo;
+ } else if (t == hi) {
+ if (t == time_t_min)
+ return WRONG;
+ --t;
+ --hi;
+ }
+ if (lo > hi)
+ return WRONG;
+ if (dir > 0)
+ hi = t;
+ else lo = t;
+ continue;
+ }
+#if defined TM_GMTOFF && ! UNINIT_TRAP
+ if (mytm.TM_GMTOFF != yourtm.TM_GMTOFF
+ && (yourtm.TM_GMTOFF < 0
+ ? (-SECSPERDAY <= yourtm.TM_GMTOFF
+ && (mytm.TM_GMTOFF <=
+ (SMALLEST (INT_FAST32_MAX, LONG_MAX)
+ + yourtm.TM_GMTOFF)))
+ : (yourtm.TM_GMTOFF <= SECSPERDAY
+ && ((BIGGEST (INT_FAST32_MIN, LONG_MIN)
+ + yourtm.TM_GMTOFF)
+ <= mytm.TM_GMTOFF)))) {
+ /* MYTM matches YOURTM except with the wrong UTC offset.
+ YOURTM.TM_GMTOFF is plausible, so try it instead.
+ It's OK if YOURTM.TM_GMTOFF contains uninitialized data,
+ since the guess gets checked. */
+ time_t altt = t;
+ int_fast32_t diff = mytm.TM_GMTOFF - yourtm.TM_GMTOFF;
+ if (!increment_overflow_time(&altt, diff)) {
+ struct tm alttm;
+ if (funcp(sp, &altt, offset, &alttm)
+ && alttm.tm_isdst == mytm.tm_isdst
+ && alttm.TM_GMTOFF == yourtm.TM_GMTOFF
+ && tmcomp(&alttm, &yourtm) == 0) {
+ t = altt;
+ mytm = alttm;
+ }
+ }
+ }
+#endif
+ if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)
+ break;
+ /*
+ ** Right time, wrong type.
+ ** Hunt for right time, right type.
+ ** It's okay to guess wrong since the guess
+ ** gets checked.
+ */
+ if (sp == NULL)
+ return WRONG;
+ for (i = sp->typecnt - 1; i >= 0; --i) {
+ if (sp->ttis[i].tt_isdst != yourtm.tm_isdst)
+ continue;
+ for (j = sp->typecnt - 1; j >= 0; --j) {
+ if (sp->ttis[j].tt_isdst == yourtm.tm_isdst)
+ continue;
+ newt = t + sp->ttis[j].tt_gmtoff -
+ sp->ttis[i].tt_gmtoff;
+ if (! funcp(sp, &newt, offset, &mytm))
+ continue;
+ if (tmcomp(&mytm, &yourtm) != 0)
+ continue;
+ if (mytm.tm_isdst != yourtm.tm_isdst)
+ continue;
+ /*
+ ** We have a match.
+ */
+ t = newt;
+ goto label;
+ }
+ }
+ return WRONG;
+ }
label:
- newt = t + saved_seconds;
- if ((newt < t) != (saved_seconds < 0))
- return WRONG;
- t = newt;
- if ((*funcp)(&t, offset, tmp, sp)) // android-changed: added sp.
- *okayp = TRUE;
- return t;
+ newt = t + saved_seconds;
+ if ((newt < t) != (saved_seconds < 0))
+ return WRONG;
+ t = newt;
+ if (funcp(sp, &t, offset, tmp))
+ *okayp = true;
+ return t;
}
static time_t
-time2(struct tm * const tmp,
- struct tm * (*const funcp)(const time_t *, int_fast32_t, struct tm *, struct state *), // android-changed: added sp.
+time2(struct tm * const tmp,
+ struct tm *(*funcp)(struct state const *, time_t const *,
+ int_fast32_t, struct tm *),
+ struct state const *sp,
const int_fast32_t offset,
- int *const okayp, struct state* sp) // android-changed: added sp.
+ bool *okayp)
{
- time_t t;
-
- /*
- ** First try without normalization of seconds
- ** (in case tm_sec contains a value associated with a leap second).
- ** If that fails, try with normalization of seconds.
- */
- t = time2sub(tmp, funcp, offset, okayp, FALSE, sp);
- return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE, sp);
+ time_t t;
+
+ /*
+ ** First try without normalization of seconds
+ ** (in case tm_sec contains a value associated with a leap second).
+ ** If that fails, try with normalization of seconds.
+ */
+ t = time2sub(tmp, funcp, sp, offset, okayp, false);
+ return *okayp ? t : time2sub(tmp, funcp, sp, offset, okayp, true);
}
static time_t
-time1(struct tm * const tmp,
- struct tm * (* const funcp) (const time_t *, int_fast32_t, struct tm *, struct state *), // android-changed: added sp.
- const int_fast32_t offset, struct state * sp) // android-changed: added sp.
+time1(struct tm *const tmp,
+ struct tm *(*funcp) (struct state const *, time_t const *,
+ int_fast32_t, struct tm *),
+ struct state const *sp,
+ const int_fast32_t offset)
{
- register time_t t;
- register int samei, otheri;
- register int sameind, otherind;
- register int i;
- register int nseen;
- char seen[TZ_MAX_TYPES];
- unsigned char types[TZ_MAX_TYPES];
- int okay;
-
- if (tmp == NULL) {
- errno = EINVAL;
- return WRONG;
- }
- if (tmp->tm_isdst > 1)
- tmp->tm_isdst = 1;
- t = time2(tmp, funcp, offset, &okay, sp); // android-changed: added sp.
- if (okay)
- return t;
- if (tmp->tm_isdst < 0)
+ register time_t t;
+ register int samei, otheri;
+ register int sameind, otherind;
+ register int i;
+ register int nseen;
+ char seen[TZ_MAX_TYPES];
+ unsigned char types[TZ_MAX_TYPES];
+ bool okay;
+
+ if (tmp == NULL) {
+ errno = EINVAL;
+ return WRONG;
+ }
+ if (tmp->tm_isdst > 1)
+ tmp->tm_isdst = 1;
+ t = time2(tmp, funcp, sp, offset, &okay);
+ if (okay)
+ return t;
+ if (tmp->tm_isdst < 0)
#ifdef PCTS
- /*
- ** POSIX Conformance Test Suite code courtesy Grant Sullivan.
- */
- tmp->tm_isdst = 0; /* reset to std and try again */
+ /*
+ ** POSIX Conformance Test Suite code courtesy Grant Sullivan.
+ */
+ tmp->tm_isdst = 0; /* reset to std and try again */
#else
- return t;
+ return t;
#endif /* !defined PCTS */
- /*
- ** We're supposed to assume that somebody took a time of one type
- ** and did some math on it that yielded a "struct tm" that's bad.
- ** We try to divine the type they started from and adjust to the
- ** type they need.
- */
- // BEGIN android-changed: support user-supplied sp.
- if (sp == NULL) {
- sp = (struct state *) ((funcp == localsub) ? lclptr : gmtptr);
- }
- // BEGIN android-changed
- if (sp == NULL)
- return WRONG;
- for (i = 0; i < sp->typecnt; ++i)
- seen[i] = FALSE;
- nseen = 0;
- for (i = sp->timecnt - 1; i >= 0; --i)
- if (!seen[sp->types[i]]) {
- seen[sp->types[i]] = TRUE;
- types[nseen++] = sp->types[i];
- }
- for (sameind = 0; sameind < nseen; ++sameind) {
- samei = types[sameind];
- if (sp->ttis[samei].tt_isdst != tmp->tm_isdst)
- continue;
- for (otherind = 0; otherind < nseen; ++otherind) {
- otheri = types[otherind];
- if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst)
- continue;
- tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
- sp->ttis[samei].tt_gmtoff;
- tmp->tm_isdst = !tmp->tm_isdst;
- t = time2(tmp, funcp, offset, &okay, sp); // android-changed: added sp.
- if (okay)
- return t;
- tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
- sp->ttis[samei].tt_gmtoff;
- tmp->tm_isdst = !tmp->tm_isdst;
- }
- }
- return WRONG;
+ /*
+ ** We're supposed to assume that somebody took a time of one type
+ ** and did some math on it that yielded a "struct tm" that's bad.
+ ** We try to divine the type they started from and adjust to the
+ ** type they need.
+ */
+ if (sp == NULL)
+ return WRONG;
+ for (i = 0; i < sp->typecnt; ++i)
+ seen[i] = false;
+ nseen = 0;
+ for (i = sp->timecnt - 1; i >= 0; --i)
+ if (!seen[sp->types[i]]) {
+ seen[sp->types[i]] = true;
+ types[nseen++] = sp->types[i];
+ }
+ for (sameind = 0; sameind < nseen; ++sameind) {
+ samei = types[sameind];
+ if (sp->ttis[samei].tt_isdst != tmp->tm_isdst)
+ continue;
+ for (otherind = 0; otherind < nseen; ++otherind) {
+ otheri = types[otherind];
+ if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst)
+ continue;
+ tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
+ sp->ttis[samei].tt_gmtoff;
+ tmp->tm_isdst = !tmp->tm_isdst;
+ t = time2(tmp, funcp, sp, offset, &okay);
+ if (okay)
+ return t;
+ tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
+ sp->ttis[samei].tt_gmtoff;
+ tmp->tm_isdst = !tmp->tm_isdst;
+ }
+ }
+ return WRONG;
}
-time_t
-mktime(struct tm * const tmp)
+static time_t
+mktime_tzname(struct state *sp, struct tm *tmp, bool setname)
{
- _tzLock();
- tzset_locked();
- time_t result = time1(tmp, localsub, 0L, NULL); // android-changed: extra parameter.
- _tzUnlock();
- return result;
+ if (sp)
+ return time1(tmp, localsub, sp, setname);
+ else {
+ gmtcheck();
+ return time1(tmp, gmtsub, gmtptr, 0);
+ }
}
-#ifdef STD_INSPIRED
+#if NETBSD_INSPIRED
time_t
-timelocal(struct tm * const tmp)
+mktime_z(struct state *sp, struct tm *tmp)
{
- if (tmp != NULL)
- tmp->tm_isdst = -1; /* in case it wasn't initialized */
- return mktime(tmp);
+ return mktime_tzname(sp, tmp, false);
}
+#endif
+
time_t
-timegm(struct tm * const tmp)
+mktime(struct tm *tmp)
{
- time_t result;
+ time_t t;
+ int err = lock();
+ if (err) {
+ errno = err;
+ return -1;
+ }
+ tzset_unlocked();
+ t = mktime_tzname(lclptr, tmp, true);
+ unlock();
+ return t;
+}
- if (tmp != NULL)
- tmp->tm_isdst = 0;
- _tzLock();
- result = time1(tmp, gmtsub, 0L, NULL); // android-changed: extra parameter.
- _tzUnlock();
+#ifdef STD_INSPIRED
- return result;
+time_t
+timelocal(struct tm *tmp)
+{
+ if (tmp != NULL)
+ tmp->tm_isdst = -1; /* in case it wasn't initialized */
+ return mktime(tmp);
}
time_t
-timeoff(struct tm *const tmp, const long offset)
+timegm(struct tm *tmp)
{
- if (tmp != NULL)
- tmp->tm_isdst = 0;
- return time1(tmp, gmtsub, offset, NULL); // android-changed: extra parameter.
+ return timeoff(tmp, 0);
}
-#endif /* defined STD_INSPIRED */
-
-#ifdef CMUCS
-
-/*
-** The following is supplied for compatibility with
-** previous versions of the CMUCS runtime library.
-*/
-
-long
-gtime(struct tm * const tmp)
+time_t
+timeoff(struct tm *tmp, long offset)
{
- const time_t t = mktime(tmp);
-
- if (t == WRONG)
- return -1;
- return t;
+ if (tmp)
+ tmp->tm_isdst = 0;
+ gmtcheck();
+ return time1(tmp, gmtsub, gmtptr, offset);
}
-#endif /* defined CMUCS */
+#endif /* defined STD_INSPIRED */
/*
** XXX--is the below the right way to conditionalize??
@@ -2059,64 +2218,105 @@ gtime(struct tm * const tmp)
*/
static int_fast64_t
-leapcorr(time_t * timep)
+leapcorr(struct state const *sp, time_t t)
{
- register struct state * sp;
- register struct lsinfo * lp;
- register int i;
-
- sp = lclptr;
- i = sp->leapcnt;
- while (--i >= 0) {
- lp = &sp->lsis[i];
- if (*timep >= lp->ls_trans)
- return lp->ls_corr;
- }
- return 0;
+ register struct lsinfo const * lp;
+ register int i;
+
+ i = sp->leapcnt;
+ while (--i >= 0) {
+ lp = &sp->lsis[i];
+ if (t >= lp->ls_trans)
+ return lp->ls_corr;
+ }
+ return 0;
+}
+
+NETBSD_INSPIRED_EXTERN time_t ATTRIBUTE_PURE
+time2posix_z(struct state *sp, time_t t)
+{
+ return t - leapcorr(sp, t);
}
time_t
time2posix(time_t t)
{
- tzset();
- return t - leapcorr(&t);
+ int err = lock();
+ if (err) {
+ errno = err;
+ return -1;
+ }
+ if (!lcl_is_set)
+ tzset_unlocked();
+ if (lclptr)
+ t = time2posix_z(lclptr, t);
+ unlock();
+ return t;
+}
+
+NETBSD_INSPIRED_EXTERN time_t ATTRIBUTE_PURE
+posix2time_z(struct state *sp, time_t t)
+{
+ time_t x;
+ time_t y;
+ /*
+ ** For a positive leap second hit, the result
+ ** is not unique. For a negative leap second
+ ** hit, the corresponding time doesn't exist,
+ ** so we return an adjacent second.
+ */
+ x = t + leapcorr(sp, t);
+ y = x - leapcorr(sp, x);
+ if (y < t) {
+ do {
+ x++;
+ y = x - leapcorr(sp, x);
+ } while (y < t);
+ x -= y != t;
+ } else if (y > t) {
+ do {
+ --x;
+ y = x - leapcorr(sp, x);
+ } while (y > t);
+ x += y != t;
+ }
+ return x;
}
time_t
posix2time(time_t t)
{
- time_t x;
- time_t y;
-
- tzset();
- /*
- ** For a positive leap second hit, the result
- ** is not unique. For a negative leap second
- ** hit, the corresponding time doesn't exist,
- ** so we return an adjacent second.
- */
- x = t + leapcorr(&t);
- y = x - leapcorr(&x);
- if (y < t) {
- do {
- x++;
- y = x - leapcorr(&x);
- } while (y < t);
- if (t != y)
- return x - 1;
- } else if (y > t) {
- do {
- --x;
- y = x - leapcorr(&x);
- } while (y > t);
- if (t != y)
- return x + 1;
- }
- return x;
+ int err = lock();
+ if (err) {
+ errno = err;
+ return -1;
+ }
+ if (!lcl_is_set)
+ tzset_unlocked();
+ if (lclptr)
+ t = posix2time_z(lclptr, t);
+ unlock();
+ return t;
}
#endif /* defined STD_INSPIRED */
+#ifdef time_tz
+
+/* Convert from the underlying system's time_t to the ersatz time_tz,
+ which is called 'time_t' in this file. */
+
+time_t
+time(time_t *p)
+{
+ time_t r = sys_time(0);
+ if (p)
+ *p = r;
+ return r;
+}
+
+#endif
+
// BEGIN android-added
#include <assert.h>
@@ -2124,7 +2324,7 @@ posix2time(time_t t)
#include <arpa/inet.h> // For ntohl(3).
static int __bionic_open_tzdata_path(const char* path_prefix_variable, const char* path_suffix,
- const char* olson_id, int* data_size) {
+ const char* olson_id) {
const char* path_prefix = getenv(path_prefix_variable);
if (path_prefix == NULL) {
fprintf(stderr, "%s: %s not set!\n", __FUNCTION__, path_prefix_variable);
@@ -2139,7 +2339,6 @@ static int __bionic_open_tzdata_path(const char* path_prefix_variable, const cha
snprintf(path, path_length, "%s/%s", path_prefix, path_suffix);
int fd = TEMP_FAILURE_RETRY(open(path, OPEN_MODE));
if (fd == -1) {
- XLOG(("%s: could not open \"%s\": %s\n", __FUNCTION__, path, strerror(errno)));
free(path);
return -2; // Distinguish failure to find any data from failure to find a specific id.
}
@@ -2223,7 +2422,6 @@ static int __bionic_open_tzdata_path(const char* path_prefix_variable, const cha
if (strcmp(this_id, olson_id) == 0) {
specific_zone_offset = ntohl(entry->start) + ntohl(header.data_offset);
- *data_size = ntohl(entry->length);
break;
}
@@ -2232,7 +2430,6 @@ static int __bionic_open_tzdata_path(const char* path_prefix_variable, const cha
free(index);
if (specific_zone_offset == -1) {
- XLOG(("%s: couldn't find zone \"%s\"\n", __FUNCTION__, olson_id));
free(path);
close(fd);
return -1;
@@ -2252,10 +2449,10 @@ static int __bionic_open_tzdata_path(const char* path_prefix_variable, const cha
return fd;
}
-static int __bionic_open_tzdata(const char* olson_id, int* data_size) {
- int fd = __bionic_open_tzdata_path("ANDROID_DATA", "/misc/zoneinfo/current/tzdata", olson_id, data_size);
+static int __bionic_open_tzdata(const char* olson_id) {
+ int fd = __bionic_open_tzdata_path("ANDROID_DATA", "/misc/zoneinfo/current/tzdata", olson_id);
if (fd < 0) {
- fd = __bionic_open_tzdata_path("ANDROID_ROOT", "/usr/share/zoneinfo/tzdata", olson_id, data_size);
+ fd = __bionic_open_tzdata_path("ANDROID_ROOT", "/usr/share/zoneinfo/tzdata", olson_id);
if (fd == -2) {
// The first thing that 'recovery' does is try to format the current time. It doesn't have
// any tzdata available, so we must not abort here --- doing so breaks the recovery image!
@@ -2265,50 +2462,4 @@ static int __bionic_open_tzdata(const char* olson_id, int* data_size) {
return fd;
}
-// Caches the most recent timezone (http://b/8270865).
-static int __bionic_tzload_cached(const char* name, struct state* const sp, const int doextend) {
- _tzLock();
-
- // Our single-item cache.
- static char* g_cached_time_zone_name;
- static struct state g_cached_time_zone;
-
- // Do we already have this timezone cached?
- if (g_cached_time_zone_name != NULL && strcmp(name, g_cached_time_zone_name) == 0) {
- *sp = g_cached_time_zone;
- _tzUnlock();
- return 0;
- }
-
- // Can we load it?
- int rc = tzload(name, sp, doextend);
- if (rc == 0) {
- // Update the cache.
- free(g_cached_time_zone_name);
- g_cached_time_zone_name = strdup(name);
- g_cached_time_zone = *sp;
- }
-
- _tzUnlock();
- return rc;
-}
-
-// Non-standard API: mktime(3) but with an explicit timezone parameter.
-// This can't actually be hidden/removed until we fix MtpUtils.cpp
-__attribute__((visibility("default"))) time_t mktime_tz(struct tm* const tmp, const char* tz) {
- struct state* st = malloc(sizeof(*st));
- time_t return_value;
-
- if (st == NULL)
- return 0;
- if (__bionic_tzload_cached(tz, st, TRUE) != 0) {
- // TODO: not sure what's best here, but for now, we fall back to gmt.
- gmtload(st);
- }
-
- return_value = time1(tmp, localsub, 0L, st);
- free(st);
- return return_value;
-}
-
// END android-added
diff --git a/libc/tzcode/private.h b/libc/tzcode/private.h
index c30c71101..1c176e62b 100644
--- a/libc/tzcode/private.h
+++ b/libc/tzcode/private.h
@@ -19,13 +19,9 @@
/*
** Defaults for preprocessor symbols.
-** You can override these in your C compiler options, e.g. '-DHAVE_ADJTIME=0'.
+** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
*/
-#ifndef HAVE_ADJTIME
-#define HAVE_ADJTIME 1
-#endif /* !defined HAVE_ADJTIME */
-
#ifndef HAVE_GETTEXT
#define HAVE_GETTEXT 0
#endif /* !defined HAVE_GETTEXT */
@@ -38,9 +34,9 @@
#define HAVE_LINK 1
#endif /* !defined HAVE_LINK */
-#ifndef HAVE_SETTIMEOFDAY
-#define HAVE_SETTIMEOFDAY 3
-#endif /* !defined HAVE_SETTIMEOFDAY */
+#ifndef HAVE_STRDUP
+#define HAVE_STRDUP 1
+#endif
#ifndef HAVE_SYMLINK
#define HAVE_SYMLINK 1
@@ -59,32 +55,61 @@
#endif /* !defined HAVE_UNISTD_H */
#ifndef HAVE_UTMPX_H
-#define HAVE_UTMPX_H 0
+#define HAVE_UTMPX_H 1
#endif /* !defined HAVE_UTMPX_H */
-#if !defined(__ANDROID__)
-#ifndef LOCALE_HOME
-#define LOCALE_HOME "/usr/lib/locale"
-#endif /* !defined LOCALE_HOME */
-#endif // __ANDROID__
+#ifndef NETBSD_INSPIRED
+# define NETBSD_INSPIRED 1
+#endif
#if HAVE_INCOMPATIBLE_CTIME_R
#define asctime_r _incompatible_asctime_r
#define ctime_r _incompatible_ctime_r
#endif /* HAVE_INCOMPATIBLE_CTIME_R */
+/* Enable tm_gmtoff and tm_zone on GNUish systems. */
+#define _GNU_SOURCE 1
+/* Fix asctime_r on Solaris 10. */
+#define _POSIX_PTHREAD_SEMANTICS 1
+/* Enable strtoimax on Solaris 10. */
+#define __EXTENSIONS__ 1
+
/*
** Nested includes
*/
+/* Avoid clashes with NetBSD by renaming NetBSD's declarations. */
+#define localtime_rz sys_localtime_rz
+#define mktime_z sys_mktime_z
+#define posix2time_z sys_posix2time_z
+#define time2posix_z sys_time2posix_z
+#define timezone_t sys_timezone_t
+#define tzalloc sys_tzalloc
+#define tzfree sys_tzfree
+#include <time.h>
+#undef localtime_rz
+#undef mktime_z
+#undef posix2time_z
+#undef time2posix_z
+#undef timezone_t
+#undef tzalloc
+#undef tzfree
+
#include "sys/types.h" /* for time_t */
#include "stdio.h"
-#include "errno.h"
#include "string.h"
#include "limits.h" /* for CHAR_BIT et al. */
-#include "time.h"
#include "stdlib.h"
+#include "errno.h"
+
+#ifndef ENAMETOOLONG
+# define ENAMETOOLONG EINVAL
+#endif
+#ifndef EOVERFLOW
+# define EOVERFLOW EINVAL
+#endif
+
#if HAVE_GETTEXT
#include "libintl.h"
#endif /* HAVE_GETTEXT */
@@ -104,6 +129,14 @@
#include "unistd.h" /* for F_OK, R_OK, and other POSIX goodness */
#endif /* HAVE_UNISTD_H */
+#ifndef HAVE_STRFTIME_L
+# if _POSIX_VERSION < 200809
+# define HAVE_STRFTIME_L 0
+# else
+# define HAVE_STRFTIME_L 1
+# endif
+#endif
+
#ifndef F_OK
#define F_OK 0
#endif /* !defined F_OK */
@@ -138,65 +171,98 @@
# include <inttypes.h>
#endif
-#ifndef INT_FAST64_MAX
/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */
-#if defined LLONG_MAX || defined __LONG_LONG_MAX__
-typedef long long int_fast64_t;
+#ifdef __LONG_LONG_MAX__
+# ifndef LLONG_MAX
+# define LLONG_MAX __LONG_LONG_MAX__
+# endif
+# ifndef LLONG_MIN
+# define LLONG_MIN (-1 - LLONG_MAX)
+# endif
+#endif
+
+#ifndef INT_FAST64_MAX
# ifdef LLONG_MAX
+typedef long long int_fast64_t;
# define INT_FAST64_MIN LLONG_MIN
# define INT_FAST64_MAX LLONG_MAX
# else
-# define INT_FAST64_MIN __LONG_LONG_MIN__
-# define INT_FAST64_MAX __LONG_LONG_MAX__
-# endif
-# define SCNdFAST64 "lld"
-#else /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
-#if (LONG_MAX >> 31) < 0xffffffff
+# if LONG_MAX >> 31 < 0xffffffff
Please use a compiler that supports a 64-bit integer type (or wider);
you may need to compile with "-DHAVE_STDINT_H".
-#endif /* (LONG_MAX >> 31) < 0xffffffff */
+# endif
typedef long int_fast64_t;
-# define INT_FAST64_MIN LONG_MIN
-# define INT_FAST64_MAX LONG_MAX
-# define SCNdFAST64 "ld"
-#endif /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */
-#endif /* !defined INT_FAST64_MAX */
+# define INT_FAST64_MIN LONG_MIN
+# define INT_FAST64_MAX LONG_MAX
+# endif
+#endif
+
+#ifndef SCNdFAST64
+# if INT_FAST64_MAX == LLONG_MAX
+# define SCNdFAST64 "lld"
+# else
+# define SCNdFAST64 "ld"
+# endif
+#endif
#ifndef INT_FAST32_MAX
# if INT_MAX >> 31 == 0
typedef long int_fast32_t;
+# define INT_FAST32_MAX LONG_MAX
+# define INT_FAST32_MIN LONG_MIN
# else
typedef int int_fast32_t;
+# define INT_FAST32_MAX INT_MAX
+# define INT_FAST32_MIN INT_MIN
# endif
#endif
#ifndef INTMAX_MAX
-# if defined LLONG_MAX || defined __LONG_LONG_MAX__
+# ifdef LLONG_MAX
typedef long long intmax_t;
# define strtoimax strtoll
-# define PRIdMAX "lld"
-# ifdef LLONG_MAX
-# define INTMAX_MAX LLONG_MAX
-# define INTMAX_MIN LLONG_MIN
-# else
-# define INTMAX_MAX __LONG_LONG_MAX__
-# define INTMAX_MIN __LONG_LONG_MIN__
-# endif
+# define INTMAX_MAX LLONG_MAX
+# define INTMAX_MIN LLONG_MIN
# else
typedef long intmax_t;
# define strtoimax strtol
-# define PRIdMAX "ld"
# define INTMAX_MAX LONG_MAX
# define INTMAX_MIN LONG_MIN
# endif
#endif
+#ifndef PRIdMAX
+# if INTMAX_MAX == LLONG_MAX
+# define PRIdMAX "lld"
+# else
+# define PRIdMAX "ld"
+# endif
+#endif
+
+#ifndef UINT_FAST64_MAX
+# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
+typedef unsigned long long uint_fast64_t;
+# else
+# if ULONG_MAX >> 31 >> 1 < 0xffffffff
+Please use a compiler that supports a 64-bit integer type (or wider);
+you may need to compile with "-DHAVE_STDINT_H".
+# endif
+typedef unsigned long uint_fast64_t;
+# endif
+#endif
+
#ifndef UINTMAX_MAX
# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
typedef unsigned long long uintmax_t;
-# define PRIuMAX "llu"
# else
typedef unsigned long uintmax_t;
+# endif
+#endif
+
+#ifndef PRIuMAX
+# if defined ULLONG_MAX || defined __LONG_LONG_MAX__
+# define PRIuMAX "llu"
+# else
# define PRIuMAX "lu"
# endif
#endif
@@ -239,16 +305,6 @@ typedef unsigned long uintmax_t;
*/
/*
-** Some time.h implementations don't declare asctime_r.
-** Others might define it as a macro.
-** Fix the former without affecting the latter.
-*/
-
-#ifndef asctime_r
-extern char * asctime_r(struct tm const *, char *);
-#endif
-
-/*
** Compile with -Dtime_tz=T to build the tz package with a private
** time_t type equivalent to T rather than the system-supplied time_t.
** This debugging feature can test unusual design decisions
@@ -256,7 +312,11 @@ extern char * asctime_r(struct tm const *, char *);
** typical platforms.
*/
#ifdef time_tz
+# ifdef LOCALTIME_IMPLEMENTATION
static time_t sys_time(time_t *x) { return time(x); }
+# endif
+
+typedef time_tz tz_time_t;
# undef ctime
# define ctime tz_ctime
@@ -272,14 +332,40 @@ static time_t sys_time(time_t *x) { return time(x); }
# define localtime tz_localtime
# undef localtime_r
# define localtime_r tz_localtime_r
+# undef localtime_rz
+# define localtime_rz tz_localtime_rz
# undef mktime
# define mktime tz_mktime
+# undef mktime_z
+# define mktime_z tz_mktime_z
+# undef offtime
+# define offtime tz_offtime
+# undef posix2time
+# define posix2time tz_posix2time
+# undef posix2time_z
+# define posix2time_z tz_posix2time_z
# undef time
# define time tz_time
+# undef time2posix
+# define time2posix tz_time2posix
+# undef time2posix_z
+# define time2posix_z tz_time2posix_z
# undef time_t
# define time_t tz_time_t
-
-typedef time_tz time_t;
+# undef timegm
+# define timegm tz_timegm
+# undef timelocal
+# define timelocal tz_timelocal
+# undef timeoff
+# define timeoff tz_timeoff
+# undef tzalloc
+# define tzalloc tz_tzalloc
+# undef tzfree
+# define tzfree tz_tzfree
+# undef tzset
+# define tzset tz_tzset
+# undef tzsetwall
+# define tzsetwall tz_tzsetwall
char *ctime(time_t const *);
char *ctime_r(time_t const *, char *);
@@ -289,36 +375,111 @@ struct tm *gmtime_r(time_t const *restrict, struct tm *restrict);
struct tm *localtime(time_t const *);
struct tm *localtime_r(time_t const *restrict, struct tm *restrict);
time_t mktime(struct tm *);
+time_t time(time_t *);
+void tzset(void);
+#endif
-static time_t
-time(time_t *p)
-{
- time_t r = sys_time(0);
- if (p)
- *p = r;
- return r;
-}
+/*
+** Some time.h implementations don't declare asctime_r.
+** Others might define it as a macro.
+** Fix the former without affecting the latter.
+** Similarly for timezone, daylight, and altzone.
+*/
+
+#ifndef asctime_r
+extern char * asctime_r(struct tm const *restrict, char *restrict);
+#endif
+
+#ifdef USG_COMPAT
+# ifndef timezone
+extern long timezone;
+# endif
+# ifndef daylight
+extern int daylight;
+# endif
+#endif
+#if defined ALTZONE && !defined altzone
+extern long altzone;
#endif
/*
-** Private function declarations.
+** The STD_INSPIRED functions are similar, but most also need
+** declarations if time_tz is defined.
*/
-char * icatalloc(char * old, const char * new);
-char * icpyalloc(const char * string);
-const char * scheck(const char * string, const char * format);
+#ifdef STD_INSPIRED
+# if !defined tzsetwall || defined time_tz
+void tzsetwall(void);
+# endif
+# if !defined offtime || defined time_tz
+struct tm *offtime(time_t const *, long);
+# endif
+# if !defined timegm || defined time_tz
+time_t timegm(struct tm *);
+# endif
+# if !defined timelocal || defined time_tz
+time_t timelocal(struct tm *);
+# endif
+# if !defined timeoff || defined time_tz
+time_t timeoff(struct tm *, long);
+# endif
+# if !defined time2posix || defined time_tz
+time_t time2posix(time_t);
+# endif
+# if !defined posix2time || defined time_tz
+time_t posix2time(time_t);
+# endif
+#endif
+
+/* Infer TM_ZONE on systems where this information is known, but suppress
+ guessing if NO_TM_ZONE is defined. Similarly for TM_GMTOFF. */
+#if (defined __GLIBC__ \
+ || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
+ || (defined __APPLE__ && defined __MACH__))
+# if !defined TM_GMTOFF && !defined NO_TM_GMTOFF
+# define TM_GMTOFF tm_gmtoff
+# endif
+# if !defined TM_ZONE && !defined NO_TM_ZONE
+# define TM_ZONE tm_zone
+# endif
+#endif
/*
-** Finally, some convenience items.
+** Define functions that are ABI compatible with NetBSD but have
+** better prototypes. NetBSD 6.1.4 defines a pointer type timezone_t
+** and labors under the misconception that 'const timezone_t' is a
+** pointer to a constant. This use of 'const' is ineffective, so it
+** is not done here. What we call 'struct state' NetBSD calls
+** 'struct __state', but this is a private name so it doesn't matter.
*/
+#if NETBSD_INSPIRED
+typedef struct state *timezone_t;
+struct tm *localtime_rz(timezone_t restrict, time_t const *restrict,
+ struct tm *restrict);
+time_t mktime_z(timezone_t restrict, struct tm *restrict);
+timezone_t tzalloc(char const *);
+void tzfree(timezone_t);
+# ifdef STD_INSPIRED
+# if !defined posix2time_z || defined time_tz
+time_t posix2time_z(timezone_t, time_t) ATTRIBUTE_PURE;
+# endif
+# if !defined time2posix_z || defined time_tz
+time_t time2posix_z(timezone_t, time_t) ATTRIBUTE_PURE;
+# endif
+# endif
+#endif
-#ifndef TRUE
-#define TRUE 1
-#endif /* !defined TRUE */
+/*
+** Finally, some convenience items.
+*/
-#ifndef FALSE
-#define FALSE 0
-#endif /* !defined FALSE */
+#if __STDC_VERSION__ < 199901
+# define true 1
+# define false 0
+# define bool int
+#else
+# include <stdbool.h>
+#endif
#ifndef TYPE_BIT
#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT)
@@ -328,15 +489,20 @@ const char * scheck(const char * string, const char * format);
#define TYPE_SIGNED(type) (((type) -1) < 0)
#endif /* !defined TYPE_SIGNED */
-/* The minimum and maximum finite time values. */
-static time_t const time_t_min =
- (TYPE_SIGNED(time_t)
- ? (time_t) -1 << (CHAR_BIT * sizeof (time_t) - 1)
- : 0);
-static time_t const time_t_max =
- (TYPE_SIGNED(time_t)
- ? - (~ 0 < 0) - ((time_t) -1 << (CHAR_BIT * sizeof (time_t) - 1))
- : -1);
+#define TWOS_COMPLEMENT(t) ((t) ~ (t) 0 < 0)
+
+/* Max and min values of the integer type T, of which only the bottom
+ B bits are used, and where the highest-order used bit is considered
+ to be a sign bit if T is signed. */
+#define MAXVAL(t, b) \
+ ((t) (((t) 1 << ((b) - 1 - TYPE_SIGNED(t))) \
+ - 1 + ((t) 1 << ((b) - 1 - TYPE_SIGNED(t)))))
+#define MINVAL(t, b) \
+ ((t) (TYPE_SIGNED(t) ? - TWOS_COMPLEMENT(t) - MAXVAL(t, b) : 0))
+
+/* The minimum and maximum finite time values. This assumes no padding. */
+static time_t const time_t_min = MINVAL(time_t, TYPE_BIT(time_t));
+static time_t const time_t_max = MAXVAL(time_t, TYPE_BIT(time_t));
#ifndef INT_STRLEN_MAXIMUM
/*
@@ -360,6 +526,10 @@ static time_t const time_t_max =
# define INITIALIZE(x)
#endif
+#ifndef UNINIT_TRAP
+# define UNINIT_TRAP 0
+#endif
+
/*
** For the benefit of GNU folk...
** '_(MSGID)' uses the current locale's message library string for MSGID.
@@ -374,7 +544,7 @@ static time_t const time_t_max =
#endif /* !HAVE_GETTEXT */
#endif /* !defined _ */
-#if !defined TZ_DOMAIN && defined TZ_DOMAINDIR
+#if !defined TZ_DOMAIN && defined HAVE_GETTEXT
# define TZ_DOMAIN "tz"
#endif
@@ -405,8 +575,4 @@ char *ctime_r(time_t const *, char *);
#define SECSPERREPEAT_BITS 34 /* ceil(log2(SECSPERREPEAT)) */
#endif /* !defined SECSPERREPEAT_BITS */
-/*
-** UNIX was a registered trademark of The Open Group in 2003.
-*/
-
#endif /* !defined PRIVATE_H */
diff --git a/libc/tzcode/strftime.c b/libc/tzcode/strftime.c
index 4328b4c53..4349cf607 100644
--- a/libc/tzcode/strftime.c
+++ b/libc/tzcode/strftime.c
@@ -55,15 +55,7 @@ struct lc_time_T {
const char * date_fmt;
};
-#ifdef LOCALE_HOME
-#include "sys/stat.h"
-static struct lc_time_T localebuf;
-static struct lc_time_T * _loc(void);
-#define Locale _loc()
-#endif /* defined LOCALE_HOME */
-#ifndef LOCALE_HOME
#define Locale (&C_time_locale)
-#endif /* !defined LOCALE_HOME */
static const struct lc_time_T C_time_locale = {
{
@@ -115,7 +107,7 @@ static char * _add(const char *, char *, const char *, int);
static char * _conv(int, const char *, char *, const char *);
static char * _fmt(const char *, const struct tm *, char *, const char *,
int *);
-static char * _yconv(int, int, int, int, char *, const char *, int);
+static char * _yconv(int, int, bool, bool, char *, const char *, int);
static char * getformat(int, char *, char *, char *, char *);
extern char * tzname[];
@@ -132,32 +124,28 @@ extern char * tzname[];
#define FORCE_LOWER_CASE 0x100
size_t
-strftime(char * const s, const size_t maxsize, const char *const format,
- const struct tm *const t)
+strftime(char *s, size_t maxsize, const char *format, const struct tm *t)
{
char * p;
int warn;
tzset();
-#ifdef LOCALE_HOME
- localebuf.mon[0] = 0;
-#endif /* defined LOCALE_HOME */
warn = IN_NONE;
p = _fmt(((format == NULL) ? "%c" : format), t, s, s + maxsize, &warn);
#ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) {
- (void) fprintf(stderr, "\n");
+ fprintf(stderr, "\n");
if (format == NULL)
- (void) fprintf(stderr, "NULL strftime format ");
- else (void) fprintf(stderr, "strftime format \"%s\" ",
+ fprintf(stderr, "NULL strftime format ");
+ else fprintf(stderr, "strftime format \"%s\" ",
format);
- (void) fprintf(stderr, "yields only two digits of years in ");
+ fprintf(stderr, "yields only two digits of years in ");
if (warn == IN_SOME)
- (void) fprintf(stderr, "some locales");
+ fprintf(stderr, "some locales");
else if (warn == IN_THIS)
- (void) fprintf(stderr, "the current locale");
- else (void) fprintf(stderr, "all locales");
- (void) fprintf(stderr, "\n");
+ fprintf(stderr, "the current locale");
+ else fprintf(stderr, "all locales");
+ fprintf(stderr, "\n");
}
#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
if (p == s + maxsize)
@@ -171,20 +159,17 @@ static char *getformat(int modifier, char *normal, char *underscore,
switch (modifier) {
case '_':
return underscore;
-
case '-':
return dash;
-
case '0':
return zero;
}
-
return normal;
}
static char *
-_fmt(const char *format, const struct tm *const t, char * pt,
- const char *const ptlim, int *warnp)
+_fmt(const char *format, const struct tm *t, char *pt,
+ const char *ptlim, int *warnp)
{
for ( ; *format; ++format) {
if (*format == '%') {
@@ -227,8 +212,8 @@ label:
** something completely different.
** (ado, 1993-05-24)
*/
- pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 0,
- pt, ptlim, modifier);
+ pt = _yconv(t->tm_year, TM_YEAR_BASE,
+ true, false, pt, ptlim, modifier);
continue;
case 'c':
{
@@ -245,10 +230,7 @@ label:
pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp);
continue;
case 'd':
- pt = _conv(t->tm_mday,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ pt = _conv(t->tm_mday, getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'E':
case 'O':
@@ -270,31 +252,21 @@ label:
modifier = *format;
goto label;
case 'e':
- pt = _conv(t->tm_mday,
- getformat(modifier, "%2d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ pt = _conv(t->tm_mday, getformat(modifier, "%2d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'F':
pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp);
continue;
case 'H':
- pt = _conv(t->tm_hour,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ pt = _conv(t->tm_hour, getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'I':
pt = _conv((t->tm_hour % 12) ?
(t->tm_hour % 12) : 12,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'j':
- pt = _conv(t->tm_yday + 1,
- getformat(modifier, "%03d", "%3d", "%d", "%03d"),
- pt, ptlim);
+ pt = _conv(t->tm_yday + 1, getformat(modifier, "%03d", "%3d", "%d", "%03d"), pt, ptlim);
continue;
case 'k':
/*
@@ -307,10 +279,7 @@ label:
** "%l" have been swapped.
** (ado, 1993-05-24)
*/
- pt = _conv(t->tm_hour,
- getformat(modifier, "%2d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ pt = _conv(t->tm_hour, getformat(modifier, "%2d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
#ifdef KITCHEN_SINK
case 'K':
@@ -332,36 +301,23 @@ label:
*/
pt = _conv((t->tm_hour % 12) ?
(t->tm_hour % 12) : 12,
- getformat(modifier, "%2d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ getformat(modifier, "%2d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'M':
- pt = _conv(t->tm_min,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ pt = _conv(t->tm_min, getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'm':
- pt = _conv(t->tm_mon + 1,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ pt = _conv(t->tm_mon + 1, getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'n':
pt = _add("\n", pt, ptlim, modifier);
continue;
- case 'p':
- pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
- Locale->pm :
- Locale->am,
- pt, ptlim, modifier);
- continue;
case 'P':
+ case 'p':
pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
Locale->pm :
Locale->am,
- pt, ptlim, FORCE_LOWER_CASE);
+ pt, ptlim, (*format == 'P') ? FORCE_LOWER_CASE : modifier);
continue;
case 'R':
pt = _fmt("%H:%M", t, pt, ptlim, warnp);
@@ -370,10 +326,7 @@ label:
pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp);
continue;
case 'S':
- pt = _conv(t->tm_sec,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ pt = _conv(t->tm_sec, getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 's':
{
@@ -385,10 +338,10 @@ label:
tm = *t;
mkt = mktime64(&tm);
if (TYPE_SIGNED(time64_t))
- (void) snprintf(buf, sizeof(buf), "%lld",
- (long long) mkt);
- else (void) snprintf(buf, sizeof(buf), "%llu",
- (unsigned long long) mkt);
+ snprintf(buf, sizeof(buf), "%"PRIdMAX,
+ (intmax_t) mkt);
+ else snprintf(buf, sizeof(buf), "%"PRIuMAX,
+ (uintmax_t) mkt);
pt = _add(buf, pt, ptlim, modifier);
}
continue;
@@ -401,9 +354,7 @@ label:
case 'U':
pt = _conv((t->tm_yday + DAYSPERWEEK -
t->tm_wday) / DAYSPERWEEK,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'u':
/*
@@ -413,7 +364,8 @@ label:
** (ado, 1993-05-24)
*/
pt = _conv((t->tm_wday == 0) ?
- DAYSPERWEEK : t->tm_wday, "%d", pt, ptlim);
+ DAYSPERWEEK : t->tm_wday,
+ "%d", pt, ptlim);
continue;
case 'V': /* ISO 8601 week number */
case 'G': /* ISO 8601 year (four digits) */
@@ -493,14 +445,15 @@ label:
w = 53;
#endif /* defined XPG4_1994_04_09 */
if (*format == 'V')
- pt = _conv(w,
- getformat(modifier, "%02d", "%2d", "%d", "%02d"),
+ pt = _conv(w, getformat(modifier, "%02d", "%2d", "%d", "%02d"),
pt, ptlim);
else if (*format == 'g') {
*warnp = IN_ALL;
- pt = _yconv(year, base, 0, 1,
+ pt = _yconv(year, base,
+ false, true,
pt, ptlim, modifier);
- } else pt = _yconv(year, base, 1, 1,
+ } else pt = _yconv(year, base,
+ true, true,
pt, ptlim, modifier);
}
continue;
@@ -517,9 +470,7 @@ label:
(t->tm_wday ?
(t->tm_wday - 1) :
(DAYSPERWEEK - 1))) / DAYSPERWEEK,
- getformat(modifier, "%02d",
- "%2d", "%d", "%02d"),
- pt, ptlim);
+ getformat(modifier, "%02d", "%2d", "%d", "%02d"), pt, ptlim);
continue;
case 'w':
pt = _conv(t->tm_wday, "%d", pt, ptlim);
@@ -540,23 +491,39 @@ label:
continue;
case 'y':
*warnp = IN_ALL;
- pt = _yconv(t->tm_year, TM_YEAR_BASE, 0, 1,
+ pt = _yconv(t->tm_year, TM_YEAR_BASE,
+ false, true,
pt, ptlim, modifier);
continue;
case 'Y':
- pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 1,
+ pt = _yconv(t->tm_year, TM_YEAR_BASE,
+ true, true,
pt, ptlim, modifier);
continue;
case 'Z':
#ifdef TM_ZONE
- if (t->TM_ZONE != NULL)
- pt = _add(t->TM_ZONE, pt, ptlim,
- modifier);
- else
-#endif /* defined TM_ZONE */
+ // BEGIN: Android-changed.
+ {
+ const char* zone = t->TM_ZONE;
+ if (!zone || !*zone) {
+ // "The value of tm_isdst shall be positive if Daylight Savings Time is
+ // in effect, 0 if Daylight Savings Time is not in effect, and negative
+ // if the information is not available."
+ if (t->tm_isdst == 0) zone = tzname[0];
+ else if (t->tm_isdst > 0) zone = tzname[1];
+
+ // "Replaced by the timezone name or abbreviation, or by no bytes if no
+ // timezone information exists."
+ if (!zone || !*zone) zone = "";
+ }
+ pt = _add(zone, pt, ptlim, modifier);
+ }
+ // END: Android-changed.
+#else
if (t->tm_isdst >= 0)
pt = _add(tzname[t->tm_isdst != 0],
- pt, ptlim, modifier);
+ pt, ptlim);
+#endif
/*
** C99 says that %Z must be replaced by the
** empty string if the time zone is not
@@ -613,10 +580,7 @@ label:
diff /= SECSPERMIN;
diff = (diff / MINSPERHOUR) * 100 +
(diff % MINSPERHOUR);
- pt = _conv(diff,
- getformat(modifier, "%04d",
- "%4d", "%d", "%04d"),
- pt, ptlim);
+ pt = _conv(diff, getformat(modifier, "%04d", "%4d", "%d", "%04d"), pt, ptlim);
}
continue;
case '+':
@@ -641,13 +605,12 @@ label:
}
static char *
-_conv(const int n, const char *const format, char *const pt,
- const char *const ptlim)
+_conv(int n, const char *format, char *pt, const char *ptlim)
{
- char buf[INT_STRLEN_MAXIMUM(int) + 1];
+ char buf[INT_STRLEN_MAXIMUM(int) + 1];
- (void) snprintf(buf, sizeof(buf), format, n);
- return _add(buf, pt, ptlim, 0);
+ snprintf(buf, sizeof(buf), format, n);
+ return _add(buf, pt, ptlim, 0);
}
static char *
@@ -699,8 +662,8 @@ _add(const char *str, char *pt, const char *const ptlim, int modifier)
*/
static char *
-_yconv(const int a, const int b, const int convert_top, const int convert_yy,
- char *pt, const char *const ptlim, int modifier)
+_yconv(int a, int b, bool convert_top, bool convert_yy,
+ char *pt, const char *ptlim, int modifier)
{
register int lead;
register int trail;
diff --git a/libc/tzcode/tzfile.h b/libc/tzcode/tzfile.h
index 529650dd8..ebecd6832 100644
--- a/libc/tzcode/tzfile.h
+++ b/libc/tzcode/tzfile.h
@@ -40,7 +40,7 @@
struct tzhead {
char tzh_magic[4]; /* TZ_MAGIC */
char tzh_version[1]; /* '\0' or '2' or '3' as of 2013 */
- char tzh_reserved[15]; /* reserved--must be zero */
+ char tzh_reserved[15]; /* reserved; must be zero */
char tzh_ttisgmtcnt[4]; /* coded number of trans. time flags */
char tzh_ttisstdcnt[4]; /* coded number of trans. time flags */
char tzh_leapcnt[4]; /* coded number of leap seconds */
@@ -62,13 +62,13 @@ struct tzhead {
** tzh_leapcnt repetitions of
** one (char [4]) coded leap second transition times
** one (char [4]) total correction after above
-** tzh_ttisstdcnt (char)s indexed by type; if TRUE, transition
-** time is standard time, if FALSE,
+** tzh_ttisstdcnt (char)s indexed by type; if 1, transition
+** time is standard time, if 0,
** transition time is wall clock time
** if absent, transition times are
** assumed to be wall clock time
-** tzh_ttisgmtcnt (char)s indexed by type; if TRUE, transition
-** time is UT, if FALSE,
+** tzh_ttisgmtcnt (char)s indexed by type; if 1, transition
+** time is UT, if 0,
** transition time is local time
** if absent, transition times are
** assumed to be local time
@@ -97,7 +97,7 @@ struct tzhead {
*/
#ifndef TZ_MAX_TIMES
-#define TZ_MAX_TIMES 1200
+#define TZ_MAX_TIMES 2000
#endif /* !defined TZ_MAX_TIMES */
#ifndef TZ_MAX_TYPES
diff --git a/libc/upstream-dlmalloc/README.txt b/libc/upstream-dlmalloc/README.txt
deleted file mode 100644
index 485704bb6..000000000
--- a/libc/upstream-dlmalloc/README.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-This directory contains malloc/free routines implemented by Doug Lea
-(aka dlmalloc). You should not edit these files directly. Make fixes
-upstream and then pull down the new version of the file.
-
-This code is imported from: ftp://g.oswego.edu/pub/misc/
-It is currently version 2.8.6.
-
-Currently there are very minor modifications that are signified with:
-BEGIN android-changed: change description
-END android-changed
diff --git a/libc/upstream-dlmalloc/malloc.c b/libc/upstream-dlmalloc/malloc.c
deleted file mode 100644
index 3c9d36bf4..000000000
--- a/libc/upstream-dlmalloc/malloc.c
+++ /dev/null
@@ -1,6318 +0,0 @@
-/*
- This is a version (aka dlmalloc) of malloc/free/realloc written by
- Doug Lea and released to the public domain, as explained at
- http://creativecommons.org/publicdomain/zero/1.0/ Send questions,
- comments, complaints, performance data, etc to dl@cs.oswego.edu
-
-* Version 2.8.6 Wed Aug 29 06:57:58 2012 Doug Lea
- Note: There may be an updated version of this malloc obtainable at
- ftp://gee.cs.oswego.edu/pub/misc/malloc.c
- Check before installing!
-
-* Quickstart
-
- This library is all in one file to simplify the most common usage:
- ftp it, compile it (-O3), and link it into another program. All of
- the compile-time options default to reasonable values for use on
- most platforms. You might later want to step through various
- compile-time and dynamic tuning options.
-
- For convenience, an include file for code using this malloc is at:
- ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.6.h
- You don't really need this .h file unless you call functions not
- defined in your system include files. The .h file contains only the
- excerpts from this file needed for using this malloc on ANSI C/C++
- systems, so long as you haven't changed compile-time options about
- naming and tuning parameters. If you do, then you can create your
- own malloc.h that does include all settings by cutting at the point
- indicated below. Note that you may already by default be using a C
- library containing a malloc that is based on some version of this
- malloc (for example in linux). You might still want to use the one
- in this file to customize settings or to avoid overheads associated
- with library versions.
-
-* Vital statistics:
-
- Supported pointer/size_t representation: 4 or 8 bytes
- size_t MUST be an unsigned type of the same width as
- pointers. (If you are using an ancient system that declares
- size_t as a signed type, or need it to be a different width
- than pointers, you can use a previous release of this malloc
- (e.g. 2.7.2) supporting these.)
-
- Alignment: 8 bytes (minimum)
- This suffices for nearly all current machines and C compilers.
- However, you can define MALLOC_ALIGNMENT to be wider than this
- if necessary (up to 128bytes), at the expense of using more space.
-
- Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes)
- 8 or 16 bytes (if 8byte sizes)
- Each malloced chunk has a hidden word of overhead holding size
- and status information, and additional cross-check word
- if FOOTERS is defined.
-
- Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead)
- 8-byte ptrs: 32 bytes (including overhead)
-
- Even a request for zero bytes (i.e., malloc(0)) returns a
- pointer to something of the minimum allocatable size.
- The maximum overhead wastage (i.e., number of extra bytes
- allocated than were requested in malloc) is less than or equal
- to the minimum size, except for requests >= mmap_threshold that
- are serviced via mmap(), where the worst case wastage is about
- 32 bytes plus the remainder from a system page (the minimal
- mmap unit); typically 4096 or 8192 bytes.
-
- Security: static-safe; optionally more or less
- The "security" of malloc refers to the ability of malicious
- code to accentuate the effects of errors (for example, freeing
- space that is not currently malloc'ed or overwriting past the
- ends of chunks) in code that calls malloc. This malloc
- guarantees not to modify any memory locations below the base of
- heap, i.e., static variables, even in the presence of usage
- errors. The routines additionally detect most improper frees
- and reallocs. All this holds as long as the static bookkeeping
- for malloc itself is not corrupted by some other means. This
- is only one aspect of security -- these checks do not, and
- cannot, detect all possible programming errors.
-
- If FOOTERS is defined nonzero, then each allocated chunk
- carries an additional check word to verify that it was malloced
- from its space. These check words are the same within each
- execution of a program using malloc, but differ across
- executions, so externally crafted fake chunks cannot be
- freed. This improves security by rejecting frees/reallocs that
- could corrupt heap memory, in addition to the checks preventing
- writes to statics that are always on. This may further improve
- security at the expense of time and space overhead. (Note that
- FOOTERS may also be worth using with MSPACES.)
-
- By default detected errors cause the program to abort (calling
- "abort()"). You can override this to instead proceed past
- errors by defining PROCEED_ON_ERROR. In this case, a bad free
- has no effect, and a malloc that encounters a bad address
- caused by user overwrites will ignore the bad address by
- dropping pointers and indices to all known memory. This may
- be appropriate for programs that should continue if at all
- possible in the face of programming errors, although they may
- run out of memory because dropped memory is never reclaimed.
-
- If you don't like either of these options, you can define
- CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything
- else. And if if you are sure that your program using malloc has
- no errors or vulnerabilities, you can define INSECURE to 1,
- which might (or might not) provide a small performance improvement.
-
- It is also possible to limit the maximum total allocatable
- space, using malloc_set_footprint_limit. This is not
- designed as a security feature in itself (calls to set limits
- are not screened or privileged), but may be useful as one
- aspect of a secure implementation.
-
- Thread-safety: NOT thread-safe unless USE_LOCKS defined non-zero
- When USE_LOCKS is defined, each public call to malloc, free,
- etc is surrounded with a lock. By default, this uses a plain
- pthread mutex, win32 critical section, or a spin-lock if if
- available for the platform and not disabled by setting
- USE_SPIN_LOCKS=0. However, if USE_RECURSIVE_LOCKS is defined,
- recursive versions are used instead (which are not required for
- base functionality but may be needed in layered extensions).
- Using a global lock is not especially fast, and can be a major
- bottleneck. It is designed only to provide minimal protection
- in concurrent environments, and to provide a basis for
- extensions. If you are using malloc in a concurrent program,
- consider instead using nedmalloc
- (http://www.nedprod.com/programs/portable/nedmalloc/) or
- ptmalloc (See http://www.malloc.de), which are derived from
- versions of this malloc.
-
- System requirements: Any combination of MORECORE and/or MMAP/MUNMAP
- This malloc can use unix sbrk or any emulation (invoked using
- the CALL_MORECORE macro) and/or mmap/munmap or any emulation
- (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system
- memory. On most unix systems, it tends to work best if both
- MORECORE and MMAP are enabled. On Win32, it uses emulations
- based on VirtualAlloc. It also uses common C library functions
- like memset.
-
- Compliance: I believe it is compliant with the Single Unix Specification
- (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably
- others as well.
-
-* Overview of algorithms
-
- This is not the fastest, most space-conserving, most portable, or
- most tunable malloc ever written. However it is among the fastest
- while also being among the most space-conserving, portable and
- tunable. Consistent balance across these factors results in a good
- general-purpose allocator for malloc-intensive programs.
-
- In most ways, this malloc is a best-fit allocator. Generally, it
- chooses the best-fitting existing chunk for a request, with ties
- broken in approximately least-recently-used order. (This strategy
- normally maintains low fragmentation.) However, for requests less
- than 256bytes, it deviates from best-fit when there is not an
- exactly fitting available chunk by preferring to use space adjacent
- to that used for the previous small request, as well as by breaking
- ties in approximately most-recently-used order. (These enhance
- locality of series of small allocations.) And for very large requests
- (>= 256Kb by default), it relies on system memory mapping
- facilities, if supported. (This helps avoid carrying around and
- possibly fragmenting memory used only for large chunks.)
-
- All operations (except malloc_stats and mallinfo) have execution
- times that are bounded by a constant factor of the number of bits in
- a size_t, not counting any clearing in calloc or copying in realloc,
- or actions surrounding MORECORE and MMAP that have times
- proportional to the number of non-contiguous regions returned by
- system allocation routines, which is often just 1. In real-time
- applications, you can optionally suppress segment traversals using
- NO_SEGMENT_TRAVERSAL, which assures bounded execution even when
- system allocators return non-contiguous spaces, at the typical
- expense of carrying around more memory and increased fragmentation.
-
- The implementation is not very modular and seriously overuses
- macros. Perhaps someday all C compilers will do as good a job
- inlining modular code as can now be done by brute-force expansion,
- but now, enough of them seem not to.
-
- Some compilers issue a lot of warnings about code that is
- dead/unreachable only on some platforms, and also about intentional
- uses of negation on unsigned types. All known cases of each can be
- ignored.
-
- For a longer but out of date high-level description, see
- http://gee.cs.oswego.edu/dl/html/malloc.html
-
-* MSPACES
- If MSPACES is defined, then in addition to malloc, free, etc.,
- this file also defines mspace_malloc, mspace_free, etc. These
- are versions of malloc routines that take an "mspace" argument
- obtained using create_mspace, to control all internal bookkeeping.
- If ONLY_MSPACES is defined, only these versions are compiled.
- So if you would like to use this allocator for only some allocations,
- and your system malloc for others, you can compile with
- ONLY_MSPACES and then do something like...
- static mspace mymspace = create_mspace(0,0); // for example
- #define mymalloc(bytes) mspace_malloc(mymspace, bytes)
-
- (Note: If you only need one instance of an mspace, you can instead
- use "USE_DL_PREFIX" to relabel the global malloc.)
-
- You can similarly create thread-local allocators by storing
- mspaces as thread-locals. For example:
- static __thread mspace tlms = 0;
- void* tlmalloc(size_t bytes) {
- if (tlms == 0) tlms = create_mspace(0, 0);
- return mspace_malloc(tlms, bytes);
- }
- void tlfree(void* mem) { mspace_free(tlms, mem); }
-
- Unless FOOTERS is defined, each mspace is completely independent.
- You cannot allocate from one and free to another (although
- conformance is only weakly checked, so usage errors are not always
- caught). If FOOTERS is defined, then each chunk carries around a tag
- indicating its originating mspace, and frees are directed to their
- originating spaces. Normally, this requires use of locks.
-
- ------------------------- Compile-time options ---------------------------
-
-Be careful in setting #define values for numerical constants of type
-size_t. On some systems, literal values are not automatically extended
-to size_t precision unless they are explicitly casted. You can also
-use the symbolic values MAX_SIZE_T, SIZE_T_ONE, etc below.
-
-WIN32 default: defined if _WIN32 defined
- Defining WIN32 sets up defaults for MS environment and compilers.
- Otherwise defaults are for unix. Beware that there seem to be some
- cases where this malloc might not be a pure drop-in replacement for
- Win32 malloc: Random-looking failures from Win32 GDI API's (eg;
- SetDIBits()) may be due to bugs in some video driver implementations
- when pixel buffers are malloc()ed, and the region spans more than
- one VirtualAlloc()ed region. Because dlmalloc uses a small (64Kb)
- default granularity, pixel buffers may straddle virtual allocation
- regions more often than when using the Microsoft allocator. You can
- avoid this by using VirtualAlloc() and VirtualFree() for all pixel
- buffers rather than using malloc(). If this is not possible,
- recompile this malloc with a larger DEFAULT_GRANULARITY. Note:
- in cases where MSC and gcc (cygwin) are known to differ on WIN32,
- conditions use _MSC_VER to distinguish them.
-
-DLMALLOC_EXPORT default: extern
- Defines how public APIs are declared. If you want to export via a
- Windows DLL, you might define this as
- #define DLMALLOC_EXPORT extern __declspec(dllexport)
- If you want a POSIX ELF shared object, you might use
- #define DLMALLOC_EXPORT extern __attribute__((visibility("default")))
-
-MALLOC_ALIGNMENT default: (size_t)(2 * sizeof(void *))
- Controls the minimum alignment for malloc'ed chunks. It must be a
- power of two and at least 8, even on machines for which smaller
- alignments would suffice. It may be defined as larger than this
- though. Note however that code and data structures are optimized for
- the case of 8-byte alignment.
-
-MSPACES default: 0 (false)
- If true, compile in support for independent allocation spaces.
- This is only supported if HAVE_MMAP is true.
-
-ONLY_MSPACES default: 0 (false)
- If true, only compile in mspace versions, not regular versions.
-
-USE_LOCKS default: 0 (false)
- Causes each call to each public routine to be surrounded with
- pthread or WIN32 mutex lock/unlock. (If set true, this can be
- overridden on a per-mspace basis for mspace versions.) If set to a
- non-zero value other than 1, locks are used, but their
- implementation is left out, so lock functions must be supplied manually,
- as described below.
-
-USE_SPIN_LOCKS default: 1 iff USE_LOCKS and spin locks available
- If true, uses custom spin locks for locking. This is currently
- supported only gcc >= 4.1, older gccs on x86 platforms, and recent
- MS compilers. Otherwise, posix locks or win32 critical sections are
- used.
-
-USE_RECURSIVE_LOCKS default: not defined
- If defined nonzero, uses recursive (aka reentrant) locks, otherwise
- uses plain mutexes. This is not required for malloc proper, but may
- be needed for layered allocators such as nedmalloc.
-
-LOCK_AT_FORK default: not defined
- If defined nonzero, performs pthread_atfork upon initialization
- to initialize child lock while holding parent lock. The implementation
- assumes that pthread locks (not custom locks) are being used. In other
- cases, you may need to customize the implementation.
-
-FOOTERS default: 0
- If true, provide extra checking and dispatching by placing
- information in the footers of allocated chunks. This adds
- space and time overhead.
-
-INSECURE default: 0
- If true, omit checks for usage errors and heap space overwrites.
-
-USE_DL_PREFIX default: NOT defined
- Causes compiler to prefix all public routines with the string 'dl'.
- This can be useful when you only want to use this malloc in one part
- of a program, using your regular system malloc elsewhere.
-
-MALLOC_INSPECT_ALL default: NOT defined
- If defined, compiles malloc_inspect_all and mspace_inspect_all, that
- perform traversal of all heap space. Unless access to these
- functions is otherwise restricted, you probably do not want to
- include them in secure implementations.
-
-ABORT default: defined as abort()
- Defines how to abort on failed checks. On most systems, a failed
- check cannot die with an "assert" or even print an informative
- message, because the underlying print routines in turn call malloc,
- which will fail again. Generally, the best policy is to simply call
- abort(). It's not very useful to do more than this because many
- errors due to overwriting will show up as address faults (null, odd
- addresses etc) rather than malloc-triggered checks, so will also
- abort. Also, most compilers know that abort() does not return, so
- can better optimize code conditionally calling it.
-
-PROCEED_ON_ERROR default: defined as 0 (false)
- Controls whether detected bad addresses cause them to bypassed
- rather than aborting. If set, detected bad arguments to free and
- realloc are ignored. And all bookkeeping information is zeroed out
- upon a detected overwrite of freed heap space, thus losing the
- ability to ever return it from malloc again, but enabling the
- application to proceed. If PROCEED_ON_ERROR is defined, the
- static variable malloc_corruption_error_count is compiled in
- and can be examined to see if errors have occurred. This option
- generates slower code than the default abort policy.
-
-DEBUG default: NOT defined
- The DEBUG setting is mainly intended for people trying to modify
- this code or diagnose problems when porting to new platforms.
- However, it may also be able to better isolate user errors than just
- using runtime checks. The assertions in the check routines spell
- out in more detail the assumptions and invariants underlying the
- algorithms. The checking is fairly extensive, and will slow down
- execution noticeably. Calling malloc_stats or mallinfo with DEBUG
- set will attempt to check every non-mmapped allocated and free chunk
- in the course of computing the summaries.
-
-ABORT_ON_ASSERT_FAILURE default: defined as 1 (true)
- Debugging assertion failures can be nearly impossible if your
- version of the assert macro causes malloc to be called, which will
- lead to a cascade of further failures, blowing the runtime stack.
- ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(),
- which will usually make debugging easier.
-
-MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32
- The action to take before "return 0" when malloc fails to be able to
- return memory because there is none available.
-
-HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES
- True if this system supports sbrk or an emulation of it.
-
-MORECORE default: sbrk
- The name of the sbrk-style system routine to call to obtain more
- memory. See below for guidance on writing custom MORECORE
- functions. The type of the argument to sbrk/MORECORE varies across
- systems. It cannot be size_t, because it supports negative
- arguments, so it is normally the signed type of the same width as
- size_t (sometimes declared as "intptr_t"). It doesn't much matter
- though. Internally, we only call it with arguments less than half
- the max value of a size_t, which should work across all reasonable
- possibilities, although sometimes generating compiler warnings.
-
-MORECORE_CONTIGUOUS default: 1 (true) if HAVE_MORECORE
- If true, take advantage of fact that consecutive calls to MORECORE
- with positive arguments always return contiguous increasing
- addresses. This is true of unix sbrk. It does not hurt too much to
- set it true anyway, since malloc copes with non-contiguities.
- Setting it false when definitely non-contiguous saves time
- and possibly wasted space it would take to discover this though.
-
-MORECORE_CANNOT_TRIM default: NOT defined
- True if MORECORE cannot release space back to the system when given
- negative arguments. This is generally necessary only if you are
- using a hand-crafted MORECORE function that cannot handle negative
- arguments.
-
-NO_SEGMENT_TRAVERSAL default: 0
- If non-zero, suppresses traversals of memory segments
- returned by either MORECORE or CALL_MMAP. This disables
- merging of segments that are contiguous, and selectively
- releasing them to the OS if unused, but bounds execution times.
-
-HAVE_MMAP default: 1 (true)
- True if this system supports mmap or an emulation of it. If so, and
- HAVE_MORECORE is not true, MMAP is used for all system
- allocation. If set and HAVE_MORECORE is true as well, MMAP is
- primarily used to directly allocate very large blocks. It is also
- used as a backup strategy in cases where MORECORE fails to provide
- space from system. Note: A single call to MUNMAP is assumed to be
- able to unmap memory that may have be allocated using multiple calls
- to MMAP, so long as they are adjacent.
-
-HAVE_MREMAP default: 1 on linux, else 0
- If true realloc() uses mremap() to re-allocate large blocks and
- extend or shrink allocation spaces.
-
-MMAP_CLEARS default: 1 except on WINCE.
- True if mmap clears memory so calloc doesn't need to. This is true
- for standard unix mmap using /dev/zero and on WIN32 except for WINCE.
-
-USE_BUILTIN_FFS default: 0 (i.e., not used)
- Causes malloc to use the builtin ffs() function to compute indices.
- Some compilers may recognize and intrinsify ffs to be faster than the
- supplied C version. Also, the case of x86 using gcc is special-cased
- to an asm instruction, so is already as fast as it can be, and so
- this setting has no effect. Similarly for Win32 under recent MS compilers.
- (On most x86s, the asm version is only slightly faster than the C version.)
-
-malloc_getpagesize default: derive from system includes, or 4096.
- The system page size. To the extent possible, this malloc manages
- memory from the system in page-size units. This may be (and
- usually is) a function rather than a constant. This is ignored
- if WIN32, where page size is determined using getSystemInfo during
- initialization.
-
-USE_DEV_RANDOM default: 0 (i.e., not used)
- Causes malloc to use /dev/random to initialize secure magic seed for
- stamping footers. Otherwise, the current time is used.
-
-NO_MALLINFO default: 0
- If defined, don't compile "mallinfo". This can be a simple way
- of dealing with mismatches between system declarations and
- those in this file.
-
-MALLINFO_FIELD_TYPE default: size_t
- The type of the fields in the mallinfo struct. This was originally
- defined as "int" in SVID etc, but is more usefully defined as
- size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set
-
-NO_MALLOC_STATS default: 0
- If defined, don't compile "malloc_stats". This avoids calls to
- fprintf and bringing in stdio dependencies you might not want.
-
-REALLOC_ZERO_BYTES_FREES default: not defined
- This should be set if a call to realloc with zero bytes should
- be the same as a call to free. Some people think it should. Otherwise,
- since this malloc returns a unique pointer for malloc(0), so does
- realloc(p, 0).
-
-LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H
-LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H
-LACKS_STDLIB_H LACKS_SCHED_H LACKS_TIME_H default: NOT defined unless on WIN32
- Define these if your system does not have these header files.
- You might need to manually insert some of the declarations they provide.
-
-DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS,
- system_info.dwAllocationGranularity in WIN32,
- otherwise 64K.
- Also settable using mallopt(M_GRANULARITY, x)
- The unit for allocating and deallocating memory from the system. On
- most systems with contiguous MORECORE, there is no reason to
- make this more than a page. However, systems with MMAP tend to
- either require or encourage larger granularities. You can increase
- this value to prevent system allocation functions to be called so
- often, especially if they are slow. The value must be at least one
- page and must be a power of two. Setting to 0 causes initialization
- to either page size or win32 region size. (Note: In previous
- versions of malloc, the equivalent of this option was called
- "TOP_PAD")
-
-DEFAULT_TRIM_THRESHOLD default: 2MB
- Also settable using mallopt(M_TRIM_THRESHOLD, x)
- The maximum amount of unused top-most memory to keep before
- releasing via malloc_trim in free(). Automatic trimming is mainly
- useful in long-lived programs using contiguous MORECORE. Because
- trimming via sbrk can be slow on some systems, and can sometimes be
- wasteful (in cases where programs immediately afterward allocate
- more large chunks) the value should be high enough so that your
- overall system performance would improve by releasing this much
- memory. As a rough guide, you might set to a value close to the
- average size of a process (program) running on your system.
- Releasing this much memory would allow such a process to run in
- memory. Generally, it is worth tuning trim thresholds when a
- program undergoes phases where several large chunks are allocated
- and released in ways that can reuse each other's storage, perhaps
- mixed with phases where there are no such chunks at all. The trim
- value must be greater than page size to have any useful effect. To
- disable trimming completely, you can set to MAX_SIZE_T. Note that the trick
- some people use of mallocing a huge space and then freeing it at
- program startup, in an attempt to reserve system memory, doesn't
- have the intended effect under automatic trimming, since that memory
- will immediately be returned to the system.
-
-DEFAULT_MMAP_THRESHOLD default: 256K
- Also settable using mallopt(M_MMAP_THRESHOLD, x)
- The request size threshold for using MMAP to directly service a
- request. Requests of at least this size that cannot be allocated
- using already-existing space will be serviced via mmap. (If enough
- normal freed space already exists it is used instead.) Using mmap
- segregates relatively large chunks of memory so that they can be
- individually obtained and released from the host system. A request
- serviced through mmap is never reused by any other request (at least
- not directly; the system may just so happen to remap successive
- requests to the same locations). Segregating space in this way has
- the benefits that: Mmapped space can always be individually released
- back to the system, which helps keep the system level memory demands
- of a long-lived program low. Also, mapped memory doesn't become
- `locked' between other chunks, as can happen with normally allocated
- chunks, which means that even trimming via malloc_trim would not
- release them. However, it has the disadvantage that the space
- cannot be reclaimed, consolidated, and then used to service later
- requests, as happens with normal chunks. The advantages of mmap
- nearly always outweigh disadvantages for "large" chunks, but the
- value of "large" may vary across systems. The default is an
- empirically derived value that works well in most systems. You can
- disable mmap by setting to MAX_SIZE_T.
-
-MAX_RELEASE_CHECK_RATE default: 4095 unless not HAVE_MMAP
- The number of consolidated frees between checks to release
- unused segments when freeing. When using non-contiguous segments,
- especially with multiple mspaces, checking only for topmost space
- doesn't always suffice to trigger trimming. To compensate for this,
- free() will, with a period of MAX_RELEASE_CHECK_RATE (or the
- current number of segments, if greater) try to release unused
- segments to the OS when freeing chunks that result in
- consolidation. The best value for this parameter is a compromise
- between slowing down frees with relatively costly checks that
- rarely trigger versus holding on to unused memory. To effectively
- disable, set to MAX_SIZE_T. This may lead to a very slight speed
- improvement at the expense of carrying around more memory.
-*/
-
-/* Version identifier to allow people to support multiple versions */
-#ifndef DLMALLOC_VERSION
-#define DLMALLOC_VERSION 20806
-#endif /* DLMALLOC_VERSION */
-
-#ifndef DLMALLOC_EXPORT
-#define DLMALLOC_EXPORT extern
-#endif
-
-#ifndef WIN32
-#ifdef _WIN32
-#define WIN32 1
-#endif /* _WIN32 */
-#ifdef _WIN32_WCE
-#define LACKS_FCNTL_H
-#define WIN32 1
-#endif /* _WIN32_WCE */
-#endif /* WIN32 */
-#ifdef WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <tchar.h>
-#define HAVE_MMAP 1
-#define HAVE_MORECORE 0
-#define LACKS_UNISTD_H
-#define LACKS_SYS_PARAM_H
-#define LACKS_SYS_MMAN_H
-#define LACKS_STRING_H
-#define LACKS_STRINGS_H
-#define LACKS_SYS_TYPES_H
-#define LACKS_ERRNO_H
-#define LACKS_SCHED_H
-#ifndef MALLOC_FAILURE_ACTION
-#define MALLOC_FAILURE_ACTION
-#endif /* MALLOC_FAILURE_ACTION */
-#ifndef MMAP_CLEARS
-#ifdef _WIN32_WCE /* WINCE reportedly does not clear */
-#define MMAP_CLEARS 0
-#else
-#define MMAP_CLEARS 1
-#endif /* _WIN32_WCE */
-#endif /*MMAP_CLEARS */
-#endif /* WIN32 */
-
-#if defined(DARWIN) || defined(_DARWIN)
-/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */
-#ifndef HAVE_MORECORE
-#define HAVE_MORECORE 0
-#define HAVE_MMAP 1
-/* OSX allocators provide 16 byte alignment */
-#ifndef MALLOC_ALIGNMENT
-#define MALLOC_ALIGNMENT ((size_t)16U)
-#endif
-#endif /* HAVE_MORECORE */
-#endif /* DARWIN */
-
-#ifndef LACKS_SYS_TYPES_H
-#include <sys/types.h> /* For size_t */
-#endif /* LACKS_SYS_TYPES_H */
-
-/* The maximum possible size_t value has all bits set */
-#define MAX_SIZE_T (~(size_t)0)
-
-#ifndef USE_LOCKS /* ensure true if spin or recursive locks set */
-#define USE_LOCKS ((defined(USE_SPIN_LOCKS) && USE_SPIN_LOCKS != 0) || \
- (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0))
-#endif /* USE_LOCKS */
-
-#if USE_LOCKS /* Spin locks for gcc >= 4.1, older gcc on x86, MSC >= 1310 */
-#if ((defined(__GNUC__) && \
- ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \
- defined(__i386__) || defined(__x86_64__))) || \
- (defined(_MSC_VER) && _MSC_VER>=1310))
-#ifndef USE_SPIN_LOCKS
-#define USE_SPIN_LOCKS 1
-#endif /* USE_SPIN_LOCKS */
-#elif USE_SPIN_LOCKS
-#error "USE_SPIN_LOCKS defined without implementation"
-#endif /* ... locks available... */
-#elif !defined(USE_SPIN_LOCKS)
-#define USE_SPIN_LOCKS 0
-#endif /* USE_LOCKS */
-
-#ifndef ONLY_MSPACES
-#define ONLY_MSPACES 0
-#endif /* ONLY_MSPACES */
-#ifndef MSPACES
-#if ONLY_MSPACES
-#define MSPACES 1
-#else /* ONLY_MSPACES */
-#define MSPACES 0
-#endif /* ONLY_MSPACES */
-#endif /* MSPACES */
-#ifndef MALLOC_ALIGNMENT
-#define MALLOC_ALIGNMENT ((size_t)(2 * sizeof(void *)))
-#endif /* MALLOC_ALIGNMENT */
-#ifndef FOOTERS
-#define FOOTERS 0
-#endif /* FOOTERS */
-#ifndef ABORT
-#define ABORT abort()
-#endif /* ABORT */
-#ifndef ABORT_ON_ASSERT_FAILURE
-#define ABORT_ON_ASSERT_FAILURE 1
-#endif /* ABORT_ON_ASSERT_FAILURE */
-#ifndef PROCEED_ON_ERROR
-#define PROCEED_ON_ERROR 0
-#endif /* PROCEED_ON_ERROR */
-
-#ifndef INSECURE
-#define INSECURE 0
-#endif /* INSECURE */
-#ifndef MALLOC_INSPECT_ALL
-#define MALLOC_INSPECT_ALL 0
-#endif /* MALLOC_INSPECT_ALL */
-#ifndef HAVE_MMAP
-#define HAVE_MMAP 1
-#endif /* HAVE_MMAP */
-#ifndef MMAP_CLEARS
-#define MMAP_CLEARS 1
-#endif /* MMAP_CLEARS */
-#ifndef HAVE_MREMAP
-#ifdef linux
-#define HAVE_MREMAP 1
-#define _GNU_SOURCE /* Turns on mremap() definition */
-#else /* linux */
-#define HAVE_MREMAP 0
-#endif /* linux */
-#endif /* HAVE_MREMAP */
-#ifndef MALLOC_FAILURE_ACTION
-#define MALLOC_FAILURE_ACTION errno = ENOMEM;
-#endif /* MALLOC_FAILURE_ACTION */
-#ifndef HAVE_MORECORE
-#if ONLY_MSPACES
-#define HAVE_MORECORE 0
-#else /* ONLY_MSPACES */
-#define HAVE_MORECORE 1
-#endif /* ONLY_MSPACES */
-#endif /* HAVE_MORECORE */
-#if !HAVE_MORECORE
-#define MORECORE_CONTIGUOUS 0
-#else /* !HAVE_MORECORE */
-#define MORECORE_DEFAULT sbrk
-#ifndef MORECORE_CONTIGUOUS
-#define MORECORE_CONTIGUOUS 1
-#endif /* MORECORE_CONTIGUOUS */
-#endif /* HAVE_MORECORE */
-#ifndef DEFAULT_GRANULARITY
-#if (MORECORE_CONTIGUOUS || defined(WIN32))
-#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */
-#else /* MORECORE_CONTIGUOUS */
-#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
-#endif /* MORECORE_CONTIGUOUS */
-#endif /* DEFAULT_GRANULARITY */
-#ifndef DEFAULT_TRIM_THRESHOLD
-#ifndef MORECORE_CANNOT_TRIM
-#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
-#else /* MORECORE_CANNOT_TRIM */
-#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
-#endif /* MORECORE_CANNOT_TRIM */
-#endif /* DEFAULT_TRIM_THRESHOLD */
-#ifndef DEFAULT_MMAP_THRESHOLD
-#if HAVE_MMAP
-#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
-#else /* HAVE_MMAP */
-#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
-#endif /* HAVE_MMAP */
-#endif /* DEFAULT_MMAP_THRESHOLD */
-#ifndef MAX_RELEASE_CHECK_RATE
-#if HAVE_MMAP
-#define MAX_RELEASE_CHECK_RATE 4095
-#else
-#define MAX_RELEASE_CHECK_RATE MAX_SIZE_T
-#endif /* HAVE_MMAP */
-#endif /* MAX_RELEASE_CHECK_RATE */
-#ifndef USE_BUILTIN_FFS
-#define USE_BUILTIN_FFS 0
-#endif /* USE_BUILTIN_FFS */
-#ifndef USE_DEV_RANDOM
-#define USE_DEV_RANDOM 0
-#endif /* USE_DEV_RANDOM */
-#ifndef NO_MALLINFO
-#define NO_MALLINFO 0
-#endif /* NO_MALLINFO */
-#ifndef MALLINFO_FIELD_TYPE
-#define MALLINFO_FIELD_TYPE size_t
-#endif /* MALLINFO_FIELD_TYPE */
-#ifndef NO_MALLOC_STATS
-#define NO_MALLOC_STATS 0
-#endif /* NO_MALLOC_STATS */
-#ifndef NO_SEGMENT_TRAVERSAL
-#define NO_SEGMENT_TRAVERSAL 0
-#endif /* NO_SEGMENT_TRAVERSAL */
-
-/*
- mallopt tuning options. SVID/XPG defines four standard parameter
- numbers for mallopt, normally defined in malloc.h. None of these
- are used in this malloc, so setting them has no effect. But this
- malloc does support the following options.
-*/
-
-#define M_TRIM_THRESHOLD (-1)
-#define M_GRANULARITY (-2)
-#define M_MMAP_THRESHOLD (-3)
-
-/* ------------------------ Mallinfo declarations ------------------------ */
-
-#if !NO_MALLINFO
-/*
- This version of malloc supports the standard SVID/XPG mallinfo
- routine that returns a struct containing usage properties and
- statistics. It should work on any system that has a
- /usr/include/malloc.h defining struct mallinfo. The main
- declaration needed is the mallinfo struct that is returned (by-copy)
- by mallinfo(). The malloinfo struct contains a bunch of fields that
- are not even meaningful in this version of malloc. These fields are
- are instead filled by mallinfo() with other numbers that might be of
- interest.
-
- HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
- /usr/include/malloc.h file that includes a declaration of struct
- mallinfo. If so, it is included; else a compliant version is
- declared below. These must be precisely the same for mallinfo() to
- work. The original SVID version of this struct, defined on most
- systems with mallinfo, declares all fields as ints. But some others
- define as unsigned long. If your system defines the fields using a
- type of different width than listed here, you MUST #include your
- system version and #define HAVE_USR_INCLUDE_MALLOC_H.
-*/
-
-/* #define HAVE_USR_INCLUDE_MALLOC_H */
-
-#ifdef HAVE_USR_INCLUDE_MALLOC_H
-#include "/usr/include/malloc.h"
-#else /* HAVE_USR_INCLUDE_MALLOC_H */
-#ifndef STRUCT_MALLINFO_DECLARED
-/* HP-UX (and others?) redefines mallinfo unless _STRUCT_MALLINFO is defined */
-#define _STRUCT_MALLINFO
-#define STRUCT_MALLINFO_DECLARED 1
-struct mallinfo {
- MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */
- MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */
- MALLINFO_FIELD_TYPE smblks; /* always 0 */
- MALLINFO_FIELD_TYPE hblks; /* always 0 */
- MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */
- MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */
- MALLINFO_FIELD_TYPE fsmblks; /* always 0 */
- MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
- MALLINFO_FIELD_TYPE fordblks; /* total free space */
- MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
-};
-#endif /* STRUCT_MALLINFO_DECLARED */
-#endif /* HAVE_USR_INCLUDE_MALLOC_H */
-#endif /* NO_MALLINFO */
-
-/*
- Try to persuade compilers to inline. The most critical functions for
- inlining are defined as macros, so these aren't used for them.
-*/
-
-#ifndef FORCEINLINE
- #if defined(__GNUC__)
-#define FORCEINLINE __inline __attribute__ ((always_inline))
- #elif defined(_MSC_VER)
- #define FORCEINLINE __forceinline
- #endif
-#endif
-#ifndef NOINLINE
- #if defined(__GNUC__)
- #define NOINLINE __attribute__ ((noinline))
- #elif defined(_MSC_VER)
- #define NOINLINE __declspec(noinline)
- #else
- #define NOINLINE
- #endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#ifndef FORCEINLINE
- #define FORCEINLINE inline
-#endif
-#endif /* __cplusplus */
-#ifndef FORCEINLINE
- #define FORCEINLINE
-#endif
-
-#if !ONLY_MSPACES
-
-/* ------------------- Declarations of public routines ------------------- */
-
-#ifndef USE_DL_PREFIX
-#define dlcalloc calloc
-#define dlfree free
-#define dlmalloc malloc
-#define dlmemalign memalign
-#define dlposix_memalign posix_memalign
-#define dlrealloc realloc
-#define dlrealloc_in_place realloc_in_place
-#define dlvalloc valloc
-#define dlpvalloc pvalloc
-#define dlmallinfo mallinfo
-#define dlmallopt mallopt
-#define dlmalloc_trim malloc_trim
-#define dlmalloc_stats malloc_stats
-#define dlmalloc_usable_size malloc_usable_size
-#define dlmalloc_footprint malloc_footprint
-#define dlmalloc_max_footprint malloc_max_footprint
-#define dlmalloc_footprint_limit malloc_footprint_limit
-#define dlmalloc_set_footprint_limit malloc_set_footprint_limit
-#define dlmalloc_inspect_all malloc_inspect_all
-#define dlindependent_calloc independent_calloc
-#define dlindependent_comalloc independent_comalloc
-#define dlbulk_free bulk_free
-#endif /* USE_DL_PREFIX */
-
-/*
- malloc(size_t n)
- Returns a pointer to a newly allocated chunk of at least n bytes, or
- null if no space is available, in which case errno is set to ENOMEM
- on ANSI C systems.
-
- If n is zero, malloc returns a minimum-sized chunk. (The minimum
- size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
- systems.) Note that size_t is an unsigned type, so calls with
- arguments that would be negative if signed are interpreted as
- requests for huge amounts of space, which will often fail. The
- maximum supported value of n differs across systems, but is in all
- cases less than the maximum representable value of a size_t.
-*/
-DLMALLOC_EXPORT void* dlmalloc(size_t);
-
-/*
- free(void* p)
- Releases the chunk of memory pointed to by p, that had been previously
- allocated using malloc or a related routine such as realloc.
- It has no effect if p is null. If p was not malloced or already
- freed, free(p) will by default cause the current program to abort.
-*/
-DLMALLOC_EXPORT void dlfree(void*);
-
-/*
- calloc(size_t n_elements, size_t element_size);
- Returns a pointer to n_elements * element_size bytes, with all locations
- set to zero.
-*/
-DLMALLOC_EXPORT void* dlcalloc(size_t, size_t);
-
-/*
- realloc(void* p, size_t n)
- Returns a pointer to a chunk of size n that contains the same data
- as does chunk p up to the minimum of (n, p's size) bytes, or null
- if no space is available.
-
- The returned pointer may or may not be the same as p. The algorithm
- prefers extending p in most cases when possible, otherwise it
- employs the equivalent of a malloc-copy-free sequence.
-
- If p is null, realloc is equivalent to malloc.
-
- If space is not available, realloc returns null, errno is set (if on
- ANSI) and p is NOT freed.
-
- if n is for fewer bytes than already held by p, the newly unused
- space is lopped off and freed if possible. realloc with a size
- argument of zero (re)allocates a minimum-sized chunk.
-
- The old unix realloc convention of allowing the last-free'd chunk
- to be used as an argument to realloc is not supported.
-*/
-DLMALLOC_EXPORT void* dlrealloc(void*, size_t);
-
-/*
- realloc_in_place(void* p, size_t n)
- Resizes the space allocated for p to size n, only if this can be
- done without moving p (i.e., only if there is adjacent space
- available if n is greater than p's current allocated size, or n is
- less than or equal to p's size). This may be used instead of plain
- realloc if an alternative allocation strategy is needed upon failure
- to expand space; for example, reallocation of a buffer that must be
- memory-aligned or cleared. You can use realloc_in_place to trigger
- these alternatives only when needed.
-
- Returns p if successful; otherwise null.
-*/
-DLMALLOC_EXPORT void* dlrealloc_in_place(void*, size_t);
-
-/*
- memalign(size_t alignment, size_t n);
- Returns a pointer to a newly allocated chunk of n bytes, aligned
- in accord with the alignment argument.
-
- The alignment argument should be a power of two. If the argument is
- not a power of two, the nearest greater power is used.
- 8-byte alignment is guaranteed by normal malloc calls, so don't
- bother calling memalign with an argument of 8 or less.
-
- Overreliance on memalign is a sure way to fragment space.
-*/
-DLMALLOC_EXPORT void* dlmemalign(size_t, size_t);
-
-/*
- int posix_memalign(void** pp, size_t alignment, size_t n);
- Allocates a chunk of n bytes, aligned in accord with the alignment
- argument. Differs from memalign only in that it (1) assigns the
- allocated memory to *pp rather than returning it, (2) fails and
- returns EINVAL if the alignment is not a power of two (3) fails and
- returns ENOMEM if memory cannot be allocated.
-*/
-DLMALLOC_EXPORT int dlposix_memalign(void**, size_t, size_t);
-
-/*
- valloc(size_t n);
- Equivalent to memalign(pagesize, n), where pagesize is the page
- size of the system. If the pagesize is unknown, 4096 is used.
-*/
-DLMALLOC_EXPORT void* dlvalloc(size_t);
-
-/*
- mallopt(int parameter_number, int parameter_value)
- Sets tunable parameters The format is to provide a
- (parameter-number, parameter-value) pair. mallopt then sets the
- corresponding parameter to the argument value if it can (i.e., so
- long as the value is meaningful), and returns 1 if successful else
- 0. To workaround the fact that mallopt is specified to use int,
- not size_t parameters, the value -1 is specially treated as the
- maximum unsigned size_t value.
-
- SVID/XPG/ANSI defines four standard param numbers for mallopt,
- normally defined in malloc.h. None of these are use in this malloc,
- so setting them has no effect. But this malloc also supports other
- options in mallopt. See below for details. Briefly, supported
- parameters are as follows (listed defaults are for "typical"
- configurations).
-
- Symbol param # default allowed param values
- M_TRIM_THRESHOLD -1 2*1024*1024 any (-1 disables)
- M_GRANULARITY -2 page size any power of 2 >= page size
- M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support)
-*/
-DLMALLOC_EXPORT int dlmallopt(int, int);
-
-/*
- malloc_footprint();
- Returns the number of bytes obtained from the system. The total
- number of bytes allocated by malloc, realloc etc., is less than this
- value. Unlike mallinfo, this function returns only a precomputed
- result, so can be called frequently to monitor memory consumption.
- Even if locks are otherwise defined, this function does not use them,
- so results might not be up to date.
-*/
-DLMALLOC_EXPORT size_t dlmalloc_footprint(void);
-
-/*
- malloc_max_footprint();
- Returns the maximum number of bytes obtained from the system. This
- value will be greater than current footprint if deallocated space
- has been reclaimed by the system. The peak number of bytes allocated
- by malloc, realloc etc., is less than this value. Unlike mallinfo,
- this function returns only a precomputed result, so can be called
- frequently to monitor memory consumption. Even if locks are
- otherwise defined, this function does not use them, so results might
- not be up to date.
-*/
-DLMALLOC_EXPORT size_t dlmalloc_max_footprint(void);
-
-/*
- malloc_footprint_limit();
- Returns the number of bytes that the heap is allowed to obtain from
- the system, returning the last value returned by
- malloc_set_footprint_limit, or the maximum size_t value if
- never set. The returned value reflects a permission. There is no
- guarantee that this number of bytes can actually be obtained from
- the system.
-*/
-DLMALLOC_EXPORT size_t dlmalloc_footprint_limit();
-
-/*
- malloc_set_footprint_limit();
- Sets the maximum number of bytes to obtain from the system, causing
- failure returns from malloc and related functions upon attempts to
- exceed this value. The argument value may be subject to page
- rounding to an enforceable limit; this actual value is returned.
- Using an argument of the maximum possible size_t effectively
- disables checks. If the argument is less than or equal to the
- current malloc_footprint, then all future allocations that require
- additional system memory will fail. However, invocation cannot
- retroactively deallocate existing used memory.
-*/
-DLMALLOC_EXPORT size_t dlmalloc_set_footprint_limit(size_t bytes);
-
-#if MALLOC_INSPECT_ALL
-/*
- malloc_inspect_all(void(*handler)(void *start,
- void *end,
- size_t used_bytes,
- void* callback_arg),
- void* arg);
- Traverses the heap and calls the given handler for each managed
- region, skipping all bytes that are (or may be) used for bookkeeping
- purposes. Traversal does not include include chunks that have been
- directly memory mapped. Each reported region begins at the start
- address, and continues up to but not including the end address. The
- first used_bytes of the region contain allocated data. If
- used_bytes is zero, the region is unallocated. The handler is
- invoked with the given callback argument. If locks are defined, they
- are held during the entire traversal. It is a bad idea to invoke
- other malloc functions from within the handler.
-
- For example, to count the number of in-use chunks with size greater
- than 1000, you could write:
- static int count = 0;
- void count_chunks(void* start, void* end, size_t used, void* arg) {
- if (used >= 1000) ++count;
- }
- then:
- malloc_inspect_all(count_chunks, NULL);
-
- malloc_inspect_all is compiled only if MALLOC_INSPECT_ALL is defined.
-*/
-DLMALLOC_EXPORT void dlmalloc_inspect_all(void(*handler)(void*, void *, size_t, void*),
- void* arg);
-
-#endif /* MALLOC_INSPECT_ALL */
-
-#if !NO_MALLINFO
-/*
- mallinfo()
- Returns (by copy) a struct containing various summary statistics:
-
- arena: current total non-mmapped bytes allocated from system
- ordblks: the number of free chunks
- smblks: always zero.
- hblks: current number of mmapped regions
- hblkhd: total bytes held in mmapped regions
- usmblks: the maximum total allocated space. This will be greater
- than current total if trimming has occurred.
- fsmblks: always zero
- uordblks: current total allocated space (normal or mmapped)
- fordblks: total free space
- keepcost: the maximum number of bytes that could ideally be released
- back to system via malloc_trim. ("ideally" means that
- it ignores page restrictions etc.)
-
- Because these fields are ints, but internal bookkeeping may
- be kept as longs, the reported values may wrap around zero and
- thus be inaccurate.
-*/
-DLMALLOC_EXPORT struct mallinfo dlmallinfo(void);
-#endif /* NO_MALLINFO */
-
-/*
- independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
-
- independent_calloc is similar to calloc, but instead of returning a
- single cleared space, it returns an array of pointers to n_elements
- independent elements that can hold contents of size elem_size, each
- of which starts out cleared, and can be independently freed,
- realloc'ed etc. The elements are guaranteed to be adjacently
- allocated (this is not guaranteed to occur with multiple callocs or
- mallocs), which may also improve cache locality in some
- applications.
-
- The "chunks" argument is optional (i.e., may be null, which is
- probably the most typical usage). If it is null, the returned array
- is itself dynamically allocated and should also be freed when it is
- no longer needed. Otherwise, the chunks array must be of at least
- n_elements in length. It is filled in with the pointers to the
- chunks.
-
- In either case, independent_calloc returns this pointer array, or
- null if the allocation failed. If n_elements is zero and "chunks"
- is null, it returns a chunk representing an array with zero elements
- (which should be freed if not wanted).
-
- Each element must be freed when it is no longer needed. This can be
- done all at once using bulk_free.
-
- independent_calloc simplifies and speeds up implementations of many
- kinds of pools. It may also be useful when constructing large data
- structures that initially have a fixed number of fixed-sized nodes,
- but the number is not known at compile time, and some of the nodes
- may later need to be freed. For example:
-
- struct Node { int item; struct Node* next; };
-
- struct Node* build_list() {
- struct Node** pool;
- int n = read_number_of_nodes_needed();
- if (n <= 0) return 0;
- pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
- if (pool == 0) die();
- // organize into a linked list...
- struct Node* first = pool[0];
- for (i = 0; i < n-1; ++i)
- pool[i]->next = pool[i+1];
- free(pool); // Can now free the array (or not, if it is needed later)
- return first;
- }
-*/
-DLMALLOC_EXPORT void** dlindependent_calloc(size_t, size_t, void**);
-
-/*
- independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
-
- independent_comalloc allocates, all at once, a set of n_elements
- chunks with sizes indicated in the "sizes" array. It returns
- an array of pointers to these elements, each of which can be
- independently freed, realloc'ed etc. The elements are guaranteed to
- be adjacently allocated (this is not guaranteed to occur with
- multiple callocs or mallocs), which may also improve cache locality
- in some applications.
-
- The "chunks" argument is optional (i.e., may be null). If it is null
- the returned array is itself dynamically allocated and should also
- be freed when it is no longer needed. Otherwise, the chunks array
- must be of at least n_elements in length. It is filled in with the
- pointers to the chunks.
-
- In either case, independent_comalloc returns this pointer array, or
- null if the allocation failed. If n_elements is zero and chunks is
- null, it returns a chunk representing an array with zero elements
- (which should be freed if not wanted).
-
- Each element must be freed when it is no longer needed. This can be
- done all at once using bulk_free.
-
- independent_comallac differs from independent_calloc in that each
- element may have a different size, and also that it does not
- automatically clear elements.
-
- independent_comalloc can be used to speed up allocation in cases
- where several structs or objects must always be allocated at the
- same time. For example:
-
- struct Head { ... }
- struct Foot { ... }
-
- void send_message(char* msg) {
- int msglen = strlen(msg);
- size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
- void* chunks[3];
- if (independent_comalloc(3, sizes, chunks) == 0)
- die();
- struct Head* head = (struct Head*)(chunks[0]);
- char* body = (char*)(chunks[1]);
- struct Foot* foot = (struct Foot*)(chunks[2]);
- // ...
- }
-
- In general though, independent_comalloc is worth using only for
- larger values of n_elements. For small values, you probably won't
- detect enough difference from series of malloc calls to bother.
-
- Overuse of independent_comalloc can increase overall memory usage,
- since it cannot reuse existing noncontiguous small chunks that
- might be available for some of the elements.
-*/
-DLMALLOC_EXPORT void** dlindependent_comalloc(size_t, size_t*, void**);
-
-/*
- bulk_free(void* array[], size_t n_elements)
- Frees and clears (sets to null) each non-null pointer in the given
- array. This is likely to be faster than freeing them one-by-one.
- If footers are used, pointers that have been allocated in different
- mspaces are not freed or cleared, and the count of all such pointers
- is returned. For large arrays of pointers with poor locality, it
- may be worthwhile to sort this array before calling bulk_free.
-*/
-DLMALLOC_EXPORT size_t dlbulk_free(void**, size_t n_elements);
-
-/*
- pvalloc(size_t n);
- Equivalent to valloc(minimum-page-that-holds(n)), that is,
- round up n to nearest pagesize.
- */
-DLMALLOC_EXPORT void* dlpvalloc(size_t);
-
-/*
- malloc_trim(size_t pad);
-
- If possible, gives memory back to the system (via negative arguments
- to sbrk) if there is unused memory at the `high' end of the malloc
- pool or in unused MMAP segments. You can call this after freeing
- large blocks of memory to potentially reduce the system-level memory
- requirements of a program. However, it cannot guarantee to reduce
- memory. Under some allocation patterns, some large free blocks of
- memory will be locked between two used chunks, so they cannot be
- given back to the system.
-
- The `pad' argument to malloc_trim represents the amount of free
- trailing space to leave untrimmed. If this argument is zero, only
- the minimum amount of memory to maintain internal data structures
- will be left. Non-zero arguments can be supplied to maintain enough
- trailing space to service future expected allocations without having
- to re-obtain memory from the system.
-
- Malloc_trim returns 1 if it actually released any memory, else 0.
-*/
-DLMALLOC_EXPORT int dlmalloc_trim(size_t);
-
-/*
- malloc_stats();
- Prints on stderr the amount of space obtained from the system (both
- via sbrk and mmap), the maximum amount (which may be more than
- current if malloc_trim and/or munmap got called), and the current
- number of bytes allocated via malloc (or realloc, etc) but not yet
- freed. Note that this is the number of bytes allocated, not the
- number requested. It will be larger than the number requested
- because of alignment and bookkeeping overhead. Because it includes
- alignment wastage as being in use, this figure may be greater than
- zero even when no user-level chunks are allocated.
-
- The reported current and maximum system memory can be inaccurate if
- a program makes other calls to system memory allocation functions
- (normally sbrk) outside of malloc.
-
- malloc_stats prints only the most commonly interesting statistics.
- More information can be obtained by calling mallinfo.
-*/
-DLMALLOC_EXPORT void dlmalloc_stats(void);
-
-/*
- malloc_usable_size(void* p);
-
- Returns the number of bytes you can actually use in
- an allocated chunk, which may be more than you requested (although
- often not) due to alignment and minimum size constraints.
- You can use this many bytes without worrying about
- overwriting other allocated objects. This is not a particularly great
- programming practice. malloc_usable_size can be more useful in
- debugging and assertions, for example:
-
- p = malloc(n);
- assert(malloc_usable_size(p) >= 256);
-*/
-/* BEGIN android-changed: added const */
-size_t dlmalloc_usable_size(const void*);
-/* END android-change */
-
-#endif /* ONLY_MSPACES */
-
-#if MSPACES
-
-/*
- mspace is an opaque type representing an independent
- region of space that supports mspace_malloc, etc.
-*/
-typedef void* mspace;
-
-/*
- create_mspace creates and returns a new independent space with the
- given initial capacity, or, if 0, the default granularity size. It
- returns null if there is no system memory available to create the
- space. If argument locked is non-zero, the space uses a separate
- lock to control access. The capacity of the space will grow
- dynamically as needed to service mspace_malloc requests. You can
- control the sizes of incremental increases of this space by
- compiling with a different DEFAULT_GRANULARITY or dynamically
- setting with mallopt(M_GRANULARITY, value).
-*/
-DLMALLOC_EXPORT mspace create_mspace(size_t capacity, int locked);
-
-/*
- destroy_mspace destroys the given space, and attempts to return all
- of its memory back to the system, returning the total number of
- bytes freed. After destruction, the results of access to all memory
- used by the space become undefined.
-*/
-DLMALLOC_EXPORT size_t destroy_mspace(mspace msp);
-
-/*
- create_mspace_with_base uses the memory supplied as the initial base
- of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
- space is used for bookkeeping, so the capacity must be at least this
- large. (Otherwise 0 is returned.) When this initial space is
- exhausted, additional memory will be obtained from the system.
- Destroying this space will deallocate all additionally allocated
- space (if possible) but not the initial base.
-*/
-DLMALLOC_EXPORT mspace create_mspace_with_base(void* base, size_t capacity, int locked);
-
-/*
- mspace_track_large_chunks controls whether requests for large chunks
- are allocated in their own untracked mmapped regions, separate from
- others in this mspace. By default large chunks are not tracked,
- which reduces fragmentation. However, such chunks are not
- necessarily released to the system upon destroy_mspace. Enabling
- tracking by setting to true may increase fragmentation, but avoids
- leakage when relying on destroy_mspace to release all memory
- allocated using this space. The function returns the previous
- setting.
-*/
-DLMALLOC_EXPORT int mspace_track_large_chunks(mspace msp, int enable);
-
-
-/*
- mspace_malloc behaves as malloc, but operates within
- the given space.
-*/
-DLMALLOC_EXPORT void* mspace_malloc(mspace msp, size_t bytes);
-
-/*
- mspace_free behaves as free, but operates within
- the given space.
-
- If compiled with FOOTERS==1, mspace_free is not actually needed.
- free may be called instead of mspace_free because freed chunks from
- any space are handled by their originating spaces.
-*/
-DLMALLOC_EXPORT void mspace_free(mspace msp, void* mem);
-
-/*
- mspace_realloc behaves as realloc, but operates within
- the given space.
-
- If compiled with FOOTERS==1, mspace_realloc is not actually
- needed. realloc may be called instead of mspace_realloc because
- realloced chunks from any space are handled by their originating
- spaces.
-*/
-DLMALLOC_EXPORT void* mspace_realloc(mspace msp, void* mem, size_t newsize);
-
-/*
- mspace_calloc behaves as calloc, but operates within
- the given space.
-*/
-DLMALLOC_EXPORT void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
-
-/*
- mspace_memalign behaves as memalign, but operates within
- the given space.
-*/
-DLMALLOC_EXPORT void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
-
-/*
- mspace_independent_calloc behaves as independent_calloc, but
- operates within the given space.
-*/
-DLMALLOC_EXPORT void** mspace_independent_calloc(mspace msp, size_t n_elements,
- size_t elem_size, void* chunks[]);
-
-/*
- mspace_independent_comalloc behaves as independent_comalloc, but
- operates within the given space.
-*/
-DLMALLOC_EXPORT void** mspace_independent_comalloc(mspace msp, size_t n_elements,
- size_t sizes[], void* chunks[]);
-
-/*
- mspace_footprint() returns the number of bytes obtained from the
- system for this space.
-*/
-DLMALLOC_EXPORT size_t mspace_footprint(mspace msp);
-
-/*
- mspace_max_footprint() returns the peak number of bytes obtained from the
- system for this space.
-*/
-DLMALLOC_EXPORT size_t mspace_max_footprint(mspace msp);
-
-
-#if !NO_MALLINFO
-/*
- mspace_mallinfo behaves as mallinfo, but reports properties of
- the given space.
-*/
-DLMALLOC_EXPORT struct mallinfo mspace_mallinfo(mspace msp);
-#endif /* NO_MALLINFO */
-
-/*
- malloc_usable_size(void* p) behaves the same as malloc_usable_size;
-*/
-DLMALLOC_EXPORT size_t mspace_usable_size(const void* mem);
-
-/*
- mspace_malloc_stats behaves as malloc_stats, but reports
- properties of the given space.
-*/
-DLMALLOC_EXPORT void mspace_malloc_stats(mspace msp);
-
-/*
- mspace_trim behaves as malloc_trim, but
- operates within the given space.
-*/
-DLMALLOC_EXPORT int mspace_trim(mspace msp, size_t pad);
-
-/*
- An alias for mallopt.
-*/
-DLMALLOC_EXPORT int mspace_mallopt(int, int);
-
-#endif /* MSPACES */
-
-#ifdef __cplusplus
-} /* end of extern "C" */
-#endif /* __cplusplus */
-
-/*
- ========================================================================
- To make a fully customizable malloc.h header file, cut everything
- above this line, put into file malloc.h, edit to suit, and #include it
- on the next line, as well as in programs that use this malloc.
- ========================================================================
-*/
-
-/* #include "malloc.h" */
-
-/*------------------------------ internal #includes ---------------------- */
-
-#ifdef _MSC_VER
-#pragma warning( disable : 4146 ) /* no "unsigned" warnings */
-#endif /* _MSC_VER */
-#if !NO_MALLOC_STATS
-#include <stdio.h> /* for printing in malloc_stats */
-#endif /* NO_MALLOC_STATS */
-#ifndef LACKS_ERRNO_H
-#include <errno.h> /* for MALLOC_FAILURE_ACTION */
-#endif /* LACKS_ERRNO_H */
-#ifdef DEBUG
-#if ABORT_ON_ASSERT_FAILURE
-#undef assert
-#define assert(x) if(!(x)) ABORT
-#else /* ABORT_ON_ASSERT_FAILURE */
-#include <assert.h>
-#endif /* ABORT_ON_ASSERT_FAILURE */
-#else /* DEBUG */
-#ifndef assert
-#define assert(x)
-#endif
-#define DEBUG 0
-#endif /* DEBUG */
-#if !defined(WIN32) && !defined(LACKS_TIME_H)
-#include <time.h> /* for magic initialization */
-#endif /* WIN32 */
-#ifndef LACKS_STDLIB_H
-#include <stdlib.h> /* for abort() */
-#endif /* LACKS_STDLIB_H */
-#ifndef LACKS_STRING_H
-#include <string.h> /* for memset etc */
-#endif /* LACKS_STRING_H */
-#if USE_BUILTIN_FFS
-#ifndef LACKS_STRINGS_H
-#include <strings.h> /* for ffs */
-#endif /* LACKS_STRINGS_H */
-#endif /* USE_BUILTIN_FFS */
-#if HAVE_MMAP
-#ifndef LACKS_SYS_MMAN_H
-/* On some versions of linux, mremap decl in mman.h needs __USE_GNU set */
-#if (defined(linux) && !defined(__USE_GNU))
-#define __USE_GNU 1
-#include <sys/mman.h> /* for mmap */
-#undef __USE_GNU
-#else
-#include <sys/mman.h> /* for mmap */
-#endif /* linux */
-#endif /* LACKS_SYS_MMAN_H */
-#ifndef LACKS_FCNTL_H
-#include <fcntl.h>
-#endif /* LACKS_FCNTL_H */
-#endif /* HAVE_MMAP */
-#ifndef LACKS_UNISTD_H
-#include <unistd.h> /* for sbrk, sysconf */
-#else /* LACKS_UNISTD_H */
-#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
-extern void* sbrk(ptrdiff_t);
-#endif /* FreeBSD etc */
-#endif /* LACKS_UNISTD_H */
-
-/* Declarations for locking */
-#if USE_LOCKS
-#ifndef WIN32
-#if defined (__SVR4) && defined (__sun) /* solaris */
-#include <thread.h>
-#elif !defined(LACKS_SCHED_H)
-#include <sched.h>
-#endif /* solaris or LACKS_SCHED_H */
-#if (defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0) || !USE_SPIN_LOCKS
-#include <pthread.h>
-#endif /* USE_RECURSIVE_LOCKS ... */
-#elif defined(_MSC_VER)
-#ifndef _M_AMD64
-/* These are already defined on AMD64 builds */
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-LONG __cdecl _InterlockedCompareExchange(LONG volatile *Dest, LONG Exchange, LONG Comp);
-LONG __cdecl _InterlockedExchange(LONG volatile *Target, LONG Value);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* _M_AMD64 */
-#pragma intrinsic (_InterlockedCompareExchange)
-#pragma intrinsic (_InterlockedExchange)
-#define interlockedcompareexchange _InterlockedCompareExchange
-#define interlockedexchange _InterlockedExchange
-#elif defined(WIN32) && defined(__GNUC__)
-#define interlockedcompareexchange(a, b, c) __sync_val_compare_and_swap(a, c, b)
-#define interlockedexchange __sync_lock_test_and_set
-#endif /* Win32 */
-#else /* USE_LOCKS */
-#endif /* USE_LOCKS */
-
-#ifndef LOCK_AT_FORK
-#define LOCK_AT_FORK 0
-#endif
-
-/* Declarations for bit scanning on win32 */
-#if defined(_MSC_VER) && _MSC_VER>=1300
-#ifndef BitScanForward /* Try to avoid pulling in WinNT.h */
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-unsigned char _BitScanForward(unsigned long *index, unsigned long mask);
-unsigned char _BitScanReverse(unsigned long *index, unsigned long mask);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#define BitScanForward _BitScanForward
-#define BitScanReverse _BitScanReverse
-#pragma intrinsic(_BitScanForward)
-#pragma intrinsic(_BitScanReverse)
-#endif /* BitScanForward */
-#endif /* defined(_MSC_VER) && _MSC_VER>=1300 */
-
-#ifndef WIN32
-#ifndef malloc_getpagesize
-# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */
-# ifndef _SC_PAGE_SIZE
-# define _SC_PAGE_SIZE _SC_PAGESIZE
-# endif
-# endif
-# ifdef _SC_PAGE_SIZE
-# define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
-# else
-# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
- extern size_t getpagesize();
-# define malloc_getpagesize getpagesize()
-# else
-# ifdef WIN32 /* use supplied emulation of getpagesize */
-# define malloc_getpagesize getpagesize()
-# else
-# ifndef LACKS_SYS_PARAM_H
-# include <sys/param.h>
-# endif
-# ifdef EXEC_PAGESIZE
-# define malloc_getpagesize EXEC_PAGESIZE
-# else
-# ifdef NBPG
-# ifndef CLSIZE
-# define malloc_getpagesize NBPG
-# else
-# define malloc_getpagesize (NBPG * CLSIZE)
-# endif
-# else
-# ifdef NBPC
-# define malloc_getpagesize NBPC
-# else
-# ifdef PAGESIZE
-# define malloc_getpagesize PAGESIZE
-# else /* just guess */
-# define malloc_getpagesize ((size_t)4096U)
-# endif
-# endif
-# endif
-# endif
-# endif
-# endif
-# endif
-#endif
-#endif
-
-/* ------------------- size_t and alignment properties -------------------- */
-
-/* The byte and bit size of a size_t */
-#define SIZE_T_SIZE (sizeof(size_t))
-#define SIZE_T_BITSIZE (sizeof(size_t) << 3)
-
-/* Some constants coerced to size_t */
-/* Annoying but necessary to avoid errors on some platforms */
-#define SIZE_T_ZERO ((size_t)0)
-#define SIZE_T_ONE ((size_t)1)
-#define SIZE_T_TWO ((size_t)2)
-#define SIZE_T_FOUR ((size_t)4)
-#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1)
-#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2)
-#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
-#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U)
-
-/* The bit mask value corresponding to MALLOC_ALIGNMENT */
-#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE)
-
-/* True if address a has acceptable alignment */
-#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
-
-/* the number of bytes to offset an address to align it */
-#define align_offset(A)\
- ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
- ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
-
-/* -------------------------- MMAP preliminaries ------------------------- */
-
-/*
- If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
- checks to fail so compiler optimizer can delete code rather than
- using so many "#if"s.
-*/
-
-
-/* MORECORE and MMAP must return MFAIL on failure */
-#define MFAIL ((void*)(MAX_SIZE_T))
-#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */
-
-#if HAVE_MMAP
-
-#ifndef WIN32
-#define MUNMAP_DEFAULT(a, s) munmap((a), (s))
-#define MMAP_PROT (PROT_READ|PROT_WRITE)
-#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
-#define MAP_ANONYMOUS MAP_ANON
-#endif /* MAP_ANON */
-#ifdef MAP_ANONYMOUS
-#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
-#define MMAP_DEFAULT(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0)
-#else /* MAP_ANONYMOUS */
-/*
- Nearly all versions of mmap support MAP_ANONYMOUS, so the following
- is unlikely to be needed, but is supplied just in case.
-*/
-#define MMAP_FLAGS (MAP_PRIVATE)
-static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
-#define MMAP_DEFAULT(s) ((dev_zero_fd < 0) ? \
- (dev_zero_fd = open("/dev/zero", O_RDWR), \
- mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
- mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
-#endif /* MAP_ANONYMOUS */
-
-#define DIRECT_MMAP_DEFAULT(s) MMAP_DEFAULT(s)
-
-#else /* WIN32 */
-
-/* Win32 MMAP via VirtualAlloc */
-static FORCEINLINE void* win32mmap(size_t size) {
- void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
- return (ptr != 0)? ptr: MFAIL;
-}
-
-/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
-static FORCEINLINE void* win32direct_mmap(size_t size) {
- void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
- PAGE_READWRITE);
- return (ptr != 0)? ptr: MFAIL;
-}
-
-/* This function supports releasing coalesed segments */
-static FORCEINLINE int win32munmap(void* ptr, size_t size) {
- MEMORY_BASIC_INFORMATION minfo;
- char* cptr = (char*)ptr;
- while (size) {
- if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0)
- return -1;
- if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr ||
- minfo.State != MEM_COMMIT || minfo.RegionSize > size)
- return -1;
- if (VirtualFree(cptr, 0, MEM_RELEASE) == 0)
- return -1;
- cptr += minfo.RegionSize;
- size -= minfo.RegionSize;
- }
- return 0;
-}
-
-#define MMAP_DEFAULT(s) win32mmap(s)
-#define MUNMAP_DEFAULT(a, s) win32munmap((a), (s))
-#define DIRECT_MMAP_DEFAULT(s) win32direct_mmap(s)
-#endif /* WIN32 */
-#endif /* HAVE_MMAP */
-
-#if HAVE_MREMAP
-#ifndef WIN32
-#define MREMAP_DEFAULT(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
-#endif /* WIN32 */
-#endif /* HAVE_MREMAP */
-
-/**
- * Define CALL_MORECORE
- */
-#if HAVE_MORECORE
- #ifdef MORECORE
- #define CALL_MORECORE(S) MORECORE(S)
- #else /* MORECORE */
- #define CALL_MORECORE(S) MORECORE_DEFAULT(S)
- #endif /* MORECORE */
-#else /* HAVE_MORECORE */
- #define CALL_MORECORE(S) MFAIL
-#endif /* HAVE_MORECORE */
-
-/**
- * Define CALL_MMAP/CALL_MUNMAP/CALL_DIRECT_MMAP
- */
-#if HAVE_MMAP
- #define USE_MMAP_BIT (SIZE_T_ONE)
-
- #ifdef MMAP
- #define CALL_MMAP(s) MMAP(s)
- #else /* MMAP */
- #define CALL_MMAP(s) MMAP_DEFAULT(s)
- #endif /* MMAP */
- #ifdef MUNMAP
- #define CALL_MUNMAP(a, s) MUNMAP((a), (s))
- #else /* MUNMAP */
- #define CALL_MUNMAP(a, s) MUNMAP_DEFAULT((a), (s))
- #endif /* MUNMAP */
- #ifdef DIRECT_MMAP
- #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
- #else /* DIRECT_MMAP */
- #define CALL_DIRECT_MMAP(s) DIRECT_MMAP_DEFAULT(s)
- #endif /* DIRECT_MMAP */
-#else /* HAVE_MMAP */
- #define USE_MMAP_BIT (SIZE_T_ZERO)
-
- #define MMAP(s) MFAIL
- #define MUNMAP(a, s) (-1)
- #define DIRECT_MMAP(s) MFAIL
- #define CALL_DIRECT_MMAP(s) DIRECT_MMAP(s)
- #define CALL_MMAP(s) MMAP(s)
- #define CALL_MUNMAP(a, s) MUNMAP((a), (s))
-#endif /* HAVE_MMAP */
-
-/**
- * Define CALL_MREMAP
- */
-#if HAVE_MMAP && HAVE_MREMAP
- #ifdef MREMAP
- #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP((addr), (osz), (nsz), (mv))
- #else /* MREMAP */
- #define CALL_MREMAP(addr, osz, nsz, mv) MREMAP_DEFAULT((addr), (osz), (nsz), (mv))
- #endif /* MREMAP */
-#else /* HAVE_MMAP && HAVE_MREMAP */
- #define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
-#endif /* HAVE_MMAP && HAVE_MREMAP */
-
-/* mstate bit set if continguous morecore disabled or failed */
-#define USE_NONCONTIGUOUS_BIT (4U)
-
-/* segment bit set in create_mspace_with_base */
-#define EXTERN_BIT (8U)
-
-
-/* --------------------------- Lock preliminaries ------------------------ */
-
-/*
- When locks are defined, there is one global lock, plus
- one per-mspace lock.
-
- The global lock_ensures that mparams.magic and other unique
- mparams values are initialized only once. It also protects
- sequences of calls to MORECORE. In many cases sys_alloc requires
- two calls, that should not be interleaved with calls by other
- threads. This does not protect against direct calls to MORECORE
- by other threads not using this lock, so there is still code to
- cope the best we can on interference.
-
- Per-mspace locks surround calls to malloc, free, etc.
- By default, locks are simple non-reentrant mutexes.
-
- Because lock-protected regions generally have bounded times, it is
- OK to use the supplied simple spinlocks. Spinlocks are likely to
- improve performance for lightly contended applications, but worsen
- performance under heavy contention.
-
- If USE_LOCKS is > 1, the definitions of lock routines here are
- bypassed, in which case you will need to define the type MLOCK_T,
- and at least INITIAL_LOCK, DESTROY_LOCK, ACQUIRE_LOCK, RELEASE_LOCK
- and TRY_LOCK. You must also declare a
- static MLOCK_T malloc_global_mutex = { initialization values };.
-
-*/
-
-#if !USE_LOCKS
-#define USE_LOCK_BIT (0U)
-#define INITIAL_LOCK(l) (0)
-#define DESTROY_LOCK(l) (0)
-#define ACQUIRE_MALLOC_GLOBAL_LOCK()
-#define RELEASE_MALLOC_GLOBAL_LOCK()
-
-#else
-#if USE_LOCKS > 1
-/* ----------------------- User-defined locks ------------------------ */
-/* Define your own lock implementation here */
-/* #define INITIAL_LOCK(lk) ... */
-/* #define DESTROY_LOCK(lk) ... */
-/* #define ACQUIRE_LOCK(lk) ... */
-/* #define RELEASE_LOCK(lk) ... */
-/* #define TRY_LOCK(lk) ... */
-/* static MLOCK_T malloc_global_mutex = ... */
-
-#elif USE_SPIN_LOCKS
-
-/* First, define CAS_LOCK and CLEAR_LOCK on ints */
-/* Note CAS_LOCK defined to return 0 on success */
-
-#if defined(__GNUC__)&& (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))
-#define CAS_LOCK(sl) __sync_lock_test_and_set(sl, 1)
-#define CLEAR_LOCK(sl) __sync_lock_release(sl)
-
-#elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
-/* Custom spin locks for older gcc on x86 */
-static FORCEINLINE int x86_cas_lock(int *sl) {
- int ret;
- int val = 1;
- int cmp = 0;
- __asm__ __volatile__ ("lock; cmpxchgl %1, %2"
- : "=a" (ret)
- : "r" (val), "m" (*(sl)), "0"(cmp)
- : "memory", "cc");
- return ret;
-}
-
-static FORCEINLINE void x86_clear_lock(int* sl) {
- assert(*sl != 0);
- int prev = 0;
- int ret;
- __asm__ __volatile__ ("lock; xchgl %0, %1"
- : "=r" (ret)
- : "m" (*(sl)), "0"(prev)
- : "memory");
-}
-
-#define CAS_LOCK(sl) x86_cas_lock(sl)
-#define CLEAR_LOCK(sl) x86_clear_lock(sl)
-
-#else /* Win32 MSC */
-#define CAS_LOCK(sl) interlockedexchange(sl, (LONG)1)
-#define CLEAR_LOCK(sl) interlockedexchange (sl, (LONG)0)
-
-#endif /* ... gcc spins locks ... */
-
-/* How to yield for a spin lock */
-#define SPINS_PER_YIELD 63
-#if defined(_MSC_VER)
-#define SLEEP_EX_DURATION 50 /* delay for yield/sleep */
-#define SPIN_LOCK_YIELD SleepEx(SLEEP_EX_DURATION, FALSE)
-#elif defined (__SVR4) && defined (__sun) /* solaris */
-#define SPIN_LOCK_YIELD thr_yield();
-#elif !defined(LACKS_SCHED_H)
-#define SPIN_LOCK_YIELD sched_yield();
-#else
-#define SPIN_LOCK_YIELD
-#endif /* ... yield ... */
-
-#if !defined(USE_RECURSIVE_LOCKS) || USE_RECURSIVE_LOCKS == 0
-/* Plain spin locks use single word (embedded in malloc_states) */
-static int spin_acquire_lock(int *sl) {
- int spins = 0;
- while (*(volatile int *)sl != 0 || CAS_LOCK(sl)) {
- if ((++spins & SPINS_PER_YIELD) == 0) {
- SPIN_LOCK_YIELD;
- }
- }
- return 0;
-}
-
-#define MLOCK_T int
-#define TRY_LOCK(sl) !CAS_LOCK(sl)
-#define RELEASE_LOCK(sl) CLEAR_LOCK(sl)
-#define ACQUIRE_LOCK(sl) (CAS_LOCK(sl)? spin_acquire_lock(sl) : 0)
-#define INITIAL_LOCK(sl) (*sl = 0)
-#define DESTROY_LOCK(sl) (0)
-static MLOCK_T malloc_global_mutex = 0;
-
-#else /* USE_RECURSIVE_LOCKS */
-/* types for lock owners */
-#ifdef WIN32
-#define THREAD_ID_T DWORD
-#define CURRENT_THREAD GetCurrentThreadId()
-#define EQ_OWNER(X,Y) ((X) == (Y))
-#else
-/*
- Note: the following assume that pthread_t is a type that can be
- initialized to (casted) zero. If this is not the case, you will need to
- somehow redefine these or not use spin locks.
-*/
-#define THREAD_ID_T pthread_t
-#define CURRENT_THREAD pthread_self()
-#define EQ_OWNER(X,Y) pthread_equal(X, Y)
-#endif
-
-struct malloc_recursive_lock {
- int sl;
- unsigned int c;
- THREAD_ID_T threadid;
-};
-
-#define MLOCK_T struct malloc_recursive_lock
-static MLOCK_T malloc_global_mutex = { 0, 0, (THREAD_ID_T)0};
-
-static FORCEINLINE void recursive_release_lock(MLOCK_T *lk) {
- assert(lk->sl != 0);
- if (--lk->c == 0) {
- CLEAR_LOCK(&lk->sl);
- }
-}
-
-static FORCEINLINE int recursive_acquire_lock(MLOCK_T *lk) {
- THREAD_ID_T mythreadid = CURRENT_THREAD;
- int spins = 0;
- for (;;) {
- if (*((volatile int *)(&lk->sl)) == 0) {
- if (!CAS_LOCK(&lk->sl)) {
- lk->threadid = mythreadid;
- lk->c = 1;
- return 0;
- }
- }
- else if (EQ_OWNER(lk->threadid, mythreadid)) {
- ++lk->c;
- return 0;
- }
- if ((++spins & SPINS_PER_YIELD) == 0) {
- SPIN_LOCK_YIELD;
- }
- }
-}
-
-static FORCEINLINE int recursive_try_lock(MLOCK_T *lk) {
- THREAD_ID_T mythreadid = CURRENT_THREAD;
- if (*((volatile int *)(&lk->sl)) == 0) {
- if (!CAS_LOCK(&lk->sl)) {
- lk->threadid = mythreadid;
- lk->c = 1;
- return 1;
- }
- }
- else if (EQ_OWNER(lk->threadid, mythreadid)) {
- ++lk->c;
- return 1;
- }
- return 0;
-}
-
-#define RELEASE_LOCK(lk) recursive_release_lock(lk)
-#define TRY_LOCK(lk) recursive_try_lock(lk)
-#define ACQUIRE_LOCK(lk) recursive_acquire_lock(lk)
-#define INITIAL_LOCK(lk) ((lk)->threadid = (THREAD_ID_T)0, (lk)->sl = 0, (lk)->c = 0)
-#define DESTROY_LOCK(lk) (0)
-#endif /* USE_RECURSIVE_LOCKS */
-
-#elif defined(WIN32) /* Win32 critical sections */
-#define MLOCK_T CRITICAL_SECTION
-#define ACQUIRE_LOCK(lk) (EnterCriticalSection(lk), 0)
-#define RELEASE_LOCK(lk) LeaveCriticalSection(lk)
-#define TRY_LOCK(lk) TryEnterCriticalSection(lk)
-#define INITIAL_LOCK(lk) (!InitializeCriticalSectionAndSpinCount((lk), 0x80000000|4000))
-#define DESTROY_LOCK(lk) (DeleteCriticalSection(lk), 0)
-#define NEED_GLOBAL_LOCK_INIT
-
-static MLOCK_T malloc_global_mutex;
-static volatile LONG malloc_global_mutex_status;
-
-/* Use spin loop to initialize global lock */
-static void init_malloc_global_mutex() {
- for (;;) {
- long stat = malloc_global_mutex_status;
- if (stat > 0)
- return;
- /* transition to < 0 while initializing, then to > 0) */
- if (stat == 0 &&
- interlockedcompareexchange(&malloc_global_mutex_status, (LONG)-1, (LONG)0) == 0) {
- InitializeCriticalSection(&malloc_global_mutex);
- interlockedexchange(&malloc_global_mutex_status, (LONG)1);
- return;
- }
- SleepEx(0, FALSE);
- }
-}
-
-#else /* pthreads-based locks */
-#define MLOCK_T pthread_mutex_t
-#define ACQUIRE_LOCK(lk) pthread_mutex_lock(lk)
-#define RELEASE_LOCK(lk) pthread_mutex_unlock(lk)
-#define TRY_LOCK(lk) (!pthread_mutex_trylock(lk))
-#define INITIAL_LOCK(lk) pthread_init_lock(lk)
-#define DESTROY_LOCK(lk) pthread_mutex_destroy(lk)
-
-#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0 && defined(linux) && !defined(PTHREAD_MUTEX_RECURSIVE)
-/* Cope with old-style linux recursive lock initialization by adding */
-/* skipped internal declaration from pthread.h */
-extern int pthread_mutexattr_setkind_np __P ((pthread_mutexattr_t *__attr,
- int __kind));
-#define PTHREAD_MUTEX_RECURSIVE PTHREAD_MUTEX_RECURSIVE_NP
-#define pthread_mutexattr_settype(x,y) pthread_mutexattr_setkind_np(x,y)
-#endif /* USE_RECURSIVE_LOCKS ... */
-
-static MLOCK_T malloc_global_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static int pthread_init_lock (MLOCK_T *lk) {
- pthread_mutexattr_t attr;
- if (pthread_mutexattr_init(&attr)) return 1;
-#if defined(USE_RECURSIVE_LOCKS) && USE_RECURSIVE_LOCKS != 0
- if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE)) return 1;
-#endif
- if (pthread_mutex_init(lk, &attr)) return 1;
- if (pthread_mutexattr_destroy(&attr)) return 1;
- return 0;
-}
-
-#endif /* ... lock types ... */
-
-/* Common code for all lock types */
-#define USE_LOCK_BIT (2U)
-
-#ifndef ACQUIRE_MALLOC_GLOBAL_LOCK
-#define ACQUIRE_MALLOC_GLOBAL_LOCK() ACQUIRE_LOCK(&malloc_global_mutex);
-#endif
-
-#ifndef RELEASE_MALLOC_GLOBAL_LOCK
-#define RELEASE_MALLOC_GLOBAL_LOCK() RELEASE_LOCK(&malloc_global_mutex);
-#endif
-
-#endif /* USE_LOCKS */
-
-/* ----------------------- Chunk representations ------------------------ */
-
-/*
- (The following includes lightly edited explanations by Colin Plumb.)
-
- The malloc_chunk declaration below is misleading (but accurate and
- necessary). It declares a "view" into memory allowing access to
- necessary fields at known offsets from a given base.
-
- Chunks of memory are maintained using a `boundary tag' method as
- originally described by Knuth. (See the paper by Paul Wilson
- ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such
- techniques.) Sizes of free chunks are stored both in the front of
- each chunk and at the end. This makes consolidating fragmented
- chunks into bigger chunks fast. The head fields also hold bits
- representing whether chunks are free or in use.
-
- Here are some pictures to make it clearer. They are "exploded" to
- show that the state of a chunk can be thought of as extending from
- the high 31 bits of the head field of its header through the
- prev_foot and PINUSE_BIT bit of the following chunk header.
-
- A chunk that's in use looks like:
-
- chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of previous chunk (if P = 0) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
- | Size of this chunk 1| +-+
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | |
- +- -+
- | |
- +- -+
- | :
- +- size - sizeof(size_t) available payload bytes -+
- : |
- chunk-> +- -+
- | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1|
- | Size of next chunk (may or may not be in use) | +-+
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- And if it's free, it looks like this:
-
- chunk-> +- -+
- | User payload (must be in use, or we would have merged!) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P|
- | Size of this chunk 0| +-+
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next pointer |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Prev pointer |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | :
- +- size - sizeof(struct chunk) unused bytes -+
- : |
- chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of this chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0|
- | Size of next chunk (must be in use, or we would have merged)| +-+
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | :
- +- User payload -+
- : |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- |0|
- +-+
- Note that since we always merge adjacent free chunks, the chunks
- adjacent to a free chunk must be in use.
-
- Given a pointer to a chunk (which can be derived trivially from the
- payload pointer) we can, in O(1) time, find out whether the adjacent
- chunks are free, and if so, unlink them from the lists that they
- are on and merge them with the current chunk.
-
- Chunks always begin on even word boundaries, so the mem portion
- (which is returned to the user) is also on an even word boundary, and
- thus at least double-word aligned.
-
- The P (PINUSE_BIT) bit, stored in the unused low-order bit of the
- chunk size (which is always a multiple of two words), is an in-use
- bit for the *previous* chunk. If that bit is *clear*, then the
- word before the current chunk size contains the previous chunk
- size, and can be used to find the front of the previous chunk.
- The very first chunk allocated always has this bit set, preventing
- access to non-existent (or non-owned) memory. If pinuse is set for
- any given chunk, then you CANNOT determine the size of the
- previous chunk, and might even get a memory addressing fault when
- trying to do so.
-
- The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of
- the chunk size redundantly records whether the current chunk is
- inuse (unless the chunk is mmapped). This redundancy enables usage
- checks within free and realloc, and reduces indirection when freeing
- and consolidating chunks.
-
- Each freshly allocated chunk must have both cinuse and pinuse set.
- That is, each allocated chunk borders either a previously allocated
- and still in-use chunk, or the base of its memory arena. This is
- ensured by making all allocations from the `lowest' part of any
- found chunk. Further, no free chunk physically borders another one,
- so each free chunk is known to be preceded and followed by either
- inuse chunks or the ends of memory.
-
- Note that the `foot' of the current chunk is actually represented
- as the prev_foot of the NEXT chunk. This makes it easier to
- deal with alignments etc but can be very confusing when trying
- to extend or adapt this code.
-
- The exceptions to all this are
-
- 1. The special chunk `top' is the top-most available chunk (i.e.,
- the one bordering the end of available memory). It is treated
- specially. Top is never included in any bin, is used only if
- no other chunk is available, and is released back to the
- system if it is very large (see M_TRIM_THRESHOLD). In effect,
- the top chunk is treated as larger (and thus less well
- fitting) than any other available chunk. The top chunk
- doesn't update its trailing size field since there is no next
- contiguous chunk that would have to index off it. However,
- space is still allocated for it (TOP_FOOT_SIZE) to enable
- separation or merging when space is extended.
-
- 3. Chunks allocated via mmap, have both cinuse and pinuse bits
- cleared in their head fields. Because they are allocated
- one-by-one, each must carry its own prev_foot field, which is
- also used to hold the offset this chunk has within its mmapped
- region, which is needed to preserve alignment. Each mmapped
- chunk is trailed by the first two fields of a fake next-chunk
- for sake of usage checks.
-
-*/
-
-struct malloc_chunk {
- size_t prev_foot; /* Size of previous chunk (if free). */
- size_t head; /* Size and inuse bits. */
- struct malloc_chunk* fd; /* double links -- used only if free. */
- struct malloc_chunk* bk;
-};
-
-typedef struct malloc_chunk mchunk;
-typedef struct malloc_chunk* mchunkptr;
-typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */
-typedef unsigned int bindex_t; /* Described below */
-typedef unsigned int binmap_t; /* Described below */
-typedef unsigned int flag_t; /* The type of various bit flag sets */
-
-/* ------------------- Chunks sizes and alignments ----------------------- */
-
-#define MCHUNK_SIZE (sizeof(mchunk))
-
-#if FOOTERS
-#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
-#else /* FOOTERS */
-#define CHUNK_OVERHEAD (SIZE_T_SIZE)
-#endif /* FOOTERS */
-
-/* MMapped chunks need a second word of overhead ... */
-#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
-/* ... and additional padding for fake next-chunk at foot */
-#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES)
-
-/* The smallest size we can malloc is an aligned minimal chunk */
-#define MIN_CHUNK_SIZE\
- ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
-
-/* conversion from malloc headers to user pointers, and back */
-#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES))
-#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES))
-/* chunk associated with aligned address A */
-#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A)))
-
-/* Bounds on request (not chunk) sizes. */
-#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2)
-#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
-
-/* pad request bytes into a usable size */
-#define pad_request(req) \
- (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
-
-/* pad request, checking for minimum (but not maximum) */
-#define request2size(req) \
- (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
-
-
-/* ------------------ Operations on head and foot fields ----------------- */
-
-/*
- The head field of a chunk is or'ed with PINUSE_BIT when previous
- adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
- use, unless mmapped, in which case both bits are cleared.
-
- FLAG4_BIT is not used by this malloc, but might be useful in extensions.
-*/
-
-#define PINUSE_BIT (SIZE_T_ONE)
-#define CINUSE_BIT (SIZE_T_TWO)
-#define FLAG4_BIT (SIZE_T_FOUR)
-#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT)
-#define FLAG_BITS (PINUSE_BIT|CINUSE_BIT|FLAG4_BIT)
-
-/* Head value for fenceposts */
-#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE)
-
-/* extraction of fields from head words */
-#define cinuse(p) ((p)->head & CINUSE_BIT)
-#define pinuse(p) ((p)->head & PINUSE_BIT)
-#define flag4inuse(p) ((p)->head & FLAG4_BIT)
-#define is_inuse(p) (((p)->head & INUSE_BITS) != PINUSE_BIT)
-#define is_mmapped(p) (((p)->head & INUSE_BITS) == 0)
-
-#define chunksize(p) ((p)->head & ~(FLAG_BITS))
-
-#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT)
-#define set_flag4(p) ((p)->head |= FLAG4_BIT)
-#define clear_flag4(p) ((p)->head &= ~FLAG4_BIT)
-
-/* Treat space at ptr +/- offset as a chunk */
-#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s)))
-#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s)))
-
-/* Ptr to next or previous physical malloc_chunk. */
-#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~FLAG_BITS)))
-#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) ))
-
-/* extract next chunk's pinuse bit */
-#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT)
-
-/* Get/set size at footer */
-#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot)
-#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s))
-
-/* Set size, pinuse bit, and foot */
-#define set_size_and_pinuse_of_free_chunk(p, s)\
- ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
-
-/* Set size, pinuse bit, foot, and clear next pinuse */
-#define set_free_with_pinuse(p, s, n)\
- (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
-
-/* Get the internal overhead associated with chunk p */
-#define overhead_for(p)\
- (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
-
-/* Return true if malloced space is not necessarily cleared */
-#if MMAP_CLEARS
-#define calloc_must_clear(p) (!is_mmapped(p))
-#else /* MMAP_CLEARS */
-#define calloc_must_clear(p) (1)
-#endif /* MMAP_CLEARS */
-
-/* ---------------------- Overlaid data structures ----------------------- */
-
-/*
- When chunks are not in use, they are treated as nodes of either
- lists or trees.
-
- "Small" chunks are stored in circular doubly-linked lists, and look
- like this:
-
- chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of previous chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- `head:' | Size of chunk, in bytes |P|
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Forward pointer to next chunk in list |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Back pointer to previous chunk in list |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Unused space (may be 0 bytes long) .
- . .
- . |
-nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- `foot:' | Size of chunk, in bytes |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Larger chunks are kept in a form of bitwise digital trees (aka
- tries) keyed on chunksizes. Because malloc_tree_chunks are only for
- free chunks greater than 256 bytes, their size doesn't impose any
- constraints on user chunk sizes. Each node looks like:
-
- chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of previous chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- `head:' | Size of chunk, in bytes |P|
- mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Forward pointer to next chunk of same size |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Back pointer to previous chunk of same size |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Pointer to left child (child[0]) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Pointer to right child (child[1]) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Pointer to parent |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | bin index of this chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Unused space .
- . |
-nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- `foot:' | Size of chunk, in bytes |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Each tree holding treenodes is a tree of unique chunk sizes. Chunks
- of the same size are arranged in a circularly-linked list, with only
- the oldest chunk (the next to be used, in our FIFO ordering)
- actually in the tree. (Tree members are distinguished by a non-null
- parent pointer.) If a chunk with the same size an an existing node
- is inserted, it is linked off the existing node using pointers that
- work in the same way as fd/bk pointers of small chunks.
-
- Each tree contains a power of 2 sized range of chunk sizes (the
- smallest is 0x100 <= x < 0x180), which is is divided in half at each
- tree level, with the chunks in the smaller half of the range (0x100
- <= x < 0x140 for the top nose) in the left subtree and the larger
- half (0x140 <= x < 0x180) in the right subtree. This is, of course,
- done by inspecting individual bits.
-
- Using these rules, each node's left subtree contains all smaller
- sizes than its right subtree. However, the node at the root of each
- subtree has no particular ordering relationship to either. (The
- dividing line between the subtree sizes is based on trie relation.)
- If we remove the last chunk of a given size from the interior of the
- tree, we need to replace it with a leaf node. The tree ordering
- rules permit a node to be replaced by any leaf below it.
-
- The smallest chunk in a tree (a common operation in a best-fit
- allocator) can be found by walking a path to the leftmost leaf in
- the tree. Unlike a usual binary tree, where we follow left child
- pointers until we reach a null, here we follow the right child
- pointer any time the left one is null, until we reach a leaf with
- both child pointers null. The smallest chunk in the tree will be
- somewhere along that path.
-
- The worst case number of steps to add, find, or remove a node is
- bounded by the number of bits differentiating chunks within
- bins. Under current bin calculations, this ranges from 6 up to 21
- (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case
- is of course much better.
-*/
-
-struct malloc_tree_chunk {
- /* The first four fields must be compatible with malloc_chunk */
- size_t prev_foot;
- size_t head;
- struct malloc_tree_chunk* fd;
- struct malloc_tree_chunk* bk;
-
- struct malloc_tree_chunk* child[2];
- struct malloc_tree_chunk* parent;
- bindex_t index;
-};
-
-typedef struct malloc_tree_chunk tchunk;
-typedef struct malloc_tree_chunk* tchunkptr;
-typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
-
-/* A little helper macro for trees */
-#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
-
-/* ----------------------------- Segments -------------------------------- */
-
-/*
- Each malloc space may include non-contiguous segments, held in a
- list headed by an embedded malloc_segment record representing the
- top-most space. Segments also include flags holding properties of
- the space. Large chunks that are directly allocated by mmap are not
- included in this list. They are instead independently created and
- destroyed without otherwise keeping track of them.
-
- Segment management mainly comes into play for spaces allocated by
- MMAP. Any call to MMAP might or might not return memory that is
- adjacent to an existing segment. MORECORE normally contiguously
- extends the current space, so this space is almost always adjacent,
- which is simpler and faster to deal with. (This is why MORECORE is
- used preferentially to MMAP when both are available -- see
- sys_alloc.) When allocating using MMAP, we don't use any of the
- hinting mechanisms (inconsistently) supported in various
- implementations of unix mmap, or distinguish reserving from
- committing memory. Instead, we just ask for space, and exploit
- contiguity when we get it. It is probably possible to do
- better than this on some systems, but no general scheme seems
- to be significantly better.
-
- Management entails a simpler variant of the consolidation scheme
- used for chunks to reduce fragmentation -- new adjacent memory is
- normally prepended or appended to an existing segment. However,
- there are limitations compared to chunk consolidation that mostly
- reflect the fact that segment processing is relatively infrequent
- (occurring only when getting memory from system) and that we
- don't expect to have huge numbers of segments:
-
- * Segments are not indexed, so traversal requires linear scans. (It
- would be possible to index these, but is not worth the extra
- overhead and complexity for most programs on most platforms.)
- * New segments are only appended to old ones when holding top-most
- memory; if they cannot be prepended to others, they are held in
- different segments.
-
- Except for the top-most segment of an mstate, each segment record
- is kept at the tail of its segment. Segments are added by pushing
- segment records onto the list headed by &mstate.seg for the
- containing mstate.
-
- Segment flags control allocation/merge/deallocation policies:
- * If EXTERN_BIT set, then we did not allocate this segment,
- and so should not try to deallocate or merge with others.
- (This currently holds only for the initial segment passed
- into create_mspace_with_base.)
- * If USE_MMAP_BIT set, the segment may be merged with
- other surrounding mmapped segments and trimmed/de-allocated
- using munmap.
- * If neither bit is set, then the segment was obtained using
- MORECORE so can be merged with surrounding MORECORE'd segments
- and deallocated/trimmed using MORECORE with negative arguments.
-*/
-
-struct malloc_segment {
- char* base; /* base address */
- size_t size; /* allocated size */
- struct malloc_segment* next; /* ptr to next segment */
- flag_t sflags; /* mmap and extern flag */
-};
-
-#define is_mmapped_segment(S) ((S)->sflags & USE_MMAP_BIT)
-#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT)
-
-typedef struct malloc_segment msegment;
-typedef struct malloc_segment* msegmentptr;
-
-/* ---------------------------- malloc_state ----------------------------- */
-
-/*
- A malloc_state holds all of the bookkeeping for a space.
- The main fields are:
-
- Top
- The topmost chunk of the currently active segment. Its size is
- cached in topsize. The actual size of topmost space is
- topsize+TOP_FOOT_SIZE, which includes space reserved for adding
- fenceposts and segment records if necessary when getting more
- space from the system. The size at which to autotrim top is
- cached from mparams in trim_check, except that it is disabled if
- an autotrim fails.
-
- Designated victim (dv)
- This is the preferred chunk for servicing small requests that
- don't have exact fits. It is normally the chunk split off most
- recently to service another small request. Its size is cached in
- dvsize. The link fields of this chunk are not maintained since it
- is not kept in a bin.
-
- SmallBins
- An array of bin headers for free chunks. These bins hold chunks
- with sizes less than MIN_LARGE_SIZE bytes. Each bin contains
- chunks of all the same size, spaced 8 bytes apart. To simplify
- use in double-linked lists, each bin header acts as a malloc_chunk
- pointing to the real first node, if it exists (else pointing to
- itself). This avoids special-casing for headers. But to avoid
- waste, we allocate only the fd/bk pointers of bins, and then use
- repositioning tricks to treat these as the fields of a chunk.
-
- TreeBins
- Treebins are pointers to the roots of trees holding a range of
- sizes. There are 2 equally spaced treebins for each power of two
- from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything
- larger.
-
- Bin maps
- There is one bit map for small bins ("smallmap") and one for
- treebins ("treemap). Each bin sets its bit when non-empty, and
- clears the bit when empty. Bit operations are then used to avoid
- bin-by-bin searching -- nearly all "search" is done without ever
- looking at bins that won't be selected. The bit maps
- conservatively use 32 bits per map word, even if on 64bit system.
- For a good description of some of the bit-based techniques used
- here, see Henry S. Warren Jr's book "Hacker's Delight" (and
- supplement at http://hackersdelight.org/). Many of these are
- intended to reduce the branchiness of paths through malloc etc, as
- well as to reduce the number of memory locations read or written.
-
- Segments
- A list of segments headed by an embedded malloc_segment record
- representing the initial space.
-
- Address check support
- The least_addr field is the least address ever obtained from
- MORECORE or MMAP. Attempted frees and reallocs of any address less
- than this are trapped (unless INSECURE is defined).
-
- Magic tag
- A cross-check field that should always hold same value as mparams.magic.
-
- Max allowed footprint
- The maximum allowed bytes to allocate from system (zero means no limit)
-
- Flags
- Bits recording whether to use MMAP, locks, or contiguous MORECORE
-
- Statistics
- Each space keeps track of current and maximum system memory
- obtained via MORECORE or MMAP.
-
- Trim support
- Fields holding the amount of unused topmost memory that should trigger
- trimming, and a counter to force periodic scanning to release unused
- non-topmost segments.
-
- Locking
- If USE_LOCKS is defined, the "mutex" lock is acquired and released
- around every public call using this mspace.
-
- Extension support
- A void* pointer and a size_t field that can be used to help implement
- extensions to this malloc.
-*/
-
-/* Bin types, widths and sizes */
-#define NSMALLBINS (32U)
-#define NTREEBINS (32U)
-#define SMALLBIN_SHIFT (3U)
-#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT)
-#define TREEBIN_SHIFT (8U)
-#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT)
-#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE)
-#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
-
-struct malloc_state {
- binmap_t smallmap;
- binmap_t treemap;
- size_t dvsize;
- size_t topsize;
- char* least_addr;
- mchunkptr dv;
- mchunkptr top;
- size_t trim_check;
- size_t release_checks;
- size_t magic;
- mchunkptr smallbins[(NSMALLBINS+1)*2];
- tbinptr treebins[NTREEBINS];
- size_t footprint;
- size_t max_footprint;
- size_t footprint_limit; /* zero means no limit */
- flag_t mflags;
-#if USE_LOCKS
- MLOCK_T mutex; /* locate lock among fields that rarely change */
-#endif /* USE_LOCKS */
- msegment seg;
- void* extp; /* Unused but available for extensions */
- size_t exts;
-};
-
-typedef struct malloc_state* mstate;
-
-/* ------------- Global malloc_state and malloc_params ------------------- */
-
-/*
- malloc_params holds global properties, including those that can be
- dynamically set using mallopt. There is a single instance, mparams,
- initialized in init_mparams. Note that the non-zeroness of "magic"
- also serves as an initialization flag.
-*/
-
-struct malloc_params {
- size_t magic;
- size_t page_size;
- size_t granularity;
- size_t mmap_threshold;
- size_t trim_threshold;
- flag_t default_mflags;
-};
-
-static struct malloc_params mparams;
-
-/* Ensure mparams initialized */
-#define ensure_initialization() (void)(mparams.magic != 0 || init_mparams())
-
-#if !ONLY_MSPACES
-
-/* The global malloc_state used for all non-"mspace" calls */
-static struct malloc_state _gm_;
-#define gm (&_gm_)
-#define is_global(M) ((M) == &_gm_)
-
-#endif /* !ONLY_MSPACES */
-
-#define is_initialized(M) ((M)->top != 0)
-
-/* -------------------------- system alloc setup ------------------------- */
-
-/* Operations on mflags */
-
-#define use_lock(M) ((M)->mflags & USE_LOCK_BIT)
-#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT)
-#if USE_LOCKS
-#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT)
-#else
-#define disable_lock(M)
-#endif
-
-#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT)
-#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT)
-#if HAVE_MMAP
-#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT)
-#else
-#define disable_mmap(M)
-#endif
-
-#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT)
-#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT)
-
-#define set_lock(M,L)\
- ((M)->mflags = (L)?\
- ((M)->mflags | USE_LOCK_BIT) :\
- ((M)->mflags & ~USE_LOCK_BIT))
-
-/* page-align a size */
-#define page_align(S)\
- (((S) + (mparams.page_size - SIZE_T_ONE)) & ~(mparams.page_size - SIZE_T_ONE))
-
-/* granularity-align a size */
-#define granularity_align(S)\
- (((S) + (mparams.granularity - SIZE_T_ONE))\
- & ~(mparams.granularity - SIZE_T_ONE))
-
-
-/* For mmap, use granularity alignment on windows, else page-align */
-#ifdef WIN32
-#define mmap_align(S) granularity_align(S)
-#else
-#define mmap_align(S) page_align(S)
-#endif
-
-/* For sys_alloc, enough padding to ensure can malloc request on success */
-#define SYS_ALLOC_PADDING (TOP_FOOT_SIZE + MALLOC_ALIGNMENT)
-
-#define is_page_aligned(S)\
- (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
-#define is_granularity_aligned(S)\
- (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
-
-/* True if segment S holds address A */
-#define segment_holds(S, A)\
- ((char*)(A) >= S->base && (char*)(A) < S->base + S->size)
-
-/* Return segment holding given address */
-static msegmentptr segment_holding(mstate m, char* addr) {
- msegmentptr sp = &m->seg;
- for (;;) {
- if (addr >= sp->base && addr < sp->base + sp->size)
- return sp;
- if ((sp = sp->next) == 0)
- return 0;
- }
-}
-
-/* Return true if segment contains a segment link */
-static int has_segment_link(mstate m, msegmentptr ss) {
- msegmentptr sp = &m->seg;
- for (;;) {
- if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size)
- return 1;
- if ((sp = sp->next) == 0)
- return 0;
- }
-}
-
-#ifndef MORECORE_CANNOT_TRIM
-#define should_trim(M,s) ((s) > (M)->trim_check)
-#else /* MORECORE_CANNOT_TRIM */
-#define should_trim(M,s) (0)
-#endif /* MORECORE_CANNOT_TRIM */
-
-/*
- TOP_FOOT_SIZE is padding at the end of a segment, including space
- that may be needed to place segment records and fenceposts when new
- noncontiguous segments are added.
-*/
-#define TOP_FOOT_SIZE\
- (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
-
-
-/* ------------------------------- Hooks -------------------------------- */
-
-/*
- PREACTION should be defined to return 0 on success, and nonzero on
- failure. If you are not using locking, you can redefine these to do
- anything you like.
-*/
-
-#if USE_LOCKS
-#define PREACTION(M) ((use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0)
-#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); }
-#else /* USE_LOCKS */
-
-#ifndef PREACTION
-#define PREACTION(M) (0)
-#endif /* PREACTION */
-
-#ifndef POSTACTION
-#define POSTACTION(M)
-#endif /* POSTACTION */
-
-#endif /* USE_LOCKS */
-
-/*
- CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
- USAGE_ERROR_ACTION is triggered on detected bad frees and
- reallocs. The argument p is an address that might have triggered the
- fault. It is ignored by the two predefined actions, but might be
- useful in custom actions that try to help diagnose errors.
-*/
-
-#if PROCEED_ON_ERROR
-
-/* A count of the number of corruption errors causing resets */
-int malloc_corruption_error_count;
-
-/* default corruption action */
-static void reset_on_error(mstate m);
-
-#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m)
-#define USAGE_ERROR_ACTION(m, p)
-
-#else /* PROCEED_ON_ERROR */
-
-#ifndef CORRUPTION_ERROR_ACTION
-#define CORRUPTION_ERROR_ACTION(m) ABORT
-#endif /* CORRUPTION_ERROR_ACTION */
-
-#ifndef USAGE_ERROR_ACTION
-#define USAGE_ERROR_ACTION(m,p) ABORT
-#endif /* USAGE_ERROR_ACTION */
-
-#endif /* PROCEED_ON_ERROR */
-
-
-/* -------------------------- Debugging setup ---------------------------- */
-
-#if ! DEBUG
-
-#define check_free_chunk(M,P)
-#define check_inuse_chunk(M,P)
-#define check_malloced_chunk(M,P,N)
-#define check_mmapped_chunk(M,P)
-#define check_malloc_state(M)
-#define check_top_chunk(M,P)
-
-#else /* DEBUG */
-#define check_free_chunk(M,P) do_check_free_chunk(M,P)
-#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P)
-#define check_top_chunk(M,P) do_check_top_chunk(M,P)
-#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
-#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P)
-#define check_malloc_state(M) do_check_malloc_state(M)
-
-static void do_check_any_chunk(mstate m, mchunkptr p);
-static void do_check_top_chunk(mstate m, mchunkptr p);
-static void do_check_mmapped_chunk(mstate m, mchunkptr p);
-static void do_check_inuse_chunk(mstate m, mchunkptr p);
-static void do_check_free_chunk(mstate m, mchunkptr p);
-static void do_check_malloced_chunk(mstate m, void* mem, size_t s);
-static void do_check_tree(mstate m, tchunkptr t);
-static void do_check_treebin(mstate m, bindex_t i);
-static void do_check_smallbin(mstate m, bindex_t i);
-static void do_check_malloc_state(mstate m);
-static int bin_find(mstate m, mchunkptr x);
-static size_t traverse_and_check(mstate m);
-#endif /* DEBUG */
-
-/* ---------------------------- Indexing Bins ---------------------------- */
-
-#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
-#define small_index(s) (bindex_t)((s) >> SMALLBIN_SHIFT)
-#define small_index2size(i) ((i) << SMALLBIN_SHIFT)
-#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE))
-
-/* addressing by index. See above about smallbin repositioning */
-/* BEGIN android-changed: strict aliasing change: char* cast to void* */
-#define smallbin_at(M, i) ((sbinptr)((void*)&((M)->smallbins[(i)<<1])))
-/* END android-changed */
-#define treebin_at(M,i) (&((M)->treebins[i]))
-
-/* assign tree index for size S to variable I. Use x86 asm if possible */
-#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
-#define compute_tree_index(S, I)\
-{\
- unsigned int X = S >> TREEBIN_SHIFT;\
- if (X == 0)\
- I = 0;\
- else if (X > 0xFFFF)\
- I = NTREEBINS-1;\
- else {\
- unsigned int K = (unsigned) sizeof(X)*__CHAR_BIT__ - 1 - (unsigned) __builtin_clz(X); \
- I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
- }\
-}
-
-#elif defined (__INTEL_COMPILER)
-#define compute_tree_index(S, I)\
-{\
- size_t X = S >> TREEBIN_SHIFT;\
- if (X == 0)\
- I = 0;\
- else if (X > 0xFFFF)\
- I = NTREEBINS-1;\
- else {\
- unsigned int K = _bit_scan_reverse (X); \
- I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
- }\
-}
-
-#elif defined(_MSC_VER) && _MSC_VER>=1300
-#define compute_tree_index(S, I)\
-{\
- size_t X = S >> TREEBIN_SHIFT;\
- if (X == 0)\
- I = 0;\
- else if (X > 0xFFFF)\
- I = NTREEBINS-1;\
- else {\
- unsigned int K;\
- _BitScanReverse((DWORD *) &K, (DWORD) X);\
- I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
- }\
-}
-
-#else /* GNUC */
-#define compute_tree_index(S, I)\
-{\
- size_t X = S >> TREEBIN_SHIFT;\
- if (X == 0)\
- I = 0;\
- else if (X > 0xFFFF)\
- I = NTREEBINS-1;\
- else {\
- unsigned int Y = (unsigned int)X;\
- unsigned int N = ((Y - 0x100) >> 16) & 8;\
- unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
- N += K;\
- N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
- K = 14 - N + ((Y <<= K) >> 15);\
- I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
- }\
-}
-#endif /* GNUC */
-
-/* Bit representing maximum resolved size in a treebin at i */
-#define bit_for_tree_index(i) \
- (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
-
-/* Shift placing maximum resolved bit in a treebin at i as sign bit */
-#define leftshift_for_tree_index(i) \
- ((i == NTREEBINS-1)? 0 : \
- ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
-
-/* The size of the smallest chunk held in bin with index i */
-#define minsize_for_tree_index(i) \
- ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \
- (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
-
-
-/* ------------------------ Operations on bin maps ----------------------- */
-
-/* bit corresponding to given index */
-#define idx2bit(i) ((binmap_t)(1) << (i))
-
-/* Mark/Clear bits with given index */
-#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i))
-#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i))
-#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i))
-
-#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i))
-#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i))
-#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i))
-
-/* isolate the least set bit of a bitmap */
-#define least_bit(x) ((x) & -(x))
-
-/* mask with all bits to left of least bit of x on */
-#define left_bits(x) ((x<<1) | -(x<<1))
-
-/* mask with all bits to left of or equal to least bit of x on */
-#define same_or_left_bits(x) ((x) | -(x))
-
-/* index corresponding to given bit. Use x86 asm if possible */
-
-#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
-#define compute_bit2idx(X, I)\
-{\
- unsigned int J;\
- J = __builtin_ctz(X); \
- I = (bindex_t)J;\
-}
-
-#elif defined (__INTEL_COMPILER)
-#define compute_bit2idx(X, I)\
-{\
- unsigned int J;\
- J = _bit_scan_forward (X); \
- I = (bindex_t)J;\
-}
-
-#elif defined(_MSC_VER) && _MSC_VER>=1300
-#define compute_bit2idx(X, I)\
-{\
- unsigned int J;\
- _BitScanForward((DWORD *) &J, X);\
- I = (bindex_t)J;\
-}
-
-#elif USE_BUILTIN_FFS
-#define compute_bit2idx(X, I) I = ffs(X)-1
-
-#else
-#define compute_bit2idx(X, I)\
-{\
- unsigned int Y = X - 1;\
- unsigned int K = Y >> (16-4) & 16;\
- unsigned int N = K; Y >>= K;\
- N += K = Y >> (8-3) & 8; Y >>= K;\
- N += K = Y >> (4-2) & 4; Y >>= K;\
- N += K = Y >> (2-1) & 2; Y >>= K;\
- N += K = Y >> (1-0) & 1; Y >>= K;\
- I = (bindex_t)(N + Y);\
-}
-#endif /* GNUC */
-
-
-/* ----------------------- Runtime Check Support ------------------------- */
-
-/*
- For security, the main invariant is that malloc/free/etc never
- writes to a static address other than malloc_state, unless static
- malloc_state itself has been corrupted, which cannot occur via
- malloc (because of these checks). In essence this means that we
- believe all pointers, sizes, maps etc held in malloc_state, but
- check all of those linked or offsetted from other embedded data
- structures. These checks are interspersed with main code in a way
- that tends to minimize their run-time cost.
-
- When FOOTERS is defined, in addition to range checking, we also
- verify footer fields of inuse chunks, which can be used guarantee
- that the mstate controlling malloc/free is intact. This is a
- streamlined version of the approach described by William Robertson
- et al in "Run-time Detection of Heap-based Overflows" LISA'03
- http://www.usenix.org/events/lisa03/tech/robertson.html The footer
- of an inuse chunk holds the xor of its mstate and a random seed,
- that is checked upon calls to free() and realloc(). This is
- (probabalistically) unguessable from outside the program, but can be
- computed by any code successfully malloc'ing any chunk, so does not
- itself provide protection against code that has already broken
- security through some other means. Unlike Robertson et al, we
- always dynamically check addresses of all offset chunks (previous,
- next, etc). This turns out to be cheaper than relying on hashes.
-*/
-
-#if !INSECURE
-/* Check if address a is at least as high as any from MORECORE or MMAP */
-#define ok_address(M, a) ((char*)(a) >= (M)->least_addr)
-/* Check if address of next chunk n is higher than base chunk p */
-#define ok_next(p, n) ((char*)(p) < (char*)(n))
-/* Check if p has inuse status */
-#define ok_inuse(p) is_inuse(p)
-/* Check if p has its pinuse bit on */
-#define ok_pinuse(p) pinuse(p)
-
-#else /* !INSECURE */
-#define ok_address(M, a) (1)
-#define ok_next(b, n) (1)
-#define ok_inuse(p) (1)
-#define ok_pinuse(p) (1)
-#endif /* !INSECURE */
-
-#if (FOOTERS && !INSECURE)
-/* Check if (alleged) mstate m has expected magic field */
-#define ok_magic(M) ((M)->magic == mparams.magic)
-#else /* (FOOTERS && !INSECURE) */
-#define ok_magic(M) (1)
-#endif /* (FOOTERS && !INSECURE) */
-
-/* In gcc, use __builtin_expect to minimize impact of checks */
-#if !INSECURE
-#if defined(__GNUC__) && __GNUC__ >= 3
-#define RTCHECK(e) __builtin_expect(e, 1)
-#else /* GNUC */
-#define RTCHECK(e) (e)
-#endif /* GNUC */
-#else /* !INSECURE */
-#define RTCHECK(e) (1)
-#endif /* !INSECURE */
-
-/* macros to set up inuse chunks with or without footers */
-
-#if !FOOTERS
-
-#define mark_inuse_foot(M,p,s)
-
-/* Macros for setting head/foot of non-mmapped chunks */
-
-/* Set cinuse bit and pinuse bit of next chunk */
-#define set_inuse(M,p,s)\
- ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
- ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
-
-/* Set cinuse and pinuse of this chunk and pinuse of next chunk */
-#define set_inuse_and_pinuse(M,p,s)\
- ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
- ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT)
-
-/* Set size, cinuse and pinuse bit of this chunk */
-#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
- ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
-
-#else /* FOOTERS */
-
-/* Set foot of inuse chunk to be xor of mstate and seed */
-#define mark_inuse_foot(M,p,s)\
- (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
-
-#define get_mstate_for(p)\
- ((mstate)(((mchunkptr)((char*)(p) +\
- (chunksize(p))))->prev_foot ^ mparams.magic))
-
-#define set_inuse(M,p,s)\
- ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
- (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \
- mark_inuse_foot(M,p,s))
-
-#define set_inuse_and_pinuse(M,p,s)\
- ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
- (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\
- mark_inuse_foot(M,p,s))
-
-#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
- ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
- mark_inuse_foot(M, p, s))
-
-#endif /* !FOOTERS */
-
-/* ---------------------------- setting mparams -------------------------- */
-
-#if LOCK_AT_FORK
-static void pre_fork(void) { ACQUIRE_LOCK(&(gm)->mutex); }
-static void post_fork_parent(void) { RELEASE_LOCK(&(gm)->mutex); }
-static void post_fork_child(void) { INITIAL_LOCK(&(gm)->mutex); }
-#endif /* LOCK_AT_FORK */
-
-/* Initialize mparams */
-static int init_mparams(void) {
- /* BEGIN android-added: move pthread_atfork outside of lock */
- int first_run = 0;
- /* END android-added */
-#ifdef NEED_GLOBAL_LOCK_INIT
- if (malloc_global_mutex_status <= 0)
- init_malloc_global_mutex();
-#endif
-
- ACQUIRE_MALLOC_GLOBAL_LOCK();
- if (mparams.magic == 0) {
- size_t magic;
- size_t psize;
- size_t gsize;
- /* BEGIN android-added: move pthread_atfork outside of lock */
- first_run = 1;
- /* END android-added */
-
-#ifndef WIN32
- psize = malloc_getpagesize;
- gsize = ((DEFAULT_GRANULARITY != 0)? DEFAULT_GRANULARITY : psize);
-#else /* WIN32 */
- {
- SYSTEM_INFO system_info;
- GetSystemInfo(&system_info);
- psize = system_info.dwPageSize;
- gsize = ((DEFAULT_GRANULARITY != 0)?
- DEFAULT_GRANULARITY : system_info.dwAllocationGranularity);
- }
-#endif /* WIN32 */
-
- /* Sanity-check configuration:
- size_t must be unsigned and as wide as pointer type.
- ints must be at least 4 bytes.
- alignment must be at least 8.
- Alignment, min chunk size, and page size must all be powers of 2.
- */
- if ((sizeof(size_t) != sizeof(char*)) ||
- (MAX_SIZE_T < MIN_CHUNK_SIZE) ||
- (sizeof(int) < 4) ||
- (MALLOC_ALIGNMENT < (size_t)8U) ||
- ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) ||
- ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) ||
- ((gsize & (gsize-SIZE_T_ONE)) != 0) ||
- ((psize & (psize-SIZE_T_ONE)) != 0))
- ABORT;
- mparams.granularity = gsize;
- mparams.page_size = psize;
- mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
- mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD;
-#if MORECORE_CONTIGUOUS
- mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT;
-#else /* MORECORE_CONTIGUOUS */
- mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT;
-#endif /* MORECORE_CONTIGUOUS */
-
-#if !ONLY_MSPACES
- /* Set up lock for main malloc area */
- gm->mflags = mparams.default_mflags;
- (void)INITIAL_LOCK(&gm->mutex);
-#endif
- /* BEGIN android-removed: move pthread_atfork outside of lock */
-#if 0 && LOCK_AT_FORK
- pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
-#endif
- /* END android-removed */
-
- {
-#if USE_DEV_RANDOM
- int fd;
- unsigned char buf[sizeof(size_t)];
- /* Try to use /dev/urandom, else fall back on using time */
- if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 &&
- read(fd, buf, sizeof(buf)) == sizeof(buf)) {
- magic = *((size_t *) buf);
- close(fd);
- }
- else
-#endif /* USE_DEV_RANDOM */
-#ifdef WIN32
- magic = (size_t)(GetTickCount() ^ (size_t)0x55555555U);
-#elif defined(LACKS_TIME_H)
- magic = (size_t)&magic ^ (size_t)0x55555555U;
-#else
- magic = (size_t)(time(0) ^ (size_t)0x55555555U);
-#endif
- magic |= (size_t)8U; /* ensure nonzero */
- magic &= ~(size_t)7U; /* improve chances of fault for bad values */
- /* Until memory modes commonly available, use volatile-write */
- (*(volatile size_t *)(&(mparams.magic))) = magic;
- }
- }
-
- RELEASE_MALLOC_GLOBAL_LOCK();
- /* BEGIN android-added: move pthread_atfork outside of lock */
- if (first_run != 0) {
-#if LOCK_AT_FORK
- pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
-#endif
- }
- /* END android-added */
- return 1;
-}
-
-/* support for mallopt */
-static int change_mparam(int param_number, int value) {
- size_t val;
- ensure_initialization();
- val = (value == -1)? MAX_SIZE_T : (size_t)value;
- switch(param_number) {
- case M_TRIM_THRESHOLD:
- mparams.trim_threshold = val;
- return 1;
- case M_GRANULARITY:
- if (val >= mparams.page_size && ((val & (val-1)) == 0)) {
- mparams.granularity = val;
- return 1;
- }
- else
- return 0;
- case M_MMAP_THRESHOLD:
- mparams.mmap_threshold = val;
- return 1;
- default:
- return 0;
- }
-}
-
-#if DEBUG
-/* ------------------------- Debugging Support --------------------------- */
-
-/* Check properties of any chunk, whether free, inuse, mmapped etc */
-static void do_check_any_chunk(mstate m, mchunkptr p) {
- assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
- assert(ok_address(m, p));
-}
-
-/* Check properties of top chunk */
-static void do_check_top_chunk(mstate m, mchunkptr p) {
- msegmentptr sp = segment_holding(m, (char*)p);
- size_t sz = p->head & ~INUSE_BITS; /* third-lowest bit can be set! */
- assert(sp != 0);
- assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
- assert(ok_address(m, p));
- assert(sz == m->topsize);
- assert(sz > 0);
- assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE);
- assert(pinuse(p));
- assert(!pinuse(chunk_plus_offset(p, sz)));
-}
-
-/* Check properties of (inuse) mmapped chunks */
-static void do_check_mmapped_chunk(mstate m, mchunkptr p) {
- size_t sz = chunksize(p);
- size_t len = (sz + (p->prev_foot) + MMAP_FOOT_PAD);
- assert(is_mmapped(p));
- assert(use_mmap(m));
- assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD));
- assert(ok_address(m, p));
- assert(!is_small(sz));
- assert((len & (mparams.page_size-SIZE_T_ONE)) == 0);
- assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD);
- assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0);
-}
-
-/* Check properties of inuse chunks */
-static void do_check_inuse_chunk(mstate m, mchunkptr p) {
- do_check_any_chunk(m, p);
- assert(is_inuse(p));
- assert(next_pinuse(p));
- /* If not pinuse and not mmapped, previous chunk has OK offset */
- assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p);
- if (is_mmapped(p))
- do_check_mmapped_chunk(m, p);
-}
-
-/* Check properties of free chunks */
-static void do_check_free_chunk(mstate m, mchunkptr p) {
- size_t sz = chunksize(p);
- mchunkptr next = chunk_plus_offset(p, sz);
- do_check_any_chunk(m, p);
- assert(!is_inuse(p));
- assert(!next_pinuse(p));
- assert (!is_mmapped(p));
- if (p != m->dv && p != m->top) {
- if (sz >= MIN_CHUNK_SIZE) {
- assert((sz & CHUNK_ALIGN_MASK) == 0);
- assert(is_aligned(chunk2mem(p)));
- assert(next->prev_foot == sz);
- assert(pinuse(p));
- assert (next == m->top || is_inuse(next));
- assert(p->fd->bk == p);
- assert(p->bk->fd == p);
- }
- else /* markers are always of size SIZE_T_SIZE */
- assert(sz == SIZE_T_SIZE);
- }
-}
-
-/* Check properties of malloced chunks at the point they are malloced */
-static void do_check_malloced_chunk(mstate m, void* mem, size_t s) {
- if (mem != 0) {
- mchunkptr p = mem2chunk(mem);
- size_t sz = p->head & ~INUSE_BITS;
- do_check_inuse_chunk(m, p);
- assert((sz & CHUNK_ALIGN_MASK) == 0);
- assert(sz >= MIN_CHUNK_SIZE);
- assert(sz >= s);
- /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */
- assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE));
- }
-}
-
-/* Check a tree and its subtrees. */
-static void do_check_tree(mstate m, tchunkptr t) {
- tchunkptr head = 0;
- tchunkptr u = t;
- bindex_t tindex = t->index;
- size_t tsize = chunksize(t);
- bindex_t idx;
- compute_tree_index(tsize, idx);
- assert(tindex == idx);
- assert(tsize >= MIN_LARGE_SIZE);
- assert(tsize >= minsize_for_tree_index(idx));
- assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1))));
-
- do { /* traverse through chain of same-sized nodes */
- do_check_any_chunk(m, ((mchunkptr)u));
- assert(u->index == tindex);
- assert(chunksize(u) == tsize);
- assert(!is_inuse(u));
- assert(!next_pinuse(u));
- assert(u->fd->bk == u);
- assert(u->bk->fd == u);
- if (u->parent == 0) {
- assert(u->child[0] == 0);
- assert(u->child[1] == 0);
- }
- else {
- assert(head == 0); /* only one node on chain has parent */
- head = u;
- assert(u->parent != u);
- assert (u->parent->child[0] == u ||
- u->parent->child[1] == u ||
- *((tbinptr*)(u->parent)) == u);
- if (u->child[0] != 0) {
- assert(u->child[0]->parent == u);
- assert(u->child[0] != u);
- do_check_tree(m, u->child[0]);
- }
- if (u->child[1] != 0) {
- assert(u->child[1]->parent == u);
- assert(u->child[1] != u);
- do_check_tree(m, u->child[1]);
- }
- if (u->child[0] != 0 && u->child[1] != 0) {
- assert(chunksize(u->child[0]) < chunksize(u->child[1]));
- }
- }
- u = u->fd;
- } while (u != t);
- assert(head != 0);
-}
-
-/* Check all the chunks in a treebin. */
-static void do_check_treebin(mstate m, bindex_t i) {
- tbinptr* tb = treebin_at(m, i);
- tchunkptr t = *tb;
- int empty = (m->treemap & (1U << i)) == 0;
- if (t == 0)
- assert(empty);
- if (!empty)
- do_check_tree(m, t);
-}
-
-/* Check all the chunks in a smallbin. */
-static void do_check_smallbin(mstate m, bindex_t i) {
- sbinptr b = smallbin_at(m, i);
- mchunkptr p = b->bk;
- unsigned int empty = (m->smallmap & (1U << i)) == 0;
- if (p == b)
- assert(empty);
- if (!empty) {
- for (; p != b; p = p->bk) {
- size_t size = chunksize(p);
- mchunkptr q;
- /* each chunk claims to be free */
- do_check_free_chunk(m, p);
- /* chunk belongs in bin */
- assert(small_index(size) == i);
- assert(p->bk == b || chunksize(p->bk) == chunksize(p));
- /* chunk is followed by an inuse chunk */
- q = next_chunk(p);
- if (q->head != FENCEPOST_HEAD)
- do_check_inuse_chunk(m, q);
- }
- }
-}
-
-/* Find x in a bin. Used in other check functions. */
-static int bin_find(mstate m, mchunkptr x) {
- size_t size = chunksize(x);
- if (is_small(size)) {
- bindex_t sidx = small_index(size);
- sbinptr b = smallbin_at(m, sidx);
- if (smallmap_is_marked(m, sidx)) {
- mchunkptr p = b;
- do {
- if (p == x)
- return 1;
- } while ((p = p->fd) != b);
- }
- }
- else {
- bindex_t tidx;
- compute_tree_index(size, tidx);
- if (treemap_is_marked(m, tidx)) {
- tchunkptr t = *treebin_at(m, tidx);
- size_t sizebits = size << leftshift_for_tree_index(tidx);
- while (t != 0 && chunksize(t) != size) {
- t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
- sizebits <<= 1;
- }
- if (t != 0) {
- tchunkptr u = t;
- do {
- if (u == (tchunkptr)x)
- return 1;
- } while ((u = u->fd) != t);
- }
- }
- }
- return 0;
-}
-
-/* Traverse each chunk and check it; return total */
-static size_t traverse_and_check(mstate m) {
- size_t sum = 0;
- if (is_initialized(m)) {
- msegmentptr s = &m->seg;
- sum += m->topsize + TOP_FOOT_SIZE;
- while (s != 0) {
- mchunkptr q = align_as_chunk(s->base);
- mchunkptr lastq = 0;
- assert(pinuse(q));
- while (segment_holds(s, q) &&
- q != m->top && q->head != FENCEPOST_HEAD) {
- sum += chunksize(q);
- if (is_inuse(q)) {
- assert(!bin_find(m, q));
- do_check_inuse_chunk(m, q);
- }
- else {
- assert(q == m->dv || bin_find(m, q));
- assert(lastq == 0 || is_inuse(lastq)); /* Not 2 consecutive free */
- do_check_free_chunk(m, q);
- }
- lastq = q;
- q = next_chunk(q);
- }
- s = s->next;
- }
- }
- return sum;
-}
-
-
-/* Check all properties of malloc_state. */
-static void do_check_malloc_state(mstate m) {
- bindex_t i;
- size_t total;
- /* check bins */
- for (i = 0; i < NSMALLBINS; ++i)
- do_check_smallbin(m, i);
- for (i = 0; i < NTREEBINS; ++i)
- do_check_treebin(m, i);
-
- if (m->dvsize != 0) { /* check dv chunk */
- do_check_any_chunk(m, m->dv);
- assert(m->dvsize == chunksize(m->dv));
- assert(m->dvsize >= MIN_CHUNK_SIZE);
- assert(bin_find(m, m->dv) == 0);
- }
-
- if (m->top != 0) { /* check top chunk */
- do_check_top_chunk(m, m->top);
- /*assert(m->topsize == chunksize(m->top)); redundant */
- assert(m->topsize > 0);
- assert(bin_find(m, m->top) == 0);
- }
-
- total = traverse_and_check(m);
- assert(total <= m->footprint);
- assert(m->footprint <= m->max_footprint);
-}
-#endif /* DEBUG */
-
-/* ----------------------------- statistics ------------------------------ */
-
-#if !NO_MALLINFO
-static struct mallinfo internal_mallinfo(mstate m) {
- struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- ensure_initialization();
- if (!PREACTION(m)) {
- check_malloc_state(m);
- if (is_initialized(m)) {
- size_t nfree = SIZE_T_ONE; /* top always free */
- size_t mfree = m->topsize + TOP_FOOT_SIZE;
- size_t sum = mfree;
- msegmentptr s = &m->seg;
- while (s != 0) {
- mchunkptr q = align_as_chunk(s->base);
- while (segment_holds(s, q) &&
- q != m->top && q->head != FENCEPOST_HEAD) {
- size_t sz = chunksize(q);
- sum += sz;
- if (!is_inuse(q)) {
- mfree += sz;
- ++nfree;
- }
- q = next_chunk(q);
- }
- s = s->next;
- }
-
- nm.arena = sum;
- nm.ordblks = nfree;
- nm.hblkhd = m->footprint - sum;
- /* BEGIN android-changed: usmblks set to footprint from max_footprint */
- nm.usmblks = m->footprint;
- /* END android-changed */
- nm.uordblks = m->footprint - mfree;
- nm.fordblks = mfree;
- nm.keepcost = m->topsize;
- }
-
- POSTACTION(m);
- }
- return nm;
-}
-#endif /* !NO_MALLINFO */
-
-#if !NO_MALLOC_STATS
-static void internal_malloc_stats(mstate m) {
- ensure_initialization();
- if (!PREACTION(m)) {
- size_t maxfp = 0;
- size_t fp = 0;
- size_t used = 0;
- check_malloc_state(m);
- if (is_initialized(m)) {
- msegmentptr s = &m->seg;
- maxfp = m->max_footprint;
- fp = m->footprint;
- used = fp - (m->topsize + TOP_FOOT_SIZE);
-
- while (s != 0) {
- mchunkptr q = align_as_chunk(s->base);
- while (segment_holds(s, q) &&
- q != m->top && q->head != FENCEPOST_HEAD) {
- if (!is_inuse(q))
- used -= chunksize(q);
- q = next_chunk(q);
- }
- s = s->next;
- }
- }
- POSTACTION(m); /* drop lock */
- fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp));
- fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp));
- fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used));
- }
-}
-#endif /* NO_MALLOC_STATS */
-
-/* ----------------------- Operations on smallbins ----------------------- */
-
-/*
- Various forms of linking and unlinking are defined as macros. Even
- the ones for trees, which are very long but have very short typical
- paths. This is ugly but reduces reliance on inlining support of
- compilers.
-*/
-
-/* Link a free chunk into a smallbin */
-#define insert_small_chunk(M, P, S) {\
- bindex_t I = small_index(S);\
- mchunkptr B = smallbin_at(M, I);\
- mchunkptr F = B;\
- assert(S >= MIN_CHUNK_SIZE);\
- if (!smallmap_is_marked(M, I))\
- mark_smallmap(M, I);\
- else if (RTCHECK(ok_address(M, B->fd)))\
- F = B->fd;\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- }\
- B->fd = P;\
- F->bk = P;\
- P->fd = F;\
- P->bk = B;\
-}
-
-/* Unlink a chunk from a smallbin */
-#define unlink_small_chunk(M, P, S) {\
- mchunkptr F = P->fd;\
- mchunkptr B = P->bk;\
- bindex_t I = small_index(S);\
- assert(P != B);\
- assert(P != F);\
- assert(chunksize(P) == small_index2size(I));\
- if (RTCHECK(F == smallbin_at(M,I) || (ok_address(M, F) && F->bk == P))) { \
- if (B == F) {\
- clear_smallmap(M, I);\
- }\
- else if (RTCHECK(B == smallbin_at(M,I) ||\
- (ok_address(M, B) && B->fd == P))) {\
- F->bk = B;\
- B->fd = F;\
- }\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- }\
- }\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- }\
-}
-
-/* Unlink the first chunk from a smallbin */
-#define unlink_first_small_chunk(M, B, P, I) {\
- mchunkptr F = P->fd;\
- assert(P != B);\
- assert(P != F);\
- assert(chunksize(P) == small_index2size(I));\
- if (B == F) {\
- clear_smallmap(M, I);\
- }\
- else if (RTCHECK(ok_address(M, F) && F->bk == P)) {\
- F->bk = B;\
- B->fd = F;\
- }\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- }\
-}
-
-/* Replace dv node, binning the old one */
-/* Used only when dvsize known to be small */
-#define replace_dv(M, P, S) {\
- size_t DVS = M->dvsize;\
- assert(is_small(DVS));\
- if (DVS != 0) {\
- mchunkptr DV = M->dv;\
- insert_small_chunk(M, DV, DVS);\
- }\
- M->dvsize = S;\
- M->dv = P;\
-}
-
-/* ------------------------- Operations on trees ------------------------- */
-
-/* Insert chunk into tree */
-#define insert_large_chunk(M, X, S) {\
- tbinptr* H;\
- bindex_t I;\
- compute_tree_index(S, I);\
- H = treebin_at(M, I);\
- X->index = I;\
- X->child[0] = X->child[1] = 0;\
- if (!treemap_is_marked(M, I)) {\
- mark_treemap(M, I);\
- *H = X;\
- X->parent = (tchunkptr)H;\
- X->fd = X->bk = X;\
- }\
- else {\
- tchunkptr T = *H;\
- size_t K = S << leftshift_for_tree_index(I);\
- for (;;) {\
- if (chunksize(T) != S) {\
- tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\
- K <<= 1;\
- if (*C != 0)\
- T = *C;\
- else if (RTCHECK(ok_address(M, C))) {\
- *C = X;\
- X->parent = T;\
- X->fd = X->bk = X;\
- break;\
- }\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- break;\
- }\
- }\
- else {\
- tchunkptr F = T->fd;\
- if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\
- T->fd = F->bk = X;\
- X->fd = F;\
- X->bk = T;\
- X->parent = 0;\
- break;\
- }\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- break;\
- }\
- }\
- }\
- }\
-}
-
-/*
- Unlink steps:
-
- 1. If x is a chained node, unlink it from its same-sized fd/bk links
- and choose its bk node as its replacement.
- 2. If x was the last node of its size, but not a leaf node, it must
- be replaced with a leaf node (not merely one with an open left or
- right), to make sure that lefts and rights of descendents
- correspond properly to bit masks. We use the rightmost descendent
- of x. We could use any other leaf, but this is easy to locate and
- tends to counteract removal of leftmosts elsewhere, and so keeps
- paths shorter than minimally guaranteed. This doesn't loop much
- because on average a node in a tree is near the bottom.
- 3. If x is the base of a chain (i.e., has parent links) relink
- x's parent and children to x's replacement (or null if none).
-*/
-
-#define unlink_large_chunk(M, X) {\
- tchunkptr XP = X->parent;\
- tchunkptr R;\
- if (X->bk != X) {\
- tchunkptr F = X->fd;\
- R = X->bk;\
- if (RTCHECK(ok_address(M, F) && F->bk == X && R->fd == X)) {\
- F->bk = R;\
- R->fd = F;\
- }\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- }\
- }\
- else {\
- tchunkptr* RP;\
- if (((R = *(RP = &(X->child[1]))) != 0) ||\
- ((R = *(RP = &(X->child[0]))) != 0)) {\
- tchunkptr* CP;\
- while ((*(CP = &(R->child[1])) != 0) ||\
- (*(CP = &(R->child[0])) != 0)) {\
- R = *(RP = CP);\
- }\
- if (RTCHECK(ok_address(M, RP)))\
- *RP = 0;\
- else {\
- CORRUPTION_ERROR_ACTION(M);\
- }\
- }\
- }\
- if (XP != 0) {\
- tbinptr* H = treebin_at(M, X->index);\
- if (X == *H) {\
- if ((*H = R) == 0) \
- clear_treemap(M, X->index);\
- }\
- else if (RTCHECK(ok_address(M, XP))) {\
- if (XP->child[0] == X) \
- XP->child[0] = R;\
- else \
- XP->child[1] = R;\
- }\
- else\
- CORRUPTION_ERROR_ACTION(M);\
- if (R != 0) {\
- if (RTCHECK(ok_address(M, R))) {\
- tchunkptr C0, C1;\
- R->parent = XP;\
- if ((C0 = X->child[0]) != 0) {\
- if (RTCHECK(ok_address(M, C0))) {\
- R->child[0] = C0;\
- C0->parent = R;\
- }\
- else\
- CORRUPTION_ERROR_ACTION(M);\
- }\
- if ((C1 = X->child[1]) != 0) {\
- if (RTCHECK(ok_address(M, C1))) {\
- R->child[1] = C1;\
- C1->parent = R;\
- }\
- else\
- CORRUPTION_ERROR_ACTION(M);\
- }\
- }\
- else\
- CORRUPTION_ERROR_ACTION(M);\
- }\
- }\
-}
-
-/* Relays to large vs small bin operations */
-
-#define insert_chunk(M, P, S)\
- if (is_small(S)) insert_small_chunk(M, P, S)\
- else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); }
-
-#define unlink_chunk(M, P, S)\
- if (is_small(S)) unlink_small_chunk(M, P, S)\
- else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); }
-
-
-/* Relays to internal calls to malloc/free from realloc, memalign etc */
-
-#if ONLY_MSPACES
-#define internal_malloc(m, b) mspace_malloc(m, b)
-#define internal_free(m, mem) mspace_free(m,mem);
-#else /* ONLY_MSPACES */
-#if MSPACES
-#define internal_malloc(m, b)\
- ((m == gm)? dlmalloc(b) : mspace_malloc(m, b))
-#define internal_free(m, mem)\
- if (m == gm) dlfree(mem); else mspace_free(m,mem);
-#else /* MSPACES */
-#define internal_malloc(m, b) dlmalloc(b)
-#define internal_free(m, mem) dlfree(mem)
-#endif /* MSPACES */
-#endif /* ONLY_MSPACES */
-
-/* ----------------------- Direct-mmapping chunks ----------------------- */
-
-/*
- Directly mmapped chunks are set up with an offset to the start of
- the mmapped region stored in the prev_foot field of the chunk. This
- allows reconstruction of the required argument to MUNMAP when freed,
- and also allows adjustment of the returned chunk to meet alignment
- requirements (especially in memalign).
-*/
-
-/* Malloc using mmap */
-static void* mmap_alloc(mstate m, size_t nb) {
- size_t mmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
- if (m->footprint_limit != 0) {
- size_t fp = m->footprint + mmsize;
- if (fp <= m->footprint || fp > m->footprint_limit)
- return 0;
- }
- if (mmsize > nb) { /* Check for wrap around 0 */
- char* mm = (char*)(CALL_DIRECT_MMAP(mmsize));
- if (mm != CMFAIL) {
- size_t offset = align_offset(chunk2mem(mm));
- size_t psize = mmsize - offset - MMAP_FOOT_PAD;
- mchunkptr p = (mchunkptr)(mm + offset);
- p->prev_foot = offset;
- p->head = psize;
- mark_inuse_foot(m, p, psize);
- chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD;
- chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0;
-
- if (m->least_addr == 0 || mm < m->least_addr)
- m->least_addr = mm;
- if ((m->footprint += mmsize) > m->max_footprint)
- m->max_footprint = m->footprint;
- assert(is_aligned(chunk2mem(p)));
- check_mmapped_chunk(m, p);
- return chunk2mem(p);
- }
- }
- return 0;
-}
-
-/* Realloc using mmap */
-static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb, int flags) {
- size_t oldsize = chunksize(oldp);
- (void)flags; /* placate people compiling -Wunused */
- if (is_small(nb)) /* Can't shrink mmap regions below small size */
- return 0;
- /* Keep old chunk if big enough but not too big */
- if (oldsize >= nb + SIZE_T_SIZE &&
- (oldsize - nb) <= (mparams.granularity << 1))
- return oldp;
- else {
- size_t offset = oldp->prev_foot;
- size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD;
- size_t newmmsize = mmap_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
- char* cp = (char*)CALL_MREMAP((char*)oldp - offset,
- oldmmsize, newmmsize, flags);
- if (cp != CMFAIL) {
- mchunkptr newp = (mchunkptr)(cp + offset);
- size_t psize = newmmsize - offset - MMAP_FOOT_PAD;
- newp->head = psize;
- mark_inuse_foot(m, newp, psize);
- chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD;
- chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0;
-
- if (cp < m->least_addr)
- m->least_addr = cp;
- if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint)
- m->max_footprint = m->footprint;
- check_mmapped_chunk(m, newp);
- return newp;
- }
- }
- return 0;
-}
-
-
-/* -------------------------- mspace management -------------------------- */
-
-/* Initialize top chunk and its size */
-static void init_top(mstate m, mchunkptr p, size_t psize) {
- /* Ensure alignment */
- size_t offset = align_offset(chunk2mem(p));
- p = (mchunkptr)((char*)p + offset);
- psize -= offset;
-
- m->top = p;
- m->topsize = psize;
- p->head = psize | PINUSE_BIT;
- /* set size of fake trailing chunk holding overhead space only once */
- chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE;
- m->trim_check = mparams.trim_threshold; /* reset on each update */
-}
-
-/* Initialize bins for a new mstate that is otherwise zeroed out */
-static void init_bins(mstate m) {
- /* Establish circular links for smallbins */
- bindex_t i;
- for (i = 0; i < NSMALLBINS; ++i) {
- sbinptr bin = smallbin_at(m,i);
- bin->fd = bin->bk = bin;
- }
-}
-
-#if PROCEED_ON_ERROR
-
-/* default corruption action */
-static void reset_on_error(mstate m) {
- int i;
- ++malloc_corruption_error_count;
- /* Reinitialize fields to forget about all memory */
- m->smallmap = m->treemap = 0;
- m->dvsize = m->topsize = 0;
- m->seg.base = 0;
- m->seg.size = 0;
- m->seg.next = 0;
- m->top = m->dv = 0;
- for (i = 0; i < NTREEBINS; ++i)
- *treebin_at(m, i) = 0;
- init_bins(m);
-}
-#endif /* PROCEED_ON_ERROR */
-
-/* Allocate chunk and prepend remainder with chunk in successor base. */
-static void* prepend_alloc(mstate m, char* newbase, char* oldbase,
- size_t nb) {
- mchunkptr p = align_as_chunk(newbase);
- mchunkptr oldfirst = align_as_chunk(oldbase);
- size_t psize = (char*)oldfirst - (char*)p;
- mchunkptr q = chunk_plus_offset(p, nb);
- size_t qsize = psize - nb;
- set_size_and_pinuse_of_inuse_chunk(m, p, nb);
-
- assert((char*)oldfirst > (char*)q);
- assert(pinuse(oldfirst));
- assert(qsize >= MIN_CHUNK_SIZE);
-
- /* consolidate remainder with first chunk of old base */
- if (oldfirst == m->top) {
- size_t tsize = m->topsize += qsize;
- m->top = q;
- q->head = tsize | PINUSE_BIT;
- check_top_chunk(m, q);
- }
- else if (oldfirst == m->dv) {
- size_t dsize = m->dvsize += qsize;
- m->dv = q;
- set_size_and_pinuse_of_free_chunk(q, dsize);
- }
- else {
- if (!is_inuse(oldfirst)) {
- size_t nsize = chunksize(oldfirst);
- unlink_chunk(m, oldfirst, nsize);
- oldfirst = chunk_plus_offset(oldfirst, nsize);
- qsize += nsize;
- }
- set_free_with_pinuse(q, qsize, oldfirst);
- insert_chunk(m, q, qsize);
- check_free_chunk(m, q);
- }
-
- check_malloced_chunk(m, chunk2mem(p), nb);
- return chunk2mem(p);
-}
-
-/* Add a segment to hold a new noncontiguous region */
-static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) {
- /* Determine locations and sizes of segment, fenceposts, old top */
- char* old_top = (char*)m->top;
- msegmentptr oldsp = segment_holding(m, old_top);
- char* old_end = oldsp->base + oldsp->size;
- size_t ssize = pad_request(sizeof(struct malloc_segment));
- char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK);
- size_t offset = align_offset(chunk2mem(rawsp));
- char* asp = rawsp + offset;
- char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp;
- mchunkptr sp = (mchunkptr)csp;
- msegmentptr ss = (msegmentptr)(chunk2mem(sp));
- mchunkptr tnext = chunk_plus_offset(sp, ssize);
- mchunkptr p = tnext;
- int nfences = 0;
-
- /* reset top to new space */
- init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
-
- /* Set up segment record */
- assert(is_aligned(ss));
- set_size_and_pinuse_of_inuse_chunk(m, sp, ssize);
- *ss = m->seg; /* Push current record */
- m->seg.base = tbase;
- m->seg.size = tsize;
- m->seg.sflags = mmapped;
- m->seg.next = ss;
-
- /* Insert trailing fenceposts */
- for (;;) {
- mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE);
- p->head = FENCEPOST_HEAD;
- ++nfences;
- if ((char*)(&(nextp->head)) < old_end)
- p = nextp;
- else
- break;
- }
- assert(nfences >= 2);
-
- /* Insert the rest of old top into a bin as an ordinary free chunk */
- if (csp != old_top) {
- mchunkptr q = (mchunkptr)old_top;
- size_t psize = csp - old_top;
- mchunkptr tn = chunk_plus_offset(q, psize);
- set_free_with_pinuse(q, psize, tn);
- insert_chunk(m, q, psize);
- }
-
- check_top_chunk(m, m->top);
-}
-
-/* -------------------------- System allocation -------------------------- */
-
-/* Get memory from system using MORECORE or MMAP */
-static void* sys_alloc(mstate m, size_t nb) {
- char* tbase = CMFAIL;
- size_t tsize = 0;
- flag_t mmap_flag = 0;
- size_t asize; /* allocation size */
-
- ensure_initialization();
-
- /* Directly map large chunks, but only if already initialized */
- if (use_mmap(m) && nb >= mparams.mmap_threshold && m->topsize != 0) {
- void* mem = mmap_alloc(m, nb);
- if (mem != 0)
- return mem;
- }
-
- asize = granularity_align(nb + SYS_ALLOC_PADDING);
- if (asize <= nb) {
- /* BEGIN android-added: set errno */
- MALLOC_FAILURE_ACTION;
- /* END android-added */
- return 0; /* wraparound */
- }
- if (m->footprint_limit != 0) {
- size_t fp = m->footprint + asize;
- if (fp <= m->footprint || fp > m->footprint_limit) {
- /* BEGIN android-added: set errno */
- MALLOC_FAILURE_ACTION;
- /* END android-added */
- return 0;
- }
- }
-
- /*
- Try getting memory in any of three ways (in most-preferred to
- least-preferred order):
- 1. A call to MORECORE that can normally contiguously extend memory.
- (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or
- or main space is mmapped or a previous contiguous call failed)
- 2. A call to MMAP new space (disabled if not HAVE_MMAP).
- Note that under the default settings, if MORECORE is unable to
- fulfill a request, and HAVE_MMAP is true, then mmap is
- used as a noncontiguous system allocator. This is a useful backup
- strategy for systems with holes in address spaces -- in this case
- sbrk cannot contiguously expand the heap, but mmap may be able to
- find space.
- 3. A call to MORECORE that cannot usually contiguously extend memory.
- (disabled if not HAVE_MORECORE)
-
- In all cases, we need to request enough bytes from system to ensure
- we can malloc nb bytes upon success, so pad with enough space for
- top_foot, plus alignment-pad to make sure we don't lose bytes if
- not on boundary, and round this up to a granularity unit.
- */
-
- if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) {
- char* br = CMFAIL;
- size_t ssize = asize; /* sbrk call size */
- msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top);
- ACQUIRE_MALLOC_GLOBAL_LOCK();
-
- if (ss == 0) { /* First time through or recovery */
- char* base = (char*)CALL_MORECORE(0);
- if (base != CMFAIL) {
- size_t fp;
- /* Adjust to end on a page boundary */
- if (!is_page_aligned(base))
- ssize += (page_align((size_t)base) - (size_t)base);
- fp = m->footprint + ssize; /* recheck limits */
- if (ssize > nb && ssize < HALF_MAX_SIZE_T &&
- (m->footprint_limit == 0 ||
- (fp > m->footprint && fp <= m->footprint_limit)) &&
- (br = (char*)(CALL_MORECORE(ssize))) == base) {
- tbase = base;
- tsize = ssize;
- }
- }
- }
- else {
- /* Subtract out existing available top space from MORECORE request. */
- ssize = granularity_align(nb - m->topsize + SYS_ALLOC_PADDING);
- /* Use mem here only if it did continuously extend old space */
- if (ssize < HALF_MAX_SIZE_T &&
- (br = (char*)(CALL_MORECORE(ssize))) == ss->base+ss->size) {
- tbase = br;
- tsize = ssize;
- }
- }
-
- if (tbase == CMFAIL) { /* Cope with partial failure */
- if (br != CMFAIL) { /* Try to use/extend the space we did get */
- if (ssize < HALF_MAX_SIZE_T &&
- ssize < nb + SYS_ALLOC_PADDING) {
- size_t esize = granularity_align(nb + SYS_ALLOC_PADDING - ssize);
- if (esize < HALF_MAX_SIZE_T) {
- char* end = (char*)CALL_MORECORE(esize);
- if (end != CMFAIL)
- ssize += esize;
- else { /* Can't use; try to release */
- (void) CALL_MORECORE(-ssize);
- br = CMFAIL;
- }
- }
- }
- }
- if (br != CMFAIL) { /* Use the space we did get */
- tbase = br;
- tsize = ssize;
- }
- else
- disable_contiguous(m); /* Don't try contiguous path in the future */
- }
-
- RELEASE_MALLOC_GLOBAL_LOCK();
- }
-
- if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */
- char* mp = (char*)(CALL_MMAP(asize));
- if (mp != CMFAIL) {
- tbase = mp;
- tsize = asize;
- mmap_flag = USE_MMAP_BIT;
- }
- }
-
- if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */
- if (asize < HALF_MAX_SIZE_T) {
- char* br = CMFAIL;
- char* end = CMFAIL;
- ACQUIRE_MALLOC_GLOBAL_LOCK();
- br = (char*)(CALL_MORECORE(asize));
- end = (char*)(CALL_MORECORE(0));
- RELEASE_MALLOC_GLOBAL_LOCK();
- if (br != CMFAIL && end != CMFAIL && br < end) {
- size_t ssize = end - br;
- if (ssize > nb + TOP_FOOT_SIZE) {
- tbase = br;
- tsize = ssize;
- }
- }
- }
- }
-
- if (tbase != CMFAIL) {
-
- if ((m->footprint += tsize) > m->max_footprint)
- m->max_footprint = m->footprint;
-
- if (!is_initialized(m)) { /* first-time initialization */
- if (m->least_addr == 0 || tbase < m->least_addr)
- m->least_addr = tbase;
- m->seg.base = tbase;
- m->seg.size = tsize;
- m->seg.sflags = mmap_flag;
- m->magic = mparams.magic;
- m->release_checks = MAX_RELEASE_CHECK_RATE;
- init_bins(m);
-#if !ONLY_MSPACES
- if (is_global(m))
- init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE);
- else
-#endif
- {
- /* Offset top by embedded malloc_state */
- mchunkptr mn = next_chunk(mem2chunk(m));
- init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE);
- }
- }
-
- else {
- /* Try to merge with an existing segment */
- msegmentptr sp = &m->seg;
- /* Only consider most recent segment if traversal suppressed */
- while (sp != 0 && tbase != sp->base + sp->size)
- sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
- if (sp != 0 &&
- !is_extern_segment(sp) &&
- (sp->sflags & USE_MMAP_BIT) == mmap_flag &&
- segment_holds(sp, m->top)) { /* append */
- sp->size += tsize;
- init_top(m, m->top, m->topsize + tsize);
- }
- else {
- if (tbase < m->least_addr)
- m->least_addr = tbase;
- sp = &m->seg;
- while (sp != 0 && sp->base != tbase + tsize)
- sp = (NO_SEGMENT_TRAVERSAL) ? 0 : sp->next;
- if (sp != 0 &&
- !is_extern_segment(sp) &&
- (sp->sflags & USE_MMAP_BIT) == mmap_flag) {
- char* oldbase = sp->base;
- sp->base = tbase;
- sp->size += tsize;
- return prepend_alloc(m, tbase, oldbase, nb);
- }
- else
- add_segment(m, tbase, tsize, mmap_flag);
- }
- }
-
- if (nb < m->topsize) { /* Allocate from new or extended top space */
- size_t rsize = m->topsize -= nb;
- mchunkptr p = m->top;
- mchunkptr r = m->top = chunk_plus_offset(p, nb);
- r->head = rsize | PINUSE_BIT;
- set_size_and_pinuse_of_inuse_chunk(m, p, nb);
- check_top_chunk(m, m->top);
- check_malloced_chunk(m, chunk2mem(p), nb);
- return chunk2mem(p);
- }
- }
-
- MALLOC_FAILURE_ACTION;
- return 0;
-}
-
-/* ----------------------- system deallocation -------------------------- */
-
-/* Unmap and unlink any mmapped segments that don't contain used chunks */
-static size_t release_unused_segments(mstate m) {
- size_t released = 0;
- int nsegs = 0;
- msegmentptr pred = &m->seg;
- msegmentptr sp = pred->next;
- while (sp != 0) {
- char* base = sp->base;
- size_t size = sp->size;
- msegmentptr next = sp->next;
- ++nsegs;
- if (is_mmapped_segment(sp) && !is_extern_segment(sp)) {
- mchunkptr p = align_as_chunk(base);
- size_t psize = chunksize(p);
- /* Can unmap if first chunk holds entire segment and not pinned */
- if (!is_inuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) {
- tchunkptr tp = (tchunkptr)p;
- assert(segment_holds(sp, (char*)sp));
- if (p == m->dv) {
- m->dv = 0;
- m->dvsize = 0;
- }
- else {
- unlink_large_chunk(m, tp);
- }
- if (CALL_MUNMAP(base, size) == 0) {
- released += size;
- m->footprint -= size;
- /* unlink obsoleted record */
- sp = pred;
- sp->next = next;
- }
- else { /* back out if cannot unmap */
- insert_large_chunk(m, tp, psize);
- }
- }
- }
- if (NO_SEGMENT_TRAVERSAL) /* scan only first segment */
- break;
- pred = sp;
- sp = next;
- }
- /* Reset check counter */
- m->release_checks = (((size_t) nsegs > (size_t) MAX_RELEASE_CHECK_RATE)?
- (size_t) nsegs : (size_t) MAX_RELEASE_CHECK_RATE);
- return released;
-}
-
-static int sys_trim(mstate m, size_t pad) {
- size_t released = 0;
- ensure_initialization();
- if (pad < MAX_REQUEST && is_initialized(m)) {
- pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */
-
- if (m->topsize > pad) {
- /* Shrink top space in granularity-size units, keeping at least one */
- size_t unit = mparams.granularity;
- size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit -
- SIZE_T_ONE) * unit;
- msegmentptr sp = segment_holding(m, (char*)m->top);
-
- if (!is_extern_segment(sp)) {
- if (is_mmapped_segment(sp)) {
- if (HAVE_MMAP &&
- sp->size >= extra &&
- !has_segment_link(m, sp)) { /* can't shrink if pinned */
- size_t newsize = sp->size - extra;
- (void)newsize; /* placate people compiling -Wunused-variable */
- /* Prefer mremap, fall back to munmap */
- if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) ||
- (CALL_MUNMAP(sp->base + newsize, extra) == 0)) {
- released = extra;
- }
- }
- }
- else if (HAVE_MORECORE) {
- if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */
- extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit;
- ACQUIRE_MALLOC_GLOBAL_LOCK();
- {
- /* Make sure end of memory is where we last set it. */
- char* old_br = (char*)(CALL_MORECORE(0));
- if (old_br == sp->base + sp->size) {
- char* rel_br = (char*)(CALL_MORECORE(-extra));
- char* new_br = (char*)(CALL_MORECORE(0));
- if (rel_br != CMFAIL && new_br < old_br)
- released = old_br - new_br;
- }
- }
- RELEASE_MALLOC_GLOBAL_LOCK();
- }
- }
-
- if (released != 0) {
- sp->size -= released;
- m->footprint -= released;
- init_top(m, m->top, m->topsize - released);
- check_top_chunk(m, m->top);
- }
- }
-
- /* Unmap any unused mmapped segments */
- if (HAVE_MMAP)
- released += release_unused_segments(m);
-
- /* On failure, disable autotrim to avoid repeated failed future calls */
- if (released == 0 && m->topsize > m->trim_check)
- m->trim_check = MAX_SIZE_T;
- }
-
- return (released != 0)? 1 : 0;
-}
-
-/* Consolidate and bin a chunk. Differs from exported versions
- of free mainly in that the chunk need not be marked as inuse.
-*/
-static void dispose_chunk(mstate m, mchunkptr p, size_t psize) {
- mchunkptr next = chunk_plus_offset(p, psize);
- if (!pinuse(p)) {
- mchunkptr prev;
- size_t prevsize = p->prev_foot;
- if (is_mmapped(p)) {
- psize += prevsize + MMAP_FOOT_PAD;
- if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
- m->footprint -= psize;
- return;
- }
- prev = chunk_minus_offset(p, prevsize);
- psize += prevsize;
- p = prev;
- if (RTCHECK(ok_address(m, prev))) { /* consolidate backward */
- if (p != m->dv) {
- unlink_chunk(m, p, prevsize);
- }
- else if ((next->head & INUSE_BITS) == INUSE_BITS) {
- m->dvsize = psize;
- set_free_with_pinuse(p, psize, next);
- return;
- }
- }
- else {
- CORRUPTION_ERROR_ACTION(m);
- return;
- }
- }
- if (RTCHECK(ok_address(m, next))) {
- if (!cinuse(next)) { /* consolidate forward */
- if (next == m->top) {
- size_t tsize = m->topsize += psize;
- m->top = p;
- p->head = tsize | PINUSE_BIT;
- if (p == m->dv) {
- m->dv = 0;
- m->dvsize = 0;
- }
- return;
- }
- else if (next == m->dv) {
- size_t dsize = m->dvsize += psize;
- m->dv = p;
- set_size_and_pinuse_of_free_chunk(p, dsize);
- return;
- }
- else {
- size_t nsize = chunksize(next);
- psize += nsize;
- unlink_chunk(m, next, nsize);
- set_size_and_pinuse_of_free_chunk(p, psize);
- if (p == m->dv) {
- m->dvsize = psize;
- return;
- }
- }
- }
- else {
- set_free_with_pinuse(p, psize, next);
- }
- insert_chunk(m, p, psize);
- }
- else {
- CORRUPTION_ERROR_ACTION(m);
- }
-}
-
-/* ---------------------------- malloc --------------------------- */
-
-/* allocate a large request from the best fitting chunk in a treebin */
-static void* tmalloc_large(mstate m, size_t nb) {
- tchunkptr v = 0;
- size_t rsize = -nb; /* Unsigned negation */
- tchunkptr t;
- bindex_t idx;
- compute_tree_index(nb, idx);
- if ((t = *treebin_at(m, idx)) != 0) {
- /* Traverse tree for this bin looking for node with size == nb */
- size_t sizebits = nb << leftshift_for_tree_index(idx);
- tchunkptr rst = 0; /* The deepest untaken right subtree */
- for (;;) {
- tchunkptr rt;
- size_t trem = chunksize(t) - nb;
- if (trem < rsize) {
- v = t;
- if ((rsize = trem) == 0)
- break;
- }
- rt = t->child[1];
- t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1];
- if (rt != 0 && rt != t)
- rst = rt;
- if (t == 0) {
- t = rst; /* set t to least subtree holding sizes > nb */
- break;
- }
- sizebits <<= 1;
- }
- }
- if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */
- binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap;
- if (leftbits != 0) {
- bindex_t i;
- binmap_t leastbit = least_bit(leftbits);
- compute_bit2idx(leastbit, i);
- t = *treebin_at(m, i);
- }
- }
-
- while (t != 0) { /* find smallest of tree or subtree */
- size_t trem = chunksize(t) - nb;
- if (trem < rsize) {
- rsize = trem;
- v = t;
- }
- t = leftmost_child(t);
- }
-
- /* If dv is a better fit, return 0 so malloc will use it */
- if (v != 0 && rsize < (size_t)(m->dvsize - nb)) {
- if (RTCHECK(ok_address(m, v))) { /* split */
- mchunkptr r = chunk_plus_offset(v, nb);
- assert(chunksize(v) == rsize + nb);
- if (RTCHECK(ok_next(v, r))) {
- unlink_large_chunk(m, v);
- if (rsize < MIN_CHUNK_SIZE)
- set_inuse_and_pinuse(m, v, (rsize + nb));
- else {
- set_size_and_pinuse_of_inuse_chunk(m, v, nb);
- set_size_and_pinuse_of_free_chunk(r, rsize);
- insert_chunk(m, r, rsize);
- }
- return chunk2mem(v);
- }
- }
- CORRUPTION_ERROR_ACTION(m);
- }
- return 0;
-}
-
-/* allocate a small request from the best fitting chunk in a treebin */
-static void* tmalloc_small(mstate m, size_t nb) {
- tchunkptr t, v;
- size_t rsize;
- bindex_t i;
- binmap_t leastbit = least_bit(m->treemap);
- compute_bit2idx(leastbit, i);
- v = t = *treebin_at(m, i);
- rsize = chunksize(t) - nb;
-
- while ((t = leftmost_child(t)) != 0) {
- size_t trem = chunksize(t) - nb;
- if (trem < rsize) {
- rsize = trem;
- v = t;
- }
- }
-
- if (RTCHECK(ok_address(m, v))) {
- mchunkptr r = chunk_plus_offset(v, nb);
- assert(chunksize(v) == rsize + nb);
- if (RTCHECK(ok_next(v, r))) {
- unlink_large_chunk(m, v);
- if (rsize < MIN_CHUNK_SIZE)
- set_inuse_and_pinuse(m, v, (rsize + nb));
- else {
- set_size_and_pinuse_of_inuse_chunk(m, v, nb);
- set_size_and_pinuse_of_free_chunk(r, rsize);
- replace_dv(m, r, rsize);
- }
- return chunk2mem(v);
- }
- }
-
- CORRUPTION_ERROR_ACTION(m);
- return 0;
-}
-
-#if !ONLY_MSPACES
-
-void* dlmalloc(size_t bytes) {
- /*
- Basic algorithm:
- If a small request (< 256 bytes minus per-chunk overhead):
- 1. If one exists, use a remainderless chunk in associated smallbin.
- (Remainderless means that there are too few excess bytes to
- represent as a chunk.)
- 2. If it is big enough, use the dv chunk, which is normally the
- chunk adjacent to the one used for the most recent small request.
- 3. If one exists, split the smallest available chunk in a bin,
- saving remainder in dv.
- 4. If it is big enough, use the top chunk.
- 5. If available, get memory from system and use it
- Otherwise, for a large request:
- 1. Find the smallest available binned chunk that fits, and use it
- if it is better fitting than dv chunk, splitting if necessary.
- 2. If better fitting than any binned chunk, use the dv chunk.
- 3. If it is big enough, use the top chunk.
- 4. If request size >= mmap threshold, try to directly mmap this chunk.
- 5. If available, get memory from system and use it
-
- The ugly goto's here ensure that postaction occurs along all paths.
- */
-
-#if USE_LOCKS
- ensure_initialization(); /* initialize in sys_alloc if not using locks */
-#endif
-
- if (!PREACTION(gm)) {
- void* mem;
- size_t nb;
- if (bytes <= MAX_SMALL_REQUEST) {
- bindex_t idx;
- binmap_t smallbits;
- nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
- idx = small_index(nb);
- smallbits = gm->smallmap >> idx;
-
- if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
- mchunkptr b, p;
- idx += ~smallbits & 1; /* Uses next bin if idx empty */
- b = smallbin_at(gm, idx);
- p = b->fd;
- assert(chunksize(p) == small_index2size(idx));
- unlink_first_small_chunk(gm, b, p, idx);
- set_inuse_and_pinuse(gm, p, small_index2size(idx));
- mem = chunk2mem(p);
- check_malloced_chunk(gm, mem, nb);
- goto postaction;
- }
-
- else if (nb > gm->dvsize) {
- if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
- mchunkptr b, p, r;
- size_t rsize;
- bindex_t i;
- binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
- binmap_t leastbit = least_bit(leftbits);
- compute_bit2idx(leastbit, i);
- b = smallbin_at(gm, i);
- p = b->fd;
- assert(chunksize(p) == small_index2size(i));
- unlink_first_small_chunk(gm, b, p, i);
- rsize = small_index2size(i) - nb;
- /* Fit here cannot be remainderless if 4byte sizes */
- if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
- set_inuse_and_pinuse(gm, p, small_index2size(i));
- else {
- set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
- r = chunk_plus_offset(p, nb);
- set_size_and_pinuse_of_free_chunk(r, rsize);
- replace_dv(gm, r, rsize);
- }
- mem = chunk2mem(p);
- check_malloced_chunk(gm, mem, nb);
- goto postaction;
- }
-
- else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
- check_malloced_chunk(gm, mem, nb);
- goto postaction;
- }
- }
- }
- else if (bytes >= MAX_REQUEST)
- nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
- else {
- nb = pad_request(bytes);
- if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
- check_malloced_chunk(gm, mem, nb);
- goto postaction;
- }
- }
-
- if (nb <= gm->dvsize) {
- size_t rsize = gm->dvsize - nb;
- mchunkptr p = gm->dv;
- if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
- mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
- gm->dvsize = rsize;
- set_size_and_pinuse_of_free_chunk(r, rsize);
- set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
- }
- else { /* exhaust dv */
- size_t dvs = gm->dvsize;
- gm->dvsize = 0;
- gm->dv = 0;
- set_inuse_and_pinuse(gm, p, dvs);
- }
- mem = chunk2mem(p);
- check_malloced_chunk(gm, mem, nb);
- goto postaction;
- }
-
- else if (nb < gm->topsize) { /* Split top */
- size_t rsize = gm->topsize -= nb;
- mchunkptr p = gm->top;
- mchunkptr r = gm->top = chunk_plus_offset(p, nb);
- r->head = rsize | PINUSE_BIT;
- set_size_and_pinuse_of_inuse_chunk(gm, p, nb);
- mem = chunk2mem(p);
- check_top_chunk(gm, gm->top);
- check_malloced_chunk(gm, mem, nb);
- goto postaction;
- }
-
- mem = sys_alloc(gm, nb);
-
- postaction:
- POSTACTION(gm);
- return mem;
- }
-
- return 0;
-}
-
-/* ---------------------------- free --------------------------- */
-
-void dlfree(void* mem) {
- /*
- Consolidate freed chunks with preceeding or succeeding bordering
- free chunks, if they exist, and then place in a bin. Intermixed
- with special cases for top, dv, mmapped chunks, and usage errors.
- */
-
- if (mem != 0) {
- mchunkptr p = mem2chunk(mem);
-#if FOOTERS
- mstate fm = get_mstate_for(p);
- if (!ok_magic(fm)) {
- USAGE_ERROR_ACTION(fm, p);
- return;
- }
-#else /* FOOTERS */
-#define fm gm
-#endif /* FOOTERS */
- if (!PREACTION(fm)) {
- check_inuse_chunk(fm, p);
- if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
- size_t psize = chunksize(p);
- mchunkptr next = chunk_plus_offset(p, psize);
- if (!pinuse(p)) {
- size_t prevsize = p->prev_foot;
- if (is_mmapped(p)) {
- psize += prevsize + MMAP_FOOT_PAD;
- if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
- fm->footprint -= psize;
- goto postaction;
- }
- else {
- mchunkptr prev = chunk_minus_offset(p, prevsize);
- psize += prevsize;
- p = prev;
- if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
- if (p != fm->dv) {
- unlink_chunk(fm, p, prevsize);
- }
- else if ((next->head & INUSE_BITS) == INUSE_BITS) {
- fm->dvsize = psize;
- set_free_with_pinuse(p, psize, next);
- goto postaction;
- }
- }
- else
- goto erroraction;
- }
- }
-
- if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
- if (!cinuse(next)) { /* consolidate forward */
- if (next == fm->top) {
- size_t tsize = fm->topsize += psize;
- fm->top = p;
- p->head = tsize | PINUSE_BIT;
- if (p == fm->dv) {
- fm->dv = 0;
- fm->dvsize = 0;
- }
- if (should_trim(fm, tsize))
- sys_trim(fm, 0);
- goto postaction;
- }
- else if (next == fm->dv) {
- size_t dsize = fm->dvsize += psize;
- fm->dv = p;
- set_size_and_pinuse_of_free_chunk(p, dsize);
- goto postaction;
- }
- else {
- size_t nsize = chunksize(next);
- psize += nsize;
- unlink_chunk(fm, next, nsize);
- set_size_and_pinuse_of_free_chunk(p, psize);
- if (p == fm->dv) {
- fm->dvsize = psize;
- goto postaction;
- }
- }
- }
- else
- set_free_with_pinuse(p, psize, next);
-
- if (is_small(psize)) {
- insert_small_chunk(fm, p, psize);
- check_free_chunk(fm, p);
- }
- else {
- tchunkptr tp = (tchunkptr)p;
- insert_large_chunk(fm, tp, psize);
- check_free_chunk(fm, p);
- if (--fm->release_checks == 0)
- release_unused_segments(fm);
- }
- goto postaction;
- }
- }
- erroraction:
- USAGE_ERROR_ACTION(fm, p);
- postaction:
- POSTACTION(fm);
- }
- }
-#if !FOOTERS
-#undef fm
-#endif /* FOOTERS */
-}
-
-void* dlcalloc(size_t n_elements, size_t elem_size) {
- void* mem;
- size_t req = 0;
- if (n_elements != 0) {
- req = n_elements * elem_size;
- if (((n_elements | elem_size) & ~(size_t)0xffff) &&
- (req / n_elements != elem_size))
- req = MAX_SIZE_T; /* force downstream failure on overflow */
- }
- mem = dlmalloc(req);
- if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
- memset(mem, 0, req);
- return mem;
-}
-
-#endif /* !ONLY_MSPACES */
-
-/* ------------ Internal support for realloc, memalign, etc -------------- */
-
-/* Try to realloc; only in-place unless can_move true */
-static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb,
- int can_move) {
- mchunkptr newp = 0;
- size_t oldsize = chunksize(p);
- mchunkptr next = chunk_plus_offset(p, oldsize);
- if (RTCHECK(ok_address(m, p) && ok_inuse(p) &&
- ok_next(p, next) && ok_pinuse(next))) {
- if (is_mmapped(p)) {
- newp = mmap_resize(m, p, nb, can_move);
- }
- else if (oldsize >= nb) { /* already big enough */
- size_t rsize = oldsize - nb;
- if (rsize >= MIN_CHUNK_SIZE) { /* split off remainder */
- mchunkptr r = chunk_plus_offset(p, nb);
- set_inuse(m, p, nb);
- set_inuse(m, r, rsize);
- dispose_chunk(m, r, rsize);
- }
- newp = p;
- }
- else if (next == m->top) { /* extend into top */
- if (oldsize + m->topsize > nb) {
- size_t newsize = oldsize + m->topsize;
- size_t newtopsize = newsize - nb;
- mchunkptr newtop = chunk_plus_offset(p, nb);
- set_inuse(m, p, nb);
- newtop->head = newtopsize |PINUSE_BIT;
- m->top = newtop;
- m->topsize = newtopsize;
- newp = p;
- }
- }
- else if (next == m->dv) { /* extend into dv */
- size_t dvs = m->dvsize;
- if (oldsize + dvs >= nb) {
- size_t dsize = oldsize + dvs - nb;
- if (dsize >= MIN_CHUNK_SIZE) {
- mchunkptr r = chunk_plus_offset(p, nb);
- mchunkptr n = chunk_plus_offset(r, dsize);
- set_inuse(m, p, nb);
- set_size_and_pinuse_of_free_chunk(r, dsize);
- clear_pinuse(n);
- m->dvsize = dsize;
- m->dv = r;
- }
- else { /* exhaust dv */
- size_t newsize = oldsize + dvs;
- set_inuse(m, p, newsize);
- m->dvsize = 0;
- m->dv = 0;
- }
- newp = p;
- }
- }
- else if (!cinuse(next)) { /* extend into next free chunk */
- size_t nextsize = chunksize(next);
- if (oldsize + nextsize >= nb) {
- size_t rsize = oldsize + nextsize - nb;
- unlink_chunk(m, next, nextsize);
- if (rsize < MIN_CHUNK_SIZE) {
- size_t newsize = oldsize + nextsize;
- set_inuse(m, p, newsize);
- }
- else {
- mchunkptr r = chunk_plus_offset(p, nb);
- set_inuse(m, p, nb);
- set_inuse(m, r, rsize);
- dispose_chunk(m, r, rsize);
- }
- newp = p;
- }
- }
- }
- else {
- USAGE_ERROR_ACTION(m, chunk2mem(p));
- }
- return newp;
-}
-
-static void* internal_memalign(mstate m, size_t alignment, size_t bytes) {
- void* mem = 0;
- if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */
- alignment = MIN_CHUNK_SIZE;
- if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */
- size_t a = MALLOC_ALIGNMENT << 1;
- while (a < alignment) a <<= 1;
- alignment = a;
- }
- if (bytes >= MAX_REQUEST - alignment) {
- if (m != 0) { /* Test isn't needed but avoids compiler warning */
- MALLOC_FAILURE_ACTION;
- }
- }
- else {
- size_t nb = request2size(bytes);
- size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD;
- mem = internal_malloc(m, req);
- if (mem != 0) {
- mchunkptr p = mem2chunk(mem);
- if (PREACTION(m))
- return 0;
- if ((((size_t)(mem)) & (alignment - 1)) != 0) { /* misaligned */
- /*
- Find an aligned spot inside chunk. Since we need to give
- back leading space in a chunk of at least MIN_CHUNK_SIZE, if
- the first calculation places us at a spot with less than
- MIN_CHUNK_SIZE leader, we can move to the next aligned spot.
- We've allocated enough total room so that this is always
- possible.
- */
- char* br = (char*)mem2chunk((size_t)(((size_t)((char*)mem + alignment -
- SIZE_T_ONE)) &
- -alignment));
- char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)?
- br : br+alignment;
- mchunkptr newp = (mchunkptr)pos;
- size_t leadsize = pos - (char*)(p);
- size_t newsize = chunksize(p) - leadsize;
-
- if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */
- newp->prev_foot = p->prev_foot + leadsize;
- newp->head = newsize;
- }
- else { /* Otherwise, give back leader, use the rest */
- set_inuse(m, newp, newsize);
- set_inuse(m, p, leadsize);
- dispose_chunk(m, p, leadsize);
- }
- p = newp;
- }
-
- /* Give back spare room at the end */
- if (!is_mmapped(p)) {
- size_t size = chunksize(p);
- if (size > nb + MIN_CHUNK_SIZE) {
- size_t remainder_size = size - nb;
- mchunkptr remainder = chunk_plus_offset(p, nb);
- set_inuse(m, p, nb);
- set_inuse(m, remainder, remainder_size);
- dispose_chunk(m, remainder, remainder_size);
- }
- }
-
- mem = chunk2mem(p);
- assert (chunksize(p) >= nb);
- assert(((size_t)mem & (alignment - 1)) == 0);
- check_inuse_chunk(m, p);
- POSTACTION(m);
- }
- }
- return mem;
-}
-
-/*
- Common support for independent_X routines, handling
- all of the combinations that can result.
- The opts arg has:
- bit 0 set if all elements are same size (using sizes[0])
- bit 1 set if elements should be zeroed
-*/
-static void** ialloc(mstate m,
- size_t n_elements,
- size_t* sizes,
- int opts,
- void* chunks[]) {
-
- size_t element_size; /* chunksize of each element, if all same */
- size_t contents_size; /* total size of elements */
- size_t array_size; /* request size of pointer array */
- void* mem; /* malloced aggregate space */
- mchunkptr p; /* corresponding chunk */
- size_t remainder_size; /* remaining bytes while splitting */
- void** marray; /* either "chunks" or malloced ptr array */
- mchunkptr array_chunk; /* chunk for malloced ptr array */
- flag_t was_enabled; /* to disable mmap */
- size_t size;
- size_t i;
-
- ensure_initialization();
- /* compute array length, if needed */
- if (chunks != 0) {
- if (n_elements == 0)
- return chunks; /* nothing to do */
- marray = chunks;
- array_size = 0;
- }
- else {
- /* if empty req, must still return chunk representing empty array */
- if (n_elements == 0)
- return (void**)internal_malloc(m, 0);
- marray = 0;
- array_size = request2size(n_elements * (sizeof(void*)));
- }
-
- /* compute total element size */
- if (opts & 0x1) { /* all-same-size */
- element_size = request2size(*sizes);
- contents_size = n_elements * element_size;
- }
- else { /* add up all the sizes */
- element_size = 0;
- contents_size = 0;
- for (i = 0; i != n_elements; ++i)
- contents_size += request2size(sizes[i]);
- }
-
- size = contents_size + array_size;
-
- /*
- Allocate the aggregate chunk. First disable direct-mmapping so
- malloc won't use it, since we would not be able to later
- free/realloc space internal to a segregated mmap region.
- */
- was_enabled = use_mmap(m);
- disable_mmap(m);
- mem = internal_malloc(m, size - CHUNK_OVERHEAD);
- if (was_enabled)
- enable_mmap(m);
- if (mem == 0)
- return 0;
-
- if (PREACTION(m)) return 0;
- p = mem2chunk(mem);
- remainder_size = chunksize(p);
-
- assert(!is_mmapped(p));
-
- if (opts & 0x2) { /* optionally clear the elements */
- memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size);
- }
-
- /* If not provided, allocate the pointer array as final part of chunk */
- if (marray == 0) {
- size_t array_chunk_size;
- array_chunk = chunk_plus_offset(p, contents_size);
- array_chunk_size = remainder_size - contents_size;
- marray = (void**) (chunk2mem(array_chunk));
- set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size);
- remainder_size = contents_size;
- }
-
- /* split out elements */
- for (i = 0; ; ++i) {
- marray[i] = chunk2mem(p);
- if (i != n_elements-1) {
- if (element_size != 0)
- size = element_size;
- else
- size = request2size(sizes[i]);
- remainder_size -= size;
- set_size_and_pinuse_of_inuse_chunk(m, p, size);
- p = chunk_plus_offset(p, size);
- }
- else { /* the final element absorbs any overallocation slop */
- set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size);
- break;
- }
- }
-
-#if DEBUG
- if (marray != chunks) {
- /* final element must have exactly exhausted chunk */
- if (element_size != 0) {
- assert(remainder_size == element_size);
- }
- else {
- assert(remainder_size == request2size(sizes[i]));
- }
- check_inuse_chunk(m, mem2chunk(marray));
- }
- for (i = 0; i != n_elements; ++i)
- check_inuse_chunk(m, mem2chunk(marray[i]));
-
-#endif /* DEBUG */
-
- POSTACTION(m);
- return marray;
-}
-
-/* Try to free all pointers in the given array.
- Note: this could be made faster, by delaying consolidation,
- at the price of disabling some user integrity checks, We
- still optimize some consolidations by combining adjacent
- chunks before freeing, which will occur often if allocated
- with ialloc or the array is sorted.
-*/
-static size_t internal_bulk_free(mstate m, void* array[], size_t nelem) {
- size_t unfreed = 0;
- if (!PREACTION(m)) {
- void** a;
- void** fence = &(array[nelem]);
- for (a = array; a != fence; ++a) {
- void* mem = *a;
- if (mem != 0) {
- mchunkptr p = mem2chunk(mem);
- size_t psize = chunksize(p);
-#if FOOTERS
- if (get_mstate_for(p) != m) {
- ++unfreed;
- continue;
- }
-#endif
- check_inuse_chunk(m, p);
- *a = 0;
- if (RTCHECK(ok_address(m, p) && ok_inuse(p))) {
- void ** b = a + 1; /* try to merge with next chunk */
- mchunkptr next = next_chunk(p);
- if (b != fence && *b == chunk2mem(next)) {
- size_t newsize = chunksize(next) + psize;
- set_inuse(m, p, newsize);
- *b = chunk2mem(p);
- }
- else
- dispose_chunk(m, p, psize);
- }
- else {
- CORRUPTION_ERROR_ACTION(m);
- break;
- }
- }
- }
- if (should_trim(m, m->topsize))
- sys_trim(m, 0);
- POSTACTION(m);
- }
- return unfreed;
-}
-
-/* Traversal */
-#if MALLOC_INSPECT_ALL
-static void internal_inspect_all(mstate m,
- void(*handler)(void *start,
- void *end,
- size_t used_bytes,
- void* callback_arg),
- void* arg) {
- if (is_initialized(m)) {
- mchunkptr top = m->top;
- msegmentptr s;
- for (s = &m->seg; s != 0; s = s->next) {
- mchunkptr q = align_as_chunk(s->base);
- while (segment_holds(s, q) && q->head != FENCEPOST_HEAD) {
- mchunkptr next = next_chunk(q);
- size_t sz = chunksize(q);
- size_t used;
- void* start;
- if (is_inuse(q)) {
- used = sz - CHUNK_OVERHEAD; /* must not be mmapped */
- start = chunk2mem(q);
- }
- else {
- used = 0;
- if (is_small(sz)) { /* offset by possible bookkeeping */
- start = (void*)((char*)q + sizeof(struct malloc_chunk));
- }
- else {
- start = (void*)((char*)q + sizeof(struct malloc_tree_chunk));
- }
- }
- if (start < (void*)next) /* skip if all space is bookkeeping */
- handler(start, next, used, arg);
- if (q == top)
- break;
- q = next;
- }
- }
- }
-}
-#endif /* MALLOC_INSPECT_ALL */
-
-/* ------------------ Exported realloc, memalign, etc -------------------- */
-
-#if !ONLY_MSPACES
-
-void* dlrealloc(void* oldmem, size_t bytes) {
- void* mem = 0;
- if (oldmem == 0) {
- mem = dlmalloc(bytes);
- }
- else if (bytes >= MAX_REQUEST) {
- MALLOC_FAILURE_ACTION;
- }
-#ifdef REALLOC_ZERO_BYTES_FREES
- else if (bytes == 0) {
- dlfree(oldmem);
- }
-#endif /* REALLOC_ZERO_BYTES_FREES */
- else {
- size_t nb = request2size(bytes);
- mchunkptr oldp = mem2chunk(oldmem);
-#if ! FOOTERS
- mstate m = gm;
-#else /* FOOTERS */
- mstate m = get_mstate_for(oldp);
- if (!ok_magic(m)) {
- USAGE_ERROR_ACTION(m, oldmem);
- return 0;
- }
-#endif /* FOOTERS */
- if (!PREACTION(m)) {
- mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1);
- POSTACTION(m);
- if (newp != 0) {
- check_inuse_chunk(m, newp);
- mem = chunk2mem(newp);
- }
- else {
- mem = internal_malloc(m, bytes);
- if (mem != 0) {
- size_t oc = chunksize(oldp) - overhead_for(oldp);
- memcpy(mem, oldmem, (oc < bytes)? oc : bytes);
- internal_free(m, oldmem);
- }
- }
- }
- }
- return mem;
-}
-
-void* dlrealloc_in_place(void* oldmem, size_t bytes) {
- void* mem = 0;
- if (oldmem != 0) {
- if (bytes >= MAX_REQUEST) {
- MALLOC_FAILURE_ACTION;
- }
- else {
- size_t nb = request2size(bytes);
- mchunkptr oldp = mem2chunk(oldmem);
-#if ! FOOTERS
- mstate m = gm;
-#else /* FOOTERS */
- mstate m = get_mstate_for(oldp);
- if (!ok_magic(m)) {
- USAGE_ERROR_ACTION(m, oldmem);
- return 0;
- }
-#endif /* FOOTERS */
- if (!PREACTION(m)) {
- mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0);
- POSTACTION(m);
- if (newp == oldp) {
- check_inuse_chunk(m, newp);
- mem = oldmem;
- }
- }
- }
- }
- return mem;
-}
-
-void* dlmemalign(size_t alignment, size_t bytes) {
- if (alignment <= MALLOC_ALIGNMENT) {
- return dlmalloc(bytes);
- }
- return internal_memalign(gm, alignment, bytes);
-}
-
-int dlposix_memalign(void** pp, size_t alignment, size_t bytes) {
- void* mem = 0;
- if (alignment == MALLOC_ALIGNMENT)
- mem = dlmalloc(bytes);
- else {
- size_t d = alignment / sizeof(void*);
- size_t r = alignment % sizeof(void*);
- if (r != 0 || d == 0 || (d & (d-SIZE_T_ONE)) != 0)
- return EINVAL;
- else if (bytes <= MAX_REQUEST - alignment) {
- if (alignment < MIN_CHUNK_SIZE)
- alignment = MIN_CHUNK_SIZE;
- mem = internal_memalign(gm, alignment, bytes);
- }
- }
- if (mem == 0)
- return ENOMEM;
- else {
- *pp = mem;
- return 0;
- }
-}
-
-void* dlvalloc(size_t bytes) {
- size_t pagesz;
- ensure_initialization();
- pagesz = mparams.page_size;
- return dlmemalign(pagesz, bytes);
-}
-
-/* BEGIN android-changed: added overflow check */
-void* dlpvalloc(size_t bytes) {
- size_t pagesz;
- size_t size;
- ensure_initialization();
- pagesz = mparams.page_size;
- size = (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE);
- if (size < bytes) {
- return NULL;
- }
- return dlmemalign(pagesz, size);
-}
-/* END android-change */
-
-void** dlindependent_calloc(size_t n_elements, size_t elem_size,
- void* chunks[]) {
- size_t sz = elem_size; /* serves as 1-element array */
- return ialloc(gm, n_elements, &sz, 3, chunks);
-}
-
-void** dlindependent_comalloc(size_t n_elements, size_t sizes[],
- void* chunks[]) {
- return ialloc(gm, n_elements, sizes, 0, chunks);
-}
-
-size_t dlbulk_free(void* array[], size_t nelem) {
- return internal_bulk_free(gm, array, nelem);
-}
-
-#if MALLOC_INSPECT_ALL
-void dlmalloc_inspect_all(void(*handler)(void *start,
- void *end,
- size_t used_bytes,
- void* callback_arg),
- void* arg) {
- ensure_initialization();
- if (!PREACTION(gm)) {
- internal_inspect_all(gm, handler, arg);
- POSTACTION(gm);
- }
-}
-#endif /* MALLOC_INSPECT_ALL */
-
-int dlmalloc_trim(size_t pad) {
- int result = 0;
- ensure_initialization();
- if (!PREACTION(gm)) {
- result = sys_trim(gm, pad);
- POSTACTION(gm);
- }
- return result;
-}
-
-size_t dlmalloc_footprint(void) {
- return gm->footprint;
-}
-
-size_t dlmalloc_max_footprint(void) {
- return gm->max_footprint;
-}
-
-size_t dlmalloc_footprint_limit(void) {
- size_t maf = gm->footprint_limit;
- return maf == 0 ? MAX_SIZE_T : maf;
-}
-
-size_t dlmalloc_set_footprint_limit(size_t bytes) {
- size_t result; /* invert sense of 0 */
- if (bytes == 0)
- result = granularity_align(1); /* Use minimal size */
- if (bytes == MAX_SIZE_T)
- result = 0; /* disable */
- else
- result = granularity_align(bytes);
- return gm->footprint_limit = result;
-}
-
-#if !NO_MALLINFO
-struct mallinfo dlmallinfo(void) {
- return internal_mallinfo(gm);
-}
-#endif /* NO_MALLINFO */
-
-#if !NO_MALLOC_STATS
-void dlmalloc_stats() {
- internal_malloc_stats(gm);
-}
-#endif /* NO_MALLOC_STATS */
-
-int dlmallopt(int param_number, int value) {
- return change_mparam(param_number, value);
-}
-
-/* BEGIN android-changed: added const */
-size_t dlmalloc_usable_size(const void* mem) {
-/* END android-change */
- if (mem != 0) {
- mchunkptr p = mem2chunk(mem);
- if (is_inuse(p))
- return chunksize(p) - overhead_for(p);
- }
- return 0;
-}
-
-#endif /* !ONLY_MSPACES */
-
-/* ----------------------------- user mspaces ---------------------------- */
-
-#if MSPACES
-
-static mstate init_user_mstate(char* tbase, size_t tsize) {
- size_t msize = pad_request(sizeof(struct malloc_state));
- mchunkptr mn;
- mchunkptr msp = align_as_chunk(tbase);
- mstate m = (mstate)(chunk2mem(msp));
- memset(m, 0, msize);
- (void)INITIAL_LOCK(&m->mutex);
- msp->head = (msize|INUSE_BITS);
- m->seg.base = m->least_addr = tbase;
- m->seg.size = m->footprint = m->max_footprint = tsize;
- m->magic = mparams.magic;
- m->release_checks = MAX_RELEASE_CHECK_RATE;
- m->mflags = mparams.default_mflags;
- m->extp = 0;
- m->exts = 0;
- disable_contiguous(m);
- init_bins(m);
- mn = next_chunk(mem2chunk(m));
- init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE);
- check_top_chunk(m, m->top);
- return m;
-}
-
-mspace create_mspace(size_t capacity, int locked) {
- mstate m = 0;
- size_t msize;
- ensure_initialization();
- msize = pad_request(sizeof(struct malloc_state));
- if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
- size_t rs = ((capacity == 0)? mparams.granularity :
- (capacity + TOP_FOOT_SIZE + msize));
- size_t tsize = granularity_align(rs);
- char* tbase = (char*)(CALL_MMAP(tsize));
- if (tbase != CMFAIL) {
- m = init_user_mstate(tbase, tsize);
- m->seg.sflags = USE_MMAP_BIT;
- set_lock(m, locked);
- }
- }
- return (mspace)m;
-}
-
-mspace create_mspace_with_base(void* base, size_t capacity, int locked) {
- mstate m = 0;
- size_t msize;
- ensure_initialization();
- msize = pad_request(sizeof(struct malloc_state));
- if (capacity > msize + TOP_FOOT_SIZE &&
- capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
- m = init_user_mstate((char*)base, capacity);
- m->seg.sflags = EXTERN_BIT;
- set_lock(m, locked);
- }
- return (mspace)m;
-}
-
-int mspace_track_large_chunks(mspace msp, int enable) {
- int ret = 0;
- mstate ms = (mstate)msp;
- if (!PREACTION(ms)) {
- if (!use_mmap(ms)) {
- ret = 1;
- }
- if (!enable) {
- enable_mmap(ms);
- } else {
- disable_mmap(ms);
- }
- POSTACTION(ms);
- }
- return ret;
-}
-
-size_t destroy_mspace(mspace msp) {
- size_t freed = 0;
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- msegmentptr sp = &ms->seg;
- (void)DESTROY_LOCK(&ms->mutex); /* destroy before unmapped */
- while (sp != 0) {
- char* base = sp->base;
- size_t size = sp->size;
- flag_t flag = sp->sflags;
- (void)base; /* placate people compiling -Wunused-variable */
- sp = sp->next;
- if ((flag & USE_MMAP_BIT) && !(flag & EXTERN_BIT) &&
- CALL_MUNMAP(base, size) == 0)
- freed += size;
- }
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
- return freed;
-}
-
-/*
- mspace versions of routines are near-clones of the global
- versions. This is not so nice but better than the alternatives.
-*/
-
-void* mspace_malloc(mspace msp, size_t bytes) {
- mstate ms = (mstate)msp;
- if (!ok_magic(ms)) {
- USAGE_ERROR_ACTION(ms,ms);
- return 0;
- }
- if (!PREACTION(ms)) {
- void* mem;
- size_t nb;
- if (bytes <= MAX_SMALL_REQUEST) {
- bindex_t idx;
- binmap_t smallbits;
- nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
- idx = small_index(nb);
- smallbits = ms->smallmap >> idx;
-
- if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
- mchunkptr b, p;
- idx += ~smallbits & 1; /* Uses next bin if idx empty */
- b = smallbin_at(ms, idx);
- p = b->fd;
- assert(chunksize(p) == small_index2size(idx));
- unlink_first_small_chunk(ms, b, p, idx);
- set_inuse_and_pinuse(ms, p, small_index2size(idx));
- mem = chunk2mem(p);
- check_malloced_chunk(ms, mem, nb);
- goto postaction;
- }
-
- else if (nb > ms->dvsize) {
- if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
- mchunkptr b, p, r;
- size_t rsize;
- bindex_t i;
- binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
- binmap_t leastbit = least_bit(leftbits);
- compute_bit2idx(leastbit, i);
- b = smallbin_at(ms, i);
- p = b->fd;
- assert(chunksize(p) == small_index2size(i));
- unlink_first_small_chunk(ms, b, p, i);
- rsize = small_index2size(i) - nb;
- /* Fit here cannot be remainderless if 4byte sizes */
- if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
- set_inuse_and_pinuse(ms, p, small_index2size(i));
- else {
- set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
- r = chunk_plus_offset(p, nb);
- set_size_and_pinuse_of_free_chunk(r, rsize);
- replace_dv(ms, r, rsize);
- }
- mem = chunk2mem(p);
- check_malloced_chunk(ms, mem, nb);
- goto postaction;
- }
-
- else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
- check_malloced_chunk(ms, mem, nb);
- goto postaction;
- }
- }
- }
- else if (bytes >= MAX_REQUEST)
- nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
- else {
- nb = pad_request(bytes);
- if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
- check_malloced_chunk(ms, mem, nb);
- goto postaction;
- }
- }
-
- if (nb <= ms->dvsize) {
- size_t rsize = ms->dvsize - nb;
- mchunkptr p = ms->dv;
- if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
- mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
- ms->dvsize = rsize;
- set_size_and_pinuse_of_free_chunk(r, rsize);
- set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
- }
- else { /* exhaust dv */
- size_t dvs = ms->dvsize;
- ms->dvsize = 0;
- ms->dv = 0;
- set_inuse_and_pinuse(ms, p, dvs);
- }
- mem = chunk2mem(p);
- check_malloced_chunk(ms, mem, nb);
- goto postaction;
- }
-
- else if (nb < ms->topsize) { /* Split top */
- size_t rsize = ms->topsize -= nb;
- mchunkptr p = ms->top;
- mchunkptr r = ms->top = chunk_plus_offset(p, nb);
- r->head = rsize | PINUSE_BIT;
- set_size_and_pinuse_of_inuse_chunk(ms, p, nb);
- mem = chunk2mem(p);
- check_top_chunk(ms, ms->top);
- check_malloced_chunk(ms, mem, nb);
- goto postaction;
- }
-
- mem = sys_alloc(ms, nb);
-
- postaction:
- POSTACTION(ms);
- return mem;
- }
-
- return 0;
-}
-
-void mspace_free(mspace msp, void* mem) {
- if (mem != 0) {
- mchunkptr p = mem2chunk(mem);
-#if FOOTERS
- mstate fm = get_mstate_for(p);
- (void)msp; /* placate people compiling -Wunused */
-#else /* FOOTERS */
- mstate fm = (mstate)msp;
-#endif /* FOOTERS */
- if (!ok_magic(fm)) {
- USAGE_ERROR_ACTION(fm, p);
- return;
- }
- if (!PREACTION(fm)) {
- check_inuse_chunk(fm, p);
- if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
- size_t psize = chunksize(p);
- mchunkptr next = chunk_plus_offset(p, psize);
- if (!pinuse(p)) {
- size_t prevsize = p->prev_foot;
- if (is_mmapped(p)) {
- psize += prevsize + MMAP_FOOT_PAD;
- if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
- fm->footprint -= psize;
- goto postaction;
- }
- else {
- mchunkptr prev = chunk_minus_offset(p, prevsize);
- psize += prevsize;
- p = prev;
- if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
- if (p != fm->dv) {
- unlink_chunk(fm, p, prevsize);
- }
- else if ((next->head & INUSE_BITS) == INUSE_BITS) {
- fm->dvsize = psize;
- set_free_with_pinuse(p, psize, next);
- goto postaction;
- }
- }
- else
- goto erroraction;
- }
- }
-
- if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
- if (!cinuse(next)) { /* consolidate forward */
- if (next == fm->top) {
- size_t tsize = fm->topsize += psize;
- fm->top = p;
- p->head = tsize | PINUSE_BIT;
- if (p == fm->dv) {
- fm->dv = 0;
- fm->dvsize = 0;
- }
- if (should_trim(fm, tsize))
- sys_trim(fm, 0);
- goto postaction;
- }
- else if (next == fm->dv) {
- size_t dsize = fm->dvsize += psize;
- fm->dv = p;
- set_size_and_pinuse_of_free_chunk(p, dsize);
- goto postaction;
- }
- else {
- size_t nsize = chunksize(next);
- psize += nsize;
- unlink_chunk(fm, next, nsize);
- set_size_and_pinuse_of_free_chunk(p, psize);
- if (p == fm->dv) {
- fm->dvsize = psize;
- goto postaction;
- }
- }
- }
- else
- set_free_with_pinuse(p, psize, next);
-
- if (is_small(psize)) {
- insert_small_chunk(fm, p, psize);
- check_free_chunk(fm, p);
- }
- else {
- tchunkptr tp = (tchunkptr)p;
- insert_large_chunk(fm, tp, psize);
- check_free_chunk(fm, p);
- if (--fm->release_checks == 0)
- release_unused_segments(fm);
- }
- goto postaction;
- }
- }
- erroraction:
- USAGE_ERROR_ACTION(fm, p);
- postaction:
- POSTACTION(fm);
- }
- }
-}
-
-void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) {
- void* mem;
- size_t req = 0;
- mstate ms = (mstate)msp;
- if (!ok_magic(ms)) {
- USAGE_ERROR_ACTION(ms,ms);
- return 0;
- }
- if (n_elements != 0) {
- req = n_elements * elem_size;
- if (((n_elements | elem_size) & ~(size_t)0xffff) &&
- (req / n_elements != elem_size))
- req = MAX_SIZE_T; /* force downstream failure on overflow */
- }
- mem = internal_malloc(ms, req);
- if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
- memset(mem, 0, req);
- return mem;
-}
-
-void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) {
- void* mem = 0;
- if (oldmem == 0) {
- mem = mspace_malloc(msp, bytes);
- }
- else if (bytes >= MAX_REQUEST) {
- MALLOC_FAILURE_ACTION;
- }
-#ifdef REALLOC_ZERO_BYTES_FREES
- else if (bytes == 0) {
- mspace_free(msp, oldmem);
- }
-#endif /* REALLOC_ZERO_BYTES_FREES */
- else {
- size_t nb = request2size(bytes);
- mchunkptr oldp = mem2chunk(oldmem);
-#if ! FOOTERS
- mstate m = (mstate)msp;
-#else /* FOOTERS */
- mstate m = get_mstate_for(oldp);
- if (!ok_magic(m)) {
- USAGE_ERROR_ACTION(m, oldmem);
- return 0;
- }
-#endif /* FOOTERS */
- if (!PREACTION(m)) {
- mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1);
- POSTACTION(m);
- if (newp != 0) {
- check_inuse_chunk(m, newp);
- mem = chunk2mem(newp);
- }
- else {
- mem = mspace_malloc(m, bytes);
- if (mem != 0) {
- size_t oc = chunksize(oldp) - overhead_for(oldp);
- memcpy(mem, oldmem, (oc < bytes)? oc : bytes);
- mspace_free(m, oldmem);
- }
- }
- }
- }
- return mem;
-}
-
-void* mspace_realloc_in_place(mspace msp, void* oldmem, size_t bytes) {
- void* mem = 0;
- if (oldmem != 0) {
- if (bytes >= MAX_REQUEST) {
- MALLOC_FAILURE_ACTION;
- }
- else {
- size_t nb = request2size(bytes);
- mchunkptr oldp = mem2chunk(oldmem);
-#if ! FOOTERS
- mstate m = (mstate)msp;
-#else /* FOOTERS */
- mstate m = get_mstate_for(oldp);
- (void)msp; /* placate people compiling -Wunused */
- if (!ok_magic(m)) {
- USAGE_ERROR_ACTION(m, oldmem);
- return 0;
- }
-#endif /* FOOTERS */
- if (!PREACTION(m)) {
- mchunkptr newp = try_realloc_chunk(m, oldp, nb, 0);
- POSTACTION(m);
- if (newp == oldp) {
- check_inuse_chunk(m, newp);
- mem = oldmem;
- }
- }
- }
- }
- return mem;
-}
-
-void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) {
- mstate ms = (mstate)msp;
- if (!ok_magic(ms)) {
- USAGE_ERROR_ACTION(ms,ms);
- return 0;
- }
- if (alignment <= MALLOC_ALIGNMENT)
- return mspace_malloc(msp, bytes);
- return internal_memalign(ms, alignment, bytes);
-}
-
-void** mspace_independent_calloc(mspace msp, size_t n_elements,
- size_t elem_size, void* chunks[]) {
- size_t sz = elem_size; /* serves as 1-element array */
- mstate ms = (mstate)msp;
- if (!ok_magic(ms)) {
- USAGE_ERROR_ACTION(ms,ms);
- return 0;
- }
- return ialloc(ms, n_elements, &sz, 3, chunks);
-}
-
-void** mspace_independent_comalloc(mspace msp, size_t n_elements,
- size_t sizes[], void* chunks[]) {
- mstate ms = (mstate)msp;
- if (!ok_magic(ms)) {
- USAGE_ERROR_ACTION(ms,ms);
- return 0;
- }
- return ialloc(ms, n_elements, sizes, 0, chunks);
-}
-
-size_t mspace_bulk_free(mspace msp, void* array[], size_t nelem) {
- return internal_bulk_free((mstate)msp, array, nelem);
-}
-
-#if MALLOC_INSPECT_ALL
-void mspace_inspect_all(mspace msp,
- void(*handler)(void *start,
- void *end,
- size_t used_bytes,
- void* callback_arg),
- void* arg) {
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- if (!PREACTION(ms)) {
- internal_inspect_all(ms, handler, arg);
- POSTACTION(ms);
- }
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
-}
-#endif /* MALLOC_INSPECT_ALL */
-
-int mspace_trim(mspace msp, size_t pad) {
- int result = 0;
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- if (!PREACTION(ms)) {
- result = sys_trim(ms, pad);
- POSTACTION(ms);
- }
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
- return result;
-}
-
-#if !NO_MALLOC_STATS
-void mspace_malloc_stats(mspace msp) {
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- internal_malloc_stats(ms);
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
-}
-#endif /* NO_MALLOC_STATS */
-
-size_t mspace_footprint(mspace msp) {
- size_t result = 0;
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- result = ms->footprint;
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
- return result;
-}
-
-size_t mspace_max_footprint(mspace msp) {
- size_t result = 0;
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- result = ms->max_footprint;
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
- return result;
-}
-
-size_t mspace_footprint_limit(mspace msp) {
- size_t result = 0;
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- size_t maf = ms->footprint_limit;
- result = (maf == 0) ? MAX_SIZE_T : maf;
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
- return result;
-}
-
-size_t mspace_set_footprint_limit(mspace msp, size_t bytes) {
- size_t result = 0;
- mstate ms = (mstate)msp;
- if (ok_magic(ms)) {
- if (bytes == 0)
- result = granularity_align(1); /* Use minimal size */
- if (bytes == MAX_SIZE_T)
- result = 0; /* disable */
- else
- result = granularity_align(bytes);
- ms->footprint_limit = result;
- }
- else {
- USAGE_ERROR_ACTION(ms,ms);
- }
- return result;
-}
-
-#if !NO_MALLINFO
-struct mallinfo mspace_mallinfo(mspace msp) {
- mstate ms = (mstate)msp;
- if (!ok_magic(ms)) {
- USAGE_ERROR_ACTION(ms,ms);
- }
- return internal_mallinfo(ms);
-}
-#endif /* NO_MALLINFO */
-
-size_t mspace_usable_size(const void* mem) {
- if (mem != 0) {
- mchunkptr p = mem2chunk(mem);
- if (is_inuse(p))
- return chunksize(p) - overhead_for(p);
- }
- return 0;
-}
-
-int mspace_mallopt(int param_number, int value) {
- return change_mparam(param_number, value);
-}
-
-#endif /* MSPACES */
-
-
-/* -------------------- Alternative MORECORE functions ------------------- */
-
-/*
- Guidelines for creating a custom version of MORECORE:
-
- * For best performance, MORECORE should allocate in multiples of pagesize.
- * MORECORE may allocate more memory than requested. (Or even less,
- but this will usually result in a malloc failure.)
- * MORECORE must not allocate memory when given argument zero, but
- instead return one past the end address of memory from previous
- nonzero call.
- * For best performance, consecutive calls to MORECORE with positive
- arguments should return increasing addresses, indicating that
- space has been contiguously extended.
- * Even though consecutive calls to MORECORE need not return contiguous
- addresses, it must be OK for malloc'ed chunks to span multiple
- regions in those cases where they do happen to be contiguous.
- * MORECORE need not handle negative arguments -- it may instead
- just return MFAIL when given negative arguments.
- Negative arguments are always multiples of pagesize. MORECORE
- must not misinterpret negative args as large positive unsigned
- args. You can suppress all such calls from even occurring by defining
- MORECORE_CANNOT_TRIM,
-
- As an example alternative MORECORE, here is a custom allocator
- kindly contributed for pre-OSX macOS. It uses virtually but not
- necessarily physically contiguous non-paged memory (locked in,
- present and won't get swapped out). You can use it by uncommenting
- this section, adding some #includes, and setting up the appropriate
- defines above:
-
- #define MORECORE osMoreCore
-
- There is also a shutdown routine that should somehow be called for
- cleanup upon program exit.
-
- #define MAX_POOL_ENTRIES 100
- #define MINIMUM_MORECORE_SIZE (64 * 1024U)
- static int next_os_pool;
- void *our_os_pools[MAX_POOL_ENTRIES];
-
- void *osMoreCore(int size)
- {
- void *ptr = 0;
- static void *sbrk_top = 0;
-
- if (size > 0)
- {
- if (size < MINIMUM_MORECORE_SIZE)
- size = MINIMUM_MORECORE_SIZE;
- if (CurrentExecutionLevel() == kTaskLevel)
- ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0);
- if (ptr == 0)
- {
- return (void *) MFAIL;
- }
- // save ptrs so they can be freed during cleanup
- our_os_pools[next_os_pool] = ptr;
- next_os_pool++;
- ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK);
- sbrk_top = (char *) ptr + size;
- return ptr;
- }
- else if (size < 0)
- {
- // we don't currently support shrink behavior
- return (void *) MFAIL;
- }
- else
- {
- return sbrk_top;
- }
- }
-
- // cleanup any allocated memory pools
- // called as last thing before shutting down driver
-
- void osCleanupMem(void)
- {
- void **ptr;
-
- for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++)
- if (*ptr)
- {
- PoolDeallocate(*ptr);
- *ptr = 0;
- }
- }
-
-*/
-
-
-/* -----------------------------------------------------------------------
-History:
- v2.8.6 Wed Aug 29 06:57:58 2012 Doug Lea
- * fix bad comparison in dlposix_memalign
- * don't reuse adjusted asize in sys_alloc
- * add LOCK_AT_FORK -- thanks to Kirill Artamonov for the suggestion
- * reduce compiler warnings -- thanks to all who reported/suggested these
-
- v2.8.5 Sun May 22 10:26:02 2011 Doug Lea (dl at gee)
- * Always perform unlink checks unless INSECURE
- * Add posix_memalign.
- * Improve realloc to expand in more cases; expose realloc_in_place.
- Thanks to Peter Buhr for the suggestion.
- * Add footprint_limit, inspect_all, bulk_free. Thanks
- to Barry Hayes and others for the suggestions.
- * Internal refactorings to avoid calls while holding locks
- * Use non-reentrant locks by default. Thanks to Roland McGrath
- for the suggestion.
- * Small fixes to mspace_destroy, reset_on_error.
- * Various configuration extensions/changes. Thanks
- to all who contributed these.
-
- V2.8.4a Thu Apr 28 14:39:43 2011 (dl at gee.cs.oswego.edu)
- * Update Creative Commons URL
-
- V2.8.4 Wed May 27 09:56:23 2009 Doug Lea (dl at gee)
- * Use zeros instead of prev foot for is_mmapped
- * Add mspace_track_large_chunks; thanks to Jean Brouwers
- * Fix set_inuse in internal_realloc; thanks to Jean Brouwers
- * Fix insufficient sys_alloc padding when using 16byte alignment
- * Fix bad error check in mspace_footprint
- * Adaptations for ptmalloc; thanks to Wolfram Gloger.
- * Reentrant spin locks; thanks to Earl Chew and others
- * Win32 improvements; thanks to Niall Douglas and Earl Chew
- * Add NO_SEGMENT_TRAVERSAL and MAX_RELEASE_CHECK_RATE options
- * Extension hook in malloc_state
- * Various small adjustments to reduce warnings on some compilers
- * Various configuration extensions/changes for more platforms. Thanks
- to all who contributed these.
-
- V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee)
- * Add max_footprint functions
- * Ensure all appropriate literals are size_t
- * Fix conditional compilation problem for some #define settings
- * Avoid concatenating segments with the one provided
- in create_mspace_with_base
- * Rename some variables to avoid compiler shadowing warnings
- * Use explicit lock initialization.
- * Better handling of sbrk interference.
- * Simplify and fix segment insertion, trimming and mspace_destroy
- * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x
- * Thanks especially to Dennis Flanagan for help on these.
-
- V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee)
- * Fix memalign brace error.
-
- V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee)
- * Fix improper #endif nesting in C++
- * Add explicit casts needed for C++
-
- V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee)
- * Use trees for large bins
- * Support mspaces
- * Use segments to unify sbrk-based and mmap-based system allocation,
- removing need for emulation on most platforms without sbrk.
- * Default safety checks
- * Optional footer checks. Thanks to William Robertson for the idea.
- * Internal code refactoring
- * Incorporate suggestions and platform-specific changes.
- Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas,
- Aaron Bachmann, Emery Berger, and others.
- * Speed up non-fastbin processing enough to remove fastbins.
- * Remove useless cfree() to avoid conflicts with other apps.
- * Remove internal memcpy, memset. Compilers handle builtins better.
- * Remove some options that no one ever used and rename others.
-
- V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee)
- * Fix malloc_state bitmap array misdeclaration
-
- V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee)
- * Allow tuning of FIRST_SORTED_BIN_SIZE
- * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte.
- * Better detection and support for non-contiguousness of MORECORE.
- Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger
- * Bypass most of malloc if no frees. Thanks To Emery Berger.
- * Fix freeing of old top non-contiguous chunk im sysmalloc.
- * Raised default trim and map thresholds to 256K.
- * Fix mmap-related #defines. Thanks to Lubos Lunak.
- * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield.
- * Branch-free bin calculation
- * Default trim and mmap thresholds now 256K.
-
- V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee)
- * Introduce independent_comalloc and independent_calloc.
- Thanks to Michael Pachos for motivation and help.
- * Make optional .h file available
- * Allow > 2GB requests on 32bit systems.
- * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>.
- Thanks also to Andreas Mueller <a.mueller at paradatec.de>,
- and Anonymous.
- * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for
- helping test this.)
- * memalign: check alignment arg
- * realloc: don't try to shift chunks backwards, since this
- leads to more fragmentation in some programs and doesn't
- seem to help in any others.
- * Collect all cases in malloc requiring system memory into sysmalloc
- * Use mmap as backup to sbrk
- * Place all internal state in malloc_state
- * Introduce fastbins (although similar to 2.5.1)
- * Many minor tunings and cosmetic improvements
- * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK
- * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS
- Thanks to Tony E. Bennett <tbennett@nvidia.com> and others.
- * Include errno.h to support default failure action.
-
- V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee)
- * return null for negative arguments
- * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com>
- * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
- (e.g. WIN32 platforms)
- * Cleanup header file inclusion for WIN32 platforms
- * Cleanup code to avoid Microsoft Visual C++ compiler complaints
- * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
- memory allocation routines
- * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
- * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
- usage of 'assert' in non-WIN32 code
- * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
- avoid infinite loop
- * Always call 'fREe()' rather than 'free()'
-
- V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee)
- * Fixed ordering problem with boundary-stamping
-
- V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee)
- * Added pvalloc, as recommended by H.J. Liu
- * Added 64bit pointer support mainly from Wolfram Gloger
- * Added anonymously donated WIN32 sbrk emulation
- * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
- * malloc_extend_top: fix mask error that caused wastage after
- foreign sbrks
- * Add linux mremap support code from HJ Liu
-
- V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee)
- * Integrated most documentation with the code.
- * Add support for mmap, with help from
- Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
- * Use last_remainder in more cases.
- * Pack bins using idea from colin@nyx10.cs.du.edu
- * Use ordered bins instead of best-fit threshhold
- * Eliminate block-local decls to simplify tracing and debugging.
- * Support another case of realloc via move into top
- * Fix error occuring when initial sbrk_base not word-aligned.
- * Rely on page size for units instead of SBRK_UNIT to
- avoid surprises about sbrk alignment conventions.
- * Add mallinfo, mallopt. Thanks to Raymond Nijssen
- (raymond@es.ele.tue.nl) for the suggestion.
- * Add `pad' argument to malloc_trim and top_pad mallopt parameter.
- * More precautions for cases where other routines call sbrk,
- courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
- * Added macros etc., allowing use in linux libc from
- H.J. Lu (hjl@gnu.ai.mit.edu)
- * Inverted this history list
-
- V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee)
- * Re-tuned and fixed to behave more nicely with V2.6.0 changes.
- * Removed all preallocation code since under current scheme
- the work required to undo bad preallocations exceeds
- the work saved in good cases for most test programs.
- * No longer use return list or unconsolidated bins since
- no scheme using them consistently outperforms those that don't
- given above changes.
- * Use best fit for very large chunks to prevent some worst-cases.
- * Added some support for debugging
-
- V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee)
- * Removed footers when chunks are in use. Thanks to
- Paul Wilson (wilson@cs.texas.edu) for the suggestion.
-
- V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee)
- * Added malloc_trim, with help from Wolfram Gloger
- (wmglo@Dent.MED.Uni-Muenchen.DE).
-
- V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g)
-
- V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g)
- * realloc: try to expand in both directions
- * malloc: swap order of clean-bin strategy;
- * realloc: only conditionally expand backwards
- * Try not to scavenge used bins
- * Use bin counts as a guide to preallocation
- * Occasionally bin return list chunks in first scan
- * Add a few optimizations from colin@nyx10.cs.du.edu
-
- V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g)
- * faster bin computation & slightly different binning
- * merged all consolidations to one part of malloc proper
- (eliminating old malloc_find_space & malloc_clean_bin)
- * Scan 2 returns chunks (not just 1)
- * Propagate failure in realloc if malloc returns 0
- * Add stuff to allow compilation on non-ANSI compilers
- from kpv@research.att.com
-
- V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu)
- * removed potential for odd address access in prev_chunk
- * removed dependency on getpagesize.h
- * misc cosmetics and a bit more internal documentation
- * anticosmetics: mangled names in macros to evade debugger strangeness
- * tested on sparc, hp-700, dec-mips, rs6000
- with gcc & native cc (hp, dec only) allowing
- Detlefs & Zorn comparison study (in SIGPLAN Notices.)
-
- Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu)
- * Based loosely on libg++-1.2X malloc. (It retains some of the overall
- structure of old version, but most details differ.)
-
-*/
diff --git a/libc/upstream-dlmalloc/malloc.h b/libc/upstream-dlmalloc/malloc.h
deleted file mode 100644
index e52c9e5a4..000000000
--- a/libc/upstream-dlmalloc/malloc.h
+++ /dev/null
@@ -1,620 +0,0 @@
-/*
- Default header file for malloc-2.8.x, written by Doug Lea
- and released to the public domain, as explained at
- http://creativecommons.org/publicdomain/zero/1.0/
-
- This header is for ANSI C/C++ only. You can set any of
- the following #defines before including:
-
- * If USE_DL_PREFIX is defined, it is assumed that malloc.c
- was also compiled with this option, so all routines
- have names starting with "dl".
-
- * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this
- file will be #included AFTER <malloc.h>. This is needed only if
- your system defines a struct mallinfo that is incompatible with the
- standard one declared here. Otherwise, you can include this file
- INSTEAD of your system system <malloc.h>. At least on ANSI, all
- declarations should be compatible with system versions
-
- * If MSPACES is defined, declarations for mspace versions are included.
-*/
-
-#ifndef MALLOC_280_H
-#define MALLOC_280_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stddef.h> /* for size_t */
-
-#ifndef ONLY_MSPACES
-#define ONLY_MSPACES 0 /* define to a value */
-#elif ONLY_MSPACES != 0
-#define ONLY_MSPACES 1
-#endif /* ONLY_MSPACES */
-#ifndef NO_MALLINFO
-#define NO_MALLINFO 0
-#endif /* NO_MALLINFO */
-
-#ifndef MSPACES
-#if ONLY_MSPACES
-#define MSPACES 1
-#else /* ONLY_MSPACES */
-#define MSPACES 0
-#endif /* ONLY_MSPACES */
-#endif /* MSPACES */
-
-#if !ONLY_MSPACES
-
-#ifndef USE_DL_PREFIX
-#define dlcalloc calloc
-#define dlfree free
-#define dlmalloc malloc
-#define dlmemalign memalign
-#define dlposix_memalign posix_memalign
-#define dlrealloc realloc
-#define dlvalloc valloc
-#define dlpvalloc pvalloc
-#define dlmallinfo mallinfo
-#define dlmallopt mallopt
-#define dlmalloc_trim malloc_trim
-#define dlmalloc_stats malloc_stats
-#define dlmalloc_usable_size malloc_usable_size
-#define dlmalloc_footprint malloc_footprint
-#define dlmalloc_max_footprint malloc_max_footprint
-#define dlmalloc_footprint_limit malloc_footprint_limit
-#define dlmalloc_set_footprint_limit malloc_set_footprint_limit
-#define dlmalloc_inspect_all malloc_inspect_all
-#define dlindependent_calloc independent_calloc
-#define dlindependent_comalloc independent_comalloc
-#define dlbulk_free bulk_free
-#endif /* USE_DL_PREFIX */
-
-#if !NO_MALLINFO
-#ifndef HAVE_USR_INCLUDE_MALLOC_H
-#ifndef _MALLOC_H
-#ifndef MALLINFO_FIELD_TYPE
-#define MALLINFO_FIELD_TYPE size_t
-#endif /* MALLINFO_FIELD_TYPE */
-#ifndef STRUCT_MALLINFO_DECLARED
-#define STRUCT_MALLINFO_DECLARED 1
-struct mallinfo {
- MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */
- MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */
- MALLINFO_FIELD_TYPE smblks; /* always 0 */
- MALLINFO_FIELD_TYPE hblks; /* always 0 */
- MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */
- MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */
- MALLINFO_FIELD_TYPE fsmblks; /* always 0 */
- MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
- MALLINFO_FIELD_TYPE fordblks; /* total free space */
- MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
-};
-#endif /* STRUCT_MALLINFO_DECLARED */
-#endif /* _MALLOC_H */
-#endif /* HAVE_USR_INCLUDE_MALLOC_H */
-#endif /* !NO_MALLINFO */
-
-/*
- malloc(size_t n)
- Returns a pointer to a newly allocated chunk of at least n bytes, or
- null if no space is available, in which case errno is set to ENOMEM
- on ANSI C systems.
-
- If n is zero, malloc returns a minimum-sized chunk. (The minimum
- size is 16 bytes on most 32bit systems, and 32 bytes on 64bit
- systems.) Note that size_t is an unsigned type, so calls with
- arguments that would be negative if signed are interpreted as
- requests for huge amounts of space, which will often fail. The
- maximum supported value of n differs across systems, but is in all
- cases less than the maximum representable value of a size_t.
-*/
-void* dlmalloc(size_t);
-
-/*
- free(void* p)
- Releases the chunk of memory pointed to by p, that had been previously
- allocated using malloc or a related routine such as realloc.
- It has no effect if p is null. If p was not malloced or already
- freed, free(p) will by default cuase the current program to abort.
-*/
-void dlfree(void*);
-
-/*
- calloc(size_t n_elements, size_t element_size);
- Returns a pointer to n_elements * element_size bytes, with all locations
- set to zero.
-*/
-void* dlcalloc(size_t, size_t);
-
-/*
- realloc(void* p, size_t n)
- Returns a pointer to a chunk of size n that contains the same data
- as does chunk p up to the minimum of (n, p's size) bytes, or null
- if no space is available.
-
- The returned pointer may or may not be the same as p. The algorithm
- prefers extending p in most cases when possible, otherwise it
- employs the equivalent of a malloc-copy-free sequence.
-
- If p is null, realloc is equivalent to malloc.
-
- If space is not available, realloc returns null, errno is set (if on
- ANSI) and p is NOT freed.
-
- if n is for fewer bytes than already held by p, the newly unused
- space is lopped off and freed if possible. realloc with a size
- argument of zero (re)allocates a minimum-sized chunk.
-
- The old unix realloc convention of allowing the last-free'd chunk
- to be used as an argument to realloc is not supported.
-*/
-void* dlrealloc(void*, size_t);
-
-/*
- realloc_in_place(void* p, size_t n)
- Resizes the space allocated for p to size n, only if this can be
- done without moving p (i.e., only if there is adjacent space
- available if n is greater than p's current allocated size, or n is
- less than or equal to p's size). This may be used instead of plain
- realloc if an alternative allocation strategy is needed upon failure
- to expand space; for example, reallocation of a buffer that must be
- memory-aligned or cleared. You can use realloc_in_place to trigger
- these alternatives only when needed.
-
- Returns p if successful; otherwise null.
-*/
-void* dlrealloc_in_place(void*, size_t);
-
-/*
- memalign(size_t alignment, size_t n);
- Returns a pointer to a newly allocated chunk of n bytes, aligned
- in accord with the alignment argument.
-
- The alignment argument should be a power of two. If the argument is
- not a power of two, the nearest greater power is used.
- 8-byte alignment is guaranteed by normal malloc calls, so don't
- bother calling memalign with an argument of 8 or less.
-
- Overreliance on memalign is a sure way to fragment space.
-*/
-void* dlmemalign(size_t, size_t);
-
-/*
- int posix_memalign(void** pp, size_t alignment, size_t n);
- Allocates a chunk of n bytes, aligned in accord with the alignment
- argument. Differs from memalign only in that it (1) assigns the
- allocated memory to *pp rather than returning it, (2) fails and
- returns EINVAL if the alignment is not a power of two (3) fails and
- returns ENOMEM if memory cannot be allocated.
-*/
-int dlposix_memalign(void**, size_t, size_t);
-
-/*
- valloc(size_t n);
- Equivalent to memalign(pagesize, n), where pagesize is the page
- size of the system. If the pagesize is unknown, 4096 is used.
-*/
-void* dlvalloc(size_t);
-
-/*
- mallopt(int parameter_number, int parameter_value)
- Sets tunable parameters The format is to provide a
- (parameter-number, parameter-value) pair. mallopt then sets the
- corresponding parameter to the argument value if it can (i.e., so
- long as the value is meaningful), and returns 1 if successful else
- 0. SVID/XPG/ANSI defines four standard param numbers for mallopt,
- normally defined in malloc.h. None of these are use in this malloc,
- so setting them has no effect. But this malloc also supports other
- options in mallopt:
-
- Symbol param # default allowed param values
- M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming)
- M_GRANULARITY -2 page size any power of 2 >= page size
- M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support)
-*/
-int dlmallopt(int, int);
-
-#define M_TRIM_THRESHOLD (-1)
-#define M_GRANULARITY (-2)
-#define M_MMAP_THRESHOLD (-3)
-
-
-/*
- malloc_footprint();
- Returns the number of bytes obtained from the system. The total
- number of bytes allocated by malloc, realloc etc., is less than this
- value. Unlike mallinfo, this function returns only a precomputed
- result, so can be called frequently to monitor memory consumption.
- Even if locks are otherwise defined, this function does not use them,
- so results might not be up to date.
-*/
-size_t dlmalloc_footprint(void);
-
-/*
- malloc_max_footprint();
- Returns the maximum number of bytes obtained from the system. This
- value will be greater than current footprint if deallocated space
- has been reclaimed by the system. The peak number of bytes allocated
- by malloc, realloc etc., is less than this value. Unlike mallinfo,
- this function returns only a precomputed result, so can be called
- frequently to monitor memory consumption. Even if locks are
- otherwise defined, this function does not use them, so results might
- not be up to date.
-*/
-size_t dlmalloc_max_footprint(void);
-
-/*
- malloc_footprint_limit();
- Returns the number of bytes that the heap is allowed to obtain from
- the system, returning the last value returned by
- malloc_set_footprint_limit, or the maximum size_t value if
- never set. The returned value reflects a permission. There is no
- guarantee that this number of bytes can actually be obtained from
- the system.
-*/
-size_t dlmalloc_footprint_limit(void);
-
-/*
- malloc_set_footprint_limit();
- Sets the maximum number of bytes to obtain from the system, causing
- failure returns from malloc and related functions upon attempts to
- exceed this value. The argument value may be subject to page
- rounding to an enforceable limit; this actual value is returned.
- Using an argument of the maximum possible size_t effectively
- disables checks. If the argument is less than or equal to the
- current malloc_footprint, then all future allocations that require
- additional system memory will fail. However, invocation cannot
- retroactively deallocate existing used memory.
-*/
-size_t dlmalloc_set_footprint_limit(size_t bytes);
-
-/*
- malloc_inspect_all(void(*handler)(void *start,
- void *end,
- size_t used_bytes,
- void* callback_arg),
- void* arg);
- Traverses the heap and calls the given handler for each managed
- region, skipping all bytes that are (or may be) used for bookkeeping
- purposes. Traversal does not include include chunks that have been
- directly memory mapped. Each reported region begins at the start
- address, and continues up to but not including the end address. The
- first used_bytes of the region contain allocated data. If
- used_bytes is zero, the region is unallocated. The handler is
- invoked with the given callback argument. If locks are defined, they
- are held during the entire traversal. It is a bad idea to invoke
- other malloc functions from within the handler.
-
- For example, to count the number of in-use chunks with size greater
- than 1000, you could write:
- static int count = 0;
- void count_chunks(void* start, void* end, size_t used, void* arg) {
- if (used >= 1000) ++count;
- }
- then:
- malloc_inspect_all(count_chunks, NULL);
-
- malloc_inspect_all is compiled only if MALLOC_INSPECT_ALL is defined.
-*/
-void dlmalloc_inspect_all(void(*handler)(void*, void *, size_t, void*),
- void* arg);
-
-#if !NO_MALLINFO
-/*
- mallinfo()
- Returns (by copy) a struct containing various summary statistics:
-
- arena: current total non-mmapped bytes allocated from system
- ordblks: the number of free chunks
- smblks: always zero.
- hblks: current number of mmapped regions
- hblkhd: total bytes held in mmapped regions
- usmblks: the maximum total allocated space. This will be greater
- than current total if trimming has occurred.
- fsmblks: always zero
- uordblks: current total allocated space (normal or mmapped)
- fordblks: total free space
- keepcost: the maximum number of bytes that could ideally be released
- back to system via malloc_trim. ("ideally" means that
- it ignores page restrictions etc.)
-
- Because these fields are ints, but internal bookkeeping may
- be kept as longs, the reported values may wrap around zero and
- thus be inaccurate.
-*/
-
-struct mallinfo dlmallinfo(void);
-#endif /* NO_MALLINFO */
-
-/*
- independent_calloc(size_t n_elements, size_t element_size, void* chunks[]);
-
- independent_calloc is similar to calloc, but instead of returning a
- single cleared space, it returns an array of pointers to n_elements
- independent elements that can hold contents of size elem_size, each
- of which starts out cleared, and can be independently freed,
- realloc'ed etc. The elements are guaranteed to be adjacently
- allocated (this is not guaranteed to occur with multiple callocs or
- mallocs), which may also improve cache locality in some
- applications.
-
- The "chunks" argument is optional (i.e., may be null, which is
- probably the most typical usage). If it is null, the returned array
- is itself dynamically allocated and should also be freed when it is
- no longer needed. Otherwise, the chunks array must be of at least
- n_elements in length. It is filled in with the pointers to the
- chunks.
-
- In either case, independent_calloc returns this pointer array, or
- null if the allocation failed. If n_elements is zero and "chunks"
- is null, it returns a chunk representing an array with zero elements
- (which should be freed if not wanted).
-
- Each element must be freed when it is no longer needed. This can be
- done all at once using bulk_free.
-
- independent_calloc simplifies and speeds up implementations of many
- kinds of pools. It may also be useful when constructing large data
- structures that initially have a fixed number of fixed-sized nodes,
- but the number is not known at compile time, and some of the nodes
- may later need to be freed. For example:
-
- struct Node { int item; struct Node* next; };
-
- struct Node* build_list() {
- struct Node** pool;
- int n = read_number_of_nodes_needed();
- if (n <= 0) return 0;
- pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0);
- if (pool == 0) die();
- // organize into a linked list...
- struct Node* first = pool[0];
- for (i = 0; i < n-1; ++i)
- pool[i]->next = pool[i+1];
- free(pool); // Can now free the array (or not, if it is needed later)
- return first;
- }
-*/
-void** dlindependent_calloc(size_t, size_t, void**);
-
-/*
- independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]);
-
- independent_comalloc allocates, all at once, a set of n_elements
- chunks with sizes indicated in the "sizes" array. It returns
- an array of pointers to these elements, each of which can be
- independently freed, realloc'ed etc. The elements are guaranteed to
- be adjacently allocated (this is not guaranteed to occur with
- multiple callocs or mallocs), which may also improve cache locality
- in some applications.
-
- The "chunks" argument is optional (i.e., may be null). If it is null
- the returned array is itself dynamically allocated and should also
- be freed when it is no longer needed. Otherwise, the chunks array
- must be of at least n_elements in length. It is filled in with the
- pointers to the chunks.
-
- In either case, independent_comalloc returns this pointer array, or
- null if the allocation failed. If n_elements is zero and chunks is
- null, it returns a chunk representing an array with zero elements
- (which should be freed if not wanted).
-
- Each element must be freed when it is no longer needed. This can be
- done all at once using bulk_free.
-
- independent_comallac differs from independent_calloc in that each
- element may have a different size, and also that it does not
- automatically clear elements.
-
- independent_comalloc can be used to speed up allocation in cases
- where several structs or objects must always be allocated at the
- same time. For example:
-
- struct Head { ... }
- struct Foot { ... }
-
- void send_message(char* msg) {
- int msglen = strlen(msg);
- size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) };
- void* chunks[3];
- if (independent_comalloc(3, sizes, chunks) == 0)
- die();
- struct Head* head = (struct Head*)(chunks[0]);
- char* body = (char*)(chunks[1]);
- struct Foot* foot = (struct Foot*)(chunks[2]);
- // ...
- }
-
- In general though, independent_comalloc is worth using only for
- larger values of n_elements. For small values, you probably won't
- detect enough difference from series of malloc calls to bother.
-
- Overuse of independent_comalloc can increase overall memory usage,
- since it cannot reuse existing noncontiguous small chunks that
- might be available for some of the elements.
-*/
-void** dlindependent_comalloc(size_t, size_t*, void**);
-
-/*
- bulk_free(void* array[], size_t n_elements)
- Frees and clears (sets to null) each non-null pointer in the given
- array. This is likely to be faster than freeing them one-by-one.
- If footers are used, pointers that have been allocated in different
- mspaces are not freed or cleared, and the count of all such pointers
- is returned. For large arrays of pointers with poor locality, it
- may be worthwhile to sort this array before calling bulk_free.
-*/
-size_t dlbulk_free(void**, size_t n_elements);
-
-/*
- pvalloc(size_t n);
- Equivalent to valloc(minimum-page-that-holds(n)), that is,
- round up n to nearest pagesize.
- */
-void* dlpvalloc(size_t);
-
-/*
- malloc_trim(size_t pad);
-
- If possible, gives memory back to the system (via negative arguments
- to sbrk) if there is unused memory at the `high' end of the malloc
- pool or in unused MMAP segments. You can call this after freeing
- large blocks of memory to potentially reduce the system-level memory
- requirements of a program. However, it cannot guarantee to reduce
- memory. Under some allocation patterns, some large free blocks of
- memory will be locked between two used chunks, so they cannot be
- given back to the system.
-
- The `pad' argument to malloc_trim represents the amount of free
- trailing space to leave untrimmed. If this argument is zero, only
- the minimum amount of memory to maintain internal data structures
- will be left. Non-zero arguments can be supplied to maintain enough
- trailing space to service future expected allocations without having
- to re-obtain memory from the system.
-
- Malloc_trim returns 1 if it actually released any memory, else 0.
-*/
-int dlmalloc_trim(size_t);
-
-/*
- malloc_stats();
- Prints on stderr the amount of space obtained from the system (both
- via sbrk and mmap), the maximum amount (which may be more than
- current if malloc_trim and/or munmap got called), and the current
- number of bytes allocated via malloc (or realloc, etc) but not yet
- freed. Note that this is the number of bytes allocated, not the
- number requested. It will be larger than the number requested
- because of alignment and bookkeeping overhead. Because it includes
- alignment wastage as being in use, this figure may be greater than
- zero even when no user-level chunks are allocated.
-
- The reported current and maximum system memory can be inaccurate if
- a program makes other calls to system memory allocation functions
- (normally sbrk) outside of malloc.
-
- malloc_stats prints only the most commonly interesting statistics.
- More information can be obtained by calling mallinfo.
-
- malloc_stats is not compiled if NO_MALLOC_STATS is defined.
-*/
-void dlmalloc_stats(void);
-
-#endif /* !ONLY_MSPACES */
-
-/*
- malloc_usable_size(void* p);
-
- Returns the number of bytes you can actually use in
- an allocated chunk, which may be more than you requested (although
- often not) due to alignment and minimum size constraints.
- You can use this many bytes without worrying about
- overwriting other allocated objects. This is not a particularly great
- programming practice. malloc_usable_size can be more useful in
- debugging and assertions, for example:
-
- p = malloc(n);
- assert(malloc_usable_size(p) >= 256);
-*/
-size_t dlmalloc_usable_size(const void*);
-
-#if MSPACES
-
-/*
- mspace is an opaque type representing an independent
- region of space that supports mspace_malloc, etc.
-*/
-typedef void* mspace;
-
-/*
- create_mspace creates and returns a new independent space with the
- given initial capacity, or, if 0, the default granularity size. It
- returns null if there is no system memory available to create the
- space. If argument locked is non-zero, the space uses a separate
- lock to control access. The capacity of the space will grow
- dynamically as needed to service mspace_malloc requests. You can
- control the sizes of incremental increases of this space by
- compiling with a different DEFAULT_GRANULARITY or dynamically
- setting with mallopt(M_GRANULARITY, value).
-*/
-mspace create_mspace(size_t capacity, int locked);
-
-/*
- destroy_mspace destroys the given space, and attempts to return all
- of its memory back to the system, returning the total number of
- bytes freed. After destruction, the results of access to all memory
- used by the space become undefined.
-*/
-size_t destroy_mspace(mspace msp);
-
-/*
- create_mspace_with_base uses the memory supplied as the initial base
- of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this
- space is used for bookkeeping, so the capacity must be at least this
- large. (Otherwise 0 is returned.) When this initial space is
- exhausted, additional memory will be obtained from the system.
- Destroying this space will deallocate all additionally allocated
- space (if possible) but not the initial base.
-*/
-mspace create_mspace_with_base(void* base, size_t capacity, int locked);
-
-/*
- mspace_track_large_chunks controls whether requests for large chunks
- are allocated in their own untracked mmapped regions, separate from
- others in this mspace. By default large chunks are not tracked,
- which reduces fragmentation. However, such chunks are not
- necessarily released to the system upon destroy_mspace. Enabling
- tracking by setting to true may increase fragmentation, but avoids
- leakage when relying on destroy_mspace to release all memory
- allocated using this space. The function returns the previous
- setting.
-*/
-int mspace_track_large_chunks(mspace msp, int enable);
-
-#if !NO_MALLINFO
-/*
- mspace_mallinfo behaves as mallinfo, but reports properties of
- the given space.
-*/
-struct mallinfo mspace_mallinfo(mspace msp);
-#endif /* NO_MALLINFO */
-
-/*
- An alias for mallopt.
-*/
-int mspace_mallopt(int, int);
-
-/*
- The following operate identically to their malloc counterparts
- but operate only for the given mspace argument
-*/
-void* mspace_malloc(mspace msp, size_t bytes);
-void mspace_free(mspace msp, void* mem);
-void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size);
-void* mspace_realloc(mspace msp, void* mem, size_t newsize);
-void* mspace_realloc_in_place(mspace msp, void* mem, size_t newsize);
-void* mspace_memalign(mspace msp, size_t alignment, size_t bytes);
-void** mspace_independent_calloc(mspace msp, size_t n_elements,
- size_t elem_size, void* chunks[]);
-void** mspace_independent_comalloc(mspace msp, size_t n_elements,
- size_t sizes[], void* chunks[]);
-size_t mspace_bulk_free(mspace msp, void**, size_t n_elements);
-size_t mspace_usable_size(const void* mem);
-void mspace_malloc_stats(mspace msp);
-int mspace_trim(mspace msp, size_t pad);
-size_t mspace_footprint(mspace msp);
-size_t mspace_max_footprint(mspace msp);
-size_t mspace_footprint_limit(mspace msp);
-size_t mspace_set_footprint_limit(mspace msp, size_t bytes);
-void mspace_inspect_all(mspace msp,
- void(*handler)(void *, void *, size_t, void*),
- void* arg);
-#endif /* MSPACES */
-
-#ifdef __cplusplus
-}; /* end of extern "C" */
-#endif
-
-#endif /* MALLOC_280_H */
diff --git a/libc/upstream-freebsd/lib/libc/stdlib/imaxabs.c b/libc/upstream-freebsd/lib/libc/stdlib/imaxabs.c
deleted file mode 100644
index 35e3dee79..000000000
--- a/libc/upstream-freebsd/lib/libc/stdlib/imaxabs.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/*-
- * Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <inttypes.h>
-
-intmax_t
-imaxabs(intmax_t j)
-{
- return (j < 0 ? -j : j);
-}
diff --git a/libc/upstream-freebsd/lib/libc/stdlib/imaxdiv.c b/libc/upstream-freebsd/lib/libc/stdlib/imaxdiv.c
deleted file mode 100644
index 7dae4675e..000000000
--- a/libc/upstream-freebsd/lib/libc/stdlib/imaxdiv.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*-
- * Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <inttypes.h>
-
-/* See comments in div.c for implementation details. */
-imaxdiv_t
-imaxdiv(intmax_t numer, intmax_t denom)
-{
- imaxdiv_t retval;
-
- retval.quot = numer / denom;
- retval.rem = numer % denom;
- if (numer >= 0 && retval.rem < 0) {
- retval.quot++;
- retval.rem -= denom;
- }
- return (retval);
-}
diff --git a/libc/upstream-freebsd/lib/libc/stdlib/llabs.c b/libc/upstream-freebsd/lib/libc/stdlib/llabs.c
deleted file mode 100644
index 2bfbada80..000000000
--- a/libc/upstream-freebsd/lib/libc/stdlib/llabs.c
+++ /dev/null
@@ -1,36 +0,0 @@
-/*-
- * Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-
-long long
-llabs(long long j)
-{
- return (j < 0 ? -j : j);
-}
diff --git a/libc/upstream-netbsd/android/include/netbsd-compat.h b/libc/upstream-netbsd/android/include/netbsd-compat.h
index 8d1c46b22..bfd040180 100644
--- a/libc/upstream-netbsd/android/include/netbsd-compat.h
+++ b/libc/upstream-netbsd/android/include/netbsd-compat.h
@@ -20,18 +20,17 @@
#define _BSD_SOURCE
#define _GNU_SOURCE
-// NetBSD uses _DIAGASSERT to null-check arguments and the like.
-#include <assert.h>
-#define _DIAGASSERT(e) ((e) ? (void) 0 : __assert2(__FILE__, __LINE__, __func__, #e))
-
-// TODO: update our <sys/cdefs.h> to support this properly.
-#define __type_fit(t, a) (0 == 0)
+// NetBSD uses _DIAGASSERT to null-check arguments and the like,
+// but it's clear from the number of mistakes in their assertions
+// that they don't actually test or ship with this.
+#define _DIAGASSERT(e) /* nothing */
// TODO: we don't yet have thread-safe environment variables.
#define __readlockenv() 0
#define __unlockenv() 0
+#include <sys/cdefs.h>
#include <stddef.h>
-__LIBC_HIDDEN__ int reallocarr(void*, size_t, size_t);
+int reallocarr(void*, size_t, size_t);
#endif
diff --git a/libc/upstream-openbsd/android/include/arc4random.h b/libc/upstream-openbsd/android/include/arc4random.h
index c07257d24..96d9c9a26 100644
--- a/libc/upstream-openbsd/android/include/arc4random.h
+++ b/libc/upstream-openbsd/android/include/arc4random.h
@@ -27,6 +27,8 @@
#include <pthread.h>
#include <signal.h>
+#include "private/bionic_prctl.h"
+
// Android gets these from "thread_private.h".
#include "thread_private.h"
//static pthread_mutex_t arc4random_mtx = PTHREAD_MUTEX_INITIALIZER;
@@ -76,12 +78,18 @@ _rs_allocate(struct _rs **rsp, struct _rsx **rsxp)
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED)
return (-1);
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, *rsp, sizeof(**rsp),
+ "arc4random _rs structure");
+
if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE,
MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) {
munmap(*rsxp, sizeof(**rsxp));
return (-1);
}
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, *rsxp, sizeof(**rsxp),
+ "arc4random _rsx structure");
+
_ARC4_ATFORK(_rs_forkhandler);
return (0);
}
diff --git a/libc/upstream-openbsd/android/include/openbsd-compat.h b/libc/upstream-openbsd/android/include/openbsd-compat.h
index 47bacc3ea..caea45a93 100644
--- a/libc/upstream-openbsd/android/include/openbsd-compat.h
+++ b/libc/upstream-openbsd/android/include/openbsd-compat.h
@@ -32,8 +32,9 @@
#define _warn warn
#define _warnx warnx
-/* Ignore all __weak_alias in OpenBSD. */
-#define __weak_alias(alias,sym)
+/* Ignore all DEF_STRONG/DEF_WEAK in OpenBSD. */
+#define DEF_STRONG(sym)
+#define DEF_WEAK(sym)
/* Ignore all __warn_references in OpenBSD. */
#define __warn_references(sym,msg)
@@ -71,8 +72,8 @@ __LIBC_HIDDEN__ extern int getentropy(void*, size_t);
__LIBC_HIDDEN__ void* reallocarray(void*, size_t, size_t);
/* LP32 NDK ctype.h contained references to these. */
-__LIBC64_HIDDEN__ extern const short* _tolower_tab_;
-__LIBC64_HIDDEN__ extern const short* _toupper_tab_;
+__LIBC32_LEGACY_PUBLIC__ extern const short* _tolower_tab_;
+__LIBC32_LEGACY_PUBLIC__ extern const short* _toupper_tab_;
__LIBC_HIDDEN__ extern const char _C_ctype_[];
__LIBC_HIDDEN__ extern const short _C_toupper_[];
diff --git a/libc/upstream-openbsd/lib/libc/gen/err.c b/libc/upstream-openbsd/lib/libc/gen/err.c
index e7ec29de4..15e1b97c4 100644
--- a/libc/upstream-openbsd/lib/libc/gen/err.c
+++ b/libc/upstream-openbsd/lib/libc/gen/err.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: err.c,v 1.11 2012/12/05 23:19:59 deraadt Exp $ */
+/* $OpenBSD: err.c,v 1.12 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -31,17 +31,13 @@
#include <err.h>
#include <stdarg.h>
-/* PRINTFLIKE2 */
__dead void
-_err(int eval, const char *fmt, ...)
+err(int eval, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- _verr(eval, fmt, ap);
+ verr(eval, fmt, ap);
va_end(ap);
}
-
-/* PRINTFLIKE2 */
-__weak_alias(err, _err);
-
+DEF_WEAK(err);
diff --git a/libc/upstream-openbsd/lib/libc/gen/errx.c b/libc/upstream-openbsd/lib/libc/gen/errx.c
index d213435db..e6b5d2389 100644
--- a/libc/upstream-openbsd/lib/libc/gen/errx.c
+++ b/libc/upstream-openbsd/lib/libc/gen/errx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: errx.c,v 1.10 2012/12/05 23:19:59 deraadt Exp $ */
+/* $OpenBSD: errx.c,v 1.11 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -31,17 +31,13 @@
#include <err.h>
#include <stdarg.h>
-/* PRINTFLIKE2 */
__dead void
-_errx(int eval, const char *fmt, ...)
+errx(int eval, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- _verrx(eval, fmt, ap);
+ verrx(eval, fmt, ap);
va_end(ap);
}
-
-/* PRINTFLIKE2 */
-__weak_alias(errx, _errx);
-
+DEF_WEAK(errx);
diff --git a/libc/upstream-openbsd/lib/libc/gen/fnmatch.c b/libc/upstream-openbsd/lib/libc/gen/fnmatch.c
index 2c860f7eb..0d0f18ff4 100644
--- a/libc/upstream-openbsd/lib/libc/gen/fnmatch.c
+++ b/libc/upstream-openbsd/lib/libc/gen/fnmatch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fnmatch.c,v 1.17 2013/11/24 23:51:29 deraadt Exp $ */
+/* $OpenBSD: fnmatch.c,v 1.19 2015/08/01 18:11:08 millert Exp $ */
/* Copyright (c) 2011, VMware, Inc.
* All rights reserved.
@@ -88,7 +88,6 @@
#include <fnmatch.h>
#include <string.h>
#include <ctype.h>
-#include <limits.h>
#include "charclass.h"
@@ -193,6 +192,8 @@ static int fnmatch_ch(const char **pattern, const char **string, int flags)
result = 0;
continue;
}
+ if (!**pattern)
+ break;
leadingclosebrace:
/* Look at only well-formed range patterns;
@@ -294,10 +295,6 @@ int fnmatch(const char *pattern, const char *string, int flags)
const char *mismatch = NULL;
int matchlen = 0;
- if (strnlen(pattern, PATH_MAX) == PATH_MAX ||
- strnlen(string, PATH_MAX) == PATH_MAX)
- return (FNM_NOMATCH);
-
if (*pattern == '*')
goto firstsegment;
diff --git a/libc/upstream-openbsd/lib/libc/gen/time.c b/libc/upstream-openbsd/lib/libc/gen/time.c
index 3a57500d4..6fcf1cde2 100644
--- a/libc/upstream-openbsd/lib/libc/gen/time.c
+++ b/libc/upstream-openbsd/lib/libc/gen/time.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: time.c,v 1.5 2005/08/08 08:05:34 espie Exp $ */
+/* $OpenBSD: time.c,v 1.7 2015/10/29 03:58:55 mmcc Exp $ */
/*
* Copyright (c) 1983, 1993
* The Regents of the University of California. All rights reserved.
@@ -28,17 +28,18 @@
* SUCH DAMAGE.
*/
-#include <sys/types.h>
#include <sys/time.h>
+#include <time.h>
time_t
time(time_t *t)
{
struct timeval tt;
- if (gettimeofday(&tt, (struct timezone *)0) < 0)
+ if (gettimeofday(&tt, NULL) < 0)
return (-1);
if (t)
*t = (time_t)tt.tv_sec;
return (tt.tv_sec);
}
+DEF_STRONG(time);
diff --git a/libc/upstream-openbsd/lib/libc/gen/verr.c b/libc/upstream-openbsd/lib/libc/gen/verr.c
index dcd8edcd0..8f4722b9e 100644
--- a/libc/upstream-openbsd/lib/libc/gen/verr.c
+++ b/libc/upstream-openbsd/lib/libc/gen/verr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: verr.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */
+/* $OpenBSD: verr.c,v 1.10 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -38,7 +38,7 @@
extern char *__progname; /* Program name, from crt0. */
__dead void
-_verr(int eval, const char *fmt, va_list ap)
+verr(int eval, const char *fmt, va_list ap)
{
int sverrno;
@@ -51,6 +51,4 @@ _verr(int eval, const char *fmt, va_list ap)
(void)fprintf(stderr, "%s\n", strerror(sverrno));
exit(eval);
}
-
-__weak_alias(verr, _verr);
-
+DEF_WEAK(verr);
diff --git a/libc/upstream-openbsd/lib/libc/gen/verrx.c b/libc/upstream-openbsd/lib/libc/gen/verrx.c
index 60da062f5..f0186b607 100644
--- a/libc/upstream-openbsd/lib/libc/gen/verrx.c
+++ b/libc/upstream-openbsd/lib/libc/gen/verrx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: verrx.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */
+/* $OpenBSD: verrx.c,v 1.10 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -36,7 +36,7 @@
extern char *__progname; /* Program name, from crt0. */
__dead void
-_verrx(int eval, const char *fmt, va_list ap)
+verrx(int eval, const char *fmt, va_list ap)
{
(void)fprintf(stderr, "%s: ", __progname);
if (fmt != NULL)
@@ -44,6 +44,4 @@ _verrx(int eval, const char *fmt, va_list ap)
(void)fprintf(stderr, "\n");
exit(eval);
}
-
-__weak_alias(verrx, _verrx);
-
+DEF_WEAK(verrx);
diff --git a/libc/upstream-openbsd/lib/libc/gen/vwarn.c b/libc/upstream-openbsd/lib/libc/gen/vwarn.c
index 26b60f336..44d8be48e 100644
--- a/libc/upstream-openbsd/lib/libc/gen/vwarn.c
+++ b/libc/upstream-openbsd/lib/libc/gen/vwarn.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vwarn.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */
+/* $OpenBSD: vwarn.c,v 1.10 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -37,7 +37,7 @@
extern char *__progname; /* Program name, from crt0. */
void
-_vwarn(const char *fmt, va_list ap)
+vwarn(const char *fmt, va_list ap)
{
int sverrno;
@@ -49,6 +49,4 @@ _vwarn(const char *fmt, va_list ap)
}
(void)fprintf(stderr, "%s\n", strerror(sverrno));
}
-
-__weak_alias(vwarn, _vwarn);
-
+DEF_WEAK(vwarn);
diff --git a/libc/upstream-openbsd/lib/libc/gen/vwarnx.c b/libc/upstream-openbsd/lib/libc/gen/vwarnx.c
index e6b1957d4..67d8f5b57 100644
--- a/libc/upstream-openbsd/lib/libc/gen/vwarnx.c
+++ b/libc/upstream-openbsd/lib/libc/gen/vwarnx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vwarnx.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */
+/* $OpenBSD: vwarnx.c,v 1.10 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -35,13 +35,11 @@
extern char *__progname; /* Program name, from crt0. */
void
-_vwarnx(const char *fmt, va_list ap)
+vwarnx(const char *fmt, va_list ap)
{
(void)fprintf(stderr, "%s: ", __progname);
if (fmt != NULL)
(void)vfprintf(stderr, fmt, ap);
(void)fprintf(stderr, "\n");
}
-
-__weak_alias(vwarnx, _vwarnx);
-
+DEF_WEAK(vwarnx);
diff --git a/libc/upstream-openbsd/lib/libc/gen/warn.c b/libc/upstream-openbsd/lib/libc/gen/warn.c
index c1b47a65f..6784cf666 100644
--- a/libc/upstream-openbsd/lib/libc/gen/warn.c
+++ b/libc/upstream-openbsd/lib/libc/gen/warn.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: warn.c,v 1.10 2012/12/05 23:20:00 deraadt Exp $ */
+/* $OpenBSD: warn.c,v 1.11 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -31,17 +31,13 @@
#include <err.h>
#include <stdarg.h>
-/* PRINTFLIKE1 */
void
-_warn(const char *fmt, ...)
+warn(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- _vwarn(fmt, ap);
+ vwarn(fmt, ap);
va_end(ap);
}
-
-/* PRINTFLIKE1 */
-__weak_alias(warn, _warn);
-
+DEF_WEAK(warn);
diff --git a/libc/upstream-openbsd/lib/libc/gen/warnx.c b/libc/upstream-openbsd/lib/libc/gen/warnx.c
index af2ab669c..723bc0db8 100644
--- a/libc/upstream-openbsd/lib/libc/gen/warnx.c
+++ b/libc/upstream-openbsd/lib/libc/gen/warnx.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: warnx.c,v 1.9 2012/12/05 23:20:00 deraadt Exp $ */
+/* $OpenBSD: warnx.c,v 1.10 2015/08/31 02:53:57 guenther Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@@ -31,17 +31,13 @@
#include <err.h>
#include <stdarg.h>
-/* PRINTFLIKE1 */
void
-_warnx(const char *fmt, ...)
+warnx(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- _vwarnx(fmt, ap);
+ vwarnx(fmt, ap);
va_end(ap);
}
-
-/* PRINTFLIKE1 */
-__weak_alias(warnx, _warnx);
-
+DEF_WEAK(warnx);
diff --git a/libc/upstream-openbsd/lib/libc/net/inet_addr.c b/libc/upstream-openbsd/lib/libc/net/inet_addr.c
deleted file mode 100644
index 18762ab52..000000000
--- a/libc/upstream-openbsd/lib/libc/net/inet_addr.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/* $OpenBSD: inet_addr.c,v 1.10 2013/11/24 23:51:28 deraadt Exp $ */
-
-/*
- * ++Copyright++ 1983, 1990, 1993
- * -
- * Copyright (c) 1983, 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * -
- * Portions Copyright (c) 1993 by Digital Equipment Corporation.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies, and that
- * the name of Digital Equipment Corporation not be used in advertising or
- * publicity pertaining to distribution of the document or software without
- * specific, written prior permission.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
- * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- * -
- * --Copyright--
- */
-
-#include <sys/types.h>
-#include <sys/param.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <ctype.h>
-
-/*
- * Ascii internet address interpretation routine.
- * The value returned is in network order.
- */
-in_addr_t
-inet_addr(const char *cp)
-{
- struct in_addr val;
-
- if (inet_aton(cp, &val))
- return (val.s_addr);
- return (INADDR_NONE);
-}
-
-/*
- * Check whether "cp" is a valid ascii representation
- * of an Internet address and convert to a binary address.
- * Returns 1 if the address is valid, 0 if not.
- * This replaces inet_addr, the return value from which
- * cannot distinguish between failure and a local broadcast address.
- */
-int
-inet_aton(const char *cp, struct in_addr *addr)
-{
- in_addr_t val;
- int base, n;
- char c;
- u_int parts[4];
- u_int *pp = parts;
-
- c = *cp;
- for (;;) {
- /*
- * Collect number up to ``.''.
- * Values are specified as for C:
- * 0x=hex, 0=octal, isdigit=decimal.
- */
- if (!isdigit((unsigned char)c))
- return (0);
- val = 0; base = 10;
- if (c == '0') {
- c = *++cp;
- if (c == 'x' || c == 'X')
- base = 16, c = *++cp;
- else
- base = 8;
- }
- for (;;) {
- if (isascii((unsigned char)c) &&
- isdigit((unsigned char)c)) {
- val = (val * base) + (c - '0');
- c = *++cp;
- } else if (base == 16 &&
- isascii((unsigned char)c) &&
- isxdigit((unsigned char)c)) {
- val = (val << 4) |
- (c + 10 - (islower((unsigned char)c) ? 'a' : 'A'));
- c = *++cp;
- } else
- break;
- }
- if (c == '.') {
- /*
- * Internet format:
- * a.b.c.d
- * a.b.c (with c treated as 16 bits)
- * a.b (with b treated as 24 bits)
- */
- if (pp >= parts + 3)
- return (0);
- *pp++ = val;
- c = *++cp;
- } else
- break;
- }
- /*
- * Check for trailing characters.
- */
- if (c != '\0' &&
- (!isascii((unsigned char)c) || !isspace((unsigned char)c)))
- return (0);
- /*
- * Concoct the address according to
- * the number of parts specified.
- */
- n = pp - parts + 1;
- switch (n) {
-
- case 0:
- return (0); /* initial nondigit */
-
- case 1: /* a -- 32 bits */
- break;
-
- case 2: /* a.b -- 8.24 bits */
- if ((val > 0xffffff) || (parts[0] > 0xff))
- return (0);
- val |= parts[0] << 24;
- break;
-
- case 3: /* a.b.c -- 8.8.16 bits */
- if ((val > 0xffff) || (parts[0] > 0xff) || (parts[1] > 0xff))
- return (0);
- val |= (parts[0] << 24) | (parts[1] << 16);
- break;
-
- case 4: /* a.b.c.d -- 8.8.8.8 bits */
- if ((val > 0xff) || (parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff))
- return (0);
- val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
- break;
- }
- if (addr)
- addr->s_addr = htonl(val);
- return (1);
-}
diff --git a/libc/upstream-openbsd/lib/libc/net/inet_network.c b/libc/upstream-openbsd/lib/libc/net/inet_network.c
deleted file mode 100644
index ecf554e4f..000000000
--- a/libc/upstream-openbsd/lib/libc/net/inet_network.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* $OpenBSD: inet_network.c,v 1.11 2013/11/25 17:29:19 deraadt Exp $ */
-/*
- * Copyright (c) 1983, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <ctype.h>
-
-/*
- * Internet network address interpretation routine.
- * The library routines call this routine to interpret
- * network numbers.
- */
-in_addr_t
-inet_network(const char *cp)
-{
- in_addr_t val, base, n;
- u_char c;
- in_addr_t parts[4], *pp = parts;
- int i;
-
-again:
- val = 0; base = 10;
- if (*cp == '0')
- base = 8, cp++;
- if (*cp == 'x' || *cp == 'X')
- base = 16, cp++;
- while ((c = *cp)) {
- if (isdigit(c)) {
- val = (val * base) + (c - '0');
- cp++;
- continue;
- }
- if (base == 16 && isxdigit(c)) {
- val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
- cp++;
- continue;
- }
- break;
- }
- if (*cp == '.') {
- if (pp >= parts + 3)
- return (INADDR_NONE);
- *pp++ = val, cp++;
- goto again;
- }
- if (*cp && !isspace(*cp))
- return (INADDR_NONE);
- *pp++ = val;
- n = pp - parts;
- for (val = 0, i = 0; i < 4; i++) {
- val <<= 8;
- if (i < n)
- val |= parts[i] & 0xff;
- }
- return (val);
-}
diff --git a/libc/upstream-openbsd/lib/libc/net/res_random.c b/libc/upstream-openbsd/lib/libc/net/res_random.c
index f28692f7c..72b9c41a2 100644
--- a/libc/upstream-openbsd/lib/libc/net/res_random.c
+++ b/libc/upstream-openbsd/lib/libc/net/res_random.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: res_random.c,v 1.21 2014/07/20 04:22:34 guenther Exp $ */
+/* $OpenBSD: res_random.c,v 1.23 2015/10/05 02:57:16 guenther Exp $ */
/*
* Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
@@ -101,6 +101,7 @@ static u_int16_t ru_counter = 0;
static u_int16_t ru_msb = 0;
static struct prf_ctx *ru_prf = NULL;
static time_t ru_reseed;
+static pid_t ru_pid;
static u_int16_t pmod(u_int16_t, u_int16_t, u_int16_t);
static void res_initid(void);
@@ -224,18 +225,22 @@ res_initid(void)
}
u_int
-res_randomid(void)
+__res_randomid(void)
{
struct timespec ts;
+ pid_t pid;
u_int r;
_THREAD_PRIVATE_MUTEX(random);
clock_gettime(CLOCK_MONOTONIC, &ts);
+ pid = getpid();
_THREAD_PRIVATE_MUTEX_LOCK(random);
- if (ru_counter >= RU_MAX || ts.tv_sec > ru_reseed)
+ if (ru_counter >= RU_MAX || ts.tv_sec > ru_reseed || pid != ru_pid) {
res_initid();
+ ru_pid = pid;
+ }
/* Linear Congruential Generator */
ru_x = (ru_a * ru_x + ru_b) % RU_M;
@@ -247,6 +252,7 @@ res_randomid(void)
return (r);
}
+DEF_STRONG(__res_randomid);
#if 0
int
diff --git a/libc/upstream-openbsd/lib/libc/stdio/asprintf.c b/libc/upstream-openbsd/lib/libc/stdio/asprintf.c
index 5424c90dc..482367759 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/asprintf.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/asprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: asprintf.c,v 1.19 2011/05/30 18:48:33 martynas Exp $ */
+/* $OpenBSD: asprintf.c,v 1.22 2015/12/28 22:08:18 mmcc Exp $ */
/*
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -23,7 +23,6 @@
#include <stdarg.h>
#include "local.h"
-/* PRINTFLIKE2 */
int
asprintf(char **str, const char *fmt, ...)
{
@@ -36,7 +35,7 @@ asprintf(char **str, const char *fmt, ...)
_FILEEXT_SETUP(&f, &fext);
f._file = -1;
f._flags = __SWR | __SSTR | __SALC;
- f._bf._base = f._p = (unsigned char *)malloc(128);
+ f._bf._base = f._p = malloc(128);
if (f._bf._base == NULL)
goto err;
f._bf._size = f._w = 127; /* Leave room for the NUL */
@@ -53,11 +52,10 @@ asprintf(char **str, const char *fmt, ...)
return (ret);
err:
- if (f._bf._base) {
- free(f._bf._base);
- f._bf._base = NULL;
- }
+ free(f._bf._base);
+ f._bf._base = NULL;
*str = NULL;
errno = ENOMEM;
return (-1);
}
+DEF_WEAK(asprintf);
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fclose.c b/libc/upstream-openbsd/lib/libc/stdio/fclose.c
deleted file mode 100644
index c72af5405..000000000
--- a/libc/upstream-openbsd/lib/libc/stdio/fclose.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $OpenBSD: fclose.c,v 1.9 2009/11/09 00:18:27 kurt Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "local.h"
-
-int
-fclose(FILE *fp)
-{
- int r;
-
- if (fp->_flags == 0) { /* not open! */
- errno = EBADF;
- return (EOF);
- }
- FLOCKFILE(fp);
- WCIO_FREE(fp);
- r = fp->_flags & __SWR ? __sflush(fp) : 0;
- if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0)
- r = EOF;
- if (fp->_flags & __SMBF)
- free((char *)fp->_bf._base);
- if (HASUB(fp))
- FREEUB(fp);
- if (HASLB(fp))
- FREELB(fp);
- fp->_r = fp->_w = 0; /* Mess up if reaccessed. */
- fp->_flags = 0; /* Release this FILE for reuse. */
- FUNLOCKFILE(fp);
- return (r);
-}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fdopen.c b/libc/upstream-openbsd/lib/libc/stdio/fdopen.c
deleted file mode 100644
index 1c0c8132f..000000000
--- a/libc/upstream-openbsd/lib/libc/stdio/fdopen.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* $OpenBSD: fdopen.c,v 1.7 2014/08/31 02:21:18 guenther Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <errno.h>
-#include "local.h"
-
-FILE *
-fdopen(int fd, const char *mode)
-{
- FILE *fp;
- int flags, oflags, fdflags, tmp;
-
- /* _file is only a short */
- if (fd > SHRT_MAX) {
- errno = EMFILE;
- return (NULL);
- }
-
- if ((flags = __sflags(mode, &oflags)) == 0)
- return (NULL);
-
- /* Make sure the mode the user wants is a subset of the actual mode. */
- if ((fdflags = fcntl(fd, F_GETFL, 0)) < 0)
- return (NULL);
- tmp = fdflags & O_ACCMODE;
- if (tmp != O_RDWR && (tmp != (oflags & O_ACCMODE))) {
- errno = EINVAL;
- return (NULL);
- }
-
- if ((fp = __sfp()) == NULL)
- return (NULL);
- fp->_flags = flags;
-
- /*
- * If opened for appending, but underlying descriptor does not have
- * O_APPEND bit set, assert __SAPP so that __swrite() will lseek to
- * end before each write.
- */
- if ((oflags & O_APPEND) && !(fdflags & O_APPEND))
- fp->_flags |= __SAPP;
-
- /*
- * If close-on-exec was requested, then turn it on if not already
- */
- if ((oflags & O_CLOEXEC) && !((tmp = fcntl(fd, F_GETFD)) & FD_CLOEXEC))
- fcntl(fd, F_SETFD, tmp | FD_CLOEXEC);
-
- fp->_file = fd;
- fp->_cookie = fp;
- fp->_read = __sread;
- fp->_write = __swrite;
- fp->_seek = __sseek;
- fp->_close = __sclose;
- return (fp);
-}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fgetwc.c b/libc/upstream-openbsd/lib/libc/stdio/fgetwc.c
index c16ffaf29..2e69191f1 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/fgetwc.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/fgetwc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fgetwc.c,v 1.4 2009/11/09 00:18:27 kurt Exp $ */
+/* $OpenBSD: fgetwc.c,v 1.6 2015/12/24 19:55:39 schwarze Exp $ */
/* $NetBSD: fgetwc.c,v 1.3 2003/03/07 07:11:36 tshiozak Exp $ */
/*-
@@ -69,7 +69,7 @@ __fgetwc_unlock(FILE *fp)
c = ch;
size = mbrtowc(&wc, &c, 1, st);
if (size == (size_t)-1) {
- errno = EILSEQ;
+ fp->_flags |= __SERR;
return WEOF;
}
} while (size == (size_t)-2);
@@ -88,3 +88,4 @@ fgetwc(FILE *fp)
return (r);
}
+DEF_STRONG(fgetwc);
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fgetws.c b/libc/upstream-openbsd/lib/libc/stdio/fgetws.c
index e8cd24900..d02ccd58c 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/fgetws.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/fgetws.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fgetws.c,v 1.6 2009/11/09 00:18:27 kurt Exp $ */
+/* $OpenBSD: fgetws.c,v 1.8 2016/01/04 16:14:19 schwarze Exp $ */
/* $NetBSD: fgetws.c,v 1.1 2003/03/07 07:11:37 tshiozak Exp $ */
/*-
@@ -52,9 +52,9 @@ fgetws(wchar_t * __restrict ws, int n, FILE * __restrict fp)
wsp = ws;
while (n-- > 1) {
- if ((wc = __fgetwc_unlock(fp)) == WEOF && errno == EILSEQ) {
+ if ((wc = __fgetwc_unlock(fp)) == WEOF &&
+ ferror(fp) && errno == EILSEQ)
goto error;
- }
if (wc == WEOF) {
if (wsp == ws) {
/* EOF/error, no characters read yet. */
@@ -77,3 +77,4 @@ error:
FUNLOCKFILE(fp);
return (NULL);
}
+DEF_STRONG(fgetws);
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fopen.c b/libc/upstream-openbsd/lib/libc/stdio/fopen.c
deleted file mode 100644
index 14650523e..000000000
--- a/libc/upstream-openbsd/lib/libc/stdio/fopen.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* $OpenBSD: fopen.c,v 1.7 2008/05/03 18:46:41 chl Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include "local.h"
-
-FILE *
-fopen(const char *file, const char *mode)
-{
- FILE *fp;
- int f;
- int flags, oflags;
-
- if ((flags = __sflags(mode, &oflags)) == 0)
- return (NULL);
- if ((fp = __sfp()) == NULL)
- return (NULL);
- if ((f = open(file, oflags, DEFFILEMODE)) < 0) {
- fp->_flags = 0; /* release */
- return (NULL);
- }
-
- /* _file is only a short */
- if (f > SHRT_MAX) {
- fp->_flags = 0; /* release */
- close(f);
- errno = EMFILE;
- return (NULL);
- }
-
- fp->_file = f;
- fp->_flags = flags;
- fp->_cookie = fp;
- fp->_read = __sread;
- fp->_write = __swrite;
- fp->_seek = __sseek;
- fp->_close = __sclose;
-
- /*
- * When opening in append mode, even though we use O_APPEND,
- * we need to seek to the end so that ftell() gets the right
- * answer. If the user then alters the seek pointer, or
- * the file extends, this will fail, but there is not much
- * we can do about this. (We could set __SAPP and check in
- * fseek and ftell.)
- */
- if (oflags & O_APPEND)
- (void) __sseek((void *)fp, (fpos_t)0, SEEK_END);
- return (fp);
-}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fputwc.c b/libc/upstream-openbsd/lib/libc/stdio/fputwc.c
index 9db70d061..829c22c48 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/fputwc.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/fputwc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fputwc.c,v 1.4 2009/11/09 00:18:27 kurt Exp $ */
+/* $OpenBSD: fputwc.c,v 1.6 2015/10/01 02:32:07 guenther Exp $ */
/* $NetBSD: fputwc.c,v 1.3 2003/03/07 07:11:37 tshiozak Exp $ */
/*-
@@ -46,8 +46,7 @@ __fputwc_unlock(wchar_t wc, FILE *fp)
struct __suio uio;
struct __siov iov;
- /* LINTED we don't play with buf */
- iov.iov_base = (void *)buf;
+ iov.iov_base = buf;
uio.uio_iov = &iov;
uio.uio_iovcnt = 1;
@@ -86,3 +85,4 @@ fputwc(wchar_t wc, FILE *fp)
return (r);
}
+DEF_STRONG(fputwc);
diff --git a/libc/upstream-openbsd/lib/libc/stdio/freopen.c b/libc/upstream-openbsd/lib/libc/stdio/freopen.c
deleted file mode 100644
index 82717b1e2..000000000
--- a/libc/upstream-openbsd/lib/libc/stdio/freopen.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/* $OpenBSD: freopen.c,v 1.14 2014/08/31 02:21:18 guenther Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <limits.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "local.h"
-
-/*
- * Re-direct an existing, open (probably) file to some other file.
- * ANSI is written such that the original file gets closed if at
- * all possible, no matter what.
- */
-FILE *
-freopen(const char *file, const char *mode, FILE *fp)
-{
- int f;
- int flags, isopen, oflags, sverrno, wantfd;
-
- if ((flags = __sflags(mode, &oflags)) == 0) {
- (void) fclose(fp);
- return (NULL);
- }
-
- if (!__sdidinit)
- __sinit();
-
- FLOCKFILE(fp);
-
- /*
- * There are actually programs that depend on being able to "freopen"
- * descriptors that weren't originally open. Keep this from breaking.
- * Remember whether the stream was open to begin with, and which file
- * descriptor (if any) was associated with it. If it was attached to
- * a descriptor, defer closing it; freopen("/dev/stdin", "r", stdin)
- * should work. This is unnecessary if it was not a Unix file.
- */
- if (fp->_flags == 0) {
- fp->_flags = __SEOF; /* hold on to it */
- isopen = 0;
- wantfd = -1;
- } else {
- /* flush the stream; ANSI doesn't require this. */
- if (fp->_flags & __SWR)
- (void) __sflush(fp);
- /* if close is NULL, closing is a no-op, hence pointless */
- isopen = fp->_close != NULL;
- if ((wantfd = fp->_file) < 0 && isopen) {
- (void) (*fp->_close)(fp->_cookie);
- isopen = 0;
- }
- }
-
- /* Get a new descriptor to refer to the new file. */
- f = open(file, oflags, DEFFILEMODE);
- if (f < 0 && isopen) {
- /* If out of fd's close the old one and try again. */
- if (errno == ENFILE || errno == EMFILE) {
- (void) (*fp->_close)(fp->_cookie);
- isopen = 0;
- f = open(file, oflags, DEFFILEMODE);
- }
- }
- sverrno = errno;
-
- /*
- * Finish closing fp. Even if the open succeeded above, we cannot
- * keep fp->_base: it may be the wrong size. This loses the effect
- * of any setbuffer calls, but stdio has always done this before.
- */
- if (isopen && f != wantfd)
- (void) (*fp->_close)(fp->_cookie);
- if (fp->_flags & __SMBF)
- free((char *)fp->_bf._base);
- fp->_w = 0;
- fp->_r = 0;
- fp->_p = NULL;
- fp->_bf._base = NULL;
- fp->_bf._size = 0;
- fp->_lbfsize = 0;
- if (HASUB(fp))
- FREEUB(fp);
- _UB(fp)._size = 0;
- WCIO_FREE(fp);
- if (HASLB(fp))
- FREELB(fp);
- fp->_lb._size = 0;
-
- if (f < 0) { /* did not get it after all */
- fp->_flags = 0; /* set it free */
- FUNLOCKFILE(fp);
- errno = sverrno; /* restore in case _close clobbered */
- return (NULL);
- }
-
- /*
- * If reopening something that was open before on a real file, try
- * to maintain the descriptor. Various C library routines (perror)
- * assume stderr is always fd STDERR_FILENO, even if being freopen'd.
- */
- if (wantfd >= 0 && f != wantfd) {
- if (dup3(f, wantfd, oflags & O_CLOEXEC) >= 0) {
- (void) close(f);
- f = wantfd;
- }
- }
-
- /* _file is only a short */
- if (f > SHRT_MAX) {
- fp->_flags = 0; /* set it free */
- FUNLOCKFILE(fp);
- errno = EMFILE;
- return (NULL);
- }
-
- fp->_flags = flags;
- fp->_file = f;
- fp->_cookie = fp;
- fp->_read = __sread;
- fp->_write = __swrite;
- fp->_seek = __sseek;
- fp->_close = __sclose;
-
- /*
- * When opening in append mode, even though we use O_APPEND,
- * we need to seek to the end so that ftell() gets the right
- * answer. If the user then alters the seek pointer, or
- * the file extends, this will fail, but there is not much
- * we can do about this. (We could set __SAPP and check in
- * fseek and ftell.)
- */
- if (oflags & O_APPEND)
- (void) __sseek((void *)fp, (fpos_t)0, SEEK_END);
- FUNLOCKFILE(fp);
- return (fp);
-}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fseek.c b/libc/upstream-openbsd/lib/libc/stdio/fseek.c
deleted file mode 100644
index cdd40b62f..000000000
--- a/libc/upstream-openbsd/lib/libc/stdio/fseek.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* $OpenBSD: fseek.c,v 1.11 2012/05/21 22:24:19 matthew Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "local.h"
-
-#define POS_ERR (-(fpos_t)1)
-
-/*
- * Seek the given file to the given offset.
- * `Whence' must be one of the three SEEK_* macros.
- */
-int
-fseeko(FILE *fp, off_t offset, int whence)
-{
- fpos_t (*seekfn)(void *, fpos_t, int);
- fpos_t target, curoff;
- size_t n;
- struct stat st;
- int havepos;
-
- /* make sure stdio is set up */
- if (!__sdidinit)
- __sinit();
-
- /*
- * Have to be able to seek.
- */
- if ((seekfn = fp->_seek) == NULL) {
- errno = ESPIPE; /* historic practice */
- return (EOF);
- }
-
- /*
- * Change any SEEK_CUR to SEEK_SET, and check `whence' argument.
- * After this, whence is either SEEK_SET or SEEK_END.
- */
- FLOCKFILE(fp);
- switch (whence) {
-
- case SEEK_CUR:
- /*
- * In order to seek relative to the current stream offset,
- * we have to first find the current stream offset a la
- * ftell (see ftell for details).
- */
- __sflush(fp); /* may adjust seek offset on append stream */
- if (fp->_flags & __SOFF)
- curoff = fp->_offset;
- else {
- curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR);
- if (curoff == (fpos_t)-1) {
- FUNLOCKFILE(fp);
- return (EOF);
- }
- }
- if (fp->_flags & __SRD) {
- curoff -= fp->_r;
- if (HASUB(fp))
- curoff -= fp->_ur;
- } else if (fp->_flags & __SWR && fp->_p != NULL)
- curoff += fp->_p - fp->_bf._base;
-
- offset += curoff;
- whence = SEEK_SET;
- havepos = 1;
- break;
-
- case SEEK_SET:
- case SEEK_END:
- curoff = 0; /* XXX just to keep gcc quiet */
- havepos = 0;
- break;
-
- default:
- FUNLOCKFILE(fp);
- errno = EINVAL;
- return (EOF);
- }
-
- /*
- * Can only optimise if:
- * reading (and not reading-and-writing);
- * not unbuffered; and
- * this is a `regular' Unix file (and hence seekfn==__sseek).
- * We must check __NBF first, because it is possible to have __NBF
- * and __SOPT both set.
- */
- if (fp->_bf._base == NULL)
- __smakebuf(fp);
- if (fp->_flags & (__SWR | __SRW | __SNBF | __SNPT))
- goto dumb;
- if ((fp->_flags & __SOPT) == 0) {
- if (seekfn != __sseek ||
- fp->_file < 0 || fstat(fp->_file, &st) ||
- (st.st_mode & S_IFMT) != S_IFREG) {
- fp->_flags |= __SNPT;
- goto dumb;
- }
- fp->_blksize = st.st_blksize;
- fp->_flags |= __SOPT;
- }
-
- /*
- * We are reading; we can try to optimise.
- * Figure out where we are going and where we are now.
- */
- if (whence == SEEK_SET)
- target = offset;
- else {
- if (fstat(fp->_file, &st))
- goto dumb;
- target = st.st_size + offset;
- }
-
- if (!havepos) {
- if (fp->_flags & __SOFF)
- curoff = fp->_offset;
- else {
- curoff = (*seekfn)(fp->_cookie, (fpos_t)0, SEEK_CUR);
- if (curoff == POS_ERR)
- goto dumb;
- }
- curoff -= fp->_r;
- if (HASUB(fp))
- curoff -= fp->_ur;
- }
-
- /*
- * Compute the number of bytes in the input buffer (pretending
- * that any ungetc() input has been discarded). Adjust current
- * offset backwards by this count so that it represents the
- * file offset for the first byte in the current input buffer.
- */
- if (HASUB(fp)) {
- curoff += fp->_r; /* kill off ungetc */
- n = fp->_up - fp->_bf._base;
- curoff -= n;
- n += fp->_ur;
- } else {
- n = fp->_p - fp->_bf._base;
- curoff -= n;
- n += fp->_r;
- }
-
- /*
- * If the target offset is within the current buffer,
- * simply adjust the pointers, clear EOF, undo ungetc(),
- * and return. (If the buffer was modified, we have to
- * skip this; see fgetln.c.)
- */
- if ((fp->_flags & __SMOD) == 0 &&
- target >= curoff && target < curoff + n) {
- int o = target - curoff;
-
- fp->_p = fp->_bf._base + o;
- fp->_r = n - o;
- if (HASUB(fp))
- FREEUB(fp);
- fp->_flags &= ~__SEOF;
- FUNLOCKFILE(fp);
- return (0);
- }
-
- /*
- * The place we want to get to is not within the current buffer,
- * but we can still be kind to the kernel copyout mechanism.
- * By aligning the file offset to a block boundary, we can let
- * the kernel use the VM hardware to map pages instead of
- * copying bytes laboriously. Using a block boundary also
- * ensures that we only read one block, rather than two.
- */
- curoff = target & ~(fp->_blksize - 1);
- if ((*seekfn)(fp->_cookie, curoff, SEEK_SET) == POS_ERR)
- goto dumb;
- fp->_r = 0;
- fp->_p = fp->_bf._base;
- if (HASUB(fp))
- FREEUB(fp);
- fp->_flags &= ~__SEOF;
- n = target - curoff;
- if (n) {
- if (__srefill(fp) || fp->_r < n)
- goto dumb;
- fp->_p += n;
- fp->_r -= n;
- }
- FUNLOCKFILE(fp);
- return (0);
-
- /*
- * We get here if we cannot optimise the seek ... just
- * do it. Allow the seek function to change fp->_bf._base.
- */
-dumb:
- if (__sflush(fp) ||
- (*seekfn)(fp->_cookie, (fpos_t)offset, whence) == POS_ERR) {
- FUNLOCKFILE(fp);
- return (EOF);
- }
- /* success: clear EOF indicator and discard ungetc() data */
- if (HASUB(fp))
- FREEUB(fp);
- fp->_p = fp->_bf._base;
- fp->_r = 0;
- /* fp->_w = 0; */ /* unnecessary (I think...) */
- fp->_flags &= ~__SEOF;
- FUNLOCKFILE(fp);
- return (0);
-}
-
-int
-fseek(FILE *fp, long offset, int whence)
-{
- return (fseeko(fp, offset, whence));
-}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/ftell.c b/libc/upstream-openbsd/lib/libc/stdio/ftell.c
deleted file mode 100644
index 0a2016ce1..000000000
--- a/libc/upstream-openbsd/lib/libc/stdio/ftell.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/* $OpenBSD: ftell.c,v 1.10 2012/05/21 22:24:19 matthew Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <limits.h>
-#include "local.h"
-
-/*
- * ftello: return current offset.
- */
-off_t
-ftello(FILE *fp)
-{
- fpos_t pos;
-
- if (fp->_seek == NULL) {
- errno = ESPIPE; /* historic practice */
- pos = -1;
- goto out;
- }
-
- /*
- * Find offset of underlying I/O object, then
- * adjust for buffered bytes.
- */
- FLOCKFILE(fp);
- __sflush(fp); /* may adjust seek offset on append stream */
- if (fp->_flags & __SOFF)
- pos = fp->_offset;
- else {
- pos = (*fp->_seek)(fp->_cookie, (fpos_t)0, SEEK_CUR);
- if (pos == -1)
- goto out;
- }
- if (fp->_flags & __SRD) {
- /*
- * Reading. Any unread characters (including
- * those from ungetc) cause the position to be
- * smaller than that in the underlying object.
- */
- pos -= fp->_r;
- if (HASUB(fp))
- pos -= fp->_ur;
- } else if (fp->_flags & __SWR && fp->_p != NULL) {
- /*
- * Writing. Any buffered characters cause the
- * position to be greater than that in the
- * underlying object.
- */
- pos += fp->_p - fp->_bf._base;
- }
-out: FUNLOCKFILE(fp);
- return (pos);
-}
-
-long
-ftell(FILE *fp)
-{
- off_t offset = ftello(fp);
- if (offset > LONG_MAX) {
- errno = EOVERFLOW;
- return (-1);
- }
- return ((long)offset);
-}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/funopen.c b/libc/upstream-openbsd/lib/libc/stdio/funopen.c
deleted file mode 100644
index b85ee96a1..000000000
--- a/libc/upstream-openbsd/lib/libc/stdio/funopen.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* $OpenBSD: funopen.c,v 1.8 2005/08/08 08:05:36 espie Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include "local.h"
-
-FILE *
-funopen(const void *cookie, int (*readfn)(void *, char *, int),
- int (*writefn)(void *, const char *, int),
- fpos_t (*seekfn)(void *, fpos_t, int), int (*closefn)(void *))
-{
- FILE *fp;
- int flags;
-
- if (readfn == NULL) {
- if (writefn == NULL) { /* illegal */
- errno = EINVAL;
- return (NULL);
- } else
- flags = __SWR; /* write only */
- } else {
- if (writefn == NULL)
- flags = __SRD; /* read only */
- else
- flags = __SRW; /* read-write */
- }
- if ((fp = __sfp()) == NULL)
- return (NULL);
- fp->_flags = flags;
- fp->_file = -1;
- fp->_cookie = (void *)cookie; /* SAFE: cookie not modified */
- fp->_read = readfn;
- fp->_write = writefn;
- fp->_seek = seekfn;
- fp->_close = closefn;
- return (fp);
-}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/getdelim.c b/libc/upstream-openbsd/lib/libc/stdio/getdelim.c
index 5e583cb55..58ff0a1be 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/getdelim.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/getdelim.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: getdelim.c,v 1.2 2014/10/16 17:31:51 millert Exp $ */
+/* $OpenBSD: getdelim.c,v 1.4 2015/08/31 02:53:57 guenther Exp $ */
/* $NetBSD: getdelim.c,v 1.13 2011/07/22 23:12:30 joerg Exp $ */
/*
@@ -30,6 +30,7 @@
#include <errno.h>
#include <limits.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -96,7 +97,7 @@ getdelim(char **__restrict buf, size_t *__restrict buflen,
newlen |= newlen >> 4;
newlen |= newlen >> 8;
newlen |= newlen >> 16;
-#if SIZE_T_MAX > 0xffffffffU
+#if SIZE_MAX > 0xffffffffU
newlen |= newlen >> 32;
#endif
newlen++;
@@ -131,3 +132,4 @@ error:
FUNLOCKFILE(fp);
return -1;
}
+DEF_WEAK(getdelim);
diff --git a/libc/upstream-openbsd/lib/libc/stdio/open_memstream.c b/libc/upstream-openbsd/lib/libc/stdio/open_memstream.c
index 46105358d..f708acc50 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/open_memstream.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/open_memstream.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: open_memstream.c,v 1.3 2013/04/03 03:11:53 guenther Exp $ */
+/* $OpenBSD: open_memstream.c,v 1.6 2015/08/31 02:53:57 guenther Exp $ */
/*
* Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
@@ -16,16 +16,16 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include <sys/param.h>
-
#include <errno.h>
#include <fcntl.h>
-#include <limits.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "local.h"
+#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
+
struct state {
char *string; /* actual stream */
char **pbuf; /* point to the stream */
@@ -95,7 +95,7 @@ memstream_seek(void *v, fpos_t off, int whence)
}
st->pos = base + off;
- *st->psize = MIN(st->pos, st->len);
+ *st->psize = MINIMUM(st->pos, st->len);
return (st->pos);
}
@@ -156,3 +156,4 @@ open_memstream(char **pbuf, size_t *psize)
return (fp);
}
+DEF_WEAK(open_memstream);
diff --git a/libc/upstream-openbsd/lib/libc/stdio/open_wmemstream.c b/libc/upstream-openbsd/lib/libc/stdio/open_wmemstream.c
index 391a94445..aceef3515 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/open_wmemstream.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/open_wmemstream.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: open_wmemstream.c,v 1.4 2014/10/08 05:28:19 deraadt Exp $ */
+/* $OpenBSD: open_wmemstream.c,v 1.8 2015/09/12 16:23:14 guenther Exp $ */
/*
* Copyright (c) 2011 Martin Pieuchot <mpi@openbsd.org>
@@ -16,17 +16,17 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include <sys/param.h>
-
#include <errno.h>
#include <fcntl.h>
-#include <limits.h>
#include <stdio.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include "local.h"
+#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
+
struct state {
wchar_t *string; /* actual stream */
wchar_t **pbuf; /* point to the stream */
@@ -105,7 +105,7 @@ wmemstream_seek(void *v, fpos_t off, int whence)
bzero(&st->mbs, sizeof(st->mbs));
st->pos = base + off;
- *st->psize = MIN(st->pos, st->len);
+ *st->psize = MINIMUM(st->pos, st->len);
return (st->pos);
}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/tempnam.c b/libc/upstream-openbsd/lib/libc/stdio/tempnam.c
index e3f2ab647..854b871cb 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/tempnam.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/tempnam.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tempnam.c,v 1.17 2013/09/30 12:02:35 millert Exp $ */
+/* $OpenBSD: tempnam.c,v 1.19 2015/08/31 02:53:57 guenther Exp $ */
/*
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
@@ -39,8 +39,6 @@
__warn_references(tempnam,
"warning: tempnam() possibly used unsafely; consider using mkstemp()");
-extern char *_mktemp(char *);
-
char *
tempnam(const char *dir, const char *pfx)
{
@@ -58,7 +56,7 @@ tempnam(const char *dir, const char *pfx)
f[strlen(f) - 1] == '/' ? "" : "/", pfx);
if (len < 0 || len >= PATH_MAX) {
errno = ENAMETOOLONG;
- return(NULL);
+ goto fail;
}
if ((f = _mktemp(name)))
return(f);
@@ -70,7 +68,7 @@ tempnam(const char *dir, const char *pfx)
f[strlen(f) - 1] == '/' ? "" : "/", pfx);
if (len < 0 || len >= PATH_MAX) {
errno = ENAMETOOLONG;
- return(NULL);
+ goto fail;
}
if ((f = _mktemp(name)))
return(f);
@@ -80,7 +78,7 @@ tempnam(const char *dir, const char *pfx)
len = snprintf(name, PATH_MAX, "%s%sXXXXXXXXX", f, pfx);
if (len < 0 || len >= PATH_MAX) {
errno = ENAMETOOLONG;
- return(NULL);
+ goto fail;
}
if ((f = _mktemp(name)))
return(f);
@@ -89,11 +87,12 @@ tempnam(const char *dir, const char *pfx)
len = snprintf(name, PATH_MAX, "%s%sXXXXXXXXX", f, pfx);
if (len < 0 || len >= PATH_MAX) {
errno = ENAMETOOLONG;
- return(NULL);
+ goto fail;
}
if ((f = _mktemp(name)))
return(f);
+fail:
sverrno = errno;
free(name);
errno = sverrno;
diff --git a/libc/upstream-openbsd/lib/libc/stdio/vasprintf.c b/libc/upstream-openbsd/lib/libc/stdio/vasprintf.c
index 8fe7c5bb5..98cdb4554 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/vasprintf.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/vasprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vasprintf.c,v 1.16 2009/11/09 00:18:27 kurt Exp $ */
+/* $OpenBSD: vasprintf.c,v 1.19 2015/12/28 22:08:18 mmcc Exp $ */
/*
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
@@ -33,7 +33,7 @@ vasprintf(char **str, const char *fmt, __va_list ap)
_FILEEXT_SETUP(&f, &fext);
f._file = -1;
f._flags = __SWR | __SSTR | __SALC;
- f._bf._base = f._p = (unsigned char *)malloc(128);
+ f._bf._base = f._p = malloc(128);
if (f._bf._base == NULL)
goto err;
f._bf._size = f._w = 127; /* Leave room for the NUL */
@@ -48,11 +48,10 @@ vasprintf(char **str, const char *fmt, __va_list ap)
return (ret);
err:
- if (f._bf._base) {
- free(f._bf._base);
- f._bf._base = NULL;
- }
+ free(f._bf._base);
+ f._bf._base = NULL;
*str = NULL;
errno = ENOMEM;
return (-1);
}
+DEF_WEAK(vasprintf);
diff --git a/libc/upstream-openbsd/lib/libc/stdio/vfprintf.c b/libc/upstream-openbsd/lib/libc/stdio/vfprintf.c
index 5f4fb7fa9..3d7d41e10 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/vfprintf.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/vfprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfprintf.c,v 1.67 2014/12/21 00:23:30 daniel Exp $ */
+/* $OpenBSD: vfprintf.c,v 1.71 2016/01/04 15:47:47 schwarze Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@@ -165,10 +165,8 @@ __wcsconv(wchar_t *wcsarg, int prec)
memset(&mbs, 0, sizeof(mbs));
p = wcsarg;
nbytes = wcsrtombs(NULL, (const wchar_t **)&p, 0, &mbs);
- if (nbytes == (size_t)-1) {
- errno = EILSEQ;
+ if (nbytes == (size_t)-1)
return (NULL);
- }
} else {
/*
* Optimisation: if the output precision is small enough,
@@ -188,10 +186,8 @@ __wcsconv(wchar_t *wcsarg, int prec)
break;
nbytes += clen;
}
- if (clen == (size_t)-1) {
- errno = EILSEQ;
+ if (clen == (size_t)-1)
return (NULL);
- }
}
}
if ((convbuf = malloc(nbytes + 1)) == NULL)
@@ -203,7 +199,6 @@ __wcsconv(wchar_t *wcsarg, int prec)
if ((nbytes = wcsrtombs(convbuf, (const wchar_t **)&p,
nbytes, &mbs)) == (size_t)-1) {
free(convbuf);
- errno = EILSEQ;
return (NULL);
}
convbuf[nbytes] = '\0';
@@ -268,6 +263,7 @@ vfprintf(FILE *fp, const char *fmt0, __va_list ap)
FUNLOCKFILE(fp);
return (ret);
}
+DEF_STRONG(vfprintf);
int
__vfprintf(FILE *fp, const char *fmt0, __va_list ap)
@@ -437,7 +433,11 @@ __vfprintf(FILE *fp, const char *fmt0, __va_list ap)
int hold = nextarg; \
if (argtable == NULL) { \
argtable = statargtable; \
- __find_arguments(fmt0, orgap, &argtable, &argtablesiz); \
+ if (__find_arguments(fmt0, orgap, &argtable, \
+ &argtablesiz) == -1) { \
+ ret = -1; \
+ goto error; \
+ } \
} \
nextarg = n2; \
val = GETARG(int); \
@@ -493,6 +493,10 @@ __vfprintf(FILE *fp, const char *fmt0, __va_list ap)
break;
}
}
+ if (n < 0) {
+ ret = -1;
+ goto error;
+ }
if (fmt != cp) {
ptrdiff_t m = fmt - cp;
if (m < 0 || m > INT_MAX - ret)
@@ -500,7 +504,7 @@ __vfprintf(FILE *fp, const char *fmt0, __va_list ap)
PRINT(cp, m);
ret += m;
}
- if (n <= 0)
+ if (n == 0)
goto done;
fmt++; /* skip over '%' */
@@ -563,8 +567,11 @@ reswitch: switch (ch) {
nextarg = n;
if (argtable == NULL) {
argtable = statargtable;
- __find_arguments(fmt0, orgap,
- &argtable, &argtablesiz);
+ if (__find_arguments(fmt0, orgap,
+ &argtable, &argtablesiz) == -1) {
+ ret = -1;
+ goto error;
+ }
}
goto rflag;
}
@@ -589,8 +596,11 @@ reswitch: switch (ch) {
nextarg = n;
if (argtable == NULL) {
argtable = statargtable;
- __find_arguments(fmt0, orgap,
- &argtable, &argtablesiz);
+ if (__find_arguments(fmt0, orgap,
+ &argtable, &argtablesiz) == -1) {
+ ret = -1;
+ goto error;
+ }
}
goto rflag;
}
@@ -639,8 +649,7 @@ reswitch: switch (ch) {
mbseqlen = wcrtomb(buf,
(wchar_t)GETARG(wint_t), &mbs);
if (mbseqlen == (size_t)-1) {
- fp->_flags |= __SERR;
- errno = EILSEQ;
+ ret = -1;
goto error;
}
cp = buf;
@@ -835,7 +844,6 @@ fp_common:
* defined manner.''
* -- ANSI X3J11
*/
- /* NOSTRICT */
_umax = (u_long)GETARG(void *);
base = HEX;
xdigs = xdigs_lower;
@@ -846,16 +854,14 @@ fp_common:
if (flags & LONGINT) {
wchar_t *wcp;
- if (convbuf != NULL) {
- free(convbuf);
- convbuf = NULL;
- }
+ free(convbuf);
+ convbuf = NULL;
if ((wcp = GETARG(wchar_t *)) == NULL) {
cp = "(null)";
} else {
convbuf = __wcsconv(wcp, prec);
if (convbuf == NULL) {
- fp->_flags = __SERR;
+ ret = -1;
goto error;
}
cp = convbuf;
@@ -1075,8 +1081,7 @@ overflow:
finish:
#ifdef PRINTF_WIDE_CHAR
- if (convbuf)
- free(convbuf);
+ free(convbuf);
#endif
#ifdef FLOATING_POINT
if (dtoaresult)
@@ -1214,7 +1219,9 @@ __find_arguments(const char *fmt0, va_list ap, union arg **argtable,
break;
}
}
- if (n <= 0)
+ if (n < 0)
+ return (-1);
+ if (n == 0)
goto done;
fmt++; /* skip over '%' */
diff --git a/libc/upstream-openbsd/lib/libc/stdio/vfwprintf.c b/libc/upstream-openbsd/lib/libc/stdio/vfwprintf.c
index a6f41232c..520c8bc7d 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/vfwprintf.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/vfwprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vfwprintf.c,v 1.12 2014/12/21 00:23:30 daniel Exp $ */
+/* $OpenBSD: vfwprintf.c,v 1.15 2015/12/28 22:08:18 mmcc Exp $ */
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@@ -667,10 +667,7 @@ reswitch: switch (ch) {
prec = dtoaend - dtoaresult;
if (expt == INT_MAX)
ox[1] = '\0';
- if (convbuf) {
- free(convbuf);
- convbuf = NULL;
- }
+ free(convbuf);
cp = convbuf = __mbsconv(dtoaresult, -1);
if (cp == NULL)
goto error;
@@ -719,10 +716,7 @@ fp_begin:
if (expt == 9999)
expt = INT_MAX;
}
- if (convbuf) {
- free(convbuf);
- convbuf = NULL;
- }
+ free(convbuf);
cp = convbuf = __mbsconv(dtoaresult, -1);
if (cp == NULL)
goto error;
@@ -812,7 +806,6 @@ fp_common:
* defined manner.''
* -- ANSI X3J11
*/
- /* NOSTRICT */
_umax = (u_long)GETARG(void *);
base = HEX;
xdigs = xdigs_lower;
@@ -829,10 +822,7 @@ fp_common:
char *mbsarg;
if ((mbsarg = GETARG(char *)) == NULL)
mbsarg = "(null)";
- if (convbuf) {
- free(convbuf);
- convbuf = NULL;
- }
+ free(convbuf);
convbuf = __mbsconv(mbsarg, prec);
if (convbuf == NULL) {
fp->_flags |= __SERR;
@@ -1048,8 +1038,7 @@ overflow:
ret = -1;
finish:
- if (convbuf)
- free(convbuf);
+ free(convbuf);
#ifdef FLOATING_POINT
if (dtoaresult)
__freedtoa(dtoaresult);
@@ -1072,6 +1061,7 @@ vfwprintf(FILE * __restrict fp, const wchar_t * __restrict fmt0, __va_list ap)
return (r);
}
+DEF_STRONG(vfwprintf);
/*
* Type ids for argument type table.
diff --git a/libc/upstream-openbsd/lib/libc/stdio/vswprintf.c b/libc/upstream-openbsd/lib/libc/stdio/vswprintf.c
index da7c4deae..641db4ae7 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/vswprintf.c
+++ b/libc/upstream-openbsd/lib/libc/stdio/vswprintf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vswprintf.c,v 1.4 2012/12/05 23:20:01 deraadt Exp $ */
+/* $OpenBSD: vswprintf.c,v 1.6 2015/08/31 02:53:57 guenther Exp $ */
/* $NetBSD: vswprintf.c,v 1.1 2005/05/14 23:51:02 christos Exp $ */
/*
@@ -55,7 +55,7 @@ vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
_FILEEXT_SETUP(&f, &fext);
f._file = -1;
f._flags = __SWR | __SSTR | __SALC;
- f._bf._base = f._p = (unsigned char *)malloc(128);
+ f._bf._base = f._p = malloc(128);
if (f._bf._base == NULL) {
errno = ENOMEM;
return (-1);
@@ -94,3 +94,4 @@ vswprintf(wchar_t * __restrict s, size_t n, const wchar_t * __restrict fmt,
return (ret);
}
+DEF_STRONG(vswprintf);
diff --git a/libc/upstream-freebsd/lib/libc/stdlib/abs.c b/libc/upstream-openbsd/lib/libc/stdlib/abs.c
index 87589474e..5d2fbae69 100644
--- a/libc/upstream-freebsd/lib/libc/stdlib/abs.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/abs.c
@@ -1,6 +1,7 @@
+/* $OpenBSD: abs.c,v 1.5 2005/08/08 08:05:36 espie Exp $ */
/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,17 +28,10 @@
* SUCH DAMAGE.
*/
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)abs.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <stdlib.h>
int
-abs(j)
- int j;
+abs(int j)
{
return(j < 0 ? -j : j);
}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fgetpos.c b/libc/upstream-openbsd/lib/libc/stdlib/imaxabs.c
index e6188e5a6..b7e910eef 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/fgetpos.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/imaxabs.c
@@ -1,10 +1,8 @@
-/* $OpenBSD: fgetpos.c,v 1.6 2005/08/08 08:05:36 espie Exp $ */
+/* $OpenBSD: imaxabs.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */
+
/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -31,13 +29,10 @@
* SUCH DAMAGE.
*/
-#include <stdio.h>
+#include <inttypes.h>
-/*
- * fgetpos: like ftello.
- */
-int
-fgetpos(FILE *fp, fpos_t *pos)
+intmax_t
+imaxabs(intmax_t j)
{
- return((*pos = ftello(fp)) == (fpos_t)-1);
+ return (j < 0 ? -j : j);
}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fileno.c b/libc/upstream-openbsd/lib/libc/stdlib/imaxdiv.c
index 58628da3c..0515a94b9 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/fileno.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/imaxdiv.c
@@ -1,7 +1,7 @@
-/* $OpenBSD: fileno.c,v 1.8 2009/11/09 00:18:27 kurt Exp $ */
-/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
+/* $OpenBSD: imaxdiv.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */
+/*
+ * Copyright (c) 1990 Regents of the University of California.
+ * All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
@@ -31,21 +31,20 @@
* SUCH DAMAGE.
*/
-#include <stdio.h>
-#include "local.h"
+#include <inttypes.h> /* imaxdiv_t */
-/*
- * A subroutine version of the macro fileno.
- */
-#undef fileno
-
-int
-fileno(FILE *fp)
+imaxdiv_t
+imaxdiv(intmax_t num, intmax_t denom)
{
- int ret;
+ imaxdiv_t r;
+
+ /* see div.c for comments */
- FLOCKFILE(fp);
- ret = __sfileno(fp);
- FUNLOCKFILE(fp);
- return (ret);
+ r.quot = num / denom;
+ r.rem = num % denom;
+ if (num >= 0 && r.rem < 0) {
+ r.quot++;
+ r.rem -= denom;
+ }
+ return (r);
}
diff --git a/libc/upstream-freebsd/lib/libc/stdlib/labs.c b/libc/upstream-openbsd/lib/libc/stdlib/labs.c
index 816370eee..ca60b9aba 100644
--- a/libc/upstream-freebsd/lib/libc/stdlib/labs.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/labs.c
@@ -1,6 +1,7 @@
+/* $OpenBSD: labs.c,v 1.5 2005/08/08 08:05:36 espie Exp $ */
/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,17 +28,10 @@
* SUCH DAMAGE.
*/
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)labs.c 8.1 (Berkeley) 6/4/93";
-#endif /* LIBC_SCCS and not lint */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
#include <stdlib.h>
long
-labs(j)
- long j;
+labs(long j)
{
return(j < 0 ? -j : j);
}
diff --git a/libc/upstream-openbsd/lib/libc/stdio/fsetpos.c b/libc/upstream-openbsd/lib/libc/stdlib/llabs.c
index 9624fe565..fc2cd8261 100644
--- a/libc/upstream-openbsd/lib/libc/stdio/fsetpos.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/llabs.c
@@ -1,10 +1,8 @@
-/* $OpenBSD: fsetpos.c,v 1.6 2005/08/08 08:05:36 espie Exp $ */
+/* $OpenBSD: llabs.c,v 1.3 2007/01/08 19:39:25 deraadt Exp $ */
+
/*-
- * Copyright (c) 1990, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Chris Torek.
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -31,13 +29,10 @@
* SUCH DAMAGE.
*/
-#include <stdio.h>
+#include <stdlib.h>
-/*
- * fsetpos: like fseeko.
- */
-int
-fsetpos(FILE *iop, const fpos_t *pos)
+long long
+llabs(long long j)
{
- return (fseeko(iop, (off_t)*pos, SEEK_SET));
+ return (j < 0 ? -j : j);
}
diff --git a/libc/upstream-openbsd/lib/libc/stdlib/reallocarray.c b/libc/upstream-openbsd/lib/libc/stdlib/reallocarray.c
index 7accd99e0..baea252a8 100644
--- a/libc/upstream-openbsd/lib/libc/stdlib/reallocarray.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/reallocarray.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: reallocarray.c,v 1.1 2014/05/08 21:43:49 deraadt Exp $ */
+/* $OpenBSD: reallocarray.c,v 1.3 2015/09/13 08:31:47 guenther Exp $ */
/*
* Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
*
@@ -24,7 +24,7 @@
* This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
* if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
*/
-#define MUL_NO_OVERFLOW (1UL << (sizeof(size_t) * 4))
+#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
void *
reallocarray(void *optr, size_t nmemb, size_t size)
@@ -36,3 +36,4 @@ reallocarray(void *optr, size_t nmemb, size_t size)
}
return realloc(optr, size * nmemb);
}
+DEF_WEAK(reallocarray);
diff --git a/libc/upstream-openbsd/lib/libc/stdlib/setenv.c b/libc/upstream-openbsd/lib/libc/stdlib/setenv.c
index 9060fdba8..e55a1feb6 100644
--- a/libc/upstream-openbsd/lib/libc/stdlib/setenv.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/setenv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: setenv.c,v 1.14 2012/09/23 16:08:04 jeremy Exp $ */
+/* $OpenBSD: setenv.c,v 1.16 2015/09/13 08:31:47 guenther Exp $ */
/*
* Copyright (c) 1987 Regents of the University of California.
* All rights reserved.
@@ -32,8 +32,6 @@
#include <stdlib.h>
#include <string.h>
-char *__findenv(const char *name, int len, int *offset);
-
extern char **environ;
static char **lastenv; /* last value of environ */
@@ -71,7 +69,7 @@ putenv(char *str)
for (P = environ; *P != NULL; P++)
;
cnt = P - environ;
- P = (char **)realloc(lastenv, sizeof(char *) * (cnt + 2));
+ P = reallocarray(lastenv, cnt + 2, sizeof(char *));
if (!P)
return (-1);
if (lastenv != environ)
@@ -81,6 +79,7 @@ putenv(char *str)
environ[cnt + 1] = NULL;
return (0);
}
+DEF_WEAK(putenv);
/*
* setenv --
@@ -129,7 +128,7 @@ setenv(const char *name, const char *value, int rewrite)
for (P = environ; *P != NULL; P++)
;
cnt = P - environ;
- P = (char **)realloc(lastenv, sizeof(char *) * (cnt + 2));
+ P = reallocarray(lastenv, cnt + 2, sizeof(char *));
if (!P)
return (-1);
if (lastenv != environ)
@@ -147,6 +146,7 @@ setenv(const char *name, const char *value, int rewrite)
;
return (0);
}
+DEF_WEAK(setenv);
/*
* unsetenv(name) --
@@ -178,3 +178,4 @@ unsetenv(const char *name)
}
return (0);
}
+DEF_WEAK(unsetenv);
diff --git a/libc/upstream-openbsd/lib/libc/stdlib/system.c b/libc/upstream-openbsd/lib/libc/stdlib/system.c
index 14ddcae8d..de32d4328 100644
--- a/libc/upstream-openbsd/lib/libc/stdlib/system.c
+++ b/libc/upstream-openbsd/lib/libc/stdlib/system.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: system.c,v 1.8 2005/08/08 08:05:37 espie Exp $ */
+/* $OpenBSD: system.c,v 1.11 2015/10/23 04:44:41 guenther Exp $ */
/*
* Copyright (c) 1988 The Regents of the University of California.
* All rights reserved.
@@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/wait.h>
+#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
@@ -40,8 +41,8 @@ extern char **environ;
int
system(const char *command)
{
- pid_t pid;
- sig_t intsave, quitsave;
+ pid_t pid, cpid;
+ struct sigaction intsave, quitsave;
sigset_t mask, omask;
int pstat;
char *argp[] = {"sh", "-c", NULL, NULL};
@@ -54,7 +55,7 @@ system(const char *command)
sigemptyset(&mask);
sigaddset(&mask, SIGCHLD);
sigprocmask(SIG_BLOCK, &mask, &omask);
- switch (pid = vfork()) {
+ switch (cpid = vfork()) {
case -1: /* error */
sigprocmask(SIG_SETMASK, &omask, NULL);
return(-1);
@@ -64,11 +65,14 @@ system(const char *command)
_exit(127);
}
- intsave = signal(SIGINT, SIG_IGN);
- quitsave = signal(SIGQUIT, SIG_IGN);
- pid = waitpid(pid, (int *)&pstat, 0);
+ sigaction(SIGINT, NULL, &intsave);
+ sigaction(SIGQUIT, NULL, &quitsave);
+ do {
+ pid = waitpid(cpid, &pstat, 0);
+ } while (pid == -1 && errno == EINTR);
sigprocmask(SIG_SETMASK, &omask, NULL);
- (void)signal(SIGINT, intsave);
- (void)signal(SIGQUIT, quitsave);
+ sigaction(SIGINT, &intsave, NULL);
+ sigaction(SIGQUIT, &quitsave, NULL);
return (pid == -1 ? -1 : pstat);
}
+DEF_STRONG(system);
diff --git a/libc/upstream-openbsd/lib/libc/string/strlcat.c b/libc/upstream-openbsd/lib/libc/string/strlcat.c
index ceab09441..073b0d425 100644
--- a/libc/upstream-openbsd/lib/libc/string/strlcat.c
+++ b/libc/upstream-openbsd/lib/libc/string/strlcat.c
@@ -1,7 +1,7 @@
-/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */
+/* $OpenBSD: strlcat.c,v 1.16 2015/08/31 02:53:57 guenther Exp $ */
/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -20,36 +20,37 @@
#include <string.h>
/*
- * Appends src to string dst of size siz (unlike strncat, siz is the
- * full size of dst, not space left). At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz <= strlen(dst)).
- * Returns strlen(src) + MIN(siz, strlen(initial dst)).
- * If retval >= siz, truncation occurred.
+ * Appends src to string dst of size dsize (unlike strncat, dsize is the
+ * full size of dst, not space left). At most dsize-1 characters
+ * will be copied. Always NUL terminates (unless dsize <= strlen(dst)).
+ * Returns strlen(src) + MIN(dsize, strlen(initial dst)).
+ * If retval >= dsize, truncation occurred.
*/
size_t
-strlcat(char *dst, const char *src, size_t siz)
+strlcat(char *dst, const char *src, size_t dsize)
{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
+ const char *odst = dst;
+ const char *osrc = src;
+ size_t n = dsize;
size_t dlen;
- /* Find the end of dst and adjust bytes left but don't go past end */
- while (n-- != 0 && *d != '\0')
- d++;
- dlen = d - dst;
- n = siz - dlen;
+ /* Find the end of dst and adjust bytes left but don't go past end. */
+ while (n-- != 0 && *dst != '\0')
+ dst++;
+ dlen = dst - odst;
+ n = dsize - dlen;
- if (n == 0)
- return(dlen + strlen(s));
- while (*s != '\0') {
- if (n != 1) {
- *d++ = *s;
+ if (n-- == 0)
+ return(dlen + strlen(src));
+ while (*src != '\0') {
+ if (n != 0) {
+ *dst++ = *src;
n--;
}
- s++;
+ src++;
}
- *d = '\0';
+ *dst = '\0';
- return(dlen + (s - src)); /* count does not include NUL */
+ return(dlen + (src - osrc)); /* count does not include NUL */
}
+DEF_WEAK(strlcat);
diff --git a/libc/upstream-openbsd/lib/libc/string/strlcpy.c b/libc/upstream-openbsd/lib/libc/string/strlcpy.c
index d32b6590f..5fcf084aa 100644
--- a/libc/upstream-openbsd/lib/libc/string/strlcpy.c
+++ b/libc/upstream-openbsd/lib/libc/string/strlcpy.c
@@ -1,7 +1,7 @@
-/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */
+/* $OpenBSD: strlcpy.c,v 1.13 2015/08/31 02:53:57 guenther Exp $ */
/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -20,32 +20,32 @@
#include <string.h>
/*
- * Copy src to string dst of size siz. At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz == 0).
- * Returns strlen(src); if retval >= siz, truncation occurred.
+ * Copy string src to buffer dst of size dsize. At most dsize-1
+ * chars will be copied. Always NUL terminates (unless dsize == 0).
+ * Returns strlen(src); if retval >= dsize, truncation occurred.
*/
size_t
-strlcpy(char *dst, const char *src, size_t siz)
+strlcpy(char *dst, const char *src, size_t dsize)
{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
+ const char *osrc = src;
+ size_t nleft = dsize;
- /* Copy as many bytes as will fit */
- if (n != 0) {
- while (--n != 0) {
- if ((*d++ = *s++) == '\0')
+ /* Copy as many bytes as will fit. */
+ if (nleft != 0) {
+ while (--nleft != 0) {
+ if ((*dst++ = *src++) == '\0')
break;
}
}
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (siz != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++)
+ /* Not enough room in dst, add NUL and traverse rest of src. */
+ if (nleft == 0) {
+ if (dsize != 0)
+ *dst = '\0'; /* NUL-terminate dst */
+ while (*src++)
;
}
- return(s - src - 1); /* count does not include NUL */
+ return(src - osrc - 1); /* count does not include NUL */
}
+DEF_WEAK(strlcpy);
diff --git a/libc/upstream-openbsd/lib/libc/string/strtok.c b/libc/upstream-openbsd/lib/libc/string/strtok.c
index 4e963a019..c5765756f 100644
--- a/libc/upstream-openbsd/lib/libc/string/strtok.c
+++ b/libc/upstream-openbsd/lib/libc/string/strtok.c
@@ -36,15 +36,15 @@ strtok(char *s, const char *delim)
return strtok_r(s, delim, &last);
}
+DEF_STRONG(strtok);
char *
strtok_r(char *s, const char *delim, char **last)
{
- char *spanp;
+ const char *spanp;
int c, sc;
char *tok;
-
if (s == NULL && (s = *last) == NULL)
return (NULL);
@@ -53,7 +53,7 @@ strtok_r(char *s, const char *delim, char **last)
*/
cont:
c = *s++;
- for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
+ for (spanp = delim; (sc = *spanp++) != 0;) {
if (c == sc)
goto cont;
}
@@ -70,13 +70,13 @@ cont:
*/
for (;;) {
c = *s++;
- spanp = (char *)delim;
+ spanp = delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0)
s = NULL;
else
- s[-1] = 0;
+ s[-1] = '\0';
*last = s;
return (tok);
}
@@ -84,3 +84,4 @@ cont:
}
/* NOTREACHED */
}
+DEF_WEAK(strtok_r);
diff --git a/libc/upstream-openbsd/lib/libc/string/wcslcpy.c b/libc/upstream-openbsd/lib/libc/string/wcslcpy.c
index f49936a88..36a544a33 100644
--- a/libc/upstream-openbsd/lib/libc/string/wcslcpy.c
+++ b/libc/upstream-openbsd/lib/libc/string/wcslcpy.c
@@ -1,8 +1,7 @@
-/* $OpenBSD: wcslcpy.c,v 1.5 2011/07/24 15:21:28 millert Exp $ */
-/* $NetBSD: wcslcpy.c,v 1.2 2001/01/03 14:33:02 lukem Exp $ */
+/* $OpenBSD: wcslcpy.c,v 1.7 2015/09/12 16:23:14 guenther Exp $ */
/*
- * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -21,32 +20,32 @@
#include <wchar.h>
/*
- * Copy src to string dst of size siz. At most siz-1 characters
- * will be copied. Always NUL terminates (unless siz == 0).
- * Returns wcslen(src); if retval >= siz, truncation occurred.
+ * Copy string src to buffer dst of size dsize. At most dsize-1
+ * chars will be copied. Always NUL terminates (unless dsize == 0).
+ * Returns wcslen(src); if retval >= dsize, truncation occurred.
*/
size_t
-wcslcpy(wchar_t *dst, const wchar_t *src, size_t siz)
+wcslcpy(wchar_t *dst, const wchar_t *src, size_t dsize)
{
- wchar_t *d = dst;
- const wchar_t *s = src;
- size_t n = siz;
+ const wchar_t *osrc = src;
+ size_t nleft = dsize;
- /* Copy as many bytes as will fit */
- if (n != 0) {
- while (--n != 0) {
- if ((*d++ = *s++) == '\0')
+ /* Copy as many bytes as will fit. */
+ if (nleft != 0) {
+ while (--nleft != 0) {
+ if ((*dst++ = *src++) == L'\0')
break;
}
}
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (siz != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++)
+ /* Not enough room in dst, add NUL and traverse rest of src. */
+ if (nleft == 0) {
+ if (dsize != 0)
+ *dst = L'\0'; /* NUL-terminate dst */
+ while (*src++)
;
}
- return(s - src - 1); /* count does not include NUL */
+ return(src - osrc - 1); /* count does not include NUL */
}
+DEF_WEAK(wcslcpy);
diff --git a/libc/upstream-openbsd/lib/libc/time/wcsftime.c b/libc/upstream-openbsd/lib/libc/time/wcsftime.c
index 21ccac704..067840401 100644
--- a/libc/upstream-openbsd/lib/libc/time/wcsftime.c
+++ b/libc/upstream-openbsd/lib/libc/time/wcsftime.c
@@ -1,6 +1,4 @@
-/* $OpenBSD: wcsftime.c,v 1.3 2014/05/06 15:49:45 tedu Exp $ */
-#include "private.h"
-
+/* $OpenBSD: wcsftime.c,v 1.6 2015/02/09 14:52:28 tedu Exp $ */
/*
** Based on the UCB version with the ID appearing below.
** This is ANSIish only when "multibyte character == plain character".
@@ -33,11 +31,13 @@
** SUCH DAMAGE.
*/
-#include "tzfile.h"
-#include "fcntl.h"
+#include <fcntl.h>
#include <locale.h>
#include <wchar.h>
+#include "private.h"
+#include "tzfile.h"
+
struct lc_time_T {
const wchar_t * mon[MONSPERYEAR];
const wchar_t * month[MONSPERYEAR];
@@ -292,14 +292,9 @@ label:
tm = *t;
mkt = mktime(&tm);
- if (TYPE_SIGNED(time_t))
- (void) swprintf(buf,
- sizeof buf/sizeof buf[0],
- L"%ld", (long) mkt);
- else
- (void) swprintf(buf,
- sizeof buf/sizeof buf[0],
- L"%lu", (unsigned long) mkt);
+ (void) swprintf(buf,
+ sizeof buf/sizeof buf[0],
+ L"%ld", (long) mkt);
pt = _add(buf, pt, ptlim);
}
continue;
@@ -529,8 +524,8 @@ static wchar_t *
_yconv(int a, int b, int convert_top, int convert_yy, wchar_t *pt,
const wchar_t *ptlim)
{
- register int lead;
- register int trail;
+ int lead;
+ int trail;
#define DIVISOR 100
trail = a % DIVISOR + b % DIVISOR;
diff --git a/libdl/Android.bp b/libdl/Android.bp
new file mode 100644
index 000000000..2aa9b68a9
--- /dev/null
+++ b/libdl/Android.bp
@@ -0,0 +1,60 @@
+//
+// libdl
+//
+cc_library {
+
+ // NOTE: --exclude-libs=libgcc.a makes sure that any symbols libdl.so pulls from
+ // libgcc.a are made static to libdl.so. This in turn ensures that libraries that
+ // a) pull symbols from libgcc.a and b) depend on libdl.so will not rely on libdl.so
+ // to provide those symbols, but will instead pull them from libgcc.a. Specifically,
+ // we use this property to make sure libc.so has its own copy of the code from
+ // libgcc.a it uses.
+ //
+ // DO NOT REMOVE --exclude-libs!
+
+ ldflags: ["-Wl,--exclude-libs=libgcc.a"],
+
+ // for x86, exclude libgcc_eh.a for the same reasons as above
+ arch: {
+ arm: {
+ version_script: "libdl.arm.map",
+ },
+ arm64: {
+ version_script: "libdl.arm64.map",
+ },
+ mips: {
+ version_script: "libdl.mips.map",
+ },
+ mips64: {
+ version_script: "libdl.mips64.map",
+ },
+ x86: {
+ ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
+ version_script: "libdl.x86.map",
+ },
+ x86_64: {
+ ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
+ version_script: "libdl.x86_64.map",
+ },
+ },
+ srcs: ["libdl.c"],
+ cflags: [
+ "-Wall",
+ "-Wextra",
+ "-Wunused",
+ "-Werror",
+ ],
+ stl: "none",
+
+ name: "libdl",
+
+ // NOTE: libdl needs __aeabi_unwind_cpp_pr0 from libgcc.a but libgcc.a needs a
+ // few symbols from libc. Using --no-undefined here results in having to link
+ // against libc creating a circular dependency which is removed and we end up
+ // with missing symbols. Since this library is just a bunch of stubs, we set
+ // LOCAL_ALLOW_UNDEFINED_SYMBOLS to remove --no-undefined from the linker flags.
+ allow_undefined_symbols: true,
+ system_shared_libs: [],
+
+ sanitize: ["never"],
+}
diff --git a/libdl/Android.mk b/libdl/Android.mk
index 7b97dc4ad..1ea5dc7ff 100644
--- a/libdl/Android.mk
+++ b/libdl/Android.mk
@@ -15,18 +15,31 @@ include $(CLEAR_VARS)
#
# DO NOT REMOVE --exclude-libs!
-LOCAL_LDFLAGS := -Wl,--exclude-libs=libgcc.a -Wl,--version-script=$(LOCAL_PATH)/libdl.map
+LOCAL_LDFLAGS := -Wl,--exclude-libs=libgcc.a
# for x86, exclude libgcc_eh.a for the same reasons as above
LOCAL_LDFLAGS_x86 := -Wl,--exclude-libs=libgcc_eh.a
LOCAL_LDFLAGS_x86_64 := $(LOCAL_LDFLAGS_x86)
+LOCAL_LDFLAGS_arm += -Wl,--version-script=$(LOCAL_PATH)/libdl.arm.map
+LOCAL_LDFLAGS_arm64 += -Wl,--version-script=$(LOCAL_PATH)/libdl.arm64.map
+LOCAL_LDFLAGS_mips += -Wl,--version-script=$(LOCAL_PATH)/libdl.mips.map
+LOCAL_LDFLAGS_mips64 += -Wl,--version-script=$(LOCAL_PATH)/libdl.mips64.map
+LOCAL_LDFLAGS_x86 += -Wl,--version-script=$(LOCAL_PATH)/libdl.x86.map
+LOCAL_LDFLAGS_x86_64 += -Wl,--version-script=$(LOCAL_PATH)/libdl.x86_64.map
+
LOCAL_SRC_FILES:= libdl.c
LOCAL_CFLAGS := -Wall -Wextra -Wunused -Werror
LOCAL_CXX_STL := none
LOCAL_MODULE := libdl
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk \
+ $(LOCAL_PATH)/libdl.arm.map \
+ $(LOCAL_PATH)/libdl.arm64.map \
+ $(LOCAL_PATH)/libdl.mips.map \
+ $(LOCAL_PATH)/libdl.mips64.map \
+ $(LOCAL_PATH)/libdl.x86.map \
+ $(LOCAL_PATH)/libdl.x86_64.map \
# NOTE: libdl needs __aeabi_unwind_cpp_pr0 from libgcc.a but libgcc.a needs a
# few symbols from libc. Using --no-undefined here results in having to link
@@ -36,7 +49,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
LOCAL_SYSTEM_SHARED_LIBRARIES :=
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
include $(BUILD_SHARED_LIBRARY)
# A dummy libdl.a. Need for static executables using the LLVM unwinder. Most
@@ -49,5 +62,5 @@ LOCAL_CXX_STL := none
LOCAL_MODULE := libdl
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
include $(BUILD_STATIC_LIBRARY)
diff --git a/libdl/libdl.arm.map b/libdl/libdl.arm.map
new file mode 100644
index 000000000..2821509f1
--- /dev/null
+++ b/libdl/libdl.arm.map
@@ -0,0 +1,31 @@
+# Generated by genversionscripts.py. Do not edit.
+
+LIBC {
+ global:
+ android_dlopen_ext;
+ dl_iterate_phdr;
+ dl_unwind_find_exidx; # arm
+ dladdr;
+ dlclose;
+ dlerror;
+ dlopen;
+ dlsym;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ dlvsym;
+} LIBC;
+
+LIBC_PLATFORM {
+ global:
+ android_dlwarning;
+ android_get_application_target_sdk_version;
+ android_set_application_target_sdk_version;
+ android_get_LD_LIBRARY_PATH;
+ android_update_LD_LIBRARY_PATH;
+ android_init_namespaces;
+ android_create_namespace;
+} LIBC_N;
diff --git a/libdl/libdl.arm64.map b/libdl/libdl.arm64.map
new file mode 100644
index 000000000..f21859ce5
--- /dev/null
+++ b/libdl/libdl.arm64.map
@@ -0,0 +1,30 @@
+# Generated by genversionscripts.py. Do not edit.
+
+LIBC {
+ global:
+ android_dlopen_ext;
+ dl_iterate_phdr;
+ dladdr;
+ dlclose;
+ dlerror;
+ dlopen;
+ dlsym;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ dlvsym;
+} LIBC;
+
+LIBC_PLATFORM {
+ global:
+ android_dlwarning;
+ android_get_application_target_sdk_version;
+ android_set_application_target_sdk_version;
+ android_get_LD_LIBRARY_PATH;
+ android_update_LD_LIBRARY_PATH;
+ android_init_namespaces;
+ android_create_namespace;
+} LIBC_N;
diff --git a/libdl/libdl.c b/libdl/libdl.c
index 9a858a36e..b62ee5ccb 100644
--- a/libdl/libdl.c
+++ b/libdl/libdl.c
@@ -24,21 +24,50 @@
// in the dynamic linker and hijacked at runtime.
void* dlopen(const char* filename __unused, int flag __unused) { return 0; }
+
const char* dlerror(void) { return 0; }
+
void* dlsym(void* handle __unused, const char* symbol __unused) { return 0; }
+
+void* dlvsym(void* handle __unused, const char* symbol __unused, const char* version __unused) {
+ return 0;
+}
+
int dladdr(const void* addr __unused, Dl_info* info __unused) { return 0; }
+
int dlclose(void* handle __unused) { return 0; }
#if defined(__arm__)
_Unwind_Ptr dl_unwind_find_exidx(_Unwind_Ptr pc __unused, int* pcount __unused) { return 0; }
#endif
-int dl_iterate_phdr(int (*cb)(struct dl_phdr_info* info, size_t size, void* data) __unused, void* data __unused) { return 0; }
+int dl_iterate_phdr(int (*cb)(struct dl_phdr_info* info, size_t size, void* data) __unused,
+ void* data __unused) {
+ return 0;
+}
void android_get_LD_LIBRARY_PATH(char* buffer __unused, size_t buffer_size __unused) { }
void android_update_LD_LIBRARY_PATH(const char* ld_library_path __unused) { }
-void* android_dlopen_ext(const char* filename __unused, int flag __unused, const android_dlextinfo* extinfo __unused) { return 0; }
+void* android_dlopen_ext(const char* filename __unused, int flag __unused,
+ const android_dlextinfo* extinfo __unused) {
+ return 0;
+}
void android_set_application_target_sdk_version(uint32_t target __unused) { }
uint32_t android_get_application_target_sdk_version() { return 0; }
+
+bool android_init_namespaces(const char* public_ns_sonames __unused,
+ const char* anon_ns_library_path __unused) {
+ return false;
+}
+
+struct android_namespace_t* android_create_namespace(const char* name __unused,
+ const char* ld_library_path __unused,
+ const char* default_library_path __unused,
+ uint64_t type __unused,
+ const char* permitted_when_isolated_path __unused) {
+ return 0;
+}
+
+void android_dlwarning(void* obj, void (*f)(void*, const char*)) { f(obj, 0); }
diff --git a/libdl/libdl.map b/libdl/libdl.map.txt
index a911cb67a..962692ec9 100644
--- a/libdl/libdl.map
+++ b/libdl/libdl.map.txt
@@ -18,9 +18,7 @@ LIBC {
global:
android_dlopen_ext;
dl_iterate_phdr;
-# begin arm-only
- dl_unwind_find_exidx;
-# end arm-only
+ dl_unwind_find_exidx; # arm
dladdr;
dlclose;
dlerror;
@@ -30,10 +28,18 @@ LIBC {
*;
};
-LIBC_PRIVATE {
+LIBC_N {
global:
+ dlvsym;
+} LIBC;
+
+LIBC_PLATFORM {
+ global:
+ android_dlwarning;
android_get_application_target_sdk_version;
android_set_application_target_sdk_version;
android_get_LD_LIBRARY_PATH;
android_update_LD_LIBRARY_PATH;
-} LIBC;
+ android_init_namespaces;
+ android_create_namespace;
+} LIBC_N;
diff --git a/libdl/libdl.mips.map b/libdl/libdl.mips.map
new file mode 100644
index 000000000..f21859ce5
--- /dev/null
+++ b/libdl/libdl.mips.map
@@ -0,0 +1,30 @@
+# Generated by genversionscripts.py. Do not edit.
+
+LIBC {
+ global:
+ android_dlopen_ext;
+ dl_iterate_phdr;
+ dladdr;
+ dlclose;
+ dlerror;
+ dlopen;
+ dlsym;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ dlvsym;
+} LIBC;
+
+LIBC_PLATFORM {
+ global:
+ android_dlwarning;
+ android_get_application_target_sdk_version;
+ android_set_application_target_sdk_version;
+ android_get_LD_LIBRARY_PATH;
+ android_update_LD_LIBRARY_PATH;
+ android_init_namespaces;
+ android_create_namespace;
+} LIBC_N;
diff --git a/libdl/libdl.mips64.map b/libdl/libdl.mips64.map
new file mode 100644
index 000000000..f21859ce5
--- /dev/null
+++ b/libdl/libdl.mips64.map
@@ -0,0 +1,30 @@
+# Generated by genversionscripts.py. Do not edit.
+
+LIBC {
+ global:
+ android_dlopen_ext;
+ dl_iterate_phdr;
+ dladdr;
+ dlclose;
+ dlerror;
+ dlopen;
+ dlsym;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ dlvsym;
+} LIBC;
+
+LIBC_PLATFORM {
+ global:
+ android_dlwarning;
+ android_get_application_target_sdk_version;
+ android_set_application_target_sdk_version;
+ android_get_LD_LIBRARY_PATH;
+ android_update_LD_LIBRARY_PATH;
+ android_init_namespaces;
+ android_create_namespace;
+} LIBC_N;
diff --git a/libdl/libdl.x86.map b/libdl/libdl.x86.map
new file mode 100644
index 000000000..f21859ce5
--- /dev/null
+++ b/libdl/libdl.x86.map
@@ -0,0 +1,30 @@
+# Generated by genversionscripts.py. Do not edit.
+
+LIBC {
+ global:
+ android_dlopen_ext;
+ dl_iterate_phdr;
+ dladdr;
+ dlclose;
+ dlerror;
+ dlopen;
+ dlsym;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ dlvsym;
+} LIBC;
+
+LIBC_PLATFORM {
+ global:
+ android_dlwarning;
+ android_get_application_target_sdk_version;
+ android_set_application_target_sdk_version;
+ android_get_LD_LIBRARY_PATH;
+ android_update_LD_LIBRARY_PATH;
+ android_init_namespaces;
+ android_create_namespace;
+} LIBC_N;
diff --git a/libdl/libdl.x86_64.map b/libdl/libdl.x86_64.map
new file mode 100644
index 000000000..f21859ce5
--- /dev/null
+++ b/libdl/libdl.x86_64.map
@@ -0,0 +1,30 @@
+# Generated by genversionscripts.py. Do not edit.
+
+LIBC {
+ global:
+ android_dlopen_ext;
+ dl_iterate_phdr;
+ dladdr;
+ dlclose;
+ dlerror;
+ dlopen;
+ dlsym;
+ local:
+ *;
+};
+
+LIBC_N {
+ global:
+ dlvsym;
+} LIBC;
+
+LIBC_PLATFORM {
+ global:
+ android_dlwarning;
+ android_get_application_target_sdk_version;
+ android_set_application_target_sdk_version;
+ android_get_LD_LIBRARY_PATH;
+ android_update_LD_LIBRARY_PATH;
+ android_init_namespaces;
+ android_create_namespace;
+} LIBC_N;
diff --git a/libm/Android.bp b/libm/Android.bp
new file mode 100644
index 000000000..081a13967
--- /dev/null
+++ b/libm/Android.bp
@@ -0,0 +1,520 @@
+// ANDROIDMK TRANSLATION ERROR: unsupported directive
+// ifneq ($(TARGET_USE_PRIVATE_LIBM),true)
+
+bionic_coverage = false
+
+libm_common_src_files = [
+ "upstream-freebsd/lib/msun/bsdsrc/b_exp.c",
+ "upstream-freebsd/lib/msun/bsdsrc/b_log.c",
+ "upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c",
+ "upstream-freebsd/lib/msun/src/catrig.c",
+ "upstream-freebsd/lib/msun/src/catrigf.c",
+ "upstream-freebsd/lib/msun/src/e_acos.c",
+ "upstream-freebsd/lib/msun/src/e_acosf.c",
+ "upstream-freebsd/lib/msun/src/e_acosh.c",
+ "upstream-freebsd/lib/msun/src/e_acoshf.c",
+ "upstream-freebsd/lib/msun/src/e_asin.c",
+ "upstream-freebsd/lib/msun/src/e_asinf.c",
+ "upstream-freebsd/lib/msun/src/e_atan2.c",
+ "upstream-freebsd/lib/msun/src/e_atan2f.c",
+ "upstream-freebsd/lib/msun/src/e_atanh.c",
+ "upstream-freebsd/lib/msun/src/e_atanhf.c",
+ "upstream-freebsd/lib/msun/src/e_cosh.c",
+ "upstream-freebsd/lib/msun/src/e_coshf.c",
+ "upstream-freebsd/lib/msun/src/e_exp.c",
+ "upstream-freebsd/lib/msun/src/e_expf.c",
+ "upstream-freebsd/lib/msun/src/e_fmod.c",
+ "upstream-freebsd/lib/msun/src/e_fmodf.c",
+ "upstream-freebsd/lib/msun/src/e_gamma.c",
+ "upstream-freebsd/lib/msun/src/e_gammaf.c",
+ "upstream-freebsd/lib/msun/src/e_gammaf_r.c",
+ "upstream-freebsd/lib/msun/src/e_gamma_r.c",
+ "upstream-freebsd/lib/msun/src/e_hypot.c",
+ "upstream-freebsd/lib/msun/src/e_hypotf.c",
+ "upstream-freebsd/lib/msun/src/e_j0.c",
+ "upstream-freebsd/lib/msun/src/e_j0f.c",
+ "upstream-freebsd/lib/msun/src/e_j1.c",
+ "upstream-freebsd/lib/msun/src/e_j1f.c",
+ "upstream-freebsd/lib/msun/src/e_jn.c",
+ "upstream-freebsd/lib/msun/src/e_jnf.c",
+ "upstream-freebsd/lib/msun/src/e_lgamma.c",
+ "upstream-freebsd/lib/msun/src/e_lgammaf.c",
+ "upstream-freebsd/lib/msun/src/e_lgammaf_r.c",
+ "upstream-freebsd/lib/msun/src/e_lgamma_r.c",
+ "upstream-freebsd/lib/msun/src/e_log10.c",
+ "upstream-freebsd/lib/msun/src/e_log10f.c",
+ "upstream-freebsd/lib/msun/src/e_log2.c",
+ "upstream-freebsd/lib/msun/src/e_log2f.c",
+ "upstream-freebsd/lib/msun/src/e_log.c",
+ "upstream-freebsd/lib/msun/src/e_logf.c",
+ "upstream-freebsd/lib/msun/src/e_pow.c",
+ "upstream-freebsd/lib/msun/src/e_powf.c",
+ "upstream-freebsd/lib/msun/src/e_remainder.c",
+ "upstream-freebsd/lib/msun/src/e_remainderf.c",
+ "upstream-freebsd/lib/msun/src/e_rem_pio2.c",
+ "upstream-freebsd/lib/msun/src/e_rem_pio2f.c",
+ "upstream-freebsd/lib/msun/src/e_scalb.c",
+ "upstream-freebsd/lib/msun/src/e_scalbf.c",
+ "upstream-freebsd/lib/msun/src/e_sinh.c",
+ "upstream-freebsd/lib/msun/src/e_sinhf.c",
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/imprecise.c",
+ "upstream-freebsd/lib/msun/src/k_cos.c",
+ "upstream-freebsd/lib/msun/src/k_cosf.c",
+ "upstream-freebsd/lib/msun/src/k_exp.c",
+ "upstream-freebsd/lib/msun/src/k_expf.c",
+ "upstream-freebsd/lib/msun/src/k_rem_pio2.c",
+ "upstream-freebsd/lib/msun/src/k_sin.c",
+ "upstream-freebsd/lib/msun/src/k_sinf.c",
+ "upstream-freebsd/lib/msun/src/k_tan.c",
+ "upstream-freebsd/lib/msun/src/k_tanf.c",
+ "upstream-freebsd/lib/msun/src/s_asinh.c",
+ "upstream-freebsd/lib/msun/src/s_asinhf.c",
+ "upstream-freebsd/lib/msun/src/s_atan.c",
+ "upstream-freebsd/lib/msun/src/s_atanf.c",
+ "upstream-freebsd/lib/msun/src/s_carg.c",
+ "upstream-freebsd/lib/msun/src/s_cargf.c",
+ "upstream-freebsd/lib/msun/src/s_cargl.c",
+ "upstream-freebsd/lib/msun/src/s_cbrt.c",
+ "upstream-freebsd/lib/msun/src/s_cbrtf.c",
+ "upstream-freebsd/lib/msun/src/s_ccosh.c",
+ "upstream-freebsd/lib/msun/src/s_ccoshf.c",
+ "upstream-freebsd/lib/msun/src/s_ceil.c",
+ "upstream-freebsd/lib/msun/src/s_ceilf.c",
+ "upstream-freebsd/lib/msun/src/s_cexp.c",
+ "upstream-freebsd/lib/msun/src/s_cexpf.c",
+ "upstream-freebsd/lib/msun/src/s_cimag.c",
+ "upstream-freebsd/lib/msun/src/s_cimagf.c",
+ "upstream-freebsd/lib/msun/src/s_cimagl.c",
+ "upstream-freebsd/lib/msun/src/s_conj.c",
+ "upstream-freebsd/lib/msun/src/s_conjf.c",
+ "upstream-freebsd/lib/msun/src/s_conjl.c",
+ "upstream-freebsd/lib/msun/src/s_copysign.c",
+ "upstream-freebsd/lib/msun/src/s_copysignf.c",
+ "upstream-freebsd/lib/msun/src/s_cos.c",
+ "upstream-freebsd/lib/msun/src/s_cosf.c",
+ "upstream-freebsd/lib/msun/src/s_cproj.c",
+ "upstream-freebsd/lib/msun/src/s_cprojf.c",
+ "upstream-freebsd/lib/msun/src/s_cprojl.c",
+ "upstream-freebsd/lib/msun/src/s_creal.c",
+ "upstream-freebsd/lib/msun/src/s_crealf.c",
+ "upstream-freebsd/lib/msun/src/s_creall.c",
+ "upstream-freebsd/lib/msun/src/s_csinh.c",
+ "upstream-freebsd/lib/msun/src/s_csinhf.c",
+ "upstream-freebsd/lib/msun/src/s_csqrt.c",
+ "upstream-freebsd/lib/msun/src/s_csqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_csqrtl.c",
+ "upstream-freebsd/lib/msun/src/s_ctanh.c",
+ "upstream-freebsd/lib/msun/src/s_ctanhf.c",
+ "upstream-freebsd/lib/msun/src/s_erf.c",
+ "upstream-freebsd/lib/msun/src/s_erff.c",
+ "upstream-freebsd/lib/msun/src/s_exp2.c",
+ "upstream-freebsd/lib/msun/src/s_exp2f.c",
+ "upstream-freebsd/lib/msun/src/s_expm1.c",
+ "upstream-freebsd/lib/msun/src/s_expm1f.c",
+ "upstream-freebsd/lib/msun/src/s_fdim.c",
+ "upstream-freebsd/lib/msun/src/s_finite.c",
+ "upstream-freebsd/lib/msun/src/s_finitef.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ "upstream-freebsd/lib/msun/src/s_floorf.c",
+ "upstream-freebsd/lib/msun/src/s_fma.c",
+ "upstream-freebsd/lib/msun/src/s_fmaf.c",
+ "upstream-freebsd/lib/msun/src/s_fmax.c",
+ "upstream-freebsd/lib/msun/src/s_fmaxf.c",
+ "upstream-freebsd/lib/msun/src/s_fmin.c",
+ "upstream-freebsd/lib/msun/src/s_fminf.c",
+ "upstream-freebsd/lib/msun/src/s_frexp.c",
+ "upstream-freebsd/lib/msun/src/s_frexpf.c",
+ "upstream-freebsd/lib/msun/src/s_ilogb.c",
+ "upstream-freebsd/lib/msun/src/s_ilogbf.c",
+ "upstream-freebsd/lib/msun/src/s_llrint.c",
+ "upstream-freebsd/lib/msun/src/s_llrintf.c",
+ "upstream-freebsd/lib/msun/src/s_llround.c",
+ "upstream-freebsd/lib/msun/src/s_llroundf.c",
+ "upstream-freebsd/lib/msun/src/s_log1p.c",
+ "upstream-freebsd/lib/msun/src/s_log1pf.c",
+ "upstream-freebsd/lib/msun/src/s_logb.c",
+ "upstream-freebsd/lib/msun/src/s_logbf.c",
+ "upstream-freebsd/lib/msun/src/s_lrint.c",
+ "upstream-freebsd/lib/msun/src/s_lrintf.c",
+ "upstream-freebsd/lib/msun/src/s_lround.c",
+ "upstream-freebsd/lib/msun/src/s_lroundf.c",
+ "upstream-freebsd/lib/msun/src/s_modf.c",
+ "upstream-freebsd/lib/msun/src/s_modff.c",
+ "upstream-freebsd/lib/msun/src/s_nan.c",
+ "upstream-freebsd/lib/msun/src/s_nearbyint.c",
+ "upstream-freebsd/lib/msun/src/s_nextafter.c",
+ "upstream-freebsd/lib/msun/src/s_nextafterf.c",
+ "upstream-freebsd/lib/msun/src/s_remquo.c",
+ "upstream-freebsd/lib/msun/src/s_remquof.c",
+ "upstream-freebsd/lib/msun/src/s_rint.c",
+ "upstream-freebsd/lib/msun/src/s_rintf.c",
+ "upstream-freebsd/lib/msun/src/s_round.c",
+ "upstream-freebsd/lib/msun/src/s_roundf.c",
+ "upstream-freebsd/lib/msun/src/s_scalbln.c",
+ "upstream-freebsd/lib/msun/src/s_scalbn.c",
+ "upstream-freebsd/lib/msun/src/s_scalbnf.c",
+ "upstream-freebsd/lib/msun/src/s_signgam.c",
+ "upstream-freebsd/lib/msun/src/s_significand.c",
+ "upstream-freebsd/lib/msun/src/s_significandf.c",
+ "upstream-freebsd/lib/msun/src/s_sin.c",
+ "upstream-freebsd/lib/msun/src/s_sinf.c",
+ "upstream-freebsd/lib/msun/src/s_tan.c",
+ "upstream-freebsd/lib/msun/src/s_tanf.c",
+ "upstream-freebsd/lib/msun/src/s_tanh.c",
+ "upstream-freebsd/lib/msun/src/s_tanhf.c",
+ "upstream-freebsd/lib/msun/src/s_tgammaf.c",
+ "upstream-freebsd/lib/msun/src/s_trunc.c",
+ "upstream-freebsd/lib/msun/src/s_truncf.c",
+ "upstream-freebsd/lib/msun/src/w_cabs.c",
+ "upstream-freebsd/lib/msun/src/w_cabsf.c",
+ "upstream-freebsd/lib/msun/src/w_cabsl.c",
+ "upstream-freebsd/lib/msun/src/w_drem.c",
+ "upstream-freebsd/lib/msun/src/w_dremf.c",
+]
+
+libm_common_src_files += [
+ // TODO: this comes from from upstream's libc, not libm, but it's an
+ // implementation detail that should have hidden visibility, so it needs
+ // to be in whatever library the math code is in.
+ "digittoint.c",
+
+ // Functionality not in the BSDs.
+ "significandl.c",
+ "sincos.c",
+
+ // Modified versions of BSD code.
+ "signbit.c",
+
+ // Home-grown stuff.
+ "fabs.cpp",
+]
+
+libm_ld128_src_files = [
+ "upstream-freebsd/lib/msun/src/e_acosl.c",
+ "upstream-freebsd/lib/msun/src/e_acoshl.c",
+ "upstream-freebsd/lib/msun/src/e_asinl.c",
+ "upstream-freebsd/lib/msun/src/e_atan2l.c",
+ "upstream-freebsd/lib/msun/src/e_atanhl.c",
+ "upstream-freebsd/lib/msun/src/e_fmodl.c",
+ "upstream-freebsd/lib/msun/src/e_hypotl.c",
+ "upstream-freebsd/lib/msun/src/e_lgammal.c",
+ "upstream-freebsd/lib/msun/src/e_remainderl.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtl.c",
+ "upstream-freebsd/lib/msun/src/s_asinhl.c",
+ "upstream-freebsd/lib/msun/src/s_atanl.c",
+ "upstream-freebsd/lib/msun/src/s_cbrtl.c",
+ "upstream-freebsd/lib/msun/src/s_ceill.c",
+ "upstream-freebsd/lib/msun/src/s_copysignl.c",
+ "upstream-freebsd/lib/msun/src/e_coshl.c",
+ "upstream-freebsd/lib/msun/src/s_cosl.c",
+ "upstream-freebsd/lib/msun/src/s_floorl.c",
+ "upstream-freebsd/lib/msun/src/s_fmal.c",
+ "upstream-freebsd/lib/msun/src/s_fmaxl.c",
+ "upstream-freebsd/lib/msun/src/s_fminl.c",
+ "upstream-freebsd/lib/msun/src/s_modfl.c",
+ "upstream-freebsd/lib/msun/src/s_frexpl.c",
+ "upstream-freebsd/lib/msun/src/s_ilogbl.c",
+ "upstream-freebsd/lib/msun/src/s_llrintl.c",
+ "upstream-freebsd/lib/msun/src/s_llroundl.c",
+ "upstream-freebsd/lib/msun/src/s_logbl.c",
+ "upstream-freebsd/lib/msun/src/s_lrintl.c",
+ "upstream-freebsd/lib/msun/src/s_lroundl.c",
+ "upstream-freebsd/lib/msun/src/s_nextafterl.c",
+ "upstream-freebsd/lib/msun/src/s_nexttoward.c",
+ "upstream-freebsd/lib/msun/src/s_nexttowardf.c",
+ "upstream-freebsd/lib/msun/src/s_remquol.c",
+ "upstream-freebsd/lib/msun/src/s_rintl.c",
+ "upstream-freebsd/lib/msun/src/s_roundl.c",
+ "upstream-freebsd/lib/msun/src/s_scalbnl.c",
+ "upstream-freebsd/lib/msun/src/e_sinhl.c",
+ "upstream-freebsd/lib/msun/src/s_sinl.c",
+ "upstream-freebsd/lib/msun/src/s_tanhl.c",
+ "upstream-freebsd/lib/msun/src/s_tanl.c",
+ "upstream-freebsd/lib/msun/src/s_truncl.c",
+]
+
+libm_ld128_src_files += [
+ "upstream-freebsd/lib/msun/ld128/invtrig.c",
+ "upstream-freebsd/lib/msun/ld128/e_lgammal_r.c",
+ "upstream-freebsd/lib/msun/ld128/k_cosl.c",
+ "upstream-freebsd/lib/msun/ld128/k_sinl.c",
+ "upstream-freebsd/lib/msun/ld128/k_tanl.c",
+ "upstream-freebsd/lib/msun/ld128/s_erfl.c",
+ "upstream-freebsd/lib/msun/ld128/s_exp2l.c",
+ "upstream-freebsd/lib/msun/ld128/s_expl.c",
+ "upstream-freebsd/lib/msun/ld128/s_logl.c",
+ "upstream-freebsd/lib/msun/ld128/s_nanl.c",
+]
+
+// TODO: re-enable i387/e_sqrtf.S for x86, and maybe others.
+
+libm_common_cflags = [
+ "-D__BIONIC_NO_MATH_INLINES",
+ "-DFLT_EVAL_METHOD=0",
+ "-include freebsd-compat.h",
+ "-Werror",
+ "-Wno-missing-braces",
+ "-Wno-parentheses",
+ "-Wno-sign-compare",
+ "-Wno-uninitialized",
+ "-Wno-unknown-pragmas",
+ "-fvisibility=hidden",
+]
+
+// Workaround the GCC "(long)fn -> lfn" optimization bug which will result in
+// self recursions for lrint, lrintf, and lrintl.
+// BUG: 14225968
+libm_common_cflags += [
+ "-fno-builtin-rint",
+ "-fno-builtin-rintf",
+ "-fno-builtin-rintl",
+]
+
+libm_common_local_includes = ["upstream-freebsd/lib/msun/src/"]
+
+libm_ld_local_includes = ["upstream-freebsd/lib/msun/ld128/"]
+
+//
+// libm.so and libm.a for target.
+//
+cc_library {
+ name: "libm",
+
+ cflags: libm_common_cflags,
+ include_dirs: ["bionic/libc"],
+ local_include_dirs: libm_common_local_includes,
+ srcs: libm_common_src_files,
+ system_shared_libs: ["libc"],
+
+ native_coverage: bionic_coverage,
+ sanitize: ["never"],
+
+ multilib: {
+ lib32: {
+ srcs: ["fake_long_double.c"],
+ },
+ lib64: {
+ srcs: libm_ld128_src_files,
+ local_include_dirs: libm_ld_local_includes,
+ // We'd really like to do this for all architectures, but since this wasn't done
+ // before, these symbols must continue to be exported on LP32 for binary
+ // compatibility.
+ ldflags: ["-Wl,--exclude-libs,libgcc.a"],
+ },
+ },
+
+ // arch-specific settings
+ arch: {
+ arm: {
+ srcs: [
+ "arm/fenv.c",
+ ],
+ armv7_a_neon: {
+ srcs: [
+ "arm/sqrt.S",
+ "arm/floor.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ ],
+ },
+ instruction_set: "arm",
+ ldflags: ["-Wl,--hash-style=both"],
+ version_script: "libm.arm.map",
+ },
+
+ arm64: {
+ srcs: [
+ "arm64/ceil.S",
+ "arm64/fenv.c",
+ "arm64/fma.S",
+ "arm64/floor.S",
+ "arm64/lrint.S",
+ "arm64/rint.S",
+ "arm64/sqrt.S",
+ "arm64/trunc.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_ceil.c",
+ "upstream-freebsd/lib/msun/src/s_ceilf.c",
+ "upstream-freebsd/lib/msun/src/s_fma.c",
+ "upstream-freebsd/lib/msun/src/s_fmaf.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ "upstream-freebsd/lib/msun/src/s_floorf.c",
+ "upstream-freebsd/lib/msun/src/s_llrint.c",
+ "upstream-freebsd/lib/msun/src/s_llrintf.c",
+ "upstream-freebsd/lib/msun/src/s_lrint.c",
+ "upstream-freebsd/lib/msun/src/s_lrintf.c",
+ "upstream-freebsd/lib/msun/src/s_rint.c",
+ "upstream-freebsd/lib/msun/src/s_rintf.c",
+ "upstream-freebsd/lib/msun/src/s_trunc.c",
+ "upstream-freebsd/lib/msun/src/s_truncf.c",
+ ],
+ version_script: "libm.arm64.map",
+ },
+
+ mips: {
+ srcs: ["mips/fenv.c"],
+ version_script: "libm.mips.map",
+ },
+
+ mips64: {
+ srcs: ["mips/fenv.c"],
+ version_script: "libm.mips64.map",
+ },
+
+ x86: {
+ srcs: [
+ "i387/fenv.c",
+ "x86/sqrt.S",
+ "x86/sqrtf.S",
+ "x86/e_acos.S",
+ "x86/e_asin.S",
+ "x86/e_atan2.S",
+ "x86/e_cosh.S",
+ "x86/e_exp.S",
+ "x86/e_hypot.S",
+ "x86/e_log10.S",
+ "x86/e_log.S",
+ "x86/e_pow.S",
+ "x86/e_sinh.S",
+ "x86/libm_reduce_pi04l.S",
+ "x86/libm_sincos_huge.S",
+ "x86/libm_tancot_huge.S",
+ "x86/s_atan.S",
+ "x86/s_cbrt.S",
+ "x86/s_cos.S",
+ "x86/s_expm1.S",
+ "x86/s_log1p.S",
+ "x86/s_sin.S",
+ "x86/s_tanh.S",
+ "x86/s_tan.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_acos.c",
+ "upstream-freebsd/lib/msun/src/e_asin.c",
+ "upstream-freebsd/lib/msun/src/e_atan2.c",
+ "upstream-freebsd/lib/msun/src/e_cosh.c",
+ "upstream-freebsd/lib/msun/src/e_exp.c",
+ "upstream-freebsd/lib/msun/src/e_hypot.c",
+ "upstream-freebsd/lib/msun/src/e_log.c",
+ "upstream-freebsd/lib/msun/src/e_log10.c",
+ "upstream-freebsd/lib/msun/src/e_pow.c",
+ "upstream-freebsd/lib/msun/src/e_sinh.c",
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_atan.c",
+ "upstream-freebsd/lib/msun/src/s_cbrt.c",
+ "upstream-freebsd/lib/msun/src/s_cos.c",
+ "upstream-freebsd/lib/msun/src/s_expm1.c",
+ "upstream-freebsd/lib/msun/src/s_log1p.c",
+ "upstream-freebsd/lib/msun/src/s_sin.c",
+ "upstream-freebsd/lib/msun/src/s_tan.c",
+ "upstream-freebsd/lib/msun/src/s_tanh.c",
+ ],
+ sse4_1: {
+ srcs: [
+ "x86/ceil.S",
+ "x86/ceilf.S",
+ "x86/floor.S",
+ "x86/floorf.S",
+ "x86/trunc.S",
+ "x86/truncf.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/s_ceil.c",
+ "upstream-freebsd/lib/msun/src/s_ceilf.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ "upstream-freebsd/lib/msun/src/s_floorf.c",
+ "upstream-freebsd/lib/msun/src/s_trunc.c",
+ "upstream-freebsd/lib/msun/src/s_truncf.c",
+ ],
+ },
+ local_include_dirs: ["i387"],
+ // Clang has wrong long double sizes for x86.
+ clang: false,
+ ldflags: ["-Wl,--hash-style=both"],
+ version_script: "libm.x86.map",
+ },
+
+ x86_64: {
+ srcs: [
+ "amd64/fenv.c",
+ "x86_64/sqrt.S",
+ "x86_64/sqrtf.S",
+ "x86_64/e_acos.S",
+ "x86_64/e_asin.S",
+ "x86_64/e_atan2.S",
+ "x86_64/e_cosh.S",
+ "x86_64/e_exp.S",
+ "x86_64/e_hypot.S",
+ "x86_64/e_log10.S",
+ "x86_64/e_log.S",
+ "x86_64/e_pow.S",
+ "x86_64/e_sinh.S",
+ "x86_64/s_atan.S",
+ "x86_64/s_cbrt.S",
+ "x86_64/s_cos.S",
+ "x86_64/s_expm1.S",
+ "x86_64/s_log1p.S",
+ "x86_64/s_sin.S",
+ "x86_64/s_tanh.S",
+ "x86_64/s_tan.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/e_acos.c",
+ "upstream-freebsd/lib/msun/src/e_asin.c",
+ "upstream-freebsd/lib/msun/src/e_atan2.c",
+ "upstream-freebsd/lib/msun/src/e_cosh.c",
+ "upstream-freebsd/lib/msun/src/e_exp.c",
+ "upstream-freebsd/lib/msun/src/e_hypot.c",
+ "upstream-freebsd/lib/msun/src/e_log.c",
+ "upstream-freebsd/lib/msun/src/e_log10.c",
+ "upstream-freebsd/lib/msun/src/e_pow.c",
+ "upstream-freebsd/lib/msun/src/e_sinh.c",
+ "upstream-freebsd/lib/msun/src/e_sqrt.c",
+ "upstream-freebsd/lib/msun/src/e_sqrtf.c",
+ "upstream-freebsd/lib/msun/src/s_atan.c",
+ "upstream-freebsd/lib/msun/src/s_cbrt.c",
+ "upstream-freebsd/lib/msun/src/s_cos.c",
+ "upstream-freebsd/lib/msun/src/s_expm1.c",
+ "upstream-freebsd/lib/msun/src/s_log1p.c",
+ "upstream-freebsd/lib/msun/src/s_sin.c",
+ "upstream-freebsd/lib/msun/src/s_tan.c",
+ "upstream-freebsd/lib/msun/src/s_tanh.c",
+ ],
+ sse4_1: {
+ srcs: [
+ "x86_64/ceil.S",
+ "x86_64/ceilf.S",
+ "x86_64/floor.S",
+ "x86_64/floorf.S",
+ "x86_64/trunc.S",
+ "x86_64/truncf.S",
+ ],
+ exclude_srcs: [
+ "upstream-freebsd/lib/msun/src/s_ceil.c",
+ "upstream-freebsd/lib/msun/src/s_ceilf.c",
+ "upstream-freebsd/lib/msun/src/s_floor.c",
+ "upstream-freebsd/lib/msun/src/s_floorf.c",
+ "upstream-freebsd/lib/msun/src/s_trunc.c",
+ "upstream-freebsd/lib/msun/src/s_truncf.c",
+ ],
+ },
+ // Clang has wrong long double sizes for x86.
+ clang: false,
+ version_script: "libm.x86_64.map",
+ },
+ },
+
+ stl: "none",
+}
+
+// ANDROIDMK TRANSLATION ERROR: unsupported directive
+// endif
diff --git a/libm/Android.mk b/libm/Android.mk
index e919129ff..6575e1ee3 100644
--- a/libm/Android.mk
+++ b/libm/Android.mk
@@ -3,8 +3,9 @@ LOCAL_PATH:= $(call my-dir)
bionic_coverage := false
-ifneq (,$(filter $(TARGET_ARCH),x86 x86_64))
-# Clang has wrong long double sizes for x86.
+# Clang/llvm has incompatible long double (fp128) for x86_64.
+# https://llvm.org/bugs/show_bug.cgi?id=23897
+ifeq ($(TARGET_ARCH),x86_64)
libm_clang := false
endif
@@ -21,14 +22,19 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/bsdsrc/b_tgamma.c \
upstream-freebsd/lib/msun/src/catrig.c \
upstream-freebsd/lib/msun/src/catrigf.c \
+ upstream-freebsd/lib/msun/src/e_acos.c \
upstream-freebsd/lib/msun/src/e_acosf.c \
upstream-freebsd/lib/msun/src/e_acosh.c \
upstream-freebsd/lib/msun/src/e_acoshf.c \
+ upstream-freebsd/lib/msun/src/e_asin.c \
upstream-freebsd/lib/msun/src/e_asinf.c \
+ upstream-freebsd/lib/msun/src/e_atan2.c \
upstream-freebsd/lib/msun/src/e_atan2f.c \
upstream-freebsd/lib/msun/src/e_atanh.c \
upstream-freebsd/lib/msun/src/e_atanhf.c \
+ upstream-freebsd/lib/msun/src/e_cosh.c \
upstream-freebsd/lib/msun/src/e_coshf.c \
+ upstream-freebsd/lib/msun/src/e_exp.c \
upstream-freebsd/lib/msun/src/e_expf.c \
upstream-freebsd/lib/msun/src/e_fmod.c \
upstream-freebsd/lib/msun/src/e_fmodf.c \
@@ -36,6 +42,7 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/e_gammaf.c \
upstream-freebsd/lib/msun/src/e_gammaf_r.c \
upstream-freebsd/lib/msun/src/e_gamma_r.c \
+ upstream-freebsd/lib/msun/src/e_hypot.c \
upstream-freebsd/lib/msun/src/e_hypotf.c \
upstream-freebsd/lib/msun/src/e_j0.c \
upstream-freebsd/lib/msun/src/e_j0f.c \
@@ -47,10 +54,13 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/e_lgammaf.c \
upstream-freebsd/lib/msun/src/e_lgammaf_r.c \
upstream-freebsd/lib/msun/src/e_lgamma_r.c \
+ upstream-freebsd/lib/msun/src/e_log10.c \
upstream-freebsd/lib/msun/src/e_log10f.c \
upstream-freebsd/lib/msun/src/e_log2.c \
upstream-freebsd/lib/msun/src/e_log2f.c \
+ upstream-freebsd/lib/msun/src/e_log.c \
upstream-freebsd/lib/msun/src/e_logf.c \
+ upstream-freebsd/lib/msun/src/e_pow.c \
upstream-freebsd/lib/msun/src/e_powf.c \
upstream-freebsd/lib/msun/src/e_remainder.c \
upstream-freebsd/lib/msun/src/e_remainderf.c \
@@ -58,7 +68,10 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/e_rem_pio2f.c \
upstream-freebsd/lib/msun/src/e_scalb.c \
upstream-freebsd/lib/msun/src/e_scalbf.c \
+ upstream-freebsd/lib/msun/src/e_sinh.c \
upstream-freebsd/lib/msun/src/e_sinhf.c \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
upstream-freebsd/lib/msun/src/imprecise.c \
upstream-freebsd/lib/msun/src/k_cos.c \
upstream-freebsd/lib/msun/src/k_cosf.c \
@@ -71,13 +84,17 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/k_tanf.c \
upstream-freebsd/lib/msun/src/s_asinh.c \
upstream-freebsd/lib/msun/src/s_asinhf.c \
+ upstream-freebsd/lib/msun/src/s_atan.c \
upstream-freebsd/lib/msun/src/s_atanf.c \
upstream-freebsd/lib/msun/src/s_carg.c \
upstream-freebsd/lib/msun/src/s_cargf.c \
upstream-freebsd/lib/msun/src/s_cargl.c \
+ upstream-freebsd/lib/msun/src/s_cbrt.c \
upstream-freebsd/lib/msun/src/s_cbrtf.c \
upstream-freebsd/lib/msun/src/s_ccosh.c \
upstream-freebsd/lib/msun/src/s_ccoshf.c \
+ upstream-freebsd/lib/msun/src/s_ceil.c \
+ upstream-freebsd/lib/msun/src/s_ceilf.c \
upstream-freebsd/lib/msun/src/s_cexp.c \
upstream-freebsd/lib/msun/src/s_cexpf.c \
upstream-freebsd/lib/msun/src/s_cimag.c \
@@ -88,6 +105,7 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/s_conjl.c \
upstream-freebsd/lib/msun/src/s_copysign.c \
upstream-freebsd/lib/msun/src/s_copysignf.c \
+ upstream-freebsd/lib/msun/src/s_cos.c \
upstream-freebsd/lib/msun/src/s_cosf.c \
upstream-freebsd/lib/msun/src/s_cproj.c \
upstream-freebsd/lib/msun/src/s_cprojf.c \
@@ -106,12 +124,15 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/s_erff.c \
upstream-freebsd/lib/msun/src/s_exp2.c \
upstream-freebsd/lib/msun/src/s_exp2f.c \
+ upstream-freebsd/lib/msun/src/s_expm1.c \
upstream-freebsd/lib/msun/src/s_expm1f.c \
- upstream-freebsd/lib/msun/src/s_fabs.c \
- upstream-freebsd/lib/msun/src/s_fabsf.c \
upstream-freebsd/lib/msun/src/s_fdim.c \
upstream-freebsd/lib/msun/src/s_finite.c \
upstream-freebsd/lib/msun/src/s_finitef.c \
+ upstream-freebsd/lib/msun/src/s_floor.c \
+ upstream-freebsd/lib/msun/src/s_floorf.c \
+ upstream-freebsd/lib/msun/src/s_fma.c \
+ upstream-freebsd/lib/msun/src/s_fmaf.c \
upstream-freebsd/lib/msun/src/s_fmax.c \
upstream-freebsd/lib/msun/src/s_fmaxf.c \
upstream-freebsd/lib/msun/src/s_fmin.c \
@@ -120,11 +141,16 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/s_frexpf.c \
upstream-freebsd/lib/msun/src/s_ilogb.c \
upstream-freebsd/lib/msun/src/s_ilogbf.c \
+ upstream-freebsd/lib/msun/src/s_llrint.c \
+ upstream-freebsd/lib/msun/src/s_llrintf.c \
upstream-freebsd/lib/msun/src/s_llround.c \
upstream-freebsd/lib/msun/src/s_llroundf.c \
+ upstream-freebsd/lib/msun/src/s_log1p.c \
upstream-freebsd/lib/msun/src/s_log1pf.c \
upstream-freebsd/lib/msun/src/s_logb.c \
upstream-freebsd/lib/msun/src/s_logbf.c \
+ upstream-freebsd/lib/msun/src/s_lrint.c \
+ upstream-freebsd/lib/msun/src/s_lrintf.c \
upstream-freebsd/lib/msun/src/s_lround.c \
upstream-freebsd/lib/msun/src/s_lroundf.c \
upstream-freebsd/lib/msun/src/s_modf.c \
@@ -135,6 +161,8 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/s_nextafterf.c \
upstream-freebsd/lib/msun/src/s_remquo.c \
upstream-freebsd/lib/msun/src/s_remquof.c \
+ upstream-freebsd/lib/msun/src/s_rint.c \
+ upstream-freebsd/lib/msun/src/s_rintf.c \
upstream-freebsd/lib/msun/src/s_round.c \
upstream-freebsd/lib/msun/src/s_roundf.c \
upstream-freebsd/lib/msun/src/s_scalbln.c \
@@ -143,10 +171,15 @@ LOCAL_SRC_FILES := \
upstream-freebsd/lib/msun/src/s_signgam.c \
upstream-freebsd/lib/msun/src/s_significand.c \
upstream-freebsd/lib/msun/src/s_significandf.c \
+ upstream-freebsd/lib/msun/src/s_sin.c \
upstream-freebsd/lib/msun/src/s_sinf.c \
+ upstream-freebsd/lib/msun/src/s_tan.c \
upstream-freebsd/lib/msun/src/s_tanf.c \
+ upstream-freebsd/lib/msun/src/s_tanh.c \
upstream-freebsd/lib/msun/src/s_tanhf.c \
upstream-freebsd/lib/msun/src/s_tgammaf.c \
+ upstream-freebsd/lib/msun/src/s_trunc.c \
+ upstream-freebsd/lib/msun/src/s_truncf.c \
upstream-freebsd/lib/msun/src/w_cabs.c \
upstream-freebsd/lib/msun/src/w_cabsf.c \
upstream-freebsd/lib/msun/src/w_cabsl.c \
@@ -174,7 +207,6 @@ LOCAL_SRC_FILES_64 := \
upstream-freebsd/lib/msun/src/s_copysignl.c \
upstream-freebsd/lib/msun/src/e_coshl.c \
upstream-freebsd/lib/msun/src/s_cosl.c \
- upstream-freebsd/lib/msun/src/s_fabsl.c \
upstream-freebsd/lib/msun/src/s_floorl.c \
upstream-freebsd/lib/msun/src/s_fmal.c \
upstream-freebsd/lib/msun/src/s_fmaxl.c \
@@ -227,6 +259,10 @@ LOCAL_SRC_FILES += \
LOCAL_SRC_FILES += \
signbit.c \
+# Home-grown stuff.
+LOCAL_SRC_FILES += \
+ fabs.cpp \
+
# Arch specific optimizations.
# -----------------------------------------------------------------------------
@@ -234,37 +270,6 @@ LOCAL_SRC_FILES += \
# -----------------------------------------------------------------------------
LOCAL_SRC_FILES_arm += \
arm/fenv.c \
- upstream-freebsd/lib/msun/src/e_acos.c \
- upstream-freebsd/lib/msun/src/e_asin.c \
- upstream-freebsd/lib/msun/src/e_atan2.c \
- upstream-freebsd/lib/msun/src/e_cosh.c \
- upstream-freebsd/lib/msun/src/e_exp.c \
- upstream-freebsd/lib/msun/src/e_hypot.c \
- upstream-freebsd/lib/msun/src/e_log.c \
- upstream-freebsd/lib/msun/src/e_log10.c \
- upstream-freebsd/lib/msun/src/e_pow.c \
- upstream-freebsd/lib/msun/src/e_sinh.c \
- upstream-freebsd/lib/msun/src/s_atan.c \
- upstream-freebsd/lib/msun/src/s_cbrt.c \
- upstream-freebsd/lib/msun/src/s_ceil.c \
- upstream-freebsd/lib/msun/src/s_ceilf.c \
- upstream-freebsd/lib/msun/src/s_cos.c \
- upstream-freebsd/lib/msun/src/s_fma.c \
- upstream-freebsd/lib/msun/src/s_fmaf.c \
- upstream-freebsd/lib/msun/src/s_floorf.c \
- upstream-freebsd/lib/msun/src/s_expm1.c \
- upstream-freebsd/lib/msun/src/s_llrint.c \
- upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_log1p.c \
- upstream-freebsd/lib/msun/src/s_lrint.c \
- upstream-freebsd/lib/msun/src/s_lrintf.c \
- upstream-freebsd/lib/msun/src/s_rint.c \
- upstream-freebsd/lib/msun/src/s_rintf.c \
- upstream-freebsd/lib/msun/src/s_sin.c \
- upstream-freebsd/lib/msun/src/s_tan.c \
- upstream-freebsd/lib/msun/src/s_tanh.c \
- upstream-freebsd/lib/msun/src/s_trunc.c \
- upstream-freebsd/lib/msun/src/s_truncf.c \
# s_floor.S requires neon instructions.
ifdef TARGET_2ND_ARCH
@@ -274,18 +279,16 @@ arch_variant := $(TARGET_ARCH_VARIANT)
endif
# Use the C version on armv7-a since it doesn't support neon instructions.
-ifeq ($(arch_variant),armv7-a)
+ifneq ($(arch_variant),armv7-a)
LOCAL_SRC_FILES_arm += \
+ arm/sqrt.S \
+ arm/floor.S \
+
+LOCAL_SRC_FILES_EXCLUDE_arm += \
upstream-freebsd/lib/msun/src/e_sqrt.c \
upstream-freebsd/lib/msun/src/e_sqrtf.c \
upstream-freebsd/lib/msun/src/s_floor.c \
-else
-LOCAL_SRC_FILES_arm += \
- arm/e_sqrt.S \
- arm/e_sqrtf.S \
- arm/s_floor.S \
-
endif
# -----------------------------------------------------------------------------
@@ -300,65 +303,31 @@ LOCAL_SRC_FILES_arm64 += \
arm64/rint.S \
arm64/sqrt.S \
arm64/trunc.S \
- upstream-freebsd/lib/msun/src/e_acos.c \
- upstream-freebsd/lib/msun/src/e_asin.c \
- upstream-freebsd/lib/msun/src/e_atan2.c \
- upstream-freebsd/lib/msun/src/e_cosh.c \
- upstream-freebsd/lib/msun/src/e_exp.c \
- upstream-freebsd/lib/msun/src/e_hypot.c \
- upstream-freebsd/lib/msun/src/e_log.c \
- upstream-freebsd/lib/msun/src/e_log10.c \
- upstream-freebsd/lib/msun/src/e_pow.c \
- upstream-freebsd/lib/msun/src/e_sinh.c \
- upstream-freebsd/lib/msun/src/s_atan.c \
- upstream-freebsd/lib/msun/src/s_cbrt.c \
- upstream-freebsd/lib/msun/src/s_cos.c \
- upstream-freebsd/lib/msun/src/s_expm1.c \
- upstream-freebsd/lib/msun/src/s_log1p.c \
- upstream-freebsd/lib/msun/src/s_sin.c \
- upstream-freebsd/lib/msun/src/s_tan.c \
- upstream-freebsd/lib/msun/src/s_tanh.c \
-# -----------------------------------------------------------------------------
-# mips
-# -----------------------------------------------------------------------------
-libm_mips_arch_files := \
- mips/fenv.c \
- upstream-freebsd/lib/msun/src/e_acos.c \
- upstream-freebsd/lib/msun/src/e_asin.c \
- upstream-freebsd/lib/msun/src/e_atan2.c \
- upstream-freebsd/lib/msun/src/e_cosh.c \
- upstream-freebsd/lib/msun/src/e_exp.c \
- upstream-freebsd/lib/msun/src/e_hypot.c \
- upstream-freebsd/lib/msun/src/e_log.c \
- upstream-freebsd/lib/msun/src/e_log10.c \
- upstream-freebsd/lib/msun/src/e_pow.c \
- upstream-freebsd/lib/msun/src/e_sinh.c \
+LOCAL_SRC_FILES_EXCLUDE_arm64 += \
upstream-freebsd/lib/msun/src/e_sqrt.c \
upstream-freebsd/lib/msun/src/e_sqrtf.c \
- upstream-freebsd/lib/msun/src/s_atan.c \
- upstream-freebsd/lib/msun/src/s_cbrt.c \
upstream-freebsd/lib/msun/src/s_ceil.c \
upstream-freebsd/lib/msun/src/s_ceilf.c \
- upstream-freebsd/lib/msun/src/s_cos.c \
upstream-freebsd/lib/msun/src/s_fma.c \
upstream-freebsd/lib/msun/src/s_fmaf.c \
upstream-freebsd/lib/msun/src/s_floor.c \
upstream-freebsd/lib/msun/src/s_floorf.c \
- upstream-freebsd/lib/msun/src/s_expm1.c \
upstream-freebsd/lib/msun/src/s_llrint.c \
upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_log1p.c \
upstream-freebsd/lib/msun/src/s_lrint.c \
upstream-freebsd/lib/msun/src/s_lrintf.c \
upstream-freebsd/lib/msun/src/s_rint.c \
upstream-freebsd/lib/msun/src/s_rintf.c \
- upstream-freebsd/lib/msun/src/s_sin.c \
- upstream-freebsd/lib/msun/src/s_tan.c \
- upstream-freebsd/lib/msun/src/s_tanh.c \
upstream-freebsd/lib/msun/src/s_trunc.c \
upstream-freebsd/lib/msun/src/s_truncf.c \
+# -----------------------------------------------------------------------------
+# mips
+# -----------------------------------------------------------------------------
+libm_mips_arch_files := \
+ mips/fenv.c \
+
LOCAL_SRC_FILES_mips += $(libm_mips_arch_files)
LOCAL_SRC_FILES_mips64 += $(libm_mips_arch_files)
@@ -367,14 +336,6 @@ LOCAL_SRC_FILES_mips64 += $(libm_mips_arch_files)
# -----------------------------------------------------------------------------
LOCAL_SRC_FILES_x86 += \
i387/fenv.c \
- upstream-freebsd/lib/msun/src/s_fma.c \
- upstream-freebsd/lib/msun/src/s_fmaf.c \
- upstream-freebsd/lib/msun/src/s_llrint.c \
- upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_lrint.c \
- upstream-freebsd/lib/msun/src/s_lrintf.c \
- upstream-freebsd/lib/msun/src/s_rint.c \
- upstream-freebsd/lib/msun/src/s_rintf.c \
x86/sqrt.S \
x86/sqrtf.S \
x86/e_acos.S \
@@ -390,6 +351,8 @@ LOCAL_SRC_FILES_x86 += \
x86/libm_reduce_pi04l.S \
x86/libm_sincos_huge.S \
x86/libm_tancot_huge.S \
+ x86/lrint.S \
+ x86/lrintf.S \
x86/s_atan.S \
x86/s_cbrt.S \
x86/s_cos.S \
@@ -399,21 +362,48 @@ LOCAL_SRC_FILES_x86 += \
x86/s_tanh.S \
x86/s_tan.S \
+LOCAL_SRC_FILES_EXCLUDE_x86 += \
+ upstream-freebsd/lib/msun/src/e_acos.c \
+ upstream-freebsd/lib/msun/src/e_asin.c \
+ upstream-freebsd/lib/msun/src/e_atan2.c \
+ upstream-freebsd/lib/msun/src/e_cosh.c \
+ upstream-freebsd/lib/msun/src/e_exp.c \
+ upstream-freebsd/lib/msun/src/e_hypot.c \
+ upstream-freebsd/lib/msun/src/e_log.c \
+ upstream-freebsd/lib/msun/src/e_log10.c \
+ upstream-freebsd/lib/msun/src/e_pow.c \
+ upstream-freebsd/lib/msun/src/e_sinh.c \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
+ upstream-freebsd/lib/msun/src/s_atan.c \
+ upstream-freebsd/lib/msun/src/s_cbrt.c \
+ upstream-freebsd/lib/msun/src/s_cos.c \
+ upstream-freebsd/lib/msun/src/s_expm1.c \
+ upstream-freebsd/lib/msun/src/s_log1p.c \
+ upstream-freebsd/lib/msun/src/s_lrint.c \
+ upstream-freebsd/lib/msun/src/s_lrintf.c \
+ upstream-freebsd/lib/msun/src/s_sin.c \
+ upstream-freebsd/lib/msun/src/s_tan.c \
+ upstream-freebsd/lib/msun/src/s_tanh.c \
+
ifeq ($(ARCH_X86_HAVE_SSE4_1),true)
LOCAL_SRC_FILES_x86 += \
x86/ceil.S \
x86/ceilf.S \
x86/floor.S \
x86/floorf.S \
+ x86/rint.S \
+ x86/rintf.S \
x86/trunc.S \
x86/truncf.S \
-else
-LOCAL_SRC_FILES_x86 += \
+LOCAL_SRC_FILES_EXCLUDE_x86 += \
upstream-freebsd/lib/msun/src/s_ceil.c \
upstream-freebsd/lib/msun/src/s_ceilf.c \
upstream-freebsd/lib/msun/src/s_floor.c \
upstream-freebsd/lib/msun/src/s_floorf.c \
+ upstream-freebsd/lib/msun/src/s_rint.c \
+ upstream-freebsd/lib/msun/src/s_rintf.c \
upstream-freebsd/lib/msun/src/s_trunc.c \
upstream-freebsd/lib/msun/src/s_truncf.c \
@@ -424,14 +414,6 @@ endif
# -----------------------------------------------------------------------------
LOCAL_SRC_FILES_x86_64 += \
amd64/fenv.c \
- upstream-freebsd/lib/msun/src/s_fma.c \
- upstream-freebsd/lib/msun/src/s_fmaf.c \
- upstream-freebsd/lib/msun/src/s_llrint.c \
- upstream-freebsd/lib/msun/src/s_llrintf.c \
- upstream-freebsd/lib/msun/src/s_lrint.c \
- upstream-freebsd/lib/msun/src/s_lrintf.c \
- upstream-freebsd/lib/msun/src/s_rint.c \
- upstream-freebsd/lib/msun/src/s_rintf.c \
x86_64/sqrt.S \
x86_64/sqrtf.S \
x86_64/e_acos.S \
@@ -444,6 +426,8 @@ LOCAL_SRC_FILES_x86_64 += \
x86_64/e_log.S \
x86_64/e_pow.S \
x86_64/e_sinh.S \
+ x86_64/lrint.S \
+ x86_64/lrintf.S \
x86_64/s_atan.S \
x86_64/s_cbrt.S \
x86_64/s_cos.S \
@@ -453,21 +437,50 @@ LOCAL_SRC_FILES_x86_64 += \
x86_64/s_tanh.S \
x86_64/s_tan.S \
+LOCAL_SRC_FILES_EXCLUDE_x86_64 += \
+ upstream-freebsd/lib/msun/src/e_acos.c \
+ upstream-freebsd/lib/msun/src/e_asin.c \
+ upstream-freebsd/lib/msun/src/e_atan2.c \
+ upstream-freebsd/lib/msun/src/e_cosh.c \
+ upstream-freebsd/lib/msun/src/e_exp.c \
+ upstream-freebsd/lib/msun/src/e_hypot.c \
+ upstream-freebsd/lib/msun/src/e_log.c \
+ upstream-freebsd/lib/msun/src/e_log10.c \
+ upstream-freebsd/lib/msun/src/e_pow.c \
+ upstream-freebsd/lib/msun/src/e_sinh.c \
+ upstream-freebsd/lib/msun/src/e_sqrt.c \
+ upstream-freebsd/lib/msun/src/e_sqrtf.c \
+ upstream-freebsd/lib/msun/src/s_atan.c \
+ upstream-freebsd/lib/msun/src/s_cbrt.c \
+ upstream-freebsd/lib/msun/src/s_cos.c \
+ upstream-freebsd/lib/msun/src/s_expm1.c \
+ upstream-freebsd/lib/msun/src/s_log1p.c \
+ upstream-freebsd/lib/msun/src/s_llrint.c \
+ upstream-freebsd/lib/msun/src/s_llrintf.c \
+ upstream-freebsd/lib/msun/src/s_lrint.c \
+ upstream-freebsd/lib/msun/src/s_lrintf.c \
+ upstream-freebsd/lib/msun/src/s_sin.c \
+ upstream-freebsd/lib/msun/src/s_tan.c \
+ upstream-freebsd/lib/msun/src/s_tanh.c \
+
ifeq ($(ARCH_X86_HAVE_SSE4_1),true)
LOCAL_SRC_FILES_x86_64 += \
x86_64/ceil.S \
x86_64/ceilf.S \
x86_64/floor.S \
x86_64/floorf.S \
+ x86_64/rint.S \
+ x86_64/rintf.S \
x86_64/trunc.S \
x86_64/truncf.S \
-else
-LOCAL_SRC_FILES_x86_64 += \
+LOCAL_SRC_FILES_EXCLUDE_x86_64 += \
upstream-freebsd/lib/msun/src/s_ceil.c \
upstream-freebsd/lib/msun/src/s_ceilf.c \
upstream-freebsd/lib/msun/src/s_floor.c \
upstream-freebsd/lib/msun/src/s_floorf.c \
+ upstream-freebsd/lib/msun/src/s_rint.c \
+ upstream-freebsd/lib/msun/src/s_rintf.c \
upstream-freebsd/lib/msun/src/s_trunc.c \
upstream-freebsd/lib/msun/src/s_truncf.c \
@@ -481,8 +494,10 @@ LOCAL_C_INCLUDES_64 += $(LOCAL_PATH)/upstream-freebsd/lib/msun/ld128/
LOCAL_CLANG := $(libm_clang)
LOCAL_ARM_MODE := arm
LOCAL_CFLAGS := \
+ -D__BIONIC_NO_MATH_INLINES \
-DFLT_EVAL_METHOD=0 \
-include $(LOCAL_PATH)/freebsd-compat.h \
+ -Werror \
-Wno-missing-braces \
-Wno-parentheses \
-Wno-sign-compare \
@@ -501,11 +516,8 @@ LOCAL_CFLAGS += \
-fno-builtin-rintf \
-fno-builtin-rintl \
-LOCAL_CONLY_FLAGS := \
- -std=c99 \
-
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
include $(BUILD_STATIC_LIBRARY)
# -----------------------------------------------------------------------------
@@ -513,13 +525,25 @@ include $(BUILD_STATIC_LIBRARY)
# -----------------------------------------------------------------------------
include $(CLEAR_VARS)
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/libm.map
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/libm.arm.map \
+ $(LOCAL_PATH)/libm.arm64.map \
+ $(LOCAL_PATH)/libm.mips.map \
+ $(LOCAL_PATH)/libm.mips64.map \
+ $(LOCAL_PATH)/libm.x86.map \
+ $(LOCAL_PATH)/libm.x86_64.map \
-# TODO: This is to work around b/19059885. Remove after root cause is fixed
+# TODO: This is to work around b/24465209. Remove after root cause is fixed
LOCAL_LDFLAGS_arm := -Wl,--hash-style=both
LOCAL_LDFLAGS_x86 := -Wl,--hash-style=both
-LOCAL_LDFLAGS := -Wl,--version-script,$(LOCAL_PATH)/libm.map
+LOCAL_LDFLAGS_arm += -Wl,--version-script,$(LOCAL_PATH)/libm.arm.map
+LOCAL_LDFLAGS_arm64 += -Wl,--version-script,$(LOCAL_PATH)/libm.arm64.map
+LOCAL_LDFLAGS_mips += -Wl,--version-script,$(LOCAL_PATH)/libm.mips.map
+LOCAL_LDFLAGS_mips64 += -Wl,--version-script,$(LOCAL_PATH)/libm.mips64.map
+LOCAL_LDFLAGS_x86 += -Wl,--version-script,$(LOCAL_PATH)/libm.x86.map
+LOCAL_LDFLAGS_x86_64 += -Wl,--version-script,$(LOCAL_PATH)/libm.x86_64.map
+
LOCAL_MODULE := libm
LOCAL_CLANG := $(libm_clang)
@@ -527,7 +551,7 @@ LOCAL_SYSTEM_SHARED_LIBRARIES := libc
LOCAL_WHOLE_STATIC_LIBRARIES := libm
LOCAL_NATIVE_COVERAGE := $(bionic_coverage)
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
LOCAL_CXX_STL := none
diff --git a/libm/NOTICE b/libm/NOTICE
index a2cfad3f0..c254c0848 100644
--- a/libm/NOTICE
+++ b/libm/NOTICE
@@ -181,6 +181,22 @@ SUCH DAMAGE.
-------------------------------------------------------------------
+Copyright (C) 2015 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+-------------------------------------------------------------------
+
Copyright (c) 1985, 1993
The Regents of the University of California. All rights reserved.
@@ -1003,37 +1019,6 @@ SUCH DAMAGE.
-------------------------------------------------------------------
Copyright (c) 2013-2014, NVIDIA Corporation. All rights reserved.
-Johhnny Qiu <joqiu@nvidia.com>
-Shu Zhang <chazhang@nvidia.com>
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials provided
- with the distribution.
- * Neither the name of The Linux Foundation nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--------------------------------------------------------------------
-
-Copyright (c) 2013-2014, NVIDIA Corporation. All rights reserved.
Johnny Qiu <joqiu@nvidia.com>
Shu Zhang <chazhang@nvidia.com>
diff --git a/libm/arm/e_sqrtf.S b/libm/arm/e_sqrtf.S
deleted file mode 100644
index ddefb226a..000000000
--- a/libm/arm/e_sqrtf.S
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2013-2014, NVIDIA Corporation. All rights reserved.
- * Johhnny Qiu <joqiu@nvidia.com>
- * Shu Zhang <chazhang@nvidia.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- * * Neither the name of The Linux Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
- * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <private/bionic_asm.h>
-
-ENTRY(sqrtf)
- vmov.f32 s0, r0
- vsqrt.f32 s0, s0
- vmov.f32 r0, s0
- bx lr
-END(sqrtf)
diff --git a/libm/arm/s_floor.S b/libm/arm/floor.S
index 3af8f7624..3af8f7624 100644
--- a/libm/arm/s_floor.S
+++ b/libm/arm/floor.S
diff --git a/libm/arm/e_sqrt.S b/libm/arm/sqrt.S
index 17312f50f..f2981f417 100644
--- a/libm/arm/e_sqrt.S
+++ b/libm/arm/sqrt.S
@@ -39,4 +39,11 @@ ENTRY(sqrt)
bx lr
END(sqrt)
+ENTRY(sqrtf)
+ vmov.f32 s0, r0
+ vsqrt.f32 s0, s0
+ vmov.f32 r0, s0
+ bx lr
+END(sqrtf)
+
ALIAS_SYMBOL(sqrtl, sqrt);
diff --git a/libm/arm64/fenv.c b/libm/arm64/fenv.c
index ce560a707..19a239334 100644
--- a/libm/arm64/fenv.c
+++ b/libm/arm64/fenv.c
@@ -26,6 +26,7 @@
* $FreeBSD: libm/aarch64/fenv.c $
*/
+#include <stdint.h>
#include <fenv.h>
#define FPCR_EXCEPT_SHIFT 8
@@ -38,10 +39,20 @@ const fenv_t __fe_dfl_env = { 0 /* control */, 0 /* status */};
typedef __uint32_t fpu_control_t; // FPCR, Floating-point Control Register.
typedef __uint32_t fpu_status_t; // FPSR, Floating-point Status Register.
-#define __get_fpcr(__fpcr) __asm__ __volatile__("mrs %0,fpcr" : "=r" (__fpcr))
-#define __get_fpsr(__fpsr) __asm__ __volatile__("mrs %0,fpsr" : "=r" (__fpsr))
-#define __set_fpcr(__fpcr) __asm__ __volatile__("msr fpcr,%0" : :"ri" (__fpcr))
-#define __set_fpsr(__fpsr) __asm__ __volatile__("msr fpsr,%0" : :"ri" (__fpsr))
+#define __get(REGISTER, __value) { \
+ uint64_t __value64; \
+ __asm__ __volatile__("mrs %0," REGISTER : "=r" (__value64)); \
+ __value = (__uint32_t) __value64; \
+}
+#define __get_fpcr(__fpcr) __get("fpcr", __fpcr)
+#define __get_fpsr(__fpsr) __get("fpsr", __fpsr)
+
+#define __set(REGISTER, __value) { \
+ uint64_t __value64 = __value; \
+ __asm__ __volatile__("msr " REGISTER ",%0" : : "ri" (__value64)); \
+}
+#define __set_fpcr(__fpcr) __set("fpcr", __fpcr)
+#define __set_fpsr(__fpsr) __set("fpsr", __fpsr)
int fegetenv(fenv_t* envp) {
__get_fpcr(envp->__control);
diff --git a/libm/fabs.cpp b/libm/fabs.cpp
new file mode 100644
index 000000000..add73fe59
--- /dev/null
+++ b/libm/fabs.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <math.h>
+
+#include "fpmath.h"
+
+double fabs(double x) {
+#if __arm__
+ // Both Clang and GCC insist on moving r0/r1 into a double register
+ // and using fabs where bit-twiddling would be a better choice.
+ // They get fabsf right, but we need to be careful in fabsl too.
+ IEEEd2bits u;
+ u.d = x;
+ u.bits.sign = 0;
+ return u.d;
+#else
+ return __builtin_fabs(x);
+#endif
+}
+
+float fabsf(float x) {
+ return __builtin_fabsf(x);
+}
+
+#if defined(__LP64__)
+long double fabsl(long double x) { return __builtin_fabsl(x); }
+#else
+long double fabsl(long double x) {
+ // Don't use __builtin_fabs here because of ARM. (See fabs above.)
+ return fabs(x);
+}
+#endif
diff --git a/libm/fake_long_double.c b/libm/fake_long_double.c
index 317a11572..20148a3b2 100644
--- a/libm/fake_long_double.c
+++ b/libm/fake_long_double.c
@@ -25,13 +25,14 @@
*/
long double copysignl(long double a1, long double a2) { return copysign(a1, a2); }
-long double fabsl(long double a1) { return fabs(a1); }
long double fmaxl(long double a1, long double a2) { return fmax(a1, a2); }
long double fmodl(long double a1, long double a2) { return fmod(a1, a2); }
long double fminl(long double a1, long double a2) { return fmin(a1, a2); }
int ilogbl(long double a1) { return ilogb(a1); }
long long llrintl(long double a1) { return llrint(a1); }
+#if !defined(__i386__) // x86 has an assembler lrint/lrintl.
long lrintl(long double a1) { return lrint(a1); }
+#endif
long long llroundl(long double a1) { return llround(a1); }
long lroundl(long double a1) { return lround(a1); }
long double modfl(long double a1, long double* a2) { double i; double f = modf(a1, &i); *a2 = i; return f; }
diff --git a/libm/include/math.h b/libm/include/math.h
index 154237496..ce8e3b2d4 100644
--- a/libm/include/math.h
+++ b/libm/include/math.h
@@ -15,116 +15,70 @@
*/
#ifndef _MATH_H_
-#define _MATH_H_
+#define _MATH_H_
#include <sys/cdefs.h>
#include <limits.h>
+#if !defined(__BIONIC_NO_MATH_INLINES)
+#define __BIONIC_MATH_INLINE(__def) extern __inline__ __always_inline __attribute__((gnu_inline)) __attribute__((__artificial__)) __def
+#else
+#define __BIONIC_MATH_INLINE(__def)
+#endif
+
__BEGIN_DECLS
#pragma GCC visibility push(default)
-/*
- * ANSI/POSIX
- */
-extern const union __infinity_un {
- unsigned char __uc[8];
- double __ud;
-} __infinity;
-
-extern const union __nan_un {
- unsigned char __uc[sizeof(float)];
- float __uf;
-} __nan;
-
-#if __GNUC_PREREQ(3, 3) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 800)
-#define __MATH_BUILTIN_CONSTANTS
-#endif
+#define HUGE_VAL __builtin_huge_val()
-#if __GNUC_PREREQ(3, 0) && !defined(__INTEL_COMPILER)
-#define __MATH_BUILTIN_RELOPS
-#endif
+#if __ISO_C_VISIBLE >= 1999
+#define FP_ILOGB0 (-INT_MAX)
+#define FP_ILOGBNAN INT_MAX
-#ifdef __MATH_BUILTIN_CONSTANTS
-#define HUGE_VAL __builtin_huge_val()
-#else
-#define HUGE_VAL (__infinity.__ud)
-#endif
+#define HUGE_VALF __builtin_huge_valf()
+#define HUGE_VALL __builtin_huge_vall()
+#define INFINITY __builtin_inff()
+#define NAN __builtin_nanf("")
-#if __ISO_C_VISIBLE >= 1999
-#define FP_ILOGB0 (-INT_MAX) /* Android-changed */
-#define FP_ILOGBNAN INT_MAX /* Android-changed */
-
-#ifdef __MATH_BUILTIN_CONSTANTS
-#define HUGE_VALF __builtin_huge_valf()
-#define HUGE_VALL __builtin_huge_vall()
-#define INFINITY __builtin_inff()
-#define NAN __builtin_nanf("")
-#else
-#define HUGE_VALF (float)HUGE_VAL
-#define HUGE_VALL (long double)HUGE_VAL
-#define INFINITY HUGE_VALF
-#define NAN (__nan.__uf)
-#endif /* __MATH_BUILTIN_CONSTANTS */
-
-#define MATH_ERRNO 1
-#define MATH_ERREXCEPT 2
-#define math_errhandling MATH_ERREXCEPT
-
-#define FP_FAST_FMAF 1
-#ifdef __ia64__
-#define FP_FAST_FMA 1
-#define FP_FAST_FMAL 1
+#define MATH_ERRNO 1
+#define MATH_ERREXCEPT 2
+#define math_errhandling MATH_ERREXCEPT
+
+#if defined(__FP_FAST_FMA)
+#define FP_FAST_FMA 1
+#endif
+#if defined(__FP_FAST_FMAF)
+#define FP_FAST_FMAF 1
+#endif
+#if defined(__FP_FAST_FMAL)
+#define FP_FAST_FMAL 1
#endif
/* Symbolic constants to classify floating point numbers. */
-#define FP_INFINITE 0x01
-#define FP_NAN 0x02
-#define FP_NORMAL 0x04
-#define FP_SUBNORMAL 0x08
-#define FP_ZERO 0x10
-#define fpclassify(x) \
- ((sizeof (x) == sizeof (float)) ? __fpclassifyf(x) \
- : (sizeof (x) == sizeof (double)) ? __fpclassifyd(x) \
- : __fpclassifyl(x))
-
-#define isfinite(x) \
- ((sizeof (x) == sizeof (float)) ? __isfinitef(x) \
- : (sizeof (x) == sizeof (double)) ? __isfinite(x) \
- : __isfinitel(x))
-#define isinf(x) \
- ((sizeof (x) == sizeof (float)) ? __isinff(x) \
- : (sizeof (x) == sizeof (double)) ? isinf(x) \
- : __isinfl(x))
-#define isnan(x) \
- ((sizeof (x) == sizeof (float)) ? __isnanf(x) \
- : (sizeof (x) == sizeof (double)) ? isnan(x) \
- : __isnanl(x))
-#define isnormal(x) \
- ((sizeof (x) == sizeof (float)) ? __isnormalf(x) \
- : (sizeof (x) == sizeof (double)) ? __isnormal(x) \
- : __isnormall(x))
-
-#ifdef __MATH_BUILTIN_RELOPS
-#define isgreater(x, y) __builtin_isgreater((x), (y))
-#define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
-#define isless(x, y) __builtin_isless((x), (y))
-#define islessequal(x, y) __builtin_islessequal((x), (y))
-#define islessgreater(x, y) __builtin_islessgreater((x), (y))
-#define isunordered(x, y) __builtin_isunordered((x), (y))
-#else
-#define isgreater(x, y) (!isunordered((x), (y)) && (x) > (y))
-#define isgreaterequal(x, y) (!isunordered((x), (y)) && (x) >= (y))
-#define isless(x, y) (!isunordered((x), (y)) && (x) < (y))
-#define islessequal(x, y) (!isunordered((x), (y)) && (x) <= (y))
-#define islessgreater(x, y) (!isunordered((x), (y)) && \
- ((x) > (y) || (y) > (x)))
-#define isunordered(x, y) (isnan(x) || isnan(y))
-#endif /* __MATH_BUILTIN_RELOPS */
-
-#define signbit(x) \
- ((sizeof (x) == sizeof (float)) ? __signbitf(x) \
- : (sizeof (x) == sizeof (double)) ? __signbit(x) \
- : __signbitl(x))
+#define FP_INFINITE 0x01
+#define FP_NAN 0x02
+#define FP_NORMAL 0x04
+#define FP_SUBNORMAL 0x08
+#define FP_ZERO 0x10
+#define fpclassify(x) \
+ __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, x)
+
+#define isfinite(x) __builtin_isfinite(x)
+#define isinf(x) __builtin_isinf(x)
+#define isnan(x) __builtin_isnan(x)
+#define isnormal(x) __builtin_isnormal(x)
+
+#define isgreater(x, y) __builtin_isgreater((x), (y))
+#define isgreaterequal(x, y) __builtin_isgreaterequal((x), (y))
+#define isless(x, y) __builtin_isless((x), (y))
+#define islessequal(x, y) __builtin_islessequal((x), (y))
+#define islessgreater(x, y) __builtin_islessgreater((x), (y))
+#define isunordered(x, y) __builtin_isunordered((x), (y))
+
+#define signbit(x) \
+ ((sizeof(x) == sizeof(float)) ? __builtin_signbitf(x) \
+ : (sizeof(x) == sizeof(double)) ? __builtin_signbit(x) \
+ : __builtin_signbitl(x))
typedef double __double_t;
typedef __double_t double_t;
@@ -213,6 +167,7 @@ double sqrt(double);
double ceil(double);
double fabs(double) __pure2;
+__BIONIC_MATH_INLINE(double fabs(double x) { return __builtin_fabs(x); })
double floor(double);
double fmod(double, double);
@@ -331,6 +286,7 @@ float sqrtf(float);
float ceilf(float);
float fabsf(float) __pure2;
+__BIONIC_MATH_INLINE(float fabsf(float x) { return __builtin_fabsf(x); })
float floorf(float);
float fmodf(float, float);
float roundf(float);
@@ -418,6 +374,7 @@ long double exp2l(long double);
long double expl(long double);
long double expm1l(long double);
long double fabsl(long double) __pure2;
+__BIONIC_MATH_INLINE(long double fabsl(long double x) { return __builtin_fabsl(x); })
long double fdiml(long double, long double);
long double floorl(long double);
long double fmal(long double, long double, long double);
diff --git a/libm/libm.arm.map b/libm/libm.arm.map
new file mode 100644
index 000000000..e781f2d74
--- /dev/null
+++ b/libm/libm.arm.map
@@ -0,0 +1,378 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __fe_dfl_env;
+ __signbit;
+ __signbitf;
+ __signbitl;
+ acos;
+ acosf;
+ acosh;
+ acoshf;
+ acoshl;
+ acosl;
+ asin;
+ asinf;
+ asinh;
+ asinhf;
+ asinhl;
+ asinl;
+ atan;
+ atan2;
+ atan2f;
+ atan2l;
+ atanf;
+ atanh;
+ atanhf;
+ atanhl;
+ atanl;
+ cabs;
+ cabsf;
+ cabsl;
+ cacos;
+ cacosf;
+ cacosh;
+ cacoshf;
+ carg;
+ cargf;
+ cargl;
+ casin;
+ casinf;
+ casinh;
+ casinhf;
+ catan;
+ catanf;
+ catanh;
+ catanhf;
+ cbrt;
+ cbrtf;
+ cbrtl;
+ ccos;
+ ccosf;
+ ccosh;
+ ccoshf;
+ ceil;
+ ceilf;
+ ceill;
+ cexp;
+ cexpf;
+ cimag;
+ cimagf;
+ cimagl;
+ conj;
+ conjf;
+ conjl;
+ copysign;
+ copysignf;
+ copysignl;
+ cos;
+ cosf;
+ cosh;
+ coshf;
+ coshl;
+ cosl;
+ cproj;
+ cprojf;
+ cprojl;
+ creal;
+ crealf;
+ creall;
+ csin;
+ csinf;
+ csinh;
+ csinhf;
+ csqrt;
+ csqrtf;
+ csqrtl;
+ ctan;
+ ctanf;
+ ctanh;
+ ctanhf;
+ drem;
+ dremf;
+ erf;
+ erfc;
+ erfcf;
+ erfcl;
+ erff;
+ erfl;
+ exp;
+ exp2;
+ exp2f;
+ exp2l;
+ expf;
+ expl;
+ expm1;
+ expm1f;
+ expm1l;
+ fabs;
+ fabsf;
+ fabsl;
+ fdim;
+ fdimf;
+ fdiml;
+ feclearexcept;
+ fedisableexcept;
+ feenableexcept;
+ fegetenv;
+ fegetexcept;
+ fegetexceptflag;
+ fegetround;
+ feholdexcept;
+ feraiseexcept;
+ fesetenv;
+ fesetexceptflag;
+ fesetround;
+ fetestexcept;
+ feupdateenv;
+ finite;
+ finitef;
+ floor;
+ floorf;
+ floorl;
+ fma;
+ fmaf;
+ fmal;
+ fmax;
+ fmaxf;
+ fmaxl;
+ fmin;
+ fminf;
+ fminl;
+ fmod;
+ fmodf;
+ fmodl;
+ frexp;
+ frexpf;
+ frexpl;
+ gamma;
+ gamma_r;
+ gammaf;
+ gammaf_r;
+ hypot;
+ hypotf;
+ hypotl;
+ ilogb;
+ ilogbf;
+ ilogbl;
+ j0;
+ j0f;
+ j1;
+ j1f;
+ jn;
+ jnf;
+ ldexpf;
+ ldexpl;
+ lgamma;
+ lgamma_r;
+ lgammaf;
+ lgammaf_r;
+ lgammal;
+ lgammal_r;
+ llrint;
+ llrintf;
+ llrintl;
+ llround;
+ llroundf;
+ llroundl;
+ log;
+ log10;
+ log10f;
+ log10l;
+ log1p;
+ log1pf;
+ log1pl;
+ log2;
+ log2f;
+ log2l;
+ logb;
+ logbf;
+ logbl;
+ logf;
+ logl;
+ lrint;
+ lrintf;
+ lrintl;
+ lround;
+ lroundf;
+ lroundl;
+ modf;
+ modff;
+ modfl;
+ nan;
+ nanf;
+ nanl;
+ nearbyint;
+ nearbyintf;
+ nearbyintl;
+ nextafter;
+ nextafterf;
+ nextafterl;
+ nexttoward;
+ nexttowardf;
+ nexttowardl;
+ pow;
+ powf;
+ powl;
+ remainder;
+ remainderf;
+ remainderl;
+ remquo;
+ remquof;
+ remquol;
+ rint;
+ rintf;
+ rintl;
+ round;
+ roundf;
+ roundl;
+ scalb;
+ scalbf;
+ scalbln;
+ scalblnf;
+ scalblnl;
+ scalbn;
+ scalbnf;
+ scalbnl;
+ signgam;
+ significand;
+ significandf;
+ significandl;
+ sin;
+ sincos;
+ sincosf;
+ sincosl;
+ sinf;
+ sinh;
+ sinhf;
+ sinhl;
+ sinl;
+ sqrt;
+ sqrtf;
+ sqrtl;
+ tan;
+ tanf;
+ tanh;
+ tanhf;
+ tanhl;
+ tanl;
+ tgamma;
+ tgammaf;
+ tgammal;
+ trunc;
+ truncf;
+ truncl;
+ y0;
+ y0f;
+ y1;
+ y1f;
+ yn;
+ ynf;
+ local:
+ *;
+};
+
+LIBC_PRIVATE { # arm mips
+ global: # arm mips
+ ___Unwind_Backtrace; # arm
+ ___Unwind_ForcedUnwind; # arm
+ ___Unwind_RaiseException; # arm
+ ___Unwind_Resume; # arm
+ ___Unwind_Resume_or_Rethrow; # arm
+ __adddf3; # arm
+ __aeabi_cdcmpeq; # arm
+ __aeabi_cdcmple; # arm
+ __aeabi_cdrcmple; # arm
+ __aeabi_cfcmpeq; # arm
+ __aeabi_cfcmple; # arm
+ __aeabi_cfrcmple; # arm
+ __aeabi_d2lz; # arm
+ __aeabi_d2uiz; # arm
+ __aeabi_d2ulz; # arm
+ __aeabi_dadd; # arm
+ __aeabi_dcmpeq; # arm
+ __aeabi_dcmpge; # arm
+ __aeabi_dcmpgt; # arm
+ __aeabi_dcmple; # arm
+ __aeabi_dcmplt; # arm
+ __aeabi_ddiv; # arm
+ __aeabi_dmul; # arm
+ __aeabi_drsub; # arm
+ __aeabi_dsub; # arm
+ __aeabi_f2d; # arm
+ __aeabi_f2lz; # arm
+ __aeabi_f2ulz; # arm
+ __aeabi_fcmpeq; # arm
+ __aeabi_fcmpge; # arm
+ __aeabi_fcmpgt; # arm
+ __aeabi_fcmple; # arm
+ __aeabi_fcmplt; # arm
+ __aeabi_i2d; # arm
+ __aeabi_l2d; # arm
+ __aeabi_ui2d; # arm
+ __aeabi_ul2d; # arm
+ __aeabi_unwind_cpp_pr0; # arm
+ __aeabi_unwind_cpp_pr1; # arm
+ __aeabi_unwind_cpp_pr2; # arm
+ __cmpdf2; # arm
+ __cmpsf2; # arm
+ __divdf3; # arm
+ __eqdf2; # arm
+ __eqsf2; # arm
+ __extendsfdf2; # arm
+ __fixdfdi; # arm mips
+ __fixsfdi; # arm mips
+ __fixunsdfdi; # arm mips
+ __fixunsdfsi; # arm
+ __fixunssfdi; # arm mips
+ __floatdidf; # arm
+ __floatsidf; # arm
+ __floatundidf; # arm
+ __floatunsidf; # arm
+ __gedf2; # arm
+ __gesf2; # arm
+ __gnu_Unwind_Backtrace; # arm
+ __gnu_unwind_execute; # arm
+ __gnu_Unwind_ForcedUnwind; # arm
+ __gnu_unwind_frame; # arm
+ __gnu_Unwind_RaiseException; # arm
+ __gnu_Unwind_Restore_VFP; # arm
+ __gnu_Unwind_Restore_VFP_D; # arm
+ __gnu_Unwind_Restore_VFP_D_16_to_31; # arm
+ __gnu_Unwind_Restore_WMMXC; # arm
+ __gnu_Unwind_Restore_WMMXD; # arm
+ __gnu_Unwind_Resume; # arm
+ __gnu_Unwind_Resume_or_Rethrow; # arm
+ __gnu_Unwind_Save_VFP; # arm
+ __gnu_Unwind_Save_VFP_D; # arm
+ __gnu_Unwind_Save_VFP_D_16_to_31; # arm
+ __gnu_Unwind_Save_WMMXC; # arm
+ __gnu_Unwind_Save_WMMXD; # arm
+ __gtdf2; # arm
+ __gtsf2; # arm
+ __ledf2; # arm
+ __lesf2; # arm
+ __ltdf2; # arm
+ __ltsf2; # arm
+ __muldf3; # arm
+ __nedf2; # arm
+ __nesf2; # arm
+ __restore_core_regs; # arm
+ __subdf3; # arm
+ _Unwind_Backtrace; # arm
+ _Unwind_Complete; # arm
+ _Unwind_DeleteException; # arm
+ _Unwind_ForcedUnwind; # arm
+ _Unwind_GetCFA; # arm
+ _Unwind_GetDataRelBase; # arm
+ _Unwind_GetLanguageSpecificData; # arm
+ _Unwind_GetRegionStart; # arm
+ _Unwind_GetTextRelBase; # arm
+ _Unwind_RaiseException; # arm
+ _Unwind_Resume; # arm
+ _Unwind_Resume_or_Rethrow; # arm
+ _Unwind_VRS_Get; # arm
+ _Unwind_VRS_Pop; # arm
+ _Unwind_VRS_Set; # arm
+ restore_core_regs; # arm
+} LIBC; # arm mips
diff --git a/libm/libm.arm64.map b/libm/libm.arm64.map
new file mode 100644
index 000000000..1623ea08d
--- /dev/null
+++ b/libm/libm.arm64.map
@@ -0,0 +1,274 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __fe_dfl_env;
+ __signbit;
+ __signbitf;
+ __signbitl;
+ acos;
+ acosf;
+ acosh;
+ acoshf;
+ acoshl;
+ acosl;
+ asin;
+ asinf;
+ asinh;
+ asinhf;
+ asinhl;
+ asinl;
+ atan;
+ atan2;
+ atan2f;
+ atan2l;
+ atanf;
+ atanh;
+ atanhf;
+ atanhl;
+ atanl;
+ cabs;
+ cabsf;
+ cabsl;
+ cacos;
+ cacosf;
+ cacosh;
+ cacoshf;
+ carg;
+ cargf;
+ cargl;
+ casin;
+ casinf;
+ casinh;
+ casinhf;
+ catan;
+ catanf;
+ catanh;
+ catanhf;
+ cbrt;
+ cbrtf;
+ cbrtl;
+ ccos;
+ ccosf;
+ ccosh;
+ ccoshf;
+ ceil;
+ ceilf;
+ ceill;
+ cexp;
+ cexpf;
+ cimag;
+ cimagf;
+ cimagl;
+ conj;
+ conjf;
+ conjl;
+ copysign;
+ copysignf;
+ copysignl;
+ cos;
+ cosf;
+ cosh;
+ coshf;
+ coshl;
+ cosl;
+ cproj;
+ cprojf;
+ cprojl;
+ creal;
+ crealf;
+ creall;
+ csin;
+ csinf;
+ csinh;
+ csinhf;
+ csqrt;
+ csqrtf;
+ csqrtl;
+ ctan;
+ ctanf;
+ ctanh;
+ ctanhf;
+ drem;
+ dremf;
+ erf;
+ erfc;
+ erfcf;
+ erfcl;
+ erff;
+ erfl;
+ exp;
+ exp2;
+ exp2f;
+ exp2l;
+ expf;
+ expl;
+ expm1;
+ expm1f;
+ expm1l;
+ fabs;
+ fabsf;
+ fabsl;
+ fdim;
+ fdimf;
+ fdiml;
+ feclearexcept;
+ fedisableexcept;
+ feenableexcept;
+ fegetenv;
+ fegetexcept;
+ fegetexceptflag;
+ fegetround;
+ feholdexcept;
+ feraiseexcept;
+ fesetenv;
+ fesetexceptflag;
+ fesetround;
+ fetestexcept;
+ feupdateenv;
+ finite;
+ finitef;
+ floor;
+ floorf;
+ floorl;
+ fma;
+ fmaf;
+ fmal;
+ fmax;
+ fmaxf;
+ fmaxl;
+ fmin;
+ fminf;
+ fminl;
+ fmod;
+ fmodf;
+ fmodl;
+ frexp;
+ frexpf;
+ frexpl;
+ gamma;
+ gamma_r;
+ gammaf;
+ gammaf_r;
+ hypot;
+ hypotf;
+ hypotl;
+ ilogb;
+ ilogbf;
+ ilogbl;
+ j0;
+ j0f;
+ j1;
+ j1f;
+ jn;
+ jnf;
+ ldexpf;
+ ldexpl;
+ lgamma;
+ lgamma_r;
+ lgammaf;
+ lgammaf_r;
+ lgammal;
+ lgammal_r;
+ llrint;
+ llrintf;
+ llrintl;
+ llround;
+ llroundf;
+ llroundl;
+ log;
+ log10;
+ log10f;
+ log10l;
+ log1p;
+ log1pf;
+ log1pl;
+ log2;
+ log2f;
+ log2l;
+ logb;
+ logbf;
+ logbl;
+ logf;
+ logl;
+ lrint;
+ lrintf;
+ lrintl;
+ lround;
+ lroundf;
+ lroundl;
+ modf;
+ modff;
+ modfl;
+ nan;
+ nanf;
+ nanl;
+ nearbyint;
+ nearbyintf;
+ nearbyintl;
+ nextafter;
+ nextafterf;
+ nextafterl;
+ nexttoward;
+ nexttowardf;
+ nexttowardl;
+ pow;
+ powf;
+ powl;
+ remainder;
+ remainderf;
+ remainderl;
+ remquo;
+ remquof;
+ remquol;
+ rint;
+ rintf;
+ rintl;
+ round;
+ roundf;
+ roundl;
+ scalb;
+ scalbf;
+ scalbln;
+ scalblnf;
+ scalblnl;
+ scalbn;
+ scalbnf;
+ scalbnl;
+ signgam;
+ significand;
+ significandf;
+ significandl;
+ sin;
+ sincos;
+ sincosf;
+ sincosl;
+ sinf;
+ sinh;
+ sinhf;
+ sinhl;
+ sinl;
+ sqrt;
+ sqrtf;
+ sqrtl;
+ tan;
+ tanf;
+ tanh;
+ tanhf;
+ tanhl;
+ tanl;
+ tgamma;
+ tgammaf;
+ tgammal;
+ trunc;
+ truncf;
+ truncl;
+ y0;
+ y0f;
+ y1;
+ y1f;
+ yn;
+ ynf;
+ local:
+ *;
+};
+
diff --git a/libm/libm.map b/libm/libm.map.txt
index 7f02f42f1..075ebd580 100644
--- a/libm/libm.map
+++ b/libm/libm.map.txt
@@ -271,8 +271,8 @@ LIBC {
*;
};
-LIBC_PRIVATE {
- global:
+LIBC_PRIVATE { # arm mips
+ global: # arm mips
___Unwind_Backtrace; # arm
___Unwind_ForcedUnwind; # arm
___Unwind_RaiseException; # arm
@@ -353,7 +353,6 @@ LIBC_PRIVATE {
__lesf2; # arm
__ltdf2; # arm
__ltsf2; # arm
- __muldc3; # arm x86 mips
__muldf3; # arm
__nedf2; # arm
__nesf2; # arm
@@ -375,4 +374,4 @@ LIBC_PRIVATE {
_Unwind_VRS_Pop; # arm
_Unwind_VRS_Set; # arm
restore_core_regs; # arm
-} LIBC;
+} LIBC; # arm mips
diff --git a/libm/libm.mips.map b/libm/libm.mips.map
new file mode 100644
index 000000000..476c6ad06
--- /dev/null
+++ b/libm/libm.mips.map
@@ -0,0 +1,281 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __fe_dfl_env;
+ __signbit;
+ __signbitf;
+ __signbitl;
+ acos;
+ acosf;
+ acosh;
+ acoshf;
+ acoshl;
+ acosl;
+ asin;
+ asinf;
+ asinh;
+ asinhf;
+ asinhl;
+ asinl;
+ atan;
+ atan2;
+ atan2f;
+ atan2l;
+ atanf;
+ atanh;
+ atanhf;
+ atanhl;
+ atanl;
+ cabs;
+ cabsf;
+ cabsl;
+ cacos;
+ cacosf;
+ cacosh;
+ cacoshf;
+ carg;
+ cargf;
+ cargl;
+ casin;
+ casinf;
+ casinh;
+ casinhf;
+ catan;
+ catanf;
+ catanh;
+ catanhf;
+ cbrt;
+ cbrtf;
+ cbrtl;
+ ccos;
+ ccosf;
+ ccosh;
+ ccoshf;
+ ceil;
+ ceilf;
+ ceill;
+ cexp;
+ cexpf;
+ cimag;
+ cimagf;
+ cimagl;
+ conj;
+ conjf;
+ conjl;
+ copysign;
+ copysignf;
+ copysignl;
+ cos;
+ cosf;
+ cosh;
+ coshf;
+ coshl;
+ cosl;
+ cproj;
+ cprojf;
+ cprojl;
+ creal;
+ crealf;
+ creall;
+ csin;
+ csinf;
+ csinh;
+ csinhf;
+ csqrt;
+ csqrtf;
+ csqrtl;
+ ctan;
+ ctanf;
+ ctanh;
+ ctanhf;
+ drem;
+ dremf;
+ erf;
+ erfc;
+ erfcf;
+ erfcl;
+ erff;
+ erfl;
+ exp;
+ exp2;
+ exp2f;
+ exp2l;
+ expf;
+ expl;
+ expm1;
+ expm1f;
+ expm1l;
+ fabs;
+ fabsf;
+ fabsl;
+ fdim;
+ fdimf;
+ fdiml;
+ feclearexcept;
+ fedisableexcept;
+ feenableexcept;
+ fegetenv;
+ fegetexcept;
+ fegetexceptflag;
+ fegetround;
+ feholdexcept;
+ feraiseexcept;
+ fesetenv;
+ fesetexceptflag;
+ fesetround;
+ fetestexcept;
+ feupdateenv;
+ finite;
+ finitef;
+ floor;
+ floorf;
+ floorl;
+ fma;
+ fmaf;
+ fmal;
+ fmax;
+ fmaxf;
+ fmaxl;
+ fmin;
+ fminf;
+ fminl;
+ fmod;
+ fmodf;
+ fmodl;
+ frexp;
+ frexpf;
+ frexpl;
+ gamma;
+ gamma_r;
+ gammaf;
+ gammaf_r;
+ hypot;
+ hypotf;
+ hypotl;
+ ilogb;
+ ilogbf;
+ ilogbl;
+ j0;
+ j0f;
+ j1;
+ j1f;
+ jn;
+ jnf;
+ ldexpf;
+ ldexpl;
+ lgamma;
+ lgamma_r;
+ lgammaf;
+ lgammaf_r;
+ lgammal;
+ lgammal_r;
+ llrint;
+ llrintf;
+ llrintl;
+ llround;
+ llroundf;
+ llroundl;
+ log;
+ log10;
+ log10f;
+ log10l;
+ log1p;
+ log1pf;
+ log1pl;
+ log2;
+ log2f;
+ log2l;
+ logb;
+ logbf;
+ logbl;
+ logf;
+ logl;
+ lrint;
+ lrintf;
+ lrintl;
+ lround;
+ lroundf;
+ lroundl;
+ modf;
+ modff;
+ modfl;
+ nan;
+ nanf;
+ nanl;
+ nearbyint;
+ nearbyintf;
+ nearbyintl;
+ nextafter;
+ nextafterf;
+ nextafterl;
+ nexttoward;
+ nexttowardf;
+ nexttowardl;
+ pow;
+ powf;
+ powl;
+ remainder;
+ remainderf;
+ remainderl;
+ remquo;
+ remquof;
+ remquol;
+ rint;
+ rintf;
+ rintl;
+ round;
+ roundf;
+ roundl;
+ scalb;
+ scalbf;
+ scalbln;
+ scalblnf;
+ scalblnl;
+ scalbn;
+ scalbnf;
+ scalbnl;
+ signgam;
+ significand;
+ significandf;
+ significandl;
+ sin;
+ sincos;
+ sincosf;
+ sincosl;
+ sinf;
+ sinh;
+ sinhf;
+ sinhl;
+ sinl;
+ sqrt;
+ sqrtf;
+ sqrtl;
+ tan;
+ tanf;
+ tanh;
+ tanhf;
+ tanhl;
+ tanl;
+ tgamma;
+ tgammaf;
+ tgammal;
+ trunc;
+ truncf;
+ truncl;
+ y0;
+ y0f;
+ y1;
+ y1f;
+ yn;
+ ynf;
+ local:
+ *;
+};
+
+LIBC_PRIVATE { # arm mips
+ global: # arm mips
+ __fixdfdi; # arm mips
+ __fixsfdi; # arm mips
+ __fixunsdfdi; # arm mips
+ __fixunssfdi; # arm mips
+} LIBC; # arm mips
diff --git a/libm/libm.mips64.map b/libm/libm.mips64.map
new file mode 100644
index 000000000..1623ea08d
--- /dev/null
+++ b/libm/libm.mips64.map
@@ -0,0 +1,274 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __fe_dfl_env;
+ __signbit;
+ __signbitf;
+ __signbitl;
+ acos;
+ acosf;
+ acosh;
+ acoshf;
+ acoshl;
+ acosl;
+ asin;
+ asinf;
+ asinh;
+ asinhf;
+ asinhl;
+ asinl;
+ atan;
+ atan2;
+ atan2f;
+ atan2l;
+ atanf;
+ atanh;
+ atanhf;
+ atanhl;
+ atanl;
+ cabs;
+ cabsf;
+ cabsl;
+ cacos;
+ cacosf;
+ cacosh;
+ cacoshf;
+ carg;
+ cargf;
+ cargl;
+ casin;
+ casinf;
+ casinh;
+ casinhf;
+ catan;
+ catanf;
+ catanh;
+ catanhf;
+ cbrt;
+ cbrtf;
+ cbrtl;
+ ccos;
+ ccosf;
+ ccosh;
+ ccoshf;
+ ceil;
+ ceilf;
+ ceill;
+ cexp;
+ cexpf;
+ cimag;
+ cimagf;
+ cimagl;
+ conj;
+ conjf;
+ conjl;
+ copysign;
+ copysignf;
+ copysignl;
+ cos;
+ cosf;
+ cosh;
+ coshf;
+ coshl;
+ cosl;
+ cproj;
+ cprojf;
+ cprojl;
+ creal;
+ crealf;
+ creall;
+ csin;
+ csinf;
+ csinh;
+ csinhf;
+ csqrt;
+ csqrtf;
+ csqrtl;
+ ctan;
+ ctanf;
+ ctanh;
+ ctanhf;
+ drem;
+ dremf;
+ erf;
+ erfc;
+ erfcf;
+ erfcl;
+ erff;
+ erfl;
+ exp;
+ exp2;
+ exp2f;
+ exp2l;
+ expf;
+ expl;
+ expm1;
+ expm1f;
+ expm1l;
+ fabs;
+ fabsf;
+ fabsl;
+ fdim;
+ fdimf;
+ fdiml;
+ feclearexcept;
+ fedisableexcept;
+ feenableexcept;
+ fegetenv;
+ fegetexcept;
+ fegetexceptflag;
+ fegetround;
+ feholdexcept;
+ feraiseexcept;
+ fesetenv;
+ fesetexceptflag;
+ fesetround;
+ fetestexcept;
+ feupdateenv;
+ finite;
+ finitef;
+ floor;
+ floorf;
+ floorl;
+ fma;
+ fmaf;
+ fmal;
+ fmax;
+ fmaxf;
+ fmaxl;
+ fmin;
+ fminf;
+ fminl;
+ fmod;
+ fmodf;
+ fmodl;
+ frexp;
+ frexpf;
+ frexpl;
+ gamma;
+ gamma_r;
+ gammaf;
+ gammaf_r;
+ hypot;
+ hypotf;
+ hypotl;
+ ilogb;
+ ilogbf;
+ ilogbl;
+ j0;
+ j0f;
+ j1;
+ j1f;
+ jn;
+ jnf;
+ ldexpf;
+ ldexpl;
+ lgamma;
+ lgamma_r;
+ lgammaf;
+ lgammaf_r;
+ lgammal;
+ lgammal_r;
+ llrint;
+ llrintf;
+ llrintl;
+ llround;
+ llroundf;
+ llroundl;
+ log;
+ log10;
+ log10f;
+ log10l;
+ log1p;
+ log1pf;
+ log1pl;
+ log2;
+ log2f;
+ log2l;
+ logb;
+ logbf;
+ logbl;
+ logf;
+ logl;
+ lrint;
+ lrintf;
+ lrintl;
+ lround;
+ lroundf;
+ lroundl;
+ modf;
+ modff;
+ modfl;
+ nan;
+ nanf;
+ nanl;
+ nearbyint;
+ nearbyintf;
+ nearbyintl;
+ nextafter;
+ nextafterf;
+ nextafterl;
+ nexttoward;
+ nexttowardf;
+ nexttowardl;
+ pow;
+ powf;
+ powl;
+ remainder;
+ remainderf;
+ remainderl;
+ remquo;
+ remquof;
+ remquol;
+ rint;
+ rintf;
+ rintl;
+ round;
+ roundf;
+ roundl;
+ scalb;
+ scalbf;
+ scalbln;
+ scalblnf;
+ scalblnl;
+ scalbn;
+ scalbnf;
+ scalbnl;
+ signgam;
+ significand;
+ significandf;
+ significandl;
+ sin;
+ sincos;
+ sincosf;
+ sincosl;
+ sinf;
+ sinh;
+ sinhf;
+ sinhl;
+ sinl;
+ sqrt;
+ sqrtf;
+ sqrtl;
+ tan;
+ tanf;
+ tanh;
+ tanhf;
+ tanhl;
+ tanl;
+ tgamma;
+ tgammaf;
+ tgammal;
+ trunc;
+ truncf;
+ truncl;
+ y0;
+ y0f;
+ y1;
+ y1f;
+ yn;
+ ynf;
+ local:
+ *;
+};
+
diff --git a/libm/libm.x86.map b/libm/libm.x86.map
new file mode 100644
index 000000000..1623ea08d
--- /dev/null
+++ b/libm/libm.x86.map
@@ -0,0 +1,274 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __fe_dfl_env;
+ __signbit;
+ __signbitf;
+ __signbitl;
+ acos;
+ acosf;
+ acosh;
+ acoshf;
+ acoshl;
+ acosl;
+ asin;
+ asinf;
+ asinh;
+ asinhf;
+ asinhl;
+ asinl;
+ atan;
+ atan2;
+ atan2f;
+ atan2l;
+ atanf;
+ atanh;
+ atanhf;
+ atanhl;
+ atanl;
+ cabs;
+ cabsf;
+ cabsl;
+ cacos;
+ cacosf;
+ cacosh;
+ cacoshf;
+ carg;
+ cargf;
+ cargl;
+ casin;
+ casinf;
+ casinh;
+ casinhf;
+ catan;
+ catanf;
+ catanh;
+ catanhf;
+ cbrt;
+ cbrtf;
+ cbrtl;
+ ccos;
+ ccosf;
+ ccosh;
+ ccoshf;
+ ceil;
+ ceilf;
+ ceill;
+ cexp;
+ cexpf;
+ cimag;
+ cimagf;
+ cimagl;
+ conj;
+ conjf;
+ conjl;
+ copysign;
+ copysignf;
+ copysignl;
+ cos;
+ cosf;
+ cosh;
+ coshf;
+ coshl;
+ cosl;
+ cproj;
+ cprojf;
+ cprojl;
+ creal;
+ crealf;
+ creall;
+ csin;
+ csinf;
+ csinh;
+ csinhf;
+ csqrt;
+ csqrtf;
+ csqrtl;
+ ctan;
+ ctanf;
+ ctanh;
+ ctanhf;
+ drem;
+ dremf;
+ erf;
+ erfc;
+ erfcf;
+ erfcl;
+ erff;
+ erfl;
+ exp;
+ exp2;
+ exp2f;
+ exp2l;
+ expf;
+ expl;
+ expm1;
+ expm1f;
+ expm1l;
+ fabs;
+ fabsf;
+ fabsl;
+ fdim;
+ fdimf;
+ fdiml;
+ feclearexcept;
+ fedisableexcept;
+ feenableexcept;
+ fegetenv;
+ fegetexcept;
+ fegetexceptflag;
+ fegetround;
+ feholdexcept;
+ feraiseexcept;
+ fesetenv;
+ fesetexceptflag;
+ fesetround;
+ fetestexcept;
+ feupdateenv;
+ finite;
+ finitef;
+ floor;
+ floorf;
+ floorl;
+ fma;
+ fmaf;
+ fmal;
+ fmax;
+ fmaxf;
+ fmaxl;
+ fmin;
+ fminf;
+ fminl;
+ fmod;
+ fmodf;
+ fmodl;
+ frexp;
+ frexpf;
+ frexpl;
+ gamma;
+ gamma_r;
+ gammaf;
+ gammaf_r;
+ hypot;
+ hypotf;
+ hypotl;
+ ilogb;
+ ilogbf;
+ ilogbl;
+ j0;
+ j0f;
+ j1;
+ j1f;
+ jn;
+ jnf;
+ ldexpf;
+ ldexpl;
+ lgamma;
+ lgamma_r;
+ lgammaf;
+ lgammaf_r;
+ lgammal;
+ lgammal_r;
+ llrint;
+ llrintf;
+ llrintl;
+ llround;
+ llroundf;
+ llroundl;
+ log;
+ log10;
+ log10f;
+ log10l;
+ log1p;
+ log1pf;
+ log1pl;
+ log2;
+ log2f;
+ log2l;
+ logb;
+ logbf;
+ logbl;
+ logf;
+ logl;
+ lrint;
+ lrintf;
+ lrintl;
+ lround;
+ lroundf;
+ lroundl;
+ modf;
+ modff;
+ modfl;
+ nan;
+ nanf;
+ nanl;
+ nearbyint;
+ nearbyintf;
+ nearbyintl;
+ nextafter;
+ nextafterf;
+ nextafterl;
+ nexttoward;
+ nexttowardf;
+ nexttowardl;
+ pow;
+ powf;
+ powl;
+ remainder;
+ remainderf;
+ remainderl;
+ remquo;
+ remquof;
+ remquol;
+ rint;
+ rintf;
+ rintl;
+ round;
+ roundf;
+ roundl;
+ scalb;
+ scalbf;
+ scalbln;
+ scalblnf;
+ scalblnl;
+ scalbn;
+ scalbnf;
+ scalbnl;
+ signgam;
+ significand;
+ significandf;
+ significandl;
+ sin;
+ sincos;
+ sincosf;
+ sincosl;
+ sinf;
+ sinh;
+ sinhf;
+ sinhl;
+ sinl;
+ sqrt;
+ sqrtf;
+ sqrtl;
+ tan;
+ tanf;
+ tanh;
+ tanhf;
+ tanhl;
+ tanl;
+ tgamma;
+ tgammaf;
+ tgammal;
+ trunc;
+ truncf;
+ truncl;
+ y0;
+ y0f;
+ y1;
+ y1f;
+ yn;
+ ynf;
+ local:
+ *;
+};
+
diff --git a/libm/libm.x86_64.map b/libm/libm.x86_64.map
new file mode 100644
index 000000000..1623ea08d
--- /dev/null
+++ b/libm/libm.x86_64.map
@@ -0,0 +1,274 @@
+# Generated by genversionscripts.py. Do not edit.
+LIBC {
+ global:
+ __fe_dfl_env;
+ __signbit;
+ __signbitf;
+ __signbitl;
+ acos;
+ acosf;
+ acosh;
+ acoshf;
+ acoshl;
+ acosl;
+ asin;
+ asinf;
+ asinh;
+ asinhf;
+ asinhl;
+ asinl;
+ atan;
+ atan2;
+ atan2f;
+ atan2l;
+ atanf;
+ atanh;
+ atanhf;
+ atanhl;
+ atanl;
+ cabs;
+ cabsf;
+ cabsl;
+ cacos;
+ cacosf;
+ cacosh;
+ cacoshf;
+ carg;
+ cargf;
+ cargl;
+ casin;
+ casinf;
+ casinh;
+ casinhf;
+ catan;
+ catanf;
+ catanh;
+ catanhf;
+ cbrt;
+ cbrtf;
+ cbrtl;
+ ccos;
+ ccosf;
+ ccosh;
+ ccoshf;
+ ceil;
+ ceilf;
+ ceill;
+ cexp;
+ cexpf;
+ cimag;
+ cimagf;
+ cimagl;
+ conj;
+ conjf;
+ conjl;
+ copysign;
+ copysignf;
+ copysignl;
+ cos;
+ cosf;
+ cosh;
+ coshf;
+ coshl;
+ cosl;
+ cproj;
+ cprojf;
+ cprojl;
+ creal;
+ crealf;
+ creall;
+ csin;
+ csinf;
+ csinh;
+ csinhf;
+ csqrt;
+ csqrtf;
+ csqrtl;
+ ctan;
+ ctanf;
+ ctanh;
+ ctanhf;
+ drem;
+ dremf;
+ erf;
+ erfc;
+ erfcf;
+ erfcl;
+ erff;
+ erfl;
+ exp;
+ exp2;
+ exp2f;
+ exp2l;
+ expf;
+ expl;
+ expm1;
+ expm1f;
+ expm1l;
+ fabs;
+ fabsf;
+ fabsl;
+ fdim;
+ fdimf;
+ fdiml;
+ feclearexcept;
+ fedisableexcept;
+ feenableexcept;
+ fegetenv;
+ fegetexcept;
+ fegetexceptflag;
+ fegetround;
+ feholdexcept;
+ feraiseexcept;
+ fesetenv;
+ fesetexceptflag;
+ fesetround;
+ fetestexcept;
+ feupdateenv;
+ finite;
+ finitef;
+ floor;
+ floorf;
+ floorl;
+ fma;
+ fmaf;
+ fmal;
+ fmax;
+ fmaxf;
+ fmaxl;
+ fmin;
+ fminf;
+ fminl;
+ fmod;
+ fmodf;
+ fmodl;
+ frexp;
+ frexpf;
+ frexpl;
+ gamma;
+ gamma_r;
+ gammaf;
+ gammaf_r;
+ hypot;
+ hypotf;
+ hypotl;
+ ilogb;
+ ilogbf;
+ ilogbl;
+ j0;
+ j0f;
+ j1;
+ j1f;
+ jn;
+ jnf;
+ ldexpf;
+ ldexpl;
+ lgamma;
+ lgamma_r;
+ lgammaf;
+ lgammaf_r;
+ lgammal;
+ lgammal_r;
+ llrint;
+ llrintf;
+ llrintl;
+ llround;
+ llroundf;
+ llroundl;
+ log;
+ log10;
+ log10f;
+ log10l;
+ log1p;
+ log1pf;
+ log1pl;
+ log2;
+ log2f;
+ log2l;
+ logb;
+ logbf;
+ logbl;
+ logf;
+ logl;
+ lrint;
+ lrintf;
+ lrintl;
+ lround;
+ lroundf;
+ lroundl;
+ modf;
+ modff;
+ modfl;
+ nan;
+ nanf;
+ nanl;
+ nearbyint;
+ nearbyintf;
+ nearbyintl;
+ nextafter;
+ nextafterf;
+ nextafterl;
+ nexttoward;
+ nexttowardf;
+ nexttowardl;
+ pow;
+ powf;
+ powl;
+ remainder;
+ remainderf;
+ remainderl;
+ remquo;
+ remquof;
+ remquol;
+ rint;
+ rintf;
+ rintl;
+ round;
+ roundf;
+ roundl;
+ scalb;
+ scalbf;
+ scalbln;
+ scalblnf;
+ scalblnl;
+ scalbn;
+ scalbnf;
+ scalbnl;
+ signgam;
+ significand;
+ significandf;
+ significandl;
+ sin;
+ sincos;
+ sincosf;
+ sincosl;
+ sinf;
+ sinh;
+ sinhf;
+ sinhl;
+ sinl;
+ sqrt;
+ sqrtf;
+ sqrtl;
+ tan;
+ tanf;
+ tanh;
+ tanhf;
+ tanhl;
+ tanl;
+ tgamma;
+ tgammaf;
+ tgammal;
+ trunc;
+ truncf;
+ truncl;
+ y0;
+ y0f;
+ y1;
+ y1f;
+ yn;
+ ynf;
+ local:
+ *;
+};
+
diff --git a/libm/upstream-freebsd/lib/msun/ld128/k_expl.h b/libm/upstream-freebsd/lib/msun/ld128/k_expl.h
index a5668fd47..e843d430e 100644
--- a/libm/upstream-freebsd/lib/msun/ld128/k_expl.h
+++ b/libm/upstream-freebsd/lib/msun/ld128/k_expl.h
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/ld128/k_expl.h 275819 2014-12-16 09:21:56Z ed $");
/*
* ld128 version of k_expl.h. See ../ld80/s_expl.c for most comments.
@@ -322,7 +322,7 @@ __ldexp_cexpl(long double complex z, int expt)
scale2 = 1;
SET_LDBL_EXPSIGN(scale1, BIAS + expt - half_expt);
- return (cpackl(cos(y) * exp_x * scale1 * scale2,
+ return (CMPLXL(cos(y) * exp_x * scale1 * scale2,
sinl(y) * exp_x * scale1 * scale2));
}
#endif /* _COMPLEX_H */
diff --git a/libm/upstream-freebsd/lib/msun/src/catrig.c b/libm/upstream-freebsd/lib/msun/src/catrig.c
index 200977c0a..050a88bf9 100644
--- a/libm/upstream-freebsd/lib/msun/src/catrig.c
+++ b/libm/upstream-freebsd/lib/msun/src/catrig.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/catrig.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <float.h>
@@ -286,19 +286,19 @@ casinh(double complex z)
if (isnan(x) || isnan(y)) {
/* casinh(+-Inf + I*NaN) = +-Inf + I*NaN */
if (isinf(x))
- return (cpack(x, y + y));
+ return (CMPLX(x, y + y));
/* casinh(NaN + I*+-Inf) = opt(+-)Inf + I*NaN */
if (isinf(y))
- return (cpack(y, x + x));
+ return (CMPLX(y, x + x));
/* casinh(NaN + I*0) = NaN + I*0 */
if (y == 0)
- return (cpack(x + x, y));
+ return (CMPLX(x + x, y));
/*
* All other cases involving NaN return NaN + I*NaN.
* C99 leaves it optional whether to raise invalid if one of
* the arguments is not NaN, so we opt not to raise it.
*/
- return (cpack(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+ return (CMPLX(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
}
if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
@@ -307,7 +307,7 @@ casinh(double complex z)
w = clog_for_large_values(z) + m_ln2;
else
w = clog_for_large_values(-z) + m_ln2;
- return (cpack(copysign(creal(w), x), copysign(cimag(w), y)));
+ return (CMPLX(copysign(creal(w), x), copysign(cimag(w), y)));
}
/* Avoid spuriously raising inexact for z = 0. */
@@ -325,7 +325,7 @@ casinh(double complex z)
ry = asin(B);
else
ry = atan2(new_y, sqrt_A2my2);
- return (cpack(copysign(rx, x), copysign(ry, y)));
+ return (CMPLX(copysign(rx, x), copysign(ry, y)));
}
/*
@@ -335,9 +335,9 @@ casinh(double complex z)
double complex
casin(double complex z)
{
- double complex w = casinh(cpack(cimag(z), creal(z)));
+ double complex w = casinh(CMPLX(cimag(z), creal(z)));
- return (cpack(cimag(w), creal(w)));
+ return (CMPLX(cimag(w), creal(w)));
}
/*
@@ -370,19 +370,19 @@ cacos(double complex z)
if (isnan(x) || isnan(y)) {
/* cacos(+-Inf + I*NaN) = NaN + I*opt(-)Inf */
if (isinf(x))
- return (cpack(y + y, -INFINITY));
+ return (CMPLX(y + y, -INFINITY));
/* cacos(NaN + I*+-Inf) = NaN + I*-+Inf */
if (isinf(y))
- return (cpack(x + x, -y));
+ return (CMPLX(x + x, -y));
/* cacos(0 + I*NaN) = PI/2 + I*NaN with inexact */
if (x == 0)
- return (cpack(pio2_hi + pio2_lo, y + y));
+ return (CMPLX(pio2_hi + pio2_lo, y + y));
/*
* All other cases involving NaN return NaN + I*NaN.
* C99 leaves it optional whether to raise invalid if one of
* the arguments is not NaN, so we opt not to raise it.
*/
- return (cpack(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+ return (CMPLX(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
}
if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
@@ -392,18 +392,18 @@ cacos(double complex z)
ry = creal(w) + m_ln2;
if (sy == 0)
ry = -ry;
- return (cpack(rx, ry));
+ return (CMPLX(rx, ry));
}
/* Avoid spuriously raising inexact for z = 1. */
if (x == 1 && y == 0)
- return (cpack(0, -y));
+ return (CMPLX(0, -y));
/* All remaining cases are inexact. */
raise_inexact();
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
- return (cpack(pio2_hi - (x - pio2_lo), -y));
+ return (CMPLX(pio2_hi - (x - pio2_lo), -y));
do_hard_work(ay, ax, &ry, &B_is_usable, &B, &sqrt_A2mx2, &new_x);
if (B_is_usable) {
@@ -419,7 +419,7 @@ cacos(double complex z)
}
if (sy == 0)
ry = -ry;
- return (cpack(rx, ry));
+ return (CMPLX(rx, ry));
}
/*
@@ -437,15 +437,15 @@ cacosh(double complex z)
ry = cimag(w);
/* cacosh(NaN + I*NaN) = NaN + I*NaN */
if (isnan(rx) && isnan(ry))
- return (cpack(ry, rx));
+ return (CMPLX(ry, rx));
/* cacosh(NaN + I*+-Inf) = +Inf + I*NaN */
/* cacosh(+-Inf + I*NaN) = +Inf + I*NaN */
if (isnan(rx))
- return (cpack(fabs(ry), rx));
+ return (CMPLX(fabs(ry), rx));
/* cacosh(0 + I*NaN) = NaN + I*NaN */
if (isnan(ry))
- return (cpack(ry, ry));
- return (cpack(fabs(ry), copysign(rx, cimag(z))));
+ return (CMPLX(ry, ry));
+ return (CMPLX(fabs(ry), copysign(rx, cimag(z))));
}
/*
@@ -475,16 +475,16 @@ clog_for_large_values(double complex z)
* this method is still poor since it is uneccessarily slow.
*/
if (ax > DBL_MAX / 2)
- return (cpack(log(hypot(x / m_e, y / m_e)) + 1, atan2(y, x)));
+ return (CMPLX(log(hypot(x / m_e, y / m_e)) + 1, atan2(y, x)));
/*
* Avoid overflow when x or y is large. Avoid underflow when x or
* y is small.
*/
if (ax > QUARTER_SQRT_MAX || ay < SQRT_MIN)
- return (cpack(log(hypot(x, y)), atan2(y, x)));
+ return (CMPLX(log(hypot(x, y)), atan2(y, x)));
- return (cpack(log(ax * ax + ay * ay) / 2, atan2(y, x)));
+ return (CMPLX(log(ax * ax + ay * ay) / 2, atan2(y, x)));
}
/*
@@ -575,30 +575,30 @@ catanh(double complex z)
/* This helps handle many cases. */
if (y == 0 && ax <= 1)
- return (cpack(atanh(x), y));
+ return (CMPLX(atanh(x), y));
/* To ensure the same accuracy as atan(), and to filter out z = 0. */
if (x == 0)
- return (cpack(x, atan(y)));
+ return (CMPLX(x, atan(y)));
if (isnan(x) || isnan(y)) {
/* catanh(+-Inf + I*NaN) = +-0 + I*NaN */
if (isinf(x))
- return (cpack(copysign(0, x), y + y));
+ return (CMPLX(copysign(0, x), y + y));
/* catanh(NaN + I*+-Inf) = sign(NaN)0 + I*+-PI/2 */
if (isinf(y))
- return (cpack(copysign(0, x),
+ return (CMPLX(copysign(0, x),
copysign(pio2_hi + pio2_lo, y)));
/*
* All other cases involving NaN return NaN + I*NaN.
* C99 leaves it optional whether to raise invalid if one of
* the arguments is not NaN, so we opt not to raise it.
*/
- return (cpack(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+ return (CMPLX(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
}
if (ax > RECIP_EPSILON || ay > RECIP_EPSILON)
- return (cpack(real_part_reciprocal(x, y),
+ return (CMPLX(real_part_reciprocal(x, y),
copysign(pio2_hi + pio2_lo, y)));
if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
@@ -623,7 +623,7 @@ catanh(double complex z)
else
ry = atan2(2 * ay, (1 - ax) * (1 + ax) - ay * ay) / 2;
- return (cpack(copysign(rx, x), copysign(ry, y)));
+ return (CMPLX(copysign(rx, x), copysign(ry, y)));
}
/*
@@ -633,7 +633,7 @@ catanh(double complex z)
double complex
catan(double complex z)
{
- double complex w = catanh(cpack(cimag(z), creal(z)));
+ double complex w = catanh(CMPLX(cimag(z), creal(z)));
- return (cpack(cimag(w), creal(w)));
+ return (CMPLX(cimag(w), creal(w)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/catrigf.c b/libm/upstream-freebsd/lib/msun/src/catrigf.c
index 08ebef783..e057d311f 100644
--- a/libm/upstream-freebsd/lib/msun/src/catrigf.c
+++ b/libm/upstream-freebsd/lib/msun/src/catrigf.c
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/catrigf.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <float.h>
@@ -156,12 +156,12 @@ casinhf(float complex z)
if (isnan(x) || isnan(y)) {
if (isinf(x))
- return (cpackf(x, y + y));
+ return (CMPLXF(x, y + y));
if (isinf(y))
- return (cpackf(y, x + x));
+ return (CMPLXF(y, x + x));
if (y == 0)
- return (cpackf(x + x, y));
- return (cpackf(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+ return (CMPLXF(x + x, y));
+ return (CMPLXF(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
}
if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
@@ -169,7 +169,7 @@ casinhf(float complex z)
w = clog_for_large_values(z) + m_ln2;
else
w = clog_for_large_values(-z) + m_ln2;
- return (cpackf(copysignf(crealf(w), x),
+ return (CMPLXF(copysignf(crealf(w), x),
copysignf(cimagf(w), y)));
}
@@ -186,15 +186,15 @@ casinhf(float complex z)
ry = asinf(B);
else
ry = atan2f(new_y, sqrt_A2my2);
- return (cpackf(copysignf(rx, x), copysignf(ry, y)));
+ return (CMPLXF(copysignf(rx, x), copysignf(ry, y)));
}
float complex
casinf(float complex z)
{
- float complex w = casinhf(cpackf(cimagf(z), crealf(z)));
+ float complex w = casinhf(CMPLXF(cimagf(z), crealf(z)));
- return (cpackf(cimagf(w), crealf(w)));
+ return (CMPLXF(cimagf(w), crealf(w)));
}
float complex
@@ -214,12 +214,12 @@ cacosf(float complex z)
if (isnan(x) || isnan(y)) {
if (isinf(x))
- return (cpackf(y + y, -INFINITY));
+ return (CMPLXF(y + y, -INFINITY));
if (isinf(y))
- return (cpackf(x + x, -y));
+ return (CMPLXF(x + x, -y));
if (x == 0)
- return (cpackf(pio2_hi + pio2_lo, y + y));
- return (cpackf(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+ return (CMPLXF(pio2_hi + pio2_lo, y + y));
+ return (CMPLXF(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
}
if (ax > RECIP_EPSILON || ay > RECIP_EPSILON) {
@@ -228,16 +228,16 @@ cacosf(float complex z)
ry = crealf(w) + m_ln2;
if (sy == 0)
ry = -ry;
- return (cpackf(rx, ry));
+ return (CMPLXF(rx, ry));
}
if (x == 1 && y == 0)
- return (cpackf(0, -y));
+ return (CMPLXF(0, -y));
raise_inexact();
if (ax < SQRT_6_EPSILON / 4 && ay < SQRT_6_EPSILON / 4)
- return (cpackf(pio2_hi - (x - pio2_lo), -y));
+ return (CMPLXF(pio2_hi - (x - pio2_lo), -y));
do_hard_work(ay, ax, &ry, &B_is_usable, &B, &sqrt_A2mx2, &new_x);
if (B_is_usable) {
@@ -253,7 +253,7 @@ cacosf(float complex z)
}
if (sy == 0)
ry = -ry;
- return (cpackf(rx, ry));
+ return (CMPLXF(rx, ry));
}
float complex
@@ -266,12 +266,12 @@ cacoshf(float complex z)
rx = crealf(w);
ry = cimagf(w);
if (isnan(rx) && isnan(ry))
- return (cpackf(ry, rx));
+ return (CMPLXF(ry, rx));
if (isnan(rx))
- return (cpackf(fabsf(ry), rx));
+ return (CMPLXF(fabsf(ry), rx));
if (isnan(ry))
- return (cpackf(ry, ry));
- return (cpackf(fabsf(ry), copysignf(rx, cimagf(z))));
+ return (CMPLXF(ry, ry));
+ return (CMPLXF(fabsf(ry), copysignf(rx, cimagf(z))));
}
static float complex
@@ -291,13 +291,13 @@ clog_for_large_values(float complex z)
}
if (ax > FLT_MAX / 2)
- return (cpackf(logf(hypotf(x / m_e, y / m_e)) + 1,
+ return (CMPLXF(logf(hypotf(x / m_e, y / m_e)) + 1,
atan2f(y, x)));
if (ax > QUARTER_SQRT_MAX || ay < SQRT_MIN)
- return (cpackf(logf(hypotf(x, y)), atan2f(y, x)));
+ return (CMPLXF(logf(hypotf(x, y)), atan2f(y, x)));
- return (cpackf(logf(ax * ax + ay * ay) / 2, atan2f(y, x)));
+ return (CMPLXF(logf(ax * ax + ay * ay) / 2, atan2f(y, x)));
}
static inline float
@@ -346,22 +346,22 @@ catanhf(float complex z)
ay = fabsf(y);
if (y == 0 && ax <= 1)
- return (cpackf(atanhf(x), y));
+ return (CMPLXF(atanhf(x), y));
if (x == 0)
- return (cpackf(x, atanf(y)));
+ return (CMPLXF(x, atanf(y)));
if (isnan(x) || isnan(y)) {
if (isinf(x))
- return (cpackf(copysignf(0, x), y + y));
+ return (CMPLXF(copysignf(0, x), y + y));
if (isinf(y))
- return (cpackf(copysignf(0, x),
+ return (CMPLXF(copysignf(0, x),
copysignf(pio2_hi + pio2_lo, y)));
- return (cpackf(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
+ return (CMPLXF(x + 0.0L + (y + 0), x + 0.0L + (y + 0)));
}
if (ax > RECIP_EPSILON || ay > RECIP_EPSILON)
- return (cpackf(real_part_reciprocal(x, y),
+ return (CMPLXF(real_part_reciprocal(x, y),
copysignf(pio2_hi + pio2_lo, y)));
if (ax < SQRT_3_EPSILON / 2 && ay < SQRT_3_EPSILON / 2) {
@@ -381,13 +381,13 @@ catanhf(float complex z)
else
ry = atan2f(2 * ay, (1 - ax) * (1 + ax) - ay * ay) / 2;
- return (cpackf(copysignf(rx, x), copysignf(ry, y)));
+ return (CMPLXF(copysignf(rx, x), copysignf(ry, y)));
}
float complex
catanf(float complex z)
{
- float complex w = catanhf(cpackf(cimagf(z), crealf(z)));
+ float complex w = catanhf(CMPLXF(cimagf(z), crealf(z)));
- return (cpackf(cimagf(w), crealf(w)));
+ return (CMPLXF(cimagf(w), crealf(w)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j0.c b/libm/upstream-freebsd/lib/msun/src/e_j0.c
index 8320f2556..36e72c245 100644
--- a/libm/upstream-freebsd/lib/msun/src/e_j0.c
+++ b/libm/upstream-freebsd/lib/msun/src/e_j0.c
@@ -12,7 +12,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j0.c 283032 2015-05-17 16:27:06Z kargl $");
/* __ieee754_j0(x), __ieee754_y0(x)
* Bessel function of the first and second kinds of order zero.
@@ -62,7 +62,9 @@ __FBSDID("$FreeBSD$");
#include "math.h"
#include "math_private.h"
-static double pzero(double), qzero(double);
+static __inline double pzero(double), qzero(double);
+
+static const volatile double vone = 1, vzero = 0;
static const double
huge = 1e300,
@@ -115,7 +117,7 @@ __ieee754_j0(double x)
if(ix<0x3f200000) { /* |x| < 2**-13 */
if(huge+x>one) { /* raise inexact if x != 0 */
if(ix<0x3e400000) return one; /* |x|<2**-27 */
- else return one - 0.25*x*x;
+ else return one - x*x/4;
}
}
z = x*x;
@@ -150,10 +152,16 @@ __ieee754_y0(double x)
EXTRACT_WORDS(hx,lx,x);
ix = 0x7fffffff&hx;
- /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
- if(ix>=0x7ff00000) return one/(x+x*x);
- if((ix|lx)==0) return -one/zero;
- if(hx<0) return zero/zero;
+ /*
+ * y0(NaN) = NaN.
+ * y0(Inf) = 0.
+ * y0(-Inf) = NaN and raise invalid exception.
+ */
+ if(ix>=0x7ff00000) return vone/(x+x*x);
+ /* y0(+-0) = -inf and raise divide-by-zero exception. */
+ if((ix|lx)==0) return -one/vzero;
+ /* y0(x<0) = NaN and raise invalid exception. */
+ if(hx<0) return vzero/vzero;
if(ix >= 0x40000000) { /* |x| >= 2.0 */
/* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
* where x0 = x-pi/4
@@ -268,7 +276,8 @@ static const double pS2[5] = {
1.46576176948256193810e+01, /* 0x402D50B3, 0x44391809 */
};
- static double pzero(double x)
+static __inline double
+pzero(double x)
{
const double *p,*q;
double z,r,s;
@@ -278,7 +287,7 @@ static const double pS2[5] = {
if(ix>=0x40200000) {p = pR8; q= pS8;}
else if(ix>=0x40122E8B){p = pR5; q= pS5;}
else if(ix>=0x4006DB6D){p = pR3; q= pS3;}
- else if(ix>=0x40000000){p = pR2; q= pS2;}
+ else {p = pR2; q= pS2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
@@ -363,7 +372,8 @@ static const double qS2[6] = {
-5.31095493882666946917e+00, /* 0xC0153E6A, 0xF8B32931 */
};
- static double qzero(double x)
+static __inline double
+qzero(double x)
{
const double *p,*q;
double s,r,z;
@@ -373,7 +383,7 @@ static const double qS2[6] = {
if(ix>=0x40200000) {p = qR8; q= qS8;}
else if(ix>=0x40122E8B){p = qR5; q= qS5;}
else if(ix>=0x4006DB6D){p = qR3; q= qS3;}
- else if(ix>=0x40000000){p = qR2; q= qS2;}
+ else {p = qR2; q= qS2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j0f.c b/libm/upstream-freebsd/lib/msun/src/e_j0f.c
index c45faf325..e53b218c0 100644
--- a/libm/upstream-freebsd/lib/msun/src/e_j0f.c
+++ b/libm/upstream-freebsd/lib/msun/src/e_j0f.c
@@ -14,12 +14,18 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j0f.c 283032 2015-05-17 16:27:06Z kargl $");
+
+/*
+ * See e_j0.c for complete comments.
+ */
#include "math.h"
#include "math_private.h"
-static float pzerof(float), qzerof(float);
+static __inline float pzerof(float), qzerof(float);
+
+static const volatile float vone = 1, vzero = 0;
static const float
huge = 1e30,
@@ -62,17 +68,17 @@ __ieee754_j0f(float x)
* j0(x) = 1/sqrt(pi) * (P(0,x)*cc - Q(0,x)*ss) / sqrt(x)
* y0(x) = 1/sqrt(pi) * (P(0,x)*ss + Q(0,x)*cc) / sqrt(x)
*/
- if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(x);
+ if(ix>0x58000000) z = (invsqrtpi*cc)/sqrtf(x); /* |x|>2**49 */
else {
u = pzerof(x); v = qzerof(x);
z = invsqrtpi*(u*cc-v*ss)/sqrtf(x);
}
return z;
}
- if(ix<0x39000000) { /* |x| < 2**-13 */
+ if(ix<0x3b000000) { /* |x| < 2**-9 */
if(huge+x>one) { /* raise inexact if x != 0 */
- if(ix<0x32000000) return one; /* |x|<2**-27 */
- else return one - (float)0.25*x*x;
+ if(ix<0x39800000) return one; /* |x|<2**-12 */
+ else return one - x*x/4;
}
}
z = x*x;
@@ -107,10 +113,9 @@ __ieee754_y0f(float x)
GET_FLOAT_WORD(hx,x);
ix = 0x7fffffff&hx;
- /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
- if(ix>=0x7f800000) return one/(x+x*x);
- if(ix==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if(ix>=0x7f800000) return vone/(x+x*x);
+ if(ix==0) return -one/vzero;
+ if(hx<0) return vzero/vzero;
if(ix >= 0x40000000) { /* |x| >= 2.0 */
/* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
* where x0 = x-pi/4
@@ -136,14 +141,14 @@ __ieee754_y0f(float x)
if ((s*c)<zero) cc = z/ss;
else ss = z/cc;
}
- if(ix>0x80000000) z = (invsqrtpi*ss)/sqrtf(x);
+ if(ix>0x58000000) z = (invsqrtpi*ss)/sqrtf(x); /* |x|>2**49 */
else {
u = pzerof(x); v = qzerof(x);
z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
}
return z;
}
- if(ix<=0x32000000) { /* x < 2**-27 */
+ if(ix<=0x39000000) { /* x < 2**-13 */
return(u00 + tpi*__ieee754_logf(x));
}
z = x*x;
@@ -224,7 +229,8 @@ static const float pS2[5] = {
1.4657617569e+01, /* 0x416a859a */
};
- static float pzerof(float x)
+static __inline float
+pzerof(float x)
{
const float *p,*q;
float z,r,s;
@@ -232,9 +238,9 @@ static const float pS2[5] = {
GET_FLOAT_WORD(ix,x);
ix &= 0x7fffffff;
if(ix>=0x41000000) {p = pR8; q= pS8;}
- else if(ix>=0x40f71c58){p = pR5; q= pS5;}
- else if(ix>=0x4036db68){p = pR3; q= pS3;}
- else if(ix>=0x40000000){p = pR2; q= pS2;}
+ else if(ix>=0x409173eb){p = pR5; q= pS5;}
+ else if(ix>=0x4036d917){p = pR3; q= pS3;}
+ else {p = pR2; q= pS2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
@@ -319,7 +325,8 @@ static const float qS2[6] = {
-5.3109550476e+00, /* 0xc0a9f358 */
};
- static float qzerof(float x)
+static __inline float
+qzerof(float x)
{
const float *p,*q;
float s,r,z;
@@ -327,9 +334,9 @@ static const float qS2[6] = {
GET_FLOAT_WORD(ix,x);
ix &= 0x7fffffff;
if(ix>=0x41000000) {p = qR8; q= qS8;}
- else if(ix>=0x40f71c58){p = qR5; q= qS5;}
- else if(ix>=0x4036db68){p = qR3; q= qS3;}
- else if(ix>=0x40000000){p = qR2; q= qS2;}
+ else if(ix>=0x409173eb){p = qR5; q= qS5;}
+ else if(ix>=0x4036d917){p = qR3; q= qS3;}
+ else {p = qR2; q= qS2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j1.c b/libm/upstream-freebsd/lib/msun/src/e_j1.c
index 63800ad4b..b11ac2d95 100644
--- a/libm/upstream-freebsd/lib/msun/src/e_j1.c
+++ b/libm/upstream-freebsd/lib/msun/src/e_j1.c
@@ -12,7 +12,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j1.c 283032 2015-05-17 16:27:06Z kargl $");
/* __ieee754_j1(x), __ieee754_y1(x)
* Bessel function of the first and second kinds of order zero.
@@ -62,7 +62,9 @@ __FBSDID("$FreeBSD$");
#include "math.h"
#include "math_private.h"
-static double pone(double), qone(double);
+static __inline double pone(double), qone(double);
+
+static const volatile double vone = 1, vzero = 0;
static const double
huge = 1e300,
@@ -147,10 +149,16 @@ __ieee754_y1(double x)
EXTRACT_WORDS(hx,lx,x);
ix = 0x7fffffff&hx;
- /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
- if(ix>=0x7ff00000) return one/(x+x*x);
- if((ix|lx)==0) return -one/zero;
- if(hx<0) return zero/zero;
+ /*
+ * y1(NaN) = NaN.
+ * y1(Inf) = 0.
+ * y1(-Inf) = NaN and raise invalid exception.
+ */
+ if(ix>=0x7ff00000) return vone/(x+x*x);
+ /* y1(+-0) = -inf and raise divide-by-zero exception. */
+ if((ix|lx)==0) return -one/vzero;
+ /* y1(x<0) = NaN and raise invalid exception. */
+ if(hx<0) return vzero/vzero;
if(ix >= 0x40000000) { /* |x| >= 2.0 */
s = sin(x);
c = cos(x);
@@ -262,7 +270,8 @@ static const double ps2[5] = {
8.36463893371618283368e+00, /* 0x4020BAB1, 0xF44E5192 */
};
- static double pone(double x)
+static __inline double
+pone(double x)
{
const double *p,*q;
double z,r,s;
@@ -272,7 +281,7 @@ static const double ps2[5] = {
if(ix>=0x40200000) {p = pr8; q= ps8;}
else if(ix>=0x40122E8B){p = pr5; q= ps5;}
else if(ix>=0x4006DB6D){p = pr3; q= ps3;}
- else if(ix>=0x40000000){p = pr2; q= ps2;}
+ else {p = pr2; q= ps2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
@@ -358,7 +367,8 @@ static const double qs2[6] = {
-4.95949898822628210127e+00, /* 0xC013D686, 0xE71BE86B */
};
- static double qone(double x)
+static __inline double
+qone(double x)
{
const double *p,*q;
double s,r,z;
@@ -368,7 +378,7 @@ static const double qs2[6] = {
if(ix>=0x40200000) {p = qr8; q= qs8;}
else if(ix>=0x40122E8B){p = qr5; q= qs5;}
else if(ix>=0x4006DB6D){p = qr3; q= qs3;}
- else if(ix>=0x40000000){p = qr2; q= qs2;}
+ else {p = qr2; q= qs2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
diff --git a/libm/upstream-freebsd/lib/msun/src/e_j1f.c b/libm/upstream-freebsd/lib/msun/src/e_j1f.c
index 88e2d833d..0cca823b7 100644
--- a/libm/upstream-freebsd/lib/msun/src/e_j1f.c
+++ b/libm/upstream-freebsd/lib/msun/src/e_j1f.c
@@ -14,12 +14,18 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/e_j1f.c 283032 2015-05-17 16:27:06Z kargl $");
+
+/*
+ * See e_j1.c for complete comments.
+ */
#include "math.h"
#include "math_private.h"
-static float ponef(float), qonef(float);
+static __inline float ponef(float), qonef(float);
+
+static const volatile float vone = 1, vzero = 0;
static const float
huge = 1e30,
@@ -63,7 +69,7 @@ __ieee754_j1f(float x)
* j1(x) = 1/sqrt(pi) * (P(1,x)*cc - Q(1,x)*ss) / sqrt(x)
* y1(x) = 1/sqrt(pi) * (P(1,x)*ss + Q(1,x)*cc) / sqrt(x)
*/
- if(ix>0x80000000) z = (invsqrtpi*cc)/sqrtf(y);
+ if(ix>0x58000000) z = (invsqrtpi*cc)/sqrtf(y); /* |x|>2**49 */
else {
u = ponef(y); v = qonef(y);
z = invsqrtpi*(u*cc-v*ss)/sqrtf(y);
@@ -71,7 +77,7 @@ __ieee754_j1f(float x)
if(hx<0) return -z;
else return z;
}
- if(ix<0x32000000) { /* |x|<2**-27 */
+ if(ix<0x39000000) { /* |x|<2**-13 */
if(huge+x>one) return (float)0.5*x;/* inexact if x!=0 necessary */
}
z = x*x;
@@ -104,10 +110,9 @@ __ieee754_y1f(float x)
GET_FLOAT_WORD(hx,x);
ix = 0x7fffffff&hx;
- /* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
- if(ix>=0x7f800000) return one/(x+x*x);
- if(ix==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if(ix>=0x7f800000) return vone/(x+x*x);
+ if(ix==0) return -one/vzero;
+ if(hx<0) return vzero/vzero;
if(ix >= 0x40000000) { /* |x| >= 2.0 */
s = sinf(x);
c = cosf(x);
@@ -129,14 +134,14 @@ __ieee754_y1f(float x)
* sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
* to compute the worse one.
*/
- if(ix>0x48000000) z = (invsqrtpi*ss)/sqrtf(x);
+ if(ix>0x58000000) z = (invsqrtpi*ss)/sqrtf(x); /* |x|>2**49 */
else {
u = ponef(x); v = qonef(x);
z = invsqrtpi*(u*ss+v*cc)/sqrtf(x);
}
return z;
}
- if(ix<=0x24800000) { /* x < 2**-54 */
+ if(ix<=0x33000000) { /* x < 2**-25 */
return(-tpi/x);
}
z = x*x;
@@ -219,7 +224,8 @@ static const float ps2[5] = {
8.3646392822e+00, /* 0x4105d590 */
};
- static float ponef(float x)
+static __inline float
+ponef(float x)
{
const float *p,*q;
float z,r,s;
@@ -227,9 +233,9 @@ static const float ps2[5] = {
GET_FLOAT_WORD(ix,x);
ix &= 0x7fffffff;
if(ix>=0x41000000) {p = pr8; q= ps8;}
- else if(ix>=0x40f71c58){p = pr5; q= ps5;}
- else if(ix>=0x4036db68){p = pr3; q= ps3;}
- else if(ix>=0x40000000){p = pr2; q= ps2;}
+ else if(ix>=0x409173eb){p = pr5; q= ps5;}
+ else if(ix>=0x4036d917){p = pr3; q= ps3;}
+ else {p = pr2; q= ps2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*q[4]))));
@@ -315,17 +321,18 @@ static const float qs2[6] = {
-4.9594988823e+00, /* 0xc09eb437 */
};
- static float qonef(float x)
+static __inline float
+qonef(float x)
{
const float *p,*q;
float s,r,z;
int32_t ix;
GET_FLOAT_WORD(ix,x);
ix &= 0x7fffffff;
- if(ix>=0x40200000) {p = qr8; q= qs8;}
- else if(ix>=0x40f71c58){p = qr5; q= qs5;}
- else if(ix>=0x4036db68){p = qr3; q= qs3;}
- else if(ix>=0x40000000){p = qr2; q= qs2;}
+ if(ix>=0x41000000) {p = qr8; q= qs8;}
+ else if(ix>=0x409173eb){p = qr5; q= qs5;}
+ else if(ix>=0x4036d917){p = qr3; q= qs3;}
+ else {p = qr2; q= qs2;} /* ix>=0x40000000 */
z = one/(x*x);
r = p[0]+z*(p[1]+z*(p[2]+z*(p[3]+z*(p[4]+z*p[5]))));
s = one+z*(q[0]+z*(q[1]+z*(q[2]+z*(q[3]+z*(q[4]+z*q[5])))));
diff --git a/libm/upstream-freebsd/lib/msun/src/e_jn.c b/libm/upstream-freebsd/lib/msun/src/e_jn.c
index 8b0bc62ef..a1130c5d0 100644
--- a/libm/upstream-freebsd/lib/msun/src/e_jn.c
+++ b/libm/upstream-freebsd/lib/msun/src/e_jn.c
@@ -12,7 +12,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/e_jn.c 279856 2015-03-10 17:10:54Z kargl $");
/*
* __ieee754_jn(n, x), __ieee754_yn(n, x)
@@ -43,6 +43,8 @@ __FBSDID("$FreeBSD$");
#include "math.h"
#include "math_private.h"
+static const volatile double vone = 1, vzero = 0;
+
static const double
invsqrtpi= 5.64189583547756279280e-01, /* 0x3FE20DD7, 0x50429B6D */
two = 2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */
@@ -220,10 +222,12 @@ __ieee754_yn(int n, double x)
EXTRACT_WORDS(hx,lx,x);
ix = 0x7fffffff&hx;
- /* if Y(n,NaN) is NaN */
+ /* yn(n,NaN) = NaN */
if((ix|((u_int32_t)(lx|-lx))>>31)>0x7ff00000) return x+x;
- if((ix|lx)==0) return -one/zero;
- if(hx<0) return zero/zero;
+ /* yn(n,+-0) = -inf and raise divide-by-zero exception. */
+ if((ix|lx)==0) return -one/vzero;
+ /* yn(n,x<0) = NaN and raise invalid exception. */
+ if(hx<0) return vzero/vzero;
sign = 1;
if(n<0){
n = -n;
diff --git a/libm/upstream-freebsd/lib/msun/src/e_jnf.c b/libm/upstream-freebsd/lib/msun/src/e_jnf.c
index f564aeccd..c82d5cf95 100644
--- a/libm/upstream-freebsd/lib/msun/src/e_jnf.c
+++ b/libm/upstream-freebsd/lib/msun/src/e_jnf.c
@@ -14,11 +14,17 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/e_jnf.c 279856 2015-03-10 17:10:54Z kargl $");
+
+/*
+ * See e_jn.c for complete comments.
+ */
#include "math.h"
#include "math_private.h"
+static const volatile float vone = 1, vzero = 0;
+
static const float
two = 2.0000000000e+00, /* 0x40000000 */
one = 1.0000000000e+00; /* 0x3F800000 */
@@ -172,10 +178,9 @@ __ieee754_ynf(int n, float x)
GET_FLOAT_WORD(hx,x);
ix = 0x7fffffff&hx;
- /* if Y(n,NaN) is NaN */
if(ix>0x7f800000) return x+x;
- if(ix==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if(ix==0) return -one/vzero;
+ if(hx<0) return vzero/vzero;
sign = 1;
if(n<0){
n = -n;
diff --git a/libm/upstream-freebsd/lib/msun/src/k_exp.c b/libm/upstream-freebsd/lib/msun/src/k_exp.c
index f592f69aa..5aa3ef378 100644
--- a/libm/upstream-freebsd/lib/msun/src/k_exp.c
+++ b/libm/upstream-freebsd/lib/msun/src/k_exp.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/k_exp.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
@@ -103,6 +103,6 @@ __ldexp_cexp(double complex z, int expt)
half_expt = expt - half_expt;
INSERT_WORDS(scale2, (0x3ff + half_expt) << 20, 0);
- return (cpack(cos(y) * exp_x * scale1 * scale2,
+ return (CMPLX(cos(y) * exp_x * scale1 * scale2,
sin(y) * exp_x * scale1 * scale2));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/k_expf.c b/libm/upstream-freebsd/lib/msun/src/k_expf.c
index 548a008f8..8fe8c4670 100644
--- a/libm/upstream-freebsd/lib/msun/src/k_expf.c
+++ b/libm/upstream-freebsd/lib/msun/src/k_expf.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/k_expf.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
@@ -82,6 +82,6 @@ __ldexp_cexpf(float complex z, int expt)
half_expt = expt - half_expt;
SET_FLOAT_WORD(scale2, (0x7f + half_expt) << 23);
- return (cpackf(cosf(y) * exp_x * scale1 * scale2,
+ return (CMPLXF(cosf(y) * exp_x * scale1 * scale2,
sinf(y) * exp_x * scale1 * scale2));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/math_private.h b/libm/upstream-freebsd/lib/msun/src/math_private.h
index 8af2c650e..1f10e8b9a 100644
--- a/libm/upstream-freebsd/lib/msun/src/math_private.h
+++ b/libm/upstream-freebsd/lib/msun/src/math_private.h
@@ -11,7 +11,7 @@
/*
* from: @(#)fdlibm.h 5.1 93/09/24
- * $FreeBSD$
+ * $FreeBSD: head/lib/msun/src/math_private.h 276176 2014-12-24 10:13:53Z ed $
*/
#ifndef _MATH_PRIVATE_H_
@@ -454,9 +454,15 @@ typedef union {
* (0.0+I)*(y+0.0*I) and laboriously computing the full complex product.
* In particular, I*Inf is corrupted to NaN+I*Inf, and I*-0 is corrupted
* to -0.0+I*0.0.
+ *
+ * The C11 standard introduced the macros CMPLX(), CMPLXF() and CMPLXL()
+ * to construct complex values. Compilers that conform to the C99
+ * standard require the following functions to avoid the above issues.
*/
+
+#ifndef CMPLXF
static __inline float complex
-cpackf(float x, float y)
+CMPLXF(float x, float y)
{
float_complex z;
@@ -464,9 +470,11 @@ cpackf(float x, float y)
IMAGPART(z) = y;
return (z.f);
}
+#endif
+#ifndef CMPLX
static __inline double complex
-cpack(double x, double y)
+CMPLX(double x, double y)
{
double_complex z;
@@ -474,9 +482,11 @@ cpack(double x, double y)
IMAGPART(z) = y;
return (z.f);
}
+#endif
+#ifndef CMPLXL
static __inline long double complex
-cpackl(long double x, long double y)
+CMPLXL(long double x, long double y)
{
long_double_complex z;
@@ -484,6 +494,8 @@ cpackl(long double x, long double y)
IMAGPART(z) = y;
return (z.f);
}
+#endif
+
#endif /* _COMPLEX_H */
#ifdef __GNUCLIKE_ASM
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ccosh.c b/libm/upstream-freebsd/lib/msun/src/s_ccosh.c
index 9ea962b48..e544e9140 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_ccosh.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_ccosh.c
@@ -32,10 +32,12 @@
*
* Exceptional values are noted in the comments within the source code.
* These values and the return value were taken from n1124.pdf.
+ * The sign of the result for some exceptional values is unspecified but
+ * must satisfy both cosh(conj(z)) == conj(cosh(z)) and cosh(-z) == cosh(z).
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ccosh.c 284423 2015-06-15 20:11:06Z tijl $");
#include <complex.h>
#include <math.h>
@@ -62,49 +64,48 @@ ccosh(double complex z)
/* Handle the nearly-non-exceptional cases where x and y are finite. */
if (ix < 0x7ff00000 && iy < 0x7ff00000) {
if ((iy | ly) == 0)
- return (cpack(cosh(x), x * y));
- if (ix < 0x40360000) /* small x: normal case */
- return (cpack(cosh(x) * cos(y), sinh(x) * sin(y)));
+ return (CMPLX(cosh(x), x * y));
+ if (ix < 0x40360000) /* |x| < 22: normal case */
+ return (CMPLX(cosh(x) * cos(y), sinh(x) * sin(y)));
/* |x| >= 22, so cosh(x) ~= exp(|x|) */
if (ix < 0x40862e42) {
/* x < 710: exp(|x|) won't overflow */
h = exp(fabs(x)) * 0.5;
- return (cpack(h * cos(y), copysign(h, x) * sin(y)));
+ return (CMPLX(h * cos(y), copysign(h, x) * sin(y)));
} else if (ix < 0x4096bbaa) {
/* x < 1455: scale to avoid overflow */
- z = __ldexp_cexp(cpack(fabs(x), y), -1);
- return (cpack(creal(z), cimag(z) * copysign(1, x)));
+ z = __ldexp_cexp(CMPLX(fabs(x), y), -1);
+ return (CMPLX(creal(z), cimag(z) * copysign(1, x)));
} else {
/* x >= 1455: the result always overflows */
h = huge * x;
- return (cpack(h * h * cos(y), h * sin(y)));
+ return (CMPLX(h * h * cos(y), h * sin(y)));
}
}
/*
- * cosh(+-0 +- I Inf) = dNaN + I sign(d(+-0, dNaN))0.
- * The sign of 0 in the result is unspecified. Choice = normally
- * the same as dNaN. Raise the invalid floating-point exception.
+ * cosh(+-0 +- I Inf) = dNaN + I (+-)(+-)0.
+ * The sign of 0 in the result is unspecified. Choice = product
+ * of the signs of the argument. Raise the invalid floating-point
+ * exception.
*
- * cosh(+-0 +- I NaN) = d(NaN) + I sign(d(+-0, NaN))0.
- * The sign of 0 in the result is unspecified. Choice = normally
- * the same as d(NaN).
+ * cosh(+-0 +- I NaN) = d(NaN) + I (+-)(+-)0.
+ * The sign of 0 in the result is unspecified. Choice = product
+ * of the signs of the argument.
*/
- if ((ix | lx) == 0 && iy >= 0x7ff00000)
- return (cpack(y - y, copysign(0, x * (y - y))));
+ if ((ix | lx) == 0) /* && iy >= 0x7ff00000 */
+ return (CMPLX(y - y, x * copysign(0, y)));
/*
* cosh(+-Inf +- I 0) = +Inf + I (+-)(+-)0.
*
- * cosh(NaN +- I 0) = d(NaN) + I sign(d(NaN, +-0))0.
- * The sign of 0 in the result is unspecified.
+ * cosh(NaN +- I 0) = d(NaN) + I (+-)(+-)0.
+ * The sign of 0 in the result is unspecified. Choice = product
+ * of the signs of the argument.
*/
- if ((iy | ly) == 0 && ix >= 0x7ff00000) {
- if (((hx & 0xfffff) | lx) == 0)
- return (cpack(x * x, copysign(0, x) * y));
- return (cpack(x * x, copysign(0, (x + x) * y)));
- }
+ if ((iy | ly) == 0) /* && ix >= 0x7ff00000 */
+ return (CMPLX(x * x, copysign(0, x) * y));
/*
* cosh(x +- I Inf) = dNaN + I dNaN.
@@ -114,8 +115,8 @@ ccosh(double complex z)
* Optionally raises the invalid floating-point exception for finite
* nonzero x. Choice = don't raise (except for signaling NaNs).
*/
- if (ix < 0x7ff00000 && iy >= 0x7ff00000)
- return (cpack(y - y, x * (y - y)));
+ if (ix < 0x7ff00000) /* && iy >= 0x7ff00000 */
+ return (CMPLX(y - y, x * (y - y)));
/*
* cosh(+-Inf + I NaN) = +Inf + I d(NaN).
@@ -126,10 +127,10 @@ ccosh(double complex z)
*
* cosh(+-Inf + I y) = +Inf cos(y) +- I Inf sin(y)
*/
- if (ix >= 0x7ff00000 && ((hx & 0xfffff) | lx) == 0) {
+ if (ix == 0x7ff00000 && lx == 0) {
if (iy >= 0x7ff00000)
- return (cpack(x * x, x * (y - y)));
- return (cpack((x * x) * cos(y), x * sin(y)));
+ return (CMPLX(INFINITY, x * (y - y)));
+ return (CMPLX(INFINITY * cos(y), x * sin(y)));
}
/*
@@ -143,7 +144,7 @@ ccosh(double complex z)
* Optionally raises the invalid floating-point exception for finite
* nonzero y. Choice = don't raise (except for signaling NaNs).
*/
- return (cpack((x * x) * (y - y), (x + x) * (y - y)));
+ return (CMPLX((x * x) * (y - y), (x + x) * (y - y)));
}
double complex
@@ -151,5 +152,5 @@ ccos(double complex z)
{
/* ccos(z) = ccosh(I * z) */
- return (ccosh(cpack(-cimag(z), creal(z))));
+ return (ccosh(CMPLX(-cimag(z), creal(z))));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ccoshf.c b/libm/upstream-freebsd/lib/msun/src/s_ccoshf.c
index 1de9ad443..e33840a75 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_ccoshf.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_ccoshf.c
@@ -25,11 +25,11 @@
*/
/*
- * Hyperbolic cosine of a complex argument. See s_ccosh.c for details.
+ * Float version of ccosh(). See s_ccosh.c for details.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ccoshf.c 284423 2015-06-15 20:11:06Z tijl $");
#include <complex.h>
#include <math.h>
@@ -55,50 +55,47 @@ ccoshf(float complex z)
if (ix < 0x7f800000 && iy < 0x7f800000) {
if (iy == 0)
- return (cpackf(coshf(x), x * y));
- if (ix < 0x41100000) /* small x: normal case */
- return (cpackf(coshf(x) * cosf(y), sinhf(x) * sinf(y)));
+ return (CMPLXF(coshf(x), x * y));
+ if (ix < 0x41100000) /* |x| < 9: normal case */
+ return (CMPLXF(coshf(x) * cosf(y), sinhf(x) * sinf(y)));
/* |x| >= 9, so cosh(x) ~= exp(|x|) */
if (ix < 0x42b17218) {
/* x < 88.7: expf(|x|) won't overflow */
- h = expf(fabsf(x)) * 0.5f;
- return (cpackf(h * cosf(y), copysignf(h, x) * sinf(y)));
+ h = expf(fabsf(x)) * 0.5F;
+ return (CMPLXF(h * cosf(y), copysignf(h, x) * sinf(y)));
} else if (ix < 0x4340b1e7) {
/* x < 192.7: scale to avoid overflow */
- z = __ldexp_cexpf(cpackf(fabsf(x), y), -1);
- return (cpackf(crealf(z), cimagf(z) * copysignf(1, x)));
+ z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1);
+ return (CMPLXF(crealf(z), cimagf(z) * copysignf(1, x)));
} else {
/* x >= 192.7: the result always overflows */
h = huge * x;
- return (cpackf(h * h * cosf(y), h * sinf(y)));
+ return (CMPLXF(h * h * cosf(y), h * sinf(y)));
}
}
- if (ix == 0 && iy >= 0x7f800000)
- return (cpackf(y - y, copysignf(0, x * (y - y))));
+ if (ix == 0) /* && iy >= 0x7f800000 */
+ return (CMPLXF(y - y, x * copysignf(0, y)));
- if (iy == 0 && ix >= 0x7f800000) {
- if ((hx & 0x7fffff) == 0)
- return (cpackf(x * x, copysignf(0, x) * y));
- return (cpackf(x * x, copysignf(0, (x + x) * y)));
- }
+ if (iy == 0) /* && ix >= 0x7f800000 */
+ return (CMPLXF(x * x, copysignf(0, x) * y));
- if (ix < 0x7f800000 && iy >= 0x7f800000)
- return (cpackf(y - y, x * (y - y)));
+ if (ix < 0x7f800000) /* && iy >= 0x7f800000 */
+ return (CMPLXF(y - y, x * (y - y)));
- if (ix >= 0x7f800000 && (hx & 0x7fffff) == 0) {
+ if (ix == 0x7f800000) {
if (iy >= 0x7f800000)
- return (cpackf(x * x, x * (y - y)));
- return (cpackf((x * x) * cosf(y), x * sinf(y)));
+ return (CMPLXF(INFINITY, x * (y - y)));
+ return (CMPLXF(INFINITY * cosf(y), x * sinf(y)));
}
- return (cpackf((x * x) * (y - y), (x + x) * (y - y)));
+ return (CMPLXF((x * x) * (y - y), (x + x) * (y - y)));
}
float complex
ccosf(float complex z)
{
- return (ccoshf(cpackf(-cimagf(z), crealf(z))));
+ return (ccoshf(CMPLXF(-cimagf(z), crealf(z))));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cexp.c b/libm/upstream-freebsd/lib/msun/src/s_cexp.c
index abe178f31..660a68d75 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_cexp.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_cexp.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cexp.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <math.h>
@@ -50,22 +50,22 @@ cexp(double complex z)
/* cexp(x + I 0) = exp(x) + I 0 */
if ((hy | ly) == 0)
- return (cpack(exp(x), y));
+ return (CMPLX(exp(x), y));
EXTRACT_WORDS(hx, lx, x);
/* cexp(0 + I y) = cos(y) + I sin(y) */
if (((hx & 0x7fffffff) | lx) == 0)
- return (cpack(cos(y), sin(y)));
+ return (CMPLX(cos(y), sin(y)));
if (hy >= 0x7ff00000) {
if (lx != 0 || (hx & 0x7fffffff) != 0x7ff00000) {
/* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */
- return (cpack(y - y, y - y));
+ return (CMPLX(y - y, y - y));
} else if (hx & 0x80000000) {
/* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */
- return (cpack(0.0, 0.0));
+ return (CMPLX(0.0, 0.0));
} else {
/* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */
- return (cpack(x, y - y));
+ return (CMPLX(x, y - y));
}
}
@@ -84,6 +84,6 @@ cexp(double complex z)
* - x = NaN (spurious inexact exception from y)
*/
exp_x = exp(x);
- return (cpack(exp_x * cos(y), exp_x * sin(y)));
+ return (CMPLX(exp_x * cos(y), exp_x * sin(y)));
}
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cexpf.c b/libm/upstream-freebsd/lib/msun/src/s_cexpf.c
index 0e30d08c8..709ad474f 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_cexpf.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_cexpf.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cexpf.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <math.h>
@@ -50,22 +50,22 @@ cexpf(float complex z)
/* cexp(x + I 0) = exp(x) + I 0 */
if (hy == 0)
- return (cpackf(expf(x), y));
+ return (CMPLXF(expf(x), y));
GET_FLOAT_WORD(hx, x);
/* cexp(0 + I y) = cos(y) + I sin(y) */
if ((hx & 0x7fffffff) == 0)
- return (cpackf(cosf(y), sinf(y)));
+ return (CMPLXF(cosf(y), sinf(y)));
if (hy >= 0x7f800000) {
if ((hx & 0x7fffffff) != 0x7f800000) {
/* cexp(finite|NaN +- I Inf|NaN) = NaN + I NaN */
- return (cpackf(y - y, y - y));
+ return (CMPLXF(y - y, y - y));
} else if (hx & 0x80000000) {
/* cexp(-Inf +- I Inf|NaN) = 0 + I 0 */
- return (cpackf(0.0, 0.0));
+ return (CMPLXF(0.0, 0.0));
} else {
/* cexp(+Inf +- I Inf|NaN) = Inf + I NaN */
- return (cpackf(x, y - y));
+ return (CMPLXF(x, y - y));
}
}
@@ -84,6 +84,6 @@ cexpf(float complex z)
* - x = NaN (spurious inexact exception from y)
*/
exp_x = expf(x);
- return (cpackf(exp_x * cosf(y), exp_x * sinf(y)));
+ return (CMPLXF(exp_x * cosf(y), exp_x * sinf(y)));
}
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_conj.c b/libm/upstream-freebsd/lib/msun/src/s_conj.c
index 5770c2946..61fac6356 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_conj.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_conj.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD$
+ * $FreeBSD: head/lib/msun/src/s_conj.c 275819 2014-12-16 09:21:56Z ed $
*/
#include <complex.h>
@@ -34,5 +34,5 @@ double complex
conj(double complex z)
{
- return (cpack(creal(z), -cimag(z)));
+ return (CMPLX(creal(z), -cimag(z)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_conjf.c b/libm/upstream-freebsd/lib/msun/src/s_conjf.c
index b09076039..83c9ef0f2 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_conjf.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_conjf.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD$
+ * $FreeBSD: head/lib/msun/src/s_conjf.c 275819 2014-12-16 09:21:56Z ed $
*/
#include <complex.h>
@@ -34,5 +34,5 @@ float complex
conjf(float complex z)
{
- return (cpackf(crealf(z), -cimagf(z)));
+ return (CMPLXF(crealf(z), -cimagf(z)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_conjl.c b/libm/upstream-freebsd/lib/msun/src/s_conjl.c
index 0e431efa0..d9e6a1640 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_conjl.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_conjl.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD$
+ * $FreeBSD: head/lib/msun/src/s_conjl.c 275819 2014-12-16 09:21:56Z ed $
*/
#include <complex.h>
@@ -34,5 +34,5 @@ long double complex
conjl(long double complex z)
{
- return (cpackl(creall(z), -cimagl(z)));
+ return (CMPLXL(creall(z), -cimagl(z)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cproj.c b/libm/upstream-freebsd/lib/msun/src/s_cproj.c
index 8e9404c29..ec2266e08 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_cproj.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_cproj.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cproj.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <math.h>
@@ -39,7 +39,7 @@ cproj(double complex z)
if (!isinf(creal(z)) && !isinf(cimag(z)))
return (z);
else
- return (cpack(INFINITY, copysign(0.0, cimag(z))));
+ return (CMPLX(INFINITY, copysign(0.0, cimag(z))));
}
#if LDBL_MANT_DIG == 53
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cprojf.c b/libm/upstream-freebsd/lib/msun/src/s_cprojf.c
index 68ea77b80..63af75f40 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_cprojf.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_cprojf.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cprojf.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <math.h>
@@ -39,5 +39,5 @@ cprojf(float complex z)
if (!isinf(crealf(z)) && !isinf(cimagf(z)))
return (z);
else
- return (cpackf(INFINITY, copysignf(0.0, cimagf(z))));
+ return (CMPLXF(INFINITY, copysignf(0.0, cimagf(z))));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_cprojl.c b/libm/upstream-freebsd/lib/msun/src/s_cprojl.c
index 07385bcc6..8386f816e 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_cprojl.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_cprojl.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_cprojl.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <math.h>
@@ -39,5 +39,5 @@ cprojl(long double complex z)
if (!isinf(creall(z)) && !isinf(cimagl(z)))
return (z);
else
- return (cpackl(INFINITY, copysignl(0.0, cimagl(z))));
+ return (CMPLXL(INFINITY, copysignl(0.0, cimagl(z))));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csinh.c b/libm/upstream-freebsd/lib/msun/src/s_csinh.c
index c192f3030..cff140241 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_csinh.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_csinh.c
@@ -32,10 +32,12 @@
*
* Exceptional values are noted in the comments within the source code.
* These values and the return value were taken from n1124.pdf.
+ * The sign of the result for some exceptional values is unspecified but
+ * must satisfy both sinh(conj(z)) == conj(sinh(z)) and sinh(-z) == -sinh(z).
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csinh.c 284426 2015-06-15 20:16:53Z tijl $");
#include <complex.h>
#include <math.h>
@@ -62,48 +64,45 @@ csinh(double complex z)
/* Handle the nearly-non-exceptional cases where x and y are finite. */
if (ix < 0x7ff00000 && iy < 0x7ff00000) {
if ((iy | ly) == 0)
- return (cpack(sinh(x), y));
- if (ix < 0x40360000) /* small x: normal case */
- return (cpack(sinh(x) * cos(y), cosh(x) * sin(y)));
+ return (CMPLX(sinh(x), y));
+ if (ix < 0x40360000) /* |x| < 22: normal case */
+ return (CMPLX(sinh(x) * cos(y), cosh(x) * sin(y)));
/* |x| >= 22, so cosh(x) ~= exp(|x|) */
if (ix < 0x40862e42) {
/* x < 710: exp(|x|) won't overflow */
h = exp(fabs(x)) * 0.5;
- return (cpack(copysign(h, x) * cos(y), h * sin(y)));
+ return (CMPLX(copysign(h, x) * cos(y), h * sin(y)));
} else if (ix < 0x4096bbaa) {
/* x < 1455: scale to avoid overflow */
- z = __ldexp_cexp(cpack(fabs(x), y), -1);
- return (cpack(creal(z) * copysign(1, x), cimag(z)));
+ z = __ldexp_cexp(CMPLX(fabs(x), y), -1);
+ return (CMPLX(creal(z) * copysign(1, x), cimag(z)));
} else {
/* x >= 1455: the result always overflows */
h = huge * x;
- return (cpack(h * cos(y), h * h * sin(y)));
+ return (CMPLX(h * cos(y), h * h * sin(y)));
}
}
/*
- * sinh(+-0 +- I Inf) = sign(d(+-0, dNaN))0 + I dNaN.
- * The sign of 0 in the result is unspecified. Choice = normally
- * the same as dNaN. Raise the invalid floating-point exception.
+ * sinh(+-0 +- I Inf) = +-0 + I dNaN.
+ * The sign of 0 in the result is unspecified. Choice = same sign
+ * as the argument. Raise the invalid floating-point exception.
*
- * sinh(+-0 +- I NaN) = sign(d(+-0, NaN))0 + I d(NaN).
- * The sign of 0 in the result is unspecified. Choice = normally
- * the same as d(NaN).
+ * sinh(+-0 +- I NaN) = +-0 + I d(NaN).
+ * The sign of 0 in the result is unspecified. Choice = same sign
+ * as the argument.
*/
- if ((ix | lx) == 0 && iy >= 0x7ff00000)
- return (cpack(copysign(0, x * (y - y)), y - y));
+ if ((ix | lx) == 0) /* && iy >= 0x7ff00000 */
+ return (CMPLX(x, y - y));
/*
* sinh(+-Inf +- I 0) = +-Inf + I +-0.
*
* sinh(NaN +- I 0) = d(NaN) + I +-0.
*/
- if ((iy | ly) == 0 && ix >= 0x7ff00000) {
- if (((hx & 0xfffff) | lx) == 0)
- return (cpack(x, y));
- return (cpack(x, copysign(0, y)));
- }
+ if ((iy | ly) == 0) /* && ix >= 0x7ff00000 */
+ return (CMPLX(x + x, y));
/*
* sinh(x +- I Inf) = dNaN + I dNaN.
@@ -113,45 +112,45 @@ csinh(double complex z)
* Optionally raises the invalid floating-point exception for finite
* nonzero x. Choice = don't raise (except for signaling NaNs).
*/
- if (ix < 0x7ff00000 && iy >= 0x7ff00000)
- return (cpack(y - y, x * (y - y)));
+ if (ix < 0x7ff00000) /* && iy >= 0x7ff00000 */
+ return (CMPLX(y - y, y - y));
/*
* sinh(+-Inf + I NaN) = +-Inf + I d(NaN).
- * The sign of Inf in the result is unspecified. Choice = normally
- * the same as d(NaN).
+ * The sign of Inf in the result is unspecified. Choice = same sign
+ * as the argument.
*
- * sinh(+-Inf +- I Inf) = +Inf + I dNaN.
- * The sign of Inf in the result is unspecified. Choice = always +.
- * Raise the invalid floating-point exception.
+ * sinh(+-Inf +- I Inf) = +-Inf + I dNaN.
+ * The sign of Inf in the result is unspecified. Choice = same sign
+ * as the argument. Raise the invalid floating-point exception.
*
* sinh(+-Inf + I y) = +-Inf cos(y) + I Inf sin(y)
*/
- if (ix >= 0x7ff00000 && ((hx & 0xfffff) | lx) == 0) {
+ if (ix == 0x7ff00000 && lx == 0) {
if (iy >= 0x7ff00000)
- return (cpack(x * x, x * (y - y)));
- return (cpack(x * cos(y), INFINITY * sin(y)));
+ return (CMPLX(x, y - y));
+ return (CMPLX(x * cos(y), INFINITY * sin(y)));
}
/*
- * sinh(NaN + I NaN) = d(NaN) + I d(NaN).
+ * sinh(NaN1 + I NaN2) = d(NaN1, NaN2) + I d(NaN1, NaN2).
*
- * sinh(NaN +- I Inf) = d(NaN) + I d(NaN).
+ * sinh(NaN +- I Inf) = d(NaN, dNaN) + I d(NaN, dNaN).
* Optionally raises the invalid floating-point exception.
* Choice = raise.
*
- * sinh(NaN + I y) = d(NaN) + I d(NaN).
+ * sinh(NaN + I y) = d(NaN) + I d(NaN).
* Optionally raises the invalid floating-point exception for finite
* nonzero y. Choice = don't raise (except for signaling NaNs).
*/
- return (cpack((x * x) * (y - y), (x + x) * (y - y)));
+ return (CMPLX((x + x) * (y - y), (x * x) * (y - y)));
}
double complex
csin(double complex z)
{
- /* csin(z) = -I * csinh(I * z) */
- z = csinh(cpack(-cimag(z), creal(z)));
- return (cpack(cimag(z), -creal(z)));
+ /* csin(z) = -I * csinh(I * z) = I * conj(csinh(I * conj(z))). */
+ z = csinh(CMPLX(cimag(z), creal(z)));
+ return (CMPLX(cimag(z), creal(z)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csinhf.c b/libm/upstream-freebsd/lib/msun/src/s_csinhf.c
index c5231251f..f0508909b 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_csinhf.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_csinhf.c
@@ -25,11 +25,11 @@
*/
/*
- * Hyperbolic sine of a complex argument z. See s_csinh.c for details.
+ * Float version of csinh(). See s_csinh.c for details.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csinhf.c 284426 2015-06-15 20:16:53Z tijl $");
#include <complex.h>
#include <math.h>
@@ -55,51 +55,48 @@ csinhf(float complex z)
if (ix < 0x7f800000 && iy < 0x7f800000) {
if (iy == 0)
- return (cpackf(sinhf(x), y));
- if (ix < 0x41100000) /* small x: normal case */
- return (cpackf(sinhf(x) * cosf(y), coshf(x) * sinf(y)));
+ return (CMPLXF(sinhf(x), y));
+ if (ix < 0x41100000) /* |x| < 9: normal case */
+ return (CMPLXF(sinhf(x) * cosf(y), coshf(x) * sinf(y)));
/* |x| >= 9, so cosh(x) ~= exp(|x|) */
if (ix < 0x42b17218) {
/* x < 88.7: expf(|x|) won't overflow */
- h = expf(fabsf(x)) * 0.5f;
- return (cpackf(copysignf(h, x) * cosf(y), h * sinf(y)));
+ h = expf(fabsf(x)) * 0.5F;
+ return (CMPLXF(copysignf(h, x) * cosf(y), h * sinf(y)));
} else if (ix < 0x4340b1e7) {
/* x < 192.7: scale to avoid overflow */
- z = __ldexp_cexpf(cpackf(fabsf(x), y), -1);
- return (cpackf(crealf(z) * copysignf(1, x), cimagf(z)));
+ z = __ldexp_cexpf(CMPLXF(fabsf(x), y), -1);
+ return (CMPLXF(crealf(z) * copysignf(1, x), cimagf(z)));
} else {
/* x >= 192.7: the result always overflows */
h = huge * x;
- return (cpackf(h * cosf(y), h * h * sinf(y)));
+ return (CMPLXF(h * cosf(y), h * h * sinf(y)));
}
}
- if (ix == 0 && iy >= 0x7f800000)
- return (cpackf(copysignf(0, x * (y - y)), y - y));
+ if (ix == 0) /* && iy >= 0x7f800000 */
+ return (CMPLXF(x, y - y));
- if (iy == 0 && ix >= 0x7f800000) {
- if ((hx & 0x7fffff) == 0)
- return (cpackf(x, y));
- return (cpackf(x, copysignf(0, y)));
- }
+ if (iy == 0) /* && ix >= 0x7f800000 */
+ return (CMPLXF(x + x, y));
- if (ix < 0x7f800000 && iy >= 0x7f800000)
- return (cpackf(y - y, x * (y - y)));
+ if (ix < 0x7f800000) /* && iy >= 0x7f800000 */
+ return (CMPLXF(y - y, y - y));
- if (ix >= 0x7f800000 && (hx & 0x7fffff) == 0) {
+ if (ix == 0x7f800000) {
if (iy >= 0x7f800000)
- return (cpackf(x * x, x * (y - y)));
- return (cpackf(x * cosf(y), INFINITY * sinf(y)));
+ return (CMPLXF(x, y - y));
+ return (CMPLXF(x * cosf(y), INFINITY * sinf(y)));
}
- return (cpackf((x * x) * (y - y), (x + x) * (y - y)));
+ return (CMPLXF((x + x) * (y - y), (x * x) * (y - y)));
}
float complex
csinf(float complex z)
{
- z = csinhf(cpackf(-cimagf(z), crealf(z)));
- return (cpackf(cimagf(z), -crealf(z)));
+ z = csinhf(CMPLXF(cimagf(z), crealf(z)));
+ return (CMPLXF(cimagf(z), crealf(z)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csqrt.c b/libm/upstream-freebsd/lib/msun/src/s_csqrt.c
index 18a7ae3e7..c908a2d5a 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_csqrt.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_csqrt.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csqrt.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <float.h>
@@ -58,12 +58,12 @@ csqrt(double complex z)
/* Handle special cases. */
if (z == 0)
- return (cpack(0, b));
+ return (CMPLX(0, b));
if (isinf(b))
- return (cpack(INFINITY, b));
+ return (CMPLX(INFINITY, b));
if (isnan(a)) {
t = (b - b) / (b - b); /* raise invalid if b is not a NaN */
- return (cpack(a, t)); /* return NaN + NaN i */
+ return (CMPLX(a, t)); /* return NaN + NaN i */
}
if (isinf(a)) {
/*
@@ -73,9 +73,9 @@ csqrt(double complex z)
* csqrt(-inf + y i) = 0 + inf i
*/
if (signbit(a))
- return (cpack(fabs(b - b), copysign(a, b)));
+ return (CMPLX(fabs(b - b), copysign(a, b)));
else
- return (cpack(a, copysign(b - b, b)));
+ return (CMPLX(a, copysign(b - b, b)));
}
/*
* The remaining special case (b is NaN) is handled just fine by
@@ -94,10 +94,10 @@ csqrt(double complex z)
/* Algorithm 312, CACM vol 10, Oct 1967. */
if (a >= 0) {
t = sqrt((a + hypot(a, b)) * 0.5);
- result = cpack(t, b / (2 * t));
+ result = CMPLX(t, b / (2 * t));
} else {
t = sqrt((-a + hypot(a, b)) * 0.5);
- result = cpack(fabs(b) / (2 * t), copysign(t, b));
+ result = CMPLX(fabs(b) / (2 * t), copysign(t, b));
}
/* Rescale. */
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csqrtf.c b/libm/upstream-freebsd/lib/msun/src/s_csqrtf.c
index da7fe1847..12a894f4e 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_csqrtf.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_csqrtf.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csqrtf.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <math.h>
@@ -49,12 +49,12 @@ csqrtf(float complex z)
/* Handle special cases. */
if (z == 0)
- return (cpackf(0, b));
+ return (CMPLXF(0, b));
if (isinf(b))
- return (cpackf(INFINITY, b));
+ return (CMPLXF(INFINITY, b));
if (isnan(a)) {
t = (b - b) / (b - b); /* raise invalid if b is not a NaN */
- return (cpackf(a, t)); /* return NaN + NaN i */
+ return (CMPLXF(a, t)); /* return NaN + NaN i */
}
if (isinf(a)) {
/*
@@ -64,9 +64,9 @@ csqrtf(float complex z)
* csqrtf(-inf + y i) = 0 + inf i
*/
if (signbit(a))
- return (cpackf(fabsf(b - b), copysignf(a, b)));
+ return (CMPLXF(fabsf(b - b), copysignf(a, b)));
else
- return (cpackf(a, copysignf(b - b, b)));
+ return (CMPLXF(a, copysignf(b - b, b)));
}
/*
* The remaining special case (b is NaN) is handled just fine by
@@ -80,9 +80,9 @@ csqrtf(float complex z)
*/
if (a >= 0) {
t = sqrt((a + hypot(a, b)) * 0.5);
- return (cpackf(t, b / (2.0 * t)));
+ return (CMPLXF(t, b / (2.0 * t)));
} else {
t = sqrt((-a + hypot(a, b)) * 0.5);
- return (cpackf(fabsf(b) / (2.0 * t), copysignf(t, b)));
+ return (CMPLXF(fabsf(b) / (2.0 * t), copysignf(t, b)));
}
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_csqrtl.c b/libm/upstream-freebsd/lib/msun/src/s_csqrtl.c
index dd18e1ef3..7bcff593c 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_csqrtl.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_csqrtl.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_csqrtl.c 275819 2014-12-16 09:21:56Z ed $");
#include <complex.h>
#include <float.h>
@@ -58,12 +58,12 @@ csqrtl(long double complex z)
/* Handle special cases. */
if (z == 0)
- return (cpackl(0, b));
+ return (CMPLXL(0, b));
if (isinf(b))
- return (cpackl(INFINITY, b));
+ return (CMPLXL(INFINITY, b));
if (isnan(a)) {
t = (b - b) / (b - b); /* raise invalid if b is not a NaN */
- return (cpackl(a, t)); /* return NaN + NaN i */
+ return (CMPLXL(a, t)); /* return NaN + NaN i */
}
if (isinf(a)) {
/*
@@ -73,9 +73,9 @@ csqrtl(long double complex z)
* csqrt(-inf + y i) = 0 + inf i
*/
if (signbit(a))
- return (cpackl(fabsl(b - b), copysignl(a, b)));
+ return (CMPLXL(fabsl(b - b), copysignl(a, b)));
else
- return (cpackl(a, copysignl(b - b, b)));
+ return (CMPLXL(a, copysignl(b - b, b)));
}
/*
* The remaining special case (b is NaN) is handled just fine by
@@ -94,10 +94,10 @@ csqrtl(long double complex z)
/* Algorithm 312, CACM vol 10, Oct 1967. */
if (a >= 0) {
t = sqrtl((a + hypotl(a, b)) * 0.5);
- result = cpackl(t, b / (2 * t));
+ result = CMPLXL(t, b / (2 * t));
} else {
t = sqrtl((-a + hypotl(a, b)) * 0.5);
- result = cpackl(fabsl(b) / (2 * t), copysignl(t, b));
+ result = CMPLXL(fabsl(b) / (2 * t), copysignl(t, b));
}
/* Rescale. */
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ctanh.c b/libm/upstream-freebsd/lib/msun/src/s_ctanh.c
index d427e28d7..e5973c303 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_ctanh.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_ctanh.c
@@ -25,7 +25,7 @@
*/
/*
- * Hyperbolic tangent of a complex argument z = x + i y.
+ * Hyperbolic tangent of a complex argument z = x + I y.
*
* The algorithm is from:
*
@@ -44,15 +44,15 @@
*
* tanh(z) = sinh(z) / cosh(z)
*
- * sinh(x) cos(y) + i cosh(x) sin(y)
+ * sinh(x) cos(y) + I cosh(x) sin(y)
* = ---------------------------------
- * cosh(x) cos(y) + i sinh(x) sin(y)
+ * cosh(x) cos(y) + I sinh(x) sin(y)
*
- * cosh(x) sinh(x) / cos^2(y) + i tan(y)
+ * cosh(x) sinh(x) / cos^2(y) + I tan(y)
* = -------------------------------------
* 1 + sinh^2(x) / cos^2(y)
*
- * beta rho s + i t
+ * beta rho s + I t
* = ----------------
* 1 + beta s^2
*
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ctanh.c 284427 2015-06-15 20:40:44Z tijl $");
#include <complex.h>
#include <math.h>
@@ -85,16 +85,16 @@ ctanh(double complex z)
ix = hx & 0x7fffffff;
/*
- * ctanh(NaN + i 0) = NaN + i 0
+ * ctanh(NaN +- I 0) = d(NaN) +- I 0
*
- * ctanh(NaN + i y) = NaN + i NaN for y != 0
+ * ctanh(NaN + I y) = d(NaN,y) + I d(NaN,y) for y != 0
*
* The imaginary part has the sign of x*sin(2*y), but there's no
* special effort to get this right.
*
- * ctanh(+-Inf +- i Inf) = +-1 +- 0
+ * ctanh(+-Inf +- I Inf) = +-1 +- I 0
*
- * ctanh(+-Inf + i y) = +-1 + 0 sin(2y) for y finite
+ * ctanh(+-Inf + I y) = +-1 + I 0 sin(2y) for y finite
*
* The imaginary part of the sign is unspecified. This special
* case is only needed to avoid a spurious invalid exception when
@@ -102,26 +102,27 @@ ctanh(double complex z)
*/
if (ix >= 0x7ff00000) {
if ((ix & 0xfffff) | lx) /* x is NaN */
- return (cpack(x, (y == 0 ? y : x * y)));
+ return (CMPLX((x + 0) * (y + 0),
+ y == 0 ? y : (x + 0) * (y + 0)));
SET_HIGH_WORD(x, hx - 0x40000000); /* x = copysign(1, x) */
- return (cpack(x, copysign(0, isinf(y) ? y : sin(y) * cos(y))));
+ return (CMPLX(x, copysign(0, isinf(y) ? y : sin(y) * cos(y))));
}
/*
- * ctanh(x + i NAN) = NaN + i NaN
- * ctanh(x +- i Inf) = NaN + i NaN
+ * ctanh(x + I NaN) = d(NaN) + I d(NaN)
+ * ctanh(x +- I Inf) = dNaN + I dNaN
*/
if (!isfinite(y))
- return (cpack(y - y, y - y));
+ return (CMPLX(y - y, y - y));
/*
- * ctanh(+-huge + i +-y) ~= +-1 +- i 2sin(2y)/exp(2x), using the
+ * ctanh(+-huge +- I y) ~= +-1 +- I 2sin(2y)/exp(2x), using the
* approximation sinh^2(huge) ~= exp(2*huge) / 4.
* We use a modified formula to avoid spurious overflow.
*/
- if (ix >= 0x40360000) { /* x >= 22 */
+ if (ix >= 0x40360000) { /* |x| >= 22 */
double exp_mx = exp(-fabs(x));
- return (cpack(copysign(1, x),
+ return (CMPLX(copysign(1, x),
4 * sin(y) * cos(y) * exp_mx * exp_mx));
}
@@ -131,14 +132,14 @@ ctanh(double complex z)
s = sinh(x);
rho = sqrt(1 + s * s); /* = cosh(x) */
denom = 1 + beta * s * s;
- return (cpack((beta * rho * s) / denom, t / denom));
+ return (CMPLX((beta * rho * s) / denom, t / denom));
}
double complex
ctan(double complex z)
{
- /* ctan(z) = -I * ctanh(I * z) */
- z = ctanh(cpack(-cimag(z), creal(z)));
- return (cpack(cimag(z), -creal(z)));
+ /* ctan(z) = -I * ctanh(I * z) = I * conj(ctanh(I * conj(z))) */
+ z = ctanh(CMPLX(cimag(z), creal(z)));
+ return (CMPLX(cimag(z), creal(z)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_ctanhf.c b/libm/upstream-freebsd/lib/msun/src/s_ctanhf.c
index 4be28d852..e9826c009 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_ctanhf.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_ctanhf.c
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_ctanhf.c 284428 2015-06-15 20:47:26Z tijl $");
#include <complex.h>
#include <math.h>
@@ -51,18 +51,19 @@ ctanhf(float complex z)
if (ix >= 0x7f800000) {
if (ix & 0x7fffff)
- return (cpackf(x, (y == 0 ? y : x * y)));
+ return (CMPLXF((x + 0) * (y + 0),
+ y == 0 ? y : (x + 0) * (y + 0)));
SET_FLOAT_WORD(x, hx - 0x40000000);
- return (cpackf(x,
+ return (CMPLXF(x,
copysignf(0, isinf(y) ? y : sinf(y) * cosf(y))));
}
if (!isfinite(y))
- return (cpackf(y - y, y - y));
+ return (CMPLXF(y - y, y - y));
- if (ix >= 0x41300000) { /* x >= 11 */
+ if (ix >= 0x41300000) { /* |x| >= 11 */
float exp_mx = expf(-fabsf(x));
- return (cpackf(copysignf(1, x),
+ return (CMPLXF(copysignf(1, x),
4 * sinf(y) * cosf(y) * exp_mx * exp_mx));
}
@@ -71,14 +72,14 @@ ctanhf(float complex z)
s = sinhf(x);
rho = sqrtf(1 + s * s);
denom = 1 + beta * s * s;
- return (cpackf((beta * rho * s) / denom, t / denom));
+ return (CMPLXF((beta * rho * s) / denom, t / denom));
}
float complex
ctanf(float complex z)
{
- z = ctanhf(cpackf(-cimagf(z), crealf(z)));
- return (cpackf(cimagf(z), -crealf(z)));
+ z = ctanhf(CMPLXF(cimagf(z), crealf(z)));
+ return (CMPLXF(cimagf(z), crealf(z)));
}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_exp2.c b/libm/upstream-freebsd/lib/msun/src/s_exp2.c
index fde11c27d..dbef729da 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_exp2.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_exp2.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_exp2.c 286515 2015-08-09 10:00:13Z dim $");
#include <float.h>
@@ -376,14 +376,14 @@ exp2(double x)
/* Compute r = exp2(y) = exp2t[i0] * p(z - eps[i]). */
t = tbl[i0]; /* exp2t[i0] */
z -= tbl[i0 + 1]; /* eps[i0] */
- if (k >= -1021 << 20)
+ if (k >= -(1021 << 20))
INSERT_WORDS(twopk, 0x3ff00000 + k, 0);
else
INSERT_WORDS(twopkp1000, 0x3ff00000 + k + (1000 << 20), 0);
r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * P5))));
/* Scale by 2**(k>>20). */
- if(k >= -1021 << 20) {
+ if(k >= -(1021 << 20)) {
if (k == 1024 << 20)
return (r * 2.0 * 0x1p1023);
return (r * twopk);
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fabs.c b/libm/upstream-freebsd/lib/msun/src/s_fabs.c
deleted file mode 100644
index 15529e585..000000000
--- a/libm/upstream-freebsd/lib/msun/src/s_fabs.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/* @(#)s_fabs.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#ifndef lint
-static char rcsid[] = "$FreeBSD$";
-#endif
-
-/*
- * fabs(x) returns the absolute value of x.
- */
-
-#include "math.h"
-#include "math_private.h"
-
-double
-fabs(double x)
-{
- u_int32_t high;
- GET_HIGH_WORD(high,x);
- SET_HIGH_WORD(x,high&0x7fffffff);
- return x;
-}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_fabsf.c b/libm/upstream-freebsd/lib/msun/src/s_fabsf.c
deleted file mode 100644
index e9383d0db..000000000
--- a/libm/upstream-freebsd/lib/msun/src/s_fabsf.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* s_fabsf.c -- float version of s_fabs.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunPro, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice
- * is preserved.
- * ====================================================
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-/*
- * fabsf(x) returns the absolute value of x.
- */
-
-#include "math.h"
-#include "math_private.h"
-
-float
-fabsf(float x)
-{
- u_int32_t ix;
- GET_FLOAT_WORD(ix,x);
- SET_FLOAT_WORD(x,ix&0x7fffffff);
- return x;
-}
diff --git a/libm/upstream-freebsd/lib/msun/src/s_scalbln.c b/libm/upstream-freebsd/lib/msun/src/s_scalbln.c
index d609d4e8b..8e61377bf 100644
--- a/libm/upstream-freebsd/lib/msun/src/s_scalbln.c
+++ b/libm/upstream-freebsd/lib/msun/src/s_scalbln.c
@@ -25,52 +25,30 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: head/lib/msun/src/s_scalbln.c 278339 2015-02-07 00:38:18Z kargl $");
-#include <limits.h>
#include <math.h>
+#define NMAX 65536
+#define NMIN -65536
+
double
-scalbln (double x, long n)
+scalbln(double x, long n)
{
- int in;
- in = (int)n;
- if (in != n) {
- if (n > 0)
- in = INT_MAX;
- else
- in = INT_MIN;
- }
- return (scalbn(x, in));
+ return (scalbn(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
}
float
-scalblnf (float x, long n)
+scalblnf(float x, long n)
{
- int in;
- in = (int)n;
- if (in != n) {
- if (n > 0)
- in = INT_MAX;
- else
- in = INT_MIN;
- }
- return (scalbnf(x, in));
+ return (scalbnf(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
}
long double
-scalblnl (long double x, long n)
+scalblnl(long double x, long n)
{
- int in;
- in = (int)n;
- if (in != n) {
- if (n > 0)
- in = INT_MAX;
- else
- in = INT_MIN;
- }
- return (scalbnl(x, (int)n));
+ return (scalbnl(x, (n > NMAX) ? NMAX : (n < NMIN) ? NMIN : (int)n));
}
diff --git a/libm/x86/lrint.S b/libm/x86/lrint.S
new file mode 100644
index 000000000..48d71dd6d
--- /dev/null
+++ b/libm/x86/lrint.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrint)
+ // LP32 sizeof(long) == 4.
+ movsd 0x4(%esp),%xmm0
+ cvtsd2si %xmm0, %eax
+ ret
+END(lrint)
+
+// LP32 sizeof(long double) == sizeof(double).
+ALIAS_SYMBOL(lrintl, lrint);
diff --git a/libm/x86/lrintf.S b/libm/x86/lrintf.S
new file mode 100644
index 000000000..bc8fcb30c
--- /dev/null
+++ b/libm/x86/lrintf.S
@@ -0,0 +1,33 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrintf)
+ // LP32 sizeof(long) == 4.
+ movss 0x4(%esp),%xmm0
+ cvtss2si %xmm0, %eax
+ ret
+END(lrintf)
diff --git a/libm/x86/rint.S b/libm/x86/rint.S
new file mode 100644
index 000000000..85635f2a3
--- /dev/null
+++ b/libm/x86/rint.S
@@ -0,0 +1,39 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rint)
+ subl $12,%esp
+ movsd 16(%esp),%xmm0
+ roundsd $4,%xmm0,%xmm0
+ movsd %xmm0,(%esp)
+ fldl (%esp)
+ addl $12,%esp
+ ret
+END(rint)
+
+// LP32 sizeof(long double) == sizeof(double).
+ALIAS_SYMBOL(rintl, rint);
diff --git a/libm/x86/rintf.S b/libm/x86/rintf.S
new file mode 100644
index 000000000..9f82400b7
--- /dev/null
+++ b/libm/x86/rintf.S
@@ -0,0 +1,36 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rintf)
+ subl $12,%esp
+ movss 16(%esp),%xmm0
+ roundss $4,%xmm0,%xmm0
+ movss %xmm0,(%esp)
+ flds (%esp)
+ add $12,%esp
+ ret
+END(rintf)
diff --git a/libm/x86_64/lrint.S b/libm/x86_64/lrint.S
new file mode 100644
index 000000000..f809a1fcb
--- /dev/null
+++ b/libm/x86_64/lrint.S
@@ -0,0 +1,35 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrint)
+ // LP64 sizeof(long) == 8.
+ cvtsd2si %xmm0, %rax
+ ret
+END(lrint)
+
+// LP64 sizeof(long long) == sizeof(long).
+ALIAS_SYMBOL(llrint, lrint);
diff --git a/libm/x86_64/lrintf.S b/libm/x86_64/lrintf.S
new file mode 100644
index 000000000..a661cbc1a
--- /dev/null
+++ b/libm/x86_64/lrintf.S
@@ -0,0 +1,35 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(lrintf)
+ // LP64 sizeof(long) == 8.
+ cvtss2si %xmm0, %rax
+ ret
+END(lrintf)
+
+// LP64 sizeof(long long) == sizeof(long).
+ALIAS_SYMBOL(llrintf, lrintf);
diff --git a/libm/x86_64/rint.S b/libm/x86_64/rint.S
new file mode 100644
index 000000000..098fdc52f
--- /dev/null
+++ b/libm/x86_64/rint.S
@@ -0,0 +1,31 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rint)
+ roundsd $0x4,%xmm0,%xmm0
+ retq
+END(rint)
diff --git a/libm/x86_64/rintf.S b/libm/x86_64/rintf.S
new file mode 100644
index 000000000..09f5e9c4f
--- /dev/null
+++ b/libm/x86_64/rintf.S
@@ -0,0 +1,31 @@
+/*
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <private/bionic_asm.h>
+
+ENTRY(rintf)
+ roundss $0x4,%xmm0,%xmm0
+ retq
+END(rintf)
diff --git a/linker/Android.mk b/linker/Android.mk
index 7a9b5d9ad..4a4ca5c5a 100644
--- a/linker/Android.mk
+++ b/linker/Android.mk
@@ -2,16 +2,22 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES:= \
+LOCAL_CLANG := true
+
+LOCAL_SRC_FILES := \
debugger.cpp \
dlfcn.cpp \
linker.cpp \
linker_allocator.cpp \
- linker_sdk_versions.cpp \
linker_block_allocator.cpp \
+ linker_dlwarning.cpp \
+ linker_gdb_support.cpp \
linker_libc_support.c \
+ linker_mapped_file_fragment.cpp \
linker_memory.cpp \
linker_phdr.cpp \
+ linker_sdk_versions.cpp \
+ linker_utils.cpp \
rt.cpp \
LOCAL_SRC_FILES_arm := arch/arm/begin.S
@@ -35,14 +41,13 @@ LOCAL_CFLAGS += \
-fvisibility=hidden \
-Wall -Wextra -Wunused -Werror \
-LOCAL_CFLAGS_arm += -D__work_around_b_19059885__
-LOCAL_CFLAGS_x86 += -D__work_around_b_19059885__
+LOCAL_CFLAGS_arm += -D__work_around_b_24465209__
+LOCAL_CFLAGS_x86 += -D__work_around_b_24465209__
LOCAL_CONLYFLAGS += \
-std=gnu99 \
LOCAL_CPPFLAGS += \
- -std=gnu++11 \
-Wold-style-cast \
ifeq ($(TARGET_IS_64_BIT),true)
@@ -60,7 +65,7 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS)
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_STATIC_LIBRARIES := libc_nomalloc libziparchive libutils libz liblog
+LOCAL_STATIC_LIBRARIES := libc_nomalloc libziparchive libutils libbase libz liblog
LOCAL_FORCE_STATIC_EXECUTABLE := true
@@ -83,4 +88,20 @@ LOCAL_POST_LINK_CMD = $(hide) $($(LOCAL_2ND_ARCH_VAR_PREFIX)TARGET_OBJCOPY) \
include $(BUILD_EXECUTABLE)
+
+define add-linker-symlink
+$(eval _from := $(TARGET_OUT)/bin/$(1))
+$(eval _to:=$(2))
+$(_from): $(LOCAL_MODULE_MAKEFILE)
+ @echo "Symlink: $$@ -> $(_to)"
+ @mkdir -p $$(dir $$@)
+ @rm -rf $$@
+ $(hide) ln -sf $(_to) $$@
+endef
+
+$(eval $(call add-linker-symlink,linker_asan,linker))
+ifeq ($(TARGET_IS_64_BIT),true)
+$(eval $(call add-linker-symlink,linker_asan64,linker64))
+endif
+
include $(call first-makefiles-under,$(LOCAL_PATH))
diff --git a/linker/NOTICE b/linker/NOTICE
index 139b26eab..2c70ab8ea 100644
--- a/linker/NOTICE
+++ b/linker/NOTICE
@@ -42,34 +42,6 @@ SUCH DAMAGE.
-------------------------------------------------------------------
-Copyright (C) 2010 The Android Open Source Project
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
-OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
--------------------------------------------------------------------
-
Copyright (C) 2012 The Android Open Source Project
All rights reserved.
diff --git a/linker/debugger.cpp b/linker/debugger.cpp
index 46c97af91..d4c7928f5 100644
--- a/linker/debugger.cpp
+++ b/linker/debugger.cpp
@@ -27,6 +27,7 @@
*/
#include "linker.h"
+#include "linker_gdb_support.h"
#include <errno.h>
#include <inttypes.h>
@@ -38,6 +39,7 @@
#include <sys/mman.h>
#include <sys/prctl.h>
#include <sys/socket.h>
+#include <sys/syscall.h>
#include <sys/un.h>
#include <unistd.h>
@@ -60,7 +62,9 @@ enum debugger_action_t {
DEBUGGER_ACTION_DUMP_BACKTRACE,
};
-/* message sent over the socket */
+// Message sent over the socket.
+// NOTE: Any changes to this structure must also be reflected in
+// system/core/include/cutils/debugger.h.
struct __attribute__((packed)) debugger_msg_t {
int32_t action;
pid_t tid;
@@ -135,9 +139,6 @@ static void log_signal_summary(int signum, const siginfo_t* info) {
signal_name = "SIGILL";
has_address = true;
break;
- case SIGPIPE:
- signal_name = "SIGPIPE";
- break;
case SIGSEGV:
signal_name = "SIGSEGV";
has_address = true;
@@ -269,27 +270,32 @@ static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void*)
send_debuggerd_packet(info);
- // Remove our net so we fault for real when we return.
+ // We need to return from the signal handler so that debuggerd can dump the
+ // thread that crashed, but returning here does not guarantee that the signal
+ // will be thrown again, even for SIGSEGV and friends, since the signal could
+ // have been sent manually. Resend the signal with rt_tgsigqueueinfo(2) to
+ // preserve the SA_SIGINFO contents.
signal(signal_number, SIG_DFL);
- // These signals are not re-thrown when we resume. This means that
- // crashing due to (say) SIGPIPE doesn't work the way you'd expect it
- // to. We work around this by throwing them manually. We don't want
- // to do this for *all* signals because it'll screw up the si_addr for
- // faults like SIGSEGV. It does screw up the si_code, which is why we
- // passed that to debuggerd above.
- switch (signal_number) {
- case SIGABRT:
- case SIGFPE:
- case SIGPIPE:
-#if defined(SIGSTKFLT)
- case SIGSTKFLT:
-#endif
- case SIGTRAP:
- tgkill(getpid(), gettid(), signal_number);
- break;
- default: // SIGILL, SIGBUS, SIGSEGV
- break;
+ struct siginfo si;
+ if (!info) {
+ memset(&si, 0, sizeof(si));
+ si.si_code = SI_USER;
+ si.si_pid = getpid();
+ si.si_uid = getuid();
+ info = &si;
+ } else if (info->si_code >= 0 || info->si_code == SI_TKILL) {
+ // rt_tgsigqueueinfo(2)'s documentation appears to be incorrect on kernels
+ // that contain commit 66dd34a (3.9+). The manpage claims to only allow
+ // negative si_code values that are not SI_TKILL, but 66dd34a changed the
+ // check to allow all si_code values in calls coming from inside the house.
+ }
+
+ int rc = syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), signal_number, info);
+ if (rc != 0) {
+ __libc_format_log(ANDROID_LOG_FATAL, "libc", "failed to resend signal during crash: %s",
+ strerror(errno));
+ _exit(0);
}
}
@@ -307,7 +313,6 @@ __LIBC_HIDDEN__ void debuggerd_init() {
sigaction(SIGBUS, &action, nullptr);
sigaction(SIGFPE, &action, nullptr);
sigaction(SIGILL, &action, nullptr);
- sigaction(SIGPIPE, &action, nullptr);
sigaction(SIGSEGV, &action, nullptr);
#if defined(SIGSTKFLT)
sigaction(SIGSTKFLT, &action, nullptr);
diff --git a/linker/dlfcn.cpp b/linker/dlfcn.cpp
index ef454abcd..12dd03939 100644
--- a/linker/dlfcn.cpp
+++ b/linker/dlfcn.cpp
@@ -15,13 +15,12 @@
*/
#include "linker.h"
+#include "linker_dlwarning.h"
-#include <dlfcn.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <android/dlext.h>
#include <android/api-level.h>
#include <bionic/pthread_internal.h>
@@ -67,9 +66,10 @@ void android_update_LD_LIBRARY_PATH(const char* ld_library_path) {
do_android_update_LD_LIBRARY_PATH(ld_library_path);
}
-static void* dlopen_ext(const char* filename, int flags, const android_dlextinfo* extinfo) {
+static void* dlopen_ext(const char* filename, int flags,
+ const android_dlextinfo* extinfo, void* caller_addr) {
ScopedPthreadMutexLocker locker(&g_dl_mutex);
- soinfo* result = do_dlopen(filename, flags, extinfo);
+ void* result = do_dlopen(filename, flags, extinfo, caller_addr);
if (result == nullptr) {
__bionic_format_dlerror("dlopen failed", linker_get_error_buffer());
return nullptr;
@@ -78,84 +78,48 @@ static void* dlopen_ext(const char* filename, int flags, const android_dlextinfo
}
void* android_dlopen_ext(const char* filename, int flags, const android_dlextinfo* extinfo) {
- return dlopen_ext(filename, flags, extinfo);
+ void* caller_addr = __builtin_return_address(0);
+ return dlopen_ext(filename, flags, extinfo, caller_addr);
}
void* dlopen(const char* filename, int flags) {
- return dlopen_ext(filename, flags, nullptr);
+ void* caller_addr = __builtin_return_address(0);
+ return dlopen_ext(filename, flags, nullptr, caller_addr);
}
-void* dlsym(void* handle, const char* symbol) {
+void* dlsym_impl(void* handle, const char* symbol, const char* version, void* caller_addr) {
ScopedPthreadMutexLocker locker(&g_dl_mutex);
-
-#if !defined(__LP64__)
- if (handle == nullptr) {
- __bionic_format_dlerror("dlsym library handle is null", nullptr);
+ void* result;
+ if (!do_dlsym(handle, symbol, version, caller_addr, &result)) {
+ __bionic_format_dlerror(linker_get_error_buffer(), nullptr);
return nullptr;
}
-#endif
- if (symbol == nullptr) {
- __bionic_format_dlerror("dlsym symbol name is null", nullptr);
- return nullptr;
- }
+ return result;
+}
- soinfo* found = nullptr;
- const ElfW(Sym)* sym = nullptr;
+void* dlsym(void* handle, const char* symbol) {
void* caller_addr = __builtin_return_address(0);
- soinfo* caller = find_containing_library(caller_addr);
-
- if (handle == RTLD_DEFAULT || handle == RTLD_NEXT) {
- sym = dlsym_linear_lookup(symbol, &found, caller, handle);
- } else {
- sym = dlsym_handle_lookup(reinterpret_cast<soinfo*>(handle), &found, symbol);
- }
-
- if (sym != nullptr) {
- unsigned bind = ELF_ST_BIND(sym->st_info);
-
- if ((bind == STB_GLOBAL || bind == STB_WEAK) && sym->st_shndx != 0) {
- return reinterpret_cast<void*>(found->resolve_symbol_address(sym));
- }
+ return dlsym_impl(handle, symbol, nullptr, caller_addr);
+}
- __bionic_format_dlerror("symbol found but not global", symbol);
- return nullptr;
- } else {
- __bionic_format_dlerror("undefined symbol", symbol);
- return nullptr;
- }
+void* dlvsym(void* handle, const char* symbol, const char* version) {
+ void* caller_addr = __builtin_return_address(0);
+ return dlsym_impl(handle, symbol, version, caller_addr);
}
int dladdr(const void* addr, Dl_info* info) {
ScopedPthreadMutexLocker locker(&g_dl_mutex);
-
- // Determine if this address can be found in any library currently mapped.
- soinfo* si = find_containing_library(addr);
- if (si == nullptr) {
- return 0;
- }
-
- memset(info, 0, sizeof(Dl_info));
-
- info->dli_fname = si->get_realpath();
- // Address at which the shared object is loaded.
- info->dli_fbase = reinterpret_cast<void*>(si->base);
-
- // Determine if any symbol in the library contains the specified address.
- ElfW(Sym)* sym = si->find_symbol_by_address(addr);
- if (sym != nullptr) {
- info->dli_sname = si->get_string(sym->st_name);
- info->dli_saddr = reinterpret_cast<void*>(si->resolve_symbol_address(sym));
- }
-
- return 1;
+ return do_dladdr(addr, info);
}
int dlclose(void* handle) {
ScopedPthreadMutexLocker locker(&g_dl_mutex);
- do_dlclose(reinterpret_cast<soinfo*>(handle));
- // dlclose has no defined errors.
- return 0;
+ int result = do_dlclose(handle);
+ if (result != 0) {
+ __bionic_format_dlerror("dlclose failed", linker_get_error_buffer());
+ }
+ return result;
}
int dl_iterate_phdr(int (*cb)(dl_phdr_info* info, size_t size, void* data), void* data) {
@@ -173,6 +137,46 @@ uint32_t android_get_application_target_sdk_version() {
return get_application_target_sdk_version();
}
+void android_dlwarning(void* obj, void (*f)(void*, const char*)) {
+ ScopedPthreadMutexLocker locker(&g_dl_mutex);
+ get_dlwarning(obj, f);
+}
+
+bool android_init_namespaces(const char* public_ns_sonames,
+ const char* anon_ns_library_path) {
+ ScopedPthreadMutexLocker locker(&g_dl_mutex);
+ bool success = init_namespaces(public_ns_sonames, anon_ns_library_path);
+ if (!success) {
+ __bionic_format_dlerror("android_init_namespaces failed", linker_get_error_buffer());
+ }
+
+ return success;
+}
+
+android_namespace_t* android_create_namespace(const char* name,
+ const char* ld_library_path,
+ const char* default_library_path,
+ uint64_t type,
+ const char* permitted_when_isolated_path,
+ android_namespace_t* parent_namespace) {
+ void* caller_addr = __builtin_return_address(0);
+ ScopedPthreadMutexLocker locker(&g_dl_mutex);
+
+ android_namespace_t* result = create_namespace(caller_addr,
+ name,
+ ld_library_path,
+ default_library_path,
+ type,
+ permitted_when_isolated_path,
+ parent_namespace);
+
+ if (result == nullptr) {
+ __bionic_format_dlerror("android_create_namespace failed", linker_get_error_buffer());
+ }
+
+ return result;
+}
+
// name_offset: starting index of the name in libdl_info.strtab
#define ELF32_SYM_INITIALIZER(name_offset, value, shndx) \
{ name_offset, \
@@ -199,11 +203,11 @@ static const char ANDROID_LIBDL_STRTAB[] =
// 00000000001 1111111112222222222 3333333333444444444455555555556666666666777 777777788888888889999999999
// 01234567890 1234567890123456789 0123456789012345678901234567890123456789012 345678901234567890123456789
"erate_phdr\0android_dlopen_ext\0android_set_application_target_sdk_version\0android_get_application_tar"
- // 0000000000111111
- // 0123456789012345
- "get_sdk_version\0"
+ // 0000000000111111 111122222222223333333333 4444444444555555555566666 6666677 777777778888888888
+ // 0123456789012345 678901234567890123456789 0123456789012345678901234 5678901 234567890123456789
+ "get_sdk_version\0android_init_namespaces\0android_create_namespace\0dlvsym\0android_dlwarning\0"
#if defined(__arm__)
- // 216
+ // 290
"dl_unwind_find_exidx\0"
#endif
;
@@ -225,8 +229,12 @@ static ElfW(Sym) g_libdl_symtab[] = {
ELFW(SYM_INITIALIZER)(111, &android_dlopen_ext, 1),
ELFW(SYM_INITIALIZER)(130, &android_set_application_target_sdk_version, 1),
ELFW(SYM_INITIALIZER)(173, &android_get_application_target_sdk_version, 1),
+ ELFW(SYM_INITIALIZER)(216, &android_init_namespaces, 1),
+ ELFW(SYM_INITIALIZER)(240, &android_create_namespace, 1),
+ ELFW(SYM_INITIALIZER)(265, &dlvsym, 1),
+ ELFW(SYM_INITIALIZER)(272, &android_dlwarning, 1),
#if defined(__arm__)
- ELFW(SYM_INITIALIZER)(216, &dl_unwind_find_exidx, 1),
+ ELFW(SYM_INITIALIZER)(290, &dl_unwind_find_exidx, 1),
#endif
};
@@ -243,18 +251,20 @@ static ElfW(Sym) g_libdl_symtab[] = {
// Note that adding any new symbols here requires stubbing them out in libdl.
static unsigned g_libdl_buckets[1] = { 1 };
#if defined(__arm__)
-static unsigned g_libdl_chains[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0 };
+static unsigned g_libdl_chains[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0 };
#else
-static unsigned g_libdl_chains[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0 };
+static unsigned g_libdl_chains[] = { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0 };
#endif
static uint8_t __libdl_info_buf[sizeof(soinfo)] __attribute__((aligned(8)));
static soinfo* __libdl_info = nullptr;
+extern android_namespace_t g_default_namespace;
+
// This is used by the dynamic linker. Every process gets these symbols for free.
soinfo* get_libdl_info() {
if (__libdl_info == nullptr) {
- __libdl_info = new (__libdl_info_buf) soinfo("libdl.so", nullptr, 0, RTLD_GLOBAL);
+ __libdl_info = new (__libdl_info_buf) soinfo(&g_default_namespace, "libdl.so", nullptr, 0, RTLD_GLOBAL);
__libdl_info->flags_ |= FLAG_LINKED;
__libdl_info->strtab_ = ANDROID_LIBDL_STRTAB;
__libdl_info->symtab_ = g_libdl_symtab;
@@ -267,7 +277,8 @@ soinfo* get_libdl_info() {
__libdl_info->local_group_root_ = __libdl_info;
__libdl_info->soname_ = "libdl.so";
__libdl_info->target_sdk_version_ = __ANDROID_API__;
-#if defined(__arm__)
+ __libdl_info->generate_handle();
+#if defined(__work_around_b_24465209__)
strlcpy(__libdl_info->old_name_, __libdl_info->soname_, sizeof(__libdl_info->old_name_));
#endif
}
diff --git a/linker/linked_list.h b/linker/linked_list.h
index 0572e635b..092e831db 100644
--- a/linker/linked_list.h
+++ b/linker/linked_list.h
@@ -25,12 +25,49 @@ struct LinkedListEntry {
T* element;
};
+// ForwardInputIterator
+template<typename T>
+class LinkedListIterator {
+ public:
+ LinkedListIterator() : entry_(nullptr) {}
+ LinkedListIterator(const LinkedListIterator<T>& that) : entry_(that.entry_) {}
+ explicit LinkedListIterator(LinkedListEntry<T>* entry) : entry_(entry) {}
+
+ LinkedListIterator<T>& operator=(const LinkedListIterator<T>& that) {
+ entry_ = that.entry_;
+ return *this;
+ }
+
+ LinkedListIterator<T>& operator++() {
+ entry_ = entry_->next;
+ return *this;
+ }
+
+ T* const operator*() {
+ return entry_->element;
+ }
+
+ bool operator==(const LinkedListIterator<T>& that) const {
+ return entry_ == that.entry_;
+ }
+
+ bool operator!=(const LinkedListIterator<T>& that) const {
+ return entry_ != that.entry_;
+ }
+
+ private:
+ LinkedListEntry<T> *entry_;
+};
+
/*
* Represents linked list of objects of type T
*/
template<typename T, typename Allocator>
class LinkedList {
public:
+ typedef LinkedListIterator<T> iterator;
+ typedef T* value_type;
+
LinkedList() : head_(nullptr), tail_(nullptr) {}
~LinkedList() {
clear();
@@ -153,6 +190,24 @@ class LinkedList {
return nullptr;
}
+ iterator begin() const {
+ return iterator(head_);
+ }
+
+ iterator end() const {
+ return iterator(nullptr);
+ }
+
+ iterator find(T* value) const {
+ for (LinkedListEntry<T>* e = head_; e != nullptr; e = e->next) {
+ if (e->element == value) {
+ return iterator(e);
+ }
+ }
+
+ return end();
+ }
+
size_t copy_to_array(T* array[], size_t array_length) const {
size_t sz = 0;
for (LinkedListEntry<T>* e = head_; sz < array_length && e != nullptr; e = e->next) {
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 19f5e94c4..a287cf453 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -27,7 +27,6 @@
*/
#include <android/api-level.h>
-#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <inttypes.h>
@@ -37,67 +36,241 @@
#include <string.h>
#include <sys/mman.h>
#include <sys/param.h>
-#include <sys/prctl.h>
#include <unistd.h>
#include <new>
#include <string>
+#include <unordered_map>
#include <vector>
// Private C library headers.
+#include "private/bionic_globals.h"
#include "private/bionic_tls.h"
#include "private/KernelArgumentBlock.h"
#include "private/ScopedPthreadMutexLocker.h"
#include "private/ScopeGuard.h"
-#include "private/UniquePtr.h"
#include "linker.h"
#include "linker_block_allocator.h"
+#include "linker_gdb_support.h"
#include "linker_debug.h"
+#include "linker_dlwarning.h"
#include "linker_sleb128.h"
#include "linker_phdr.h"
#include "linker_relocs.h"
#include "linker_reloc_iterators.h"
+#include "linker_utils.h"
+
+#include "android-base/strings.h"
#include "ziparchive/zip_archive.h"
+extern void __libc_init_globals(KernelArgumentBlock&);
extern void __libc_init_AT_SECURE(KernelArgumentBlock&);
+extern "C" void _start();
+
// Override macros to use C++ style casts.
#undef ELF_ST_TYPE
#define ELF_ST_TYPE(x) (static_cast<uint32_t>(x) & 0xf)
+struct android_namespace_t {
+ public:
+ android_namespace_t() : name_(nullptr), is_isolated_(false) {}
+
+ const char* get_name() const { return name_; }
+ void set_name(const char* name) { name_ = name; }
+
+ bool is_isolated() const { return is_isolated_; }
+ void set_isolated(bool isolated) { is_isolated_ = isolated; }
+
+ const std::vector<std::string>& get_ld_library_paths() const {
+ return ld_library_paths_;
+ }
+ void set_ld_library_paths(std::vector<std::string>&& library_paths) {
+ ld_library_paths_ = library_paths;
+ }
+
+ const std::vector<std::string>& get_default_library_paths() const {
+ return default_library_paths_;
+ }
+ void set_default_library_paths(std::vector<std::string>&& library_paths) {
+ default_library_paths_ = library_paths;
+ }
+
+ const std::vector<std::string>& get_permitted_paths() const {
+ return permitted_paths_;
+ }
+ void set_permitted_paths(std::vector<std::string>&& permitted_paths) {
+ permitted_paths_ = permitted_paths;
+ }
+
+ void add_soinfo(soinfo* si) {
+ soinfo_list_.push_back(si);
+ }
+
+ void add_soinfos(const soinfo::soinfo_list_t& soinfos) {
+ for (auto si : soinfos) {
+ add_soinfo(si);
+ si->add_secondary_namespace(this);
+ }
+ }
+
+ void remove_soinfo(soinfo* si) {
+ soinfo_list_.remove_if([&](soinfo* candidate) {
+ return si == candidate;
+ });
+ }
+
+ const soinfo::soinfo_list_t& soinfo_list() const { return soinfo_list_; }
+
+ // For isolated namespaces - checks if the file is on the search path;
+ // always returns true for not isolated namespace.
+ bool is_accessible(const std::string& path);
+
+ private:
+ const char* name_;
+ bool is_isolated_;
+ std::vector<std::string> ld_library_paths_;
+ std::vector<std::string> default_library_paths_;
+ std::vector<std::string> permitted_paths_;
+ soinfo::soinfo_list_t soinfo_list_;
+
+ DISALLOW_COPY_AND_ASSIGN(android_namespace_t);
+};
+
+android_namespace_t g_default_namespace;
+
+static std::unordered_map<uintptr_t, soinfo*> g_soinfo_handles_map;
+static android_namespace_t* g_anonymous_namespace = &g_default_namespace;
+
static ElfW(Addr) get_elf_exec_load_bias(const ElfW(Ehdr)* elf);
static LinkerTypeAllocator<soinfo> g_soinfo_allocator;
static LinkerTypeAllocator<LinkedListEntry<soinfo>> g_soinfo_links_allocator;
+static LinkerTypeAllocator<android_namespace_t> g_namespace_allocator;
+static LinkerTypeAllocator<LinkedListEntry<android_namespace_t>> g_namespace_list_allocator;
+
static soinfo* solist;
static soinfo* sonext;
static soinfo* somain; // main process, always the one after libdl_info
static const char* const kDefaultLdPaths[] = {
#if defined(__LP64__)
- "/vendor/lib64",
"/system/lib64",
+ "/vendor/lib64",
#else
+ "/system/lib",
"/vendor/lib",
+#endif
+ nullptr
+};
+
+static const char* const kAsanDefaultLdPaths[] = {
+#if defined(__LP64__)
+ "/data/lib64",
+ "/system/lib64",
+ "/data/vendor/lib64",
+ "/vendor/lib64",
+#else
+ "/data/lib",
"/system/lib",
+ "/data/vendor/lib",
+ "/vendor/lib",
#endif
nullptr
};
+static bool is_system_library(const std::string& realpath) {
+ for (const auto& dir : g_default_namespace.get_default_library_paths()) {
+ if (file_is_in_dir(realpath, dir)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+#if defined(__LP64__)
+static const char* const kSystemLibDir = "/system/lib64";
+#else
+static const char* const kSystemLibDir = "/system/lib";
+#endif
+
+static std::string dirname(const char *path);
+
+// TODO(dimitry): The grey-list is a workaround for http://b/26394120 ---
+// gradually remove libraries from this list until it is gone.
+static bool is_greylisted(const char* name, const soinfo* needed_by) {
+ static const char* const kLibraryGreyList[] = {
+ "libandroid_runtime.so",
+ "libbinder.so",
+ "libcrypto.so",
+ "libcutils.so",
+ "libexpat.so",
+ "libgui.so",
+ "libmedia.so",
+ "libnativehelper.so",
+ "libskia.so",
+ "libssl.so",
+ "libstagefright.so",
+ "libsqlite.so",
+ "libui.so",
+ "libutils.so",
+ "libvorbisidec.so",
+ nullptr
+ };
+
+ // limit greylisting to apps targeting sdk version 23 and below
+ if (get_application_target_sdk_version() > 23) {
+ return false;
+ }
+
+ // if the library needed by a system library - implicitly assume it
+ // is greylisted
+
+ if (needed_by != nullptr && is_system_library(needed_by->get_realpath())) {
+ return true;
+ }
+
+ // if this is an absolute path - make sure it points to /system/lib(64)
+ if (name[0] == '/' && dirname(name) == kSystemLibDir) {
+ // and reduce the path to basename
+ name = basename(name);
+ }
+
+ for (size_t i = 0; kLibraryGreyList[i] != nullptr; ++i) {
+ if (strcmp(name, kLibraryGreyList[i]) == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
+// END OF WORKAROUND
+
static const ElfW(Versym) kVersymNotNeeded = 0;
static const ElfW(Versym) kVersymGlobal = 1;
-static std::vector<std::string> g_ld_library_paths;
+static const char* const* g_default_ld_paths;
static std::vector<std::string> g_ld_preload_names;
static std::vector<soinfo*> g_ld_preloads;
+static bool g_public_namespace_initialized;
+static soinfo::soinfo_list_t g_public_namespace;
+
__LIBC_HIDDEN__ int g_ld_debug_verbosity;
__LIBC_HIDDEN__ abort_msg_t* g_abort_message = nullptr; // For debuggerd.
+static std::string dirname(const char *path) {
+ const char* last_slash = strrchr(path, '/');
+ if (last_slash == path) return "/";
+ else if (last_slash == nullptr) return ".";
+ else
+ return std::string(path, last_slash - path);
+}
+
#if STATS
struct linker_stats_t {
int count[kRelocMax];
@@ -127,95 +300,53 @@ size_t linker_get_error_buffer_size() {
return sizeof(__linker_dl_err_buf);
}
-// This function is an empty stub where GDB locates a breakpoint to get notified
-// about linker activity.
-extern "C"
-void __attribute__((noinline)) __attribute__((visibility("default"))) rtld_db_dlactivity();
-
-static pthread_mutex_t g__r_debug_mutex = PTHREAD_MUTEX_INITIALIZER;
-static r_debug _r_debug =
- {1, nullptr, reinterpret_cast<uintptr_t>(&rtld_db_dlactivity), r_debug::RT_CONSISTENT, 0};
-
-static link_map* r_debug_tail = 0;
+static void notify_gdb_of_load(soinfo* info) {
+ if (info->is_linker() || info->is_main_executable()) {
+ // gdb already knows about the linker and the main executable.
+ return;
+ }
-static void insert_soinfo_into_debug_map(soinfo* info) {
- // Copy the necessary fields into the debug structure.
link_map* map = &(info->link_map_head);
+
map->l_addr = info->load_bias;
// link_map l_name field is not const.
map->l_name = const_cast<char*>(info->get_realpath());
map->l_ld = info->dynamic;
- // Stick the new library at the end of the list.
- // gdb tends to care more about libc than it does
- // about leaf libraries, and ordering it this way
- // reduces the back-and-forth over the wire.
- if (r_debug_tail) {
- r_debug_tail->l_next = map;
- map->l_prev = r_debug_tail;
- map->l_next = 0;
- } else {
- _r_debug.r_map = map;
- map->l_prev = 0;
- map->l_next = 0;
- }
- r_debug_tail = map;
+ CHECK(map->l_name != nullptr);
+ CHECK(map->l_name[0] != '\0');
+
+ notify_gdb_of_load(map);
}
-static void remove_soinfo_from_debug_map(soinfo* info) {
- link_map* map = &(info->link_map_head);
+static void notify_gdb_of_unload(soinfo* info) {
+ notify_gdb_of_unload(&(info->link_map_head));
+}
- if (r_debug_tail == map) {
- r_debug_tail = map->l_prev;
+bool android_namespace_t::is_accessible(const std::string& file) {
+ if (!is_isolated_) {
+ return true;
}
- if (map->l_prev) {
- map->l_prev->l_next = map->l_next;
- }
- if (map->l_next) {
- map->l_next->l_prev = map->l_prev;
+ for (const auto& dir : ld_library_paths_) {
+ if (file_is_in_dir(file, dir)) {
+ return true;
+ }
}
-}
-static void notify_gdb_of_load(soinfo* info) {
- if (info->is_main_executable()) {
- // GDB already knows about the main executable
- return;
+ for (const auto& dir : default_library_paths_) {
+ if (file_is_in_dir(file, dir)) {
+ return true;
+ }
}
- ScopedPthreadMutexLocker locker(&g__r_debug_mutex);
-
- _r_debug.r_state = r_debug::RT_ADD;
- rtld_db_dlactivity();
-
- insert_soinfo_into_debug_map(info);
-
- _r_debug.r_state = r_debug::RT_CONSISTENT;
- rtld_db_dlactivity();
-}
-
-static void notify_gdb_of_unload(soinfo* info) {
- if (info->is_main_executable()) {
- // GDB already knows about the main executable
- return;
+ for (const auto& dir : permitted_paths_) {
+ if (file_is_under_dir(file, dir)) {
+ return true;
+ }
}
- ScopedPthreadMutexLocker locker(&g__r_debug_mutex);
-
- _r_debug.r_state = r_debug::RT_DELETE;
- rtld_db_dlactivity();
-
- remove_soinfo_from_debug_map(info);
-
- _r_debug.r_state = r_debug::RT_CONSISTENT;
- rtld_db_dlactivity();
-}
-
-void notify_gdb_of_libraries() {
- _r_debug.r_state = r_debug::RT_ADD;
- rtld_db_dlactivity();
- _r_debug.r_state = r_debug::RT_CONSISTENT;
- rtld_db_dlactivity();
+ return false;
}
LinkedListEntry<soinfo>* SoinfoListAllocator::alloc() {
@@ -226,18 +357,31 @@ void SoinfoListAllocator::free(LinkedListEntry<soinfo>* entry) {
g_soinfo_links_allocator.free(entry);
}
-static soinfo* soinfo_alloc(const char* name, struct stat* file_stat,
- off64_t file_offset, uint32_t rtld_flags) {
+LinkedListEntry<android_namespace_t>* NamespaceListAllocator::alloc() {
+ return g_namespace_list_allocator.alloc();
+}
+
+void NamespaceListAllocator::free(LinkedListEntry<android_namespace_t>* entry) {
+ g_namespace_list_allocator.free(entry);
+}
+
+static soinfo* soinfo_alloc(android_namespace_t* ns, const char* name,
+ struct stat* file_stat, off64_t file_offset,
+ uint32_t rtld_flags) {
if (strlen(name) >= PATH_MAX) {
DL_ERR("library name \"%s\" too long", name);
return nullptr;
}
- soinfo* si = new (g_soinfo_allocator.alloc()) soinfo(name, file_stat, file_offset, rtld_flags);
+ soinfo* si = new (g_soinfo_allocator.alloc()) soinfo(ns, name, file_stat,
+ file_offset, rtld_flags);
sonext->next = si;
sonext = si;
+ si->generate_handle();
+ ns->add_soinfo(si);
+
TRACE("name %s: allocated soinfo @ %p", name, si);
return si;
}
@@ -248,7 +392,13 @@ static void soinfo_free(soinfo* si) {
}
if (si->base != 0 && si->size != 0) {
- munmap(reinterpret_cast<void*>(si->base), si->size);
+ if (!si->is_mapped_by_caller()) {
+ munmap(reinterpret_cast<void*>(si->base), si->size);
+ } else {
+ // remap the region as PROT_NONE, MAP_ANONYMOUS | MAP_NORESERVE
+ mmap(reinterpret_cast<void*>(si->base), si->size, PROT_NONE,
+ MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
+ }
}
soinfo *prev = nullptr, *trav;
@@ -282,55 +432,132 @@ static void soinfo_free(soinfo* si) {
g_soinfo_allocator.free(si);
}
-static void parse_path(const char* path, const char* delimiters,
- std::vector<std::string>* paths) {
- if (path == nullptr) {
- return;
- }
+// For every path element this function checks of it exists, and is a directory,
+// and normalizes it:
+// 1. For regular path it converts it to realpath()
+// 2. For path in a zip file it uses realpath on the zipfile
+// normalizes entry name by calling normalize_path function.
+static void resolve_paths(std::vector<std::string>& paths,
+ std::vector<std::string>* resolved_paths) {
+ resolved_paths->clear();
+ for (const auto& path : paths) {
+ char resolved_path[PATH_MAX];
+ const char* original_path = path.c_str();
+ if (realpath(original_path, resolved_path) != nullptr) {
+ struct stat s;
+ if (stat(resolved_path, &s) == 0) {
+ if (S_ISDIR(s.st_mode)) {
+ resolved_paths->push_back(resolved_path);
+ } else {
+ DL_WARN("Warning: \"%s\" is not a directory (excluding from path)", resolved_path);
+ continue;
+ }
+ } else {
+ DL_WARN("Warning: cannot stat file \"%s\": %s", resolved_path, strerror(errno));
+ continue;
+ }
+ } else {
+ std::string zip_path;
+ std::string entry_path;
- paths->clear();
+ std::string normalized_path;
- for (const char *p = path; ; ++p) {
- size_t len = strcspn(p, delimiters);
- // skip empty tokens
- if (len == 0) {
- continue;
- }
+ if (!normalize_path(original_path, &normalized_path)) {
+ DL_WARN("Warning: unable to normalize \"%s\"", original_path);
+ continue;
+ }
- paths->push_back(std::string(p, len));
- p += len;
+ if (parse_zip_path(normalized_path.c_str(), &zip_path, &entry_path)) {
+ if (realpath(zip_path.c_str(), resolved_path) == nullptr) {
+ DL_WARN("Warning: unable to resolve \"%s\": %s", zip_path.c_str(), strerror(errno));
+ continue;
+ }
- if (*p == '\0') {
- break;
+ resolved_paths->push_back(std::string(resolved_path) + kZipFileSeparator + entry_path);
+ }
}
}
}
+static void split_path(const char* path, const char* delimiters,
+ std::vector<std::string>* paths) {
+ if (path != nullptr && path[0] != 0) {
+ *paths = android::base::Split(path, delimiters);
+ }
+}
+
+static void parse_path(const char* path, const char* delimiters,
+ std::vector<std::string>* resolved_paths) {
+ std::vector<std::string> paths;
+ split_path(path, delimiters, &paths);
+ resolve_paths(paths, resolved_paths);
+}
+
static void parse_LD_LIBRARY_PATH(const char* path) {
- parse_path(path, ":", &g_ld_library_paths);
+ std::vector<std::string> ld_libary_paths;
+ parse_path(path, ":", &ld_libary_paths);
+ g_default_namespace.set_ld_library_paths(std::move(ld_libary_paths));
+}
+
+void soinfo::set_dt_runpath(const char* path) {
+ if (!has_min_version(3)) {
+ return;
+ }
+
+ std::vector<std::string> runpaths;
+
+ split_path(path, ":", &runpaths);
+
+ std::string origin = dirname(get_realpath());
+ // FIXME: add $LIB and $PLATFORM.
+ std::pair<std::string, std::string> substs[] = {{"ORIGIN", origin}};
+ for (auto&& s : runpaths) {
+ size_t pos = 0;
+ while (pos < s.size()) {
+ pos = s.find("$", pos);
+ if (pos == std::string::npos) break;
+ for (const auto& subst : substs) {
+ const std::string& token = subst.first;
+ const std::string& replacement = subst.second;
+ if (s.substr(pos + 1, token.size()) == token) {
+ s.replace(pos, token.size() + 1, replacement);
+ // -1 to compensate for the ++pos below.
+ pos += replacement.size() - 1;
+ break;
+ } else if (s.substr(pos + 1, token.size() + 2) == "{" + token + "}") {
+ s.replace(pos, token.size() + 3, replacement);
+ pos += replacement.size() - 1;
+ break;
+ }
+ }
+ // Skip $ in case it did not match any of the known substitutions.
+ ++pos;
+ }
+ }
+
+ resolve_paths(runpaths, &dt_runpath_);
}
static void parse_LD_PRELOAD(const char* path) {
- // We have historically supported ':' as well as ' ' in LD_PRELOAD.
- parse_path(path, " :", &g_ld_preload_names);
+ g_ld_preload_names.clear();
+ if (path != nullptr) {
+ // We have historically supported ':' as well as ' ' in LD_PRELOAD.
+ g_ld_preload_names = android::base::Split(path, " :");
+ std::remove_if(g_ld_preload_names.begin(),
+ g_ld_preload_names.end(),
+ [] (const std::string& s) { return s.empty(); });
+ }
}
static bool realpath_fd(int fd, std::string* realpath) {
std::vector<char> buf(PATH_MAX), proc_self_fd(PATH_MAX);
- snprintf(&proc_self_fd[0], proc_self_fd.size(), "/proc/self/fd/%d", fd);
- // set DUMPABLE to 1 to access /proc/self/fd
- int dumpable = prctl(PR_GET_DUMPABLE, 0, 0, 0, 0);
- prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
- auto guard = make_scope_guard([&]() {
- // restore dumpable
- prctl(PR_SET_DUMPABLE, dumpable, 0, 0, 0);
- });
+ __libc_format_buffer(&proc_self_fd[0], proc_self_fd.size(), "/proc/self/fd/%d", fd);
if (readlink(&proc_self_fd[0], &buf[0], buf.size()) == -1) {
- PRINT("readlink('%s') failed: %s [fd=%d]", &proc_self_fd[0], strerror(errno), fd);
+ PRINT("readlink(\"%s\") failed: %s [fd=%d]", &proc_self_fd[0], strerror(errno), fd);
return false;
}
- *realpath = std::string(&buf[0]);
+ *realpath = &buf[0];
return true;
}
@@ -507,8 +734,8 @@ static bool is_symbol_global_and_defined(const soinfo* si, const ElfW(Sym)* s) {
ELF_ST_BIND(s->st_info) == STB_WEAK) {
return s->st_shndx != SHN_UNDEF;
} else if (ELF_ST_BIND(s->st_info) != STB_LOCAL) {
- DL_WARN("unexpected ST_BIND value: %d for '%s' in '%s'",
- ELF_ST_BIND(s->st_info), si->get_string(s->st_name), si->get_realpath());
+ DL_WARN("unexpected ST_BIND value: %d for \"%s\" in \"%s\"",
+ ELF_ST_BIND(s->st_info), si->get_string(s->st_name), si->get_realpath());
}
return false;
@@ -640,8 +867,9 @@ bool soinfo::elf_lookup(SymbolName& symbol_name,
return true;
}
-soinfo::soinfo(const char* realpath, const struct stat* file_stat,
- off64_t file_offset, int rtld_flags) {
+soinfo::soinfo(android_namespace_t* ns, const char* realpath,
+ const struct stat* file_stat, off64_t file_offset,
+ int rtld_flags) {
memset(this, 0, sizeof(*this));
if (realpath != nullptr) {
@@ -658,22 +886,30 @@ soinfo::soinfo(const char* realpath, const struct stat* file_stat,
}
this->rtld_flags_ = rtld_flags;
+ this->primary_namespace_ = ns;
}
+soinfo::~soinfo() {
+ g_soinfo_handles_map.erase(handle_);
+}
-uint32_t SymbolName::elf_hash() {
- if (!has_elf_hash_) {
- const uint8_t* name = reinterpret_cast<const uint8_t*>(name_);
- uint32_t h = 0, g;
+static uint32_t calculate_elf_hash(const char* name) {
+ const uint8_t* name_bytes = reinterpret_cast<const uint8_t*>(name);
+ uint32_t h = 0, g;
- while (*name) {
- h = (h << 4) + *name++;
- g = h & 0xf0000000;
- h ^= g;
- h ^= g >> 24;
- }
+ while (*name_bytes) {
+ h = (h << 4) + *name_bytes++;
+ g = h & 0xf0000000;
+ h ^= g;
+ h ^= g >> 24;
+ }
- elf_hash_ = h;
+ return h;
+}
+
+uint32_t SymbolName::elf_hash() {
+ if (!has_elf_hash_) {
+ elf_hash_ = calculate_elf_hash(name_);
has_elf_hash_ = true;
}
@@ -809,6 +1045,8 @@ class ProtectedDataGuard {
void protect_data(int protection) {
g_soinfo_allocator.protect_all(protection);
g_soinfo_links_allocator.protect_all(protection);
+ g_namespace_allocator.protect_all(protection);
+ g_namespace_list_allocator.protect_all(protection);
}
static size_t ref_count_;
@@ -851,17 +1089,17 @@ class LoadTask {
public:
struct deleter_t {
void operator()(LoadTask* t) {
+ t->~LoadTask();
TypeBasedAllocator<LoadTask>::free(t);
}
};
- typedef UniquePtr<LoadTask, deleter_t> unique_ptr;
-
static deleter_t deleter;
- static LoadTask* create(const char* name, soinfo* needed_by) {
+ static LoadTask* create(const char* name, soinfo* needed_by,
+ std::unordered_map<const soinfo*, ElfReader>* readers_map) {
LoadTask* ptr = TypeBasedAllocator<LoadTask>::alloc();
- return new (ptr) LoadTask(name, needed_by);
+ return new (ptr) LoadTask(name, needed_by, readers_map);
}
const char* get_name() const {
@@ -871,12 +1109,107 @@ class LoadTask {
soinfo* get_needed_by() const {
return needed_by_;
}
+
+ soinfo* get_soinfo() const {
+ return si_;
+ }
+
+ void set_soinfo(soinfo* si) {
+ si_ = si;
+ }
+
+ off64_t get_file_offset() const {
+ return file_offset_;
+ }
+
+ void set_file_offset(off64_t offset) {
+ file_offset_ = offset;
+ }
+
+ int get_fd() const {
+ return fd_;
+ }
+
+ void set_fd(int fd, bool assume_ownership) {
+ fd_ = fd;
+ close_fd_ = assume_ownership;
+ }
+
+ const android_dlextinfo* get_extinfo() const {
+ return extinfo_;
+ }
+
+ void set_extinfo(const android_dlextinfo* extinfo) {
+ extinfo_ = extinfo;
+ }
+
+ bool is_dt_needed() const {
+ return is_dt_needed_;
+ }
+
+ void set_dt_needed(bool is_dt_needed) {
+ is_dt_needed_ = is_dt_needed;
+ }
+
+ const ElfReader& get_elf_reader() const {
+ CHECK(si_ != nullptr);
+ return (*elf_readers_map_)[si_];
+ }
+
+ ElfReader& get_elf_reader() {
+ CHECK(si_ != nullptr);
+ return (*elf_readers_map_)[si_];
+ }
+
+ std::unordered_map<const soinfo*, ElfReader>* get_readers_map() {
+ return elf_readers_map_;
+ }
+
+ bool read(const char* realpath, off64_t file_size) {
+ ElfReader& elf_reader = get_elf_reader();
+ return elf_reader.Read(realpath, fd_, file_offset_, file_size);
+ }
+
+ bool load() {
+ ElfReader& elf_reader = get_elf_reader();
+ if (!elf_reader.Load(extinfo_)) {
+ return false;
+ }
+
+ si_->base = elf_reader.load_start();
+ si_->size = elf_reader.load_size();
+ si_->set_mapped_by_caller(elf_reader.is_mapped_by_caller());
+ si_->load_bias = elf_reader.load_bias();
+ si_->phnum = elf_reader.phdr_count();
+ si_->phdr = elf_reader.loaded_phdr();
+
+ return true;
+ }
+
private:
- LoadTask(const char* name, soinfo* needed_by)
- : name_(name), needed_by_(needed_by) {}
+ LoadTask(const char* name, soinfo* needed_by,
+ std::unordered_map<const soinfo*, ElfReader>* readers_map)
+ : name_(name), needed_by_(needed_by), si_(nullptr),
+ fd_(-1), close_fd_(false), file_offset_(0), elf_readers_map_(readers_map),
+ is_dt_needed_(false) {}
+
+ ~LoadTask() {
+ if (fd_ != -1 && close_fd_) {
+ close(fd_);
+ }
+ }
const char* name_;
soinfo* needed_by_;
+ soinfo* si_;
+ const android_dlextinfo* extinfo_;
+ int fd_;
+ bool close_fd_;
+ off64_t file_offset_;
+ std::unordered_map<const soinfo*, ElfReader>* elf_readers_map_;
+ // TODO(dimitry): needed by workaround for http://b/26394120 (the grey-list)
+ bool is_dt_needed_;
+ // END OF WORKAROUND
DISALLOW_IMPLICIT_CONSTRUCTORS(LoadTask);
};
@@ -888,7 +1221,7 @@ using linked_list_t = LinkedList<T, TypeBasedAllocator<LinkedListEntry<T>>>;
typedef linked_list_t<soinfo> SoinfoLinkedList;
typedef linked_list_t<const char> StringLinkedList;
-typedef linked_list_t<LoadTask> LoadTaskList;
+typedef std::vector<LoadTask*> LoadTaskList;
// This function walks down the tree of soinfo dependencies
@@ -929,7 +1262,8 @@ static bool walk_dependencies_tree(soinfo* root_soinfos[], size_t root_soinfos_s
static const ElfW(Sym)* dlsym_handle_lookup(soinfo* root, soinfo* skip_until,
- soinfo** found, SymbolName& symbol_name) {
+ soinfo** found, SymbolName& symbol_name,
+ const version_info* vi) {
const ElfW(Sym)* result = nullptr;
bool skip_lookup = skip_until != nullptr;
@@ -939,7 +1273,7 @@ static const ElfW(Sym)* dlsym_handle_lookup(soinfo* root, soinfo* skip_until,
return true;
}
- if (!current_soinfo->find_symbol_by_name(symbol_name, nullptr, &result)) {
+ if (!current_soinfo->find_symbol_by_name(symbol_name, vi, &result)) {
result = nullptr;
return false;
}
@@ -955,9 +1289,17 @@ static const ElfW(Sym)* dlsym_handle_lookup(soinfo* root, soinfo* skip_until,
return result;
}
+static const ElfW(Sym)* dlsym_linear_lookup(android_namespace_t* ns,
+ const char* name,
+ const version_info* vi,
+ soinfo** found,
+ soinfo* caller,
+ void* handle);
+
// This is used by dlsym(3). It performs symbol lookup only within the
// specified soinfo object and its dependencies in breadth first order.
-const ElfW(Sym)* dlsym_handle_lookup(soinfo* si, soinfo** found, const char* name) {
+static const ElfW(Sym)* dlsym_handle_lookup(soinfo* si, soinfo** found,
+ const char* name, const version_info* vi) {
// According to man dlopen(3) and posix docs in the case when si is handle
// of the main executable we need to search not only in the executable and its
// dependencies but also in all libraries loaded with RTLD_GLOBAL.
@@ -966,11 +1308,11 @@ const ElfW(Sym)* dlsym_handle_lookup(soinfo* si, soinfo** found, const char* nam
// libraries and they are loaded in breath-first (correct) order we can just execute
// dlsym(RTLD_DEFAULT, ...); instead of doing two stage lookup.
if (si == somain) {
- return dlsym_linear_lookup(name, found, nullptr, RTLD_DEFAULT);
+ return dlsym_linear_lookup(&g_default_namespace, name, vi, found, nullptr, RTLD_DEFAULT);
}
SymbolName symbol_name(name);
- return dlsym_handle_lookup(si, nullptr, found, symbol_name);
+ return dlsym_handle_lookup(si, nullptr, found, symbol_name, vi);
}
/* This is used by dlsym(3) to performs a global symbol lookup. If the
@@ -978,24 +1320,30 @@ const ElfW(Sym)* dlsym_handle_lookup(soinfo* si, soinfo** found, const char* nam
beginning of the global solist. Otherwise the search starts at the
specified soinfo (for RTLD_NEXT).
*/
-const ElfW(Sym)* dlsym_linear_lookup(const char* name,
- soinfo** found,
- soinfo* caller,
- void* handle) {
+static const ElfW(Sym)* dlsym_linear_lookup(android_namespace_t* ns,
+ const char* name,
+ const version_info* vi,
+ soinfo** found,
+ soinfo* caller,
+ void* handle) {
SymbolName symbol_name(name);
- soinfo* start = solist;
+ auto& soinfo_list = ns->soinfo_list();
+ auto start = soinfo_list.begin();
if (handle == RTLD_NEXT) {
if (caller == nullptr) {
return nullptr;
} else {
- start = caller->next;
+ auto it = soinfo_list.find(caller);
+ CHECK (it != soinfo_list.end());
+ start = ++it;
}
}
const ElfW(Sym)* s = nullptr;
- for (soinfo* si = start; si != nullptr; si = si->next) {
+ for (auto it = start, end = soinfo_list.end(); it != end; ++it) {
+ soinfo* si = *it;
// Do not skip RTLD_LOCAL libraries in dlsym(RTLD_DEFAULT, ...)
// if the library is opened by application with target api level <= 22
// See http://b/21565766
@@ -1003,7 +1351,7 @@ const ElfW(Sym)* dlsym_linear_lookup(const char* name,
continue;
}
- if (!si->find_symbol_by_name(symbol_name, nullptr, &s)) {
+ if (!si->find_symbol_by_name(symbol_name, vi, &s)) {
return nullptr;
}
@@ -1019,7 +1367,7 @@ const ElfW(Sym)* dlsym_linear_lookup(const char* name,
if (s == nullptr && caller != nullptr &&
(caller->get_rtld_flags() & RTLD_GLOBAL) == 0) {
return dlsym_handle_lookup(caller->get_local_group_root(),
- (handle == RTLD_NEXT) ? caller : nullptr, found, symbol_name);
+ (handle == RTLD_NEXT) ? caller : nullptr, found, symbol_name, vi);
}
if (s != nullptr) {
@@ -1086,15 +1434,65 @@ ElfW(Sym)* soinfo::elf_addr_lookup(const void* addr) {
return nullptr;
}
-static int open_library_in_zipfile(const char* const path,
- off64_t* file_offset) {
- TRACE("Trying zip file open from path '%s'", path);
+class ZipArchiveCache {
+ public:
+ ZipArchiveCache() {}
+ ~ZipArchiveCache();
+
+ bool get_or_open(const char* zip_path, ZipArchiveHandle* handle);
+ private:
+ DISALLOW_COPY_AND_ASSIGN(ZipArchiveCache);
+
+ std::unordered_map<std::string, ZipArchiveHandle> cache_;
+};
+
+bool ZipArchiveCache::get_or_open(const char* zip_path, ZipArchiveHandle* handle) {
+ std::string key(zip_path);
+
+ auto it = cache_.find(key);
+ if (it != cache_.end()) {
+ *handle = it->second;
+ return true;
+ }
+
+ int fd = TEMP_FAILURE_RETRY(open(zip_path, O_RDONLY | O_CLOEXEC));
+ if (fd == -1) {
+ return false;
+ }
+
+ if (OpenArchiveFd(fd, "", handle) != 0) {
+ // invalid zip-file (?)
+ CloseArchive(handle);
+ close(fd);
+ return false;
+ }
+
+ cache_[key] = *handle;
+ return true;
+}
+
+ZipArchiveCache::~ZipArchiveCache() {
+ for (const auto& it : cache_) {
+ CloseArchive(it.second);
+ }
+}
+
+static int open_library_in_zipfile(ZipArchiveCache* zip_archive_cache,
+ const char* const input_path,
+ off64_t* file_offset, std::string* realpath) {
+ std::string normalized_path;
+ if (!normalize_path(input_path, &normalized_path)) {
+ return -1;
+ }
+
+ const char* const path = normalized_path.c_str();
+ TRACE("Trying zip file open from path \"%s\" -> normalized \"%s\"", input_path, path);
// Treat an '!/' separator inside a path as the separator between the name
// of the zip file on disk and the subdirectory to search within it.
// For example, if path is "foo.zip!/bar/bas/x.so", then we search for
// "bar/bas/x.so" within "foo.zip".
- const char* separator = strstr(path, "!/");
+ const char* const separator = strstr(path, kZipFileSeparator);
if (separator == nullptr) {
return -1;
}
@@ -1115,19 +1513,15 @@ static int open_library_in_zipfile(const char* const path,
}
ZipArchiveHandle handle;
- if (OpenArchiveFd(fd, "", &handle, false) != 0) {
+ if (!zip_archive_cache->get_or_open(zip_path, &handle)) {
// invalid zip-file (?)
close(fd);
return -1;
}
- auto archive_guard = make_scope_guard([&]() {
- CloseArchive(handle);
- });
-
ZipEntry entry;
- if (FindEntry(handle, ZipEntryName(file_path), &entry) != 0) {
+ if (FindEntry(handle, ZipString(file_path), &entry) != 0) {
// Entry was not found.
close(fd);
return -1;
@@ -1140,6 +1534,15 @@ static int open_library_in_zipfile(const char* const path,
}
*file_offset = entry.offset;
+
+ if (realpath_fd(fd, realpath)) {
+ *realpath += separator;
+ } else {
+ PRINT("warning: unable to get realpath for the library \"%s\". Will use given path.",
+ normalized_path.c_str());
+ *realpath = normalized_path;
+ }
+
return fd;
}
@@ -1153,40 +1556,29 @@ static bool format_path(char* buf, size_t buf_size, const char* path, const char
return true;
}
-static int open_library_on_default_path(const char* name, off64_t* file_offset) {
- for (size_t i = 0; kDefaultLdPaths[i] != nullptr; ++i) {
- char buf[512];
- if (!format_path(buf, sizeof(buf), kDefaultLdPaths[i], name)) {
- continue;
- }
-
- int fd = TEMP_FAILURE_RETRY(open(buf, O_RDONLY | O_CLOEXEC));
- if (fd != -1) {
- *file_offset = 0;
- return fd;
- }
- }
-
- return -1;
-}
-
-static int open_library_on_ld_library_path(const char* name, off64_t* file_offset) {
- for (const auto& path_str : g_ld_library_paths) {
+static int open_library_on_paths(ZipArchiveCache* zip_archive_cache,
+ const char* name, off64_t* file_offset,
+ const std::vector<std::string>& paths,
+ std::string* realpath) {
+ for (const auto& path : paths) {
char buf[512];
- const char* const path = path_str.c_str();
- if (!format_path(buf, sizeof(buf), path, name)) {
+ if (!format_path(buf, sizeof(buf), path.c_str(), name)) {
continue;
}
int fd = -1;
- if (strchr(buf, '!') != nullptr) {
- fd = open_library_in_zipfile(buf, file_offset);
+ if (strstr(buf, kZipFileSeparator) != nullptr) {
+ fd = open_library_in_zipfile(zip_archive_cache, buf, file_offset, realpath);
}
if (fd == -1) {
fd = TEMP_FAILURE_RETRY(open(buf, O_RDONLY | O_CLOEXEC));
if (fd != -1) {
*file_offset = 0;
+ if (!realpath_fd(fd, realpath)) {
+ PRINT("warning: unable to get realpath for the library \"%s\". Will use given path.", buf);
+ *realpath = buf;
+ }
}
}
@@ -1198,30 +1590,56 @@ static int open_library_on_ld_library_path(const char* name, off64_t* file_offse
return -1;
}
-static int open_library(const char* name, off64_t* file_offset) {
+static int open_library(android_namespace_t* ns,
+ ZipArchiveCache* zip_archive_cache,
+ const char* name, soinfo *needed_by,
+ off64_t* file_offset, std::string* realpath) {
TRACE("[ opening %s ]", name);
// If the name contains a slash, we should attempt to open it directly and not search the paths.
if (strchr(name, '/') != nullptr) {
- if (strchr(name, '!') != nullptr) {
- int fd = open_library_in_zipfile(name, file_offset);
+ int fd = -1;
+
+ if (strstr(name, kZipFileSeparator) != nullptr) {
+ fd = open_library_in_zipfile(zip_archive_cache, name, file_offset, realpath);
+ }
+
+ if (fd == -1) {
+ fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CLOEXEC));
if (fd != -1) {
- return fd;
+ *file_offset = 0;
+ if (!realpath_fd(fd, realpath)) {
+ PRINT("warning: unable to get realpath for the library \"%s\". Will use given path.", name);
+ *realpath = name;
+ }
}
}
- int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CLOEXEC));
- if (fd != -1) {
- *file_offset = 0;
- }
return fd;
}
- // Otherwise we try LD_LIBRARY_PATH first, and fall back to the built-in well known paths.
- int fd = open_library_on_ld_library_path(name, file_offset);
+ // Otherwise we try LD_LIBRARY_PATH first, and fall back to the default library path
+ int fd = open_library_on_paths(zip_archive_cache, name, file_offset, ns->get_ld_library_paths(), realpath);
+ if (fd == -1 && needed_by != nullptr) {
+ fd = open_library_on_paths(zip_archive_cache, name, file_offset, needed_by->get_dt_runpath(), realpath);
+ // Check if the library is accessible
+ if (fd != -1 && !ns->is_accessible(*realpath)) {
+ fd = -1;
+ }
+ }
+
if (fd == -1) {
- fd = open_library_on_default_path(name, file_offset);
+ fd = open_library_on_paths(zip_archive_cache, name, file_offset, ns->get_default_library_paths(), realpath);
+ }
+
+ // TODO(dimitry): workaround for http://b/26394120 (the grey-list)
+ if (fd == -1 && ns != &g_default_namespace && is_greylisted(name, needed_by)) {
+ // try searching for it on default_namespace default_library_path
+ fd = open_library_on_paths(zip_archive_cache, name, file_offset,
+ g_default_namespace.get_default_library_paths(), realpath);
}
+ // END OF WORKAROUND
+
return fd;
}
@@ -1231,7 +1649,8 @@ static const char* fix_dt_needed(const char* dt_needed, const char* sopath __unu
if (get_application_target_sdk_version() <= 22) {
const char* bname = basename(dt_needed);
if (bname != dt_needed) {
- DL_WARN("'%s' library has invalid DT_NEEDED entry '%s'", sopath, dt_needed);
+ DL_WARN("library \"%s\" has invalid DT_NEEDED entry \"%s\"", sopath, dt_needed);
+ add_dlwarning(sopath, "invalid DT_NEEDED entry", dt_needed);
}
return bname;
@@ -1242,120 +1661,204 @@ static const char* fix_dt_needed(const char* dt_needed, const char* sopath __unu
template<typename F>
static void for_each_dt_needed(const soinfo* si, F action) {
- for (ElfW(Dyn)* d = si->dynamic; d->d_tag != DT_NULL; ++d) {
+ for (const ElfW(Dyn)* d = si->dynamic; d->d_tag != DT_NULL; ++d) {
if (d->d_tag == DT_NEEDED) {
action(fix_dt_needed(si->get_string(d->d_un.d_val), si->get_realpath()));
}
}
}
-static soinfo* load_library(int fd, off64_t file_offset,
- LoadTaskList& load_tasks,
- const char* name, int rtld_flags,
- const android_dlextinfo* extinfo) {
+template<typename F>
+static void for_each_dt_needed(const ElfReader& elf_reader, F action) {
+ for (const ElfW(Dyn)* d = elf_reader.dynamic(); d->d_tag != DT_NULL; ++d) {
+ if (d->d_tag == DT_NEEDED) {
+ action(fix_dt_needed(elf_reader.get_string(d->d_un.d_val), elf_reader.name()));
+ }
+ }
+}
+
+static bool load_library(android_namespace_t* ns,
+ LoadTask* task,
+ LoadTaskList* load_tasks,
+ int rtld_flags,
+ const std::string& realpath) {
+ off64_t file_offset = task->get_file_offset();
+ const char* name = task->get_name();
+ const android_dlextinfo* extinfo = task->get_extinfo();
+
if ((file_offset % PAGE_SIZE) != 0) {
DL_ERR("file offset for the library \"%s\" is not page-aligned: %" PRId64, name, file_offset);
- return nullptr;
+ return false;
}
if (file_offset < 0) {
DL_ERR("file offset for the library \"%s\" is negative: %" PRId64, name, file_offset);
- return nullptr;
+ return false;
}
struct stat file_stat;
- if (TEMP_FAILURE_RETRY(fstat(fd, &file_stat)) != 0) {
+ if (TEMP_FAILURE_RETRY(fstat(task->get_fd(), &file_stat)) != 0) {
DL_ERR("unable to stat file for the library \"%s\": %s", name, strerror(errno));
- return nullptr;
+ return false;
}
if (file_offset >= file_stat.st_size) {
DL_ERR("file offset for the library \"%s\" >= file size: %" PRId64 " >= %" PRId64,
name, file_offset, file_stat.st_size);
- return nullptr;
+ return false;
}
// Check for symlink and other situations where
// file can have different names, unless ANDROID_DLEXT_FORCE_LOAD is set
if (extinfo == nullptr || (extinfo->flags & ANDROID_DLEXT_FORCE_LOAD) == 0) {
- for (soinfo* si = solist; si != nullptr; si = si->next) {
- if (si->get_st_dev() != 0 &&
- si->get_st_ino() != 0 &&
- si->get_st_dev() == file_stat.st_dev &&
- si->get_st_ino() == file_stat.st_ino &&
- si->get_file_offset() == file_offset) {
- TRACE("library \"%s\" is already loaded under different name/path \"%s\" - "
- "will return existing soinfo", name, si->get_realpath());
- return si;
+ auto predicate = [&](soinfo* si) {
+ return si->get_st_dev() != 0 &&
+ si->get_st_ino() != 0 &&
+ si->get_st_dev() == file_stat.st_dev &&
+ si->get_st_ino() == file_stat.st_ino &&
+ si->get_file_offset() == file_offset;
+ };
+
+ soinfo* si = ns->soinfo_list().find_if(predicate);
+
+ // check public namespace
+ if (si == nullptr) {
+ si = g_public_namespace.find_if(predicate);
+ if (si != nullptr) {
+ ns->add_soinfo(si);
}
}
+
+ if (si != nullptr) {
+ TRACE("library \"%s\" is already loaded under different name/path \"%s\" - "
+ "will return existing soinfo", name, si->get_realpath());
+ task->set_soinfo(si);
+ return true;
+ }
}
if ((rtld_flags & RTLD_NOLOAD) != 0) {
DL_ERR("library \"%s\" wasn't loaded and RTLD_NOLOAD prevented it", name);
- return nullptr;
- }
-
- std::string realpath = name;
- if (!realpath_fd(fd, &realpath)) {
- PRINT("warning: unable to get realpath for the library \"%s\". Will use given name.", name);
- realpath = name;
+ return false;
}
- // Read the ELF header and load the segments.
- ElfReader elf_reader(realpath.c_str(), fd, file_offset, file_stat.st_size);
- if (!elf_reader.Load(extinfo)) {
- return nullptr;
+ if (!ns->is_accessible(realpath)) {
+ // TODO(dimitry): workaround for http://b/26394120 - the grey-list
+ const soinfo* needed_by = task->is_dt_needed() ? task->get_needed_by() : nullptr;
+ if (is_greylisted(name, needed_by)) {
+ // print warning only if needed by non-system library
+ if (needed_by == nullptr || !is_system_library(needed_by->get_realpath())) {
+ const soinfo* needed_or_dlopened_by = task->get_needed_by();
+ const char* sopath = needed_or_dlopened_by == nullptr ? "(unknown)" :
+ needed_or_dlopened_by->get_realpath();
+ DL_WARN("library \"%s\" (\"%s\") needed or dlopened by \"%s\" is not accessible for the namespace \"%s\""
+ " - the access is temporarily granted as a workaround for http://b/26394120, note that the access"
+ " will be removed in future releases of Android.",
+ name, realpath.c_str(), sopath, ns->get_name());
+ add_dlwarning(sopath, "unauthorized access to", name);
+ }
+ } else {
+ // do not load libraries if they are not accessible for the specified namespace.
+ const char* needed_or_dlopened_by = task->get_needed_by() == nullptr ?
+ "(unknown)" :
+ task->get_needed_by()->get_realpath();
+
+ DL_ERR("library \"%s\" needed or dlopened by \"%s\" is not accessible for the namespace \"%s\"",
+ name, needed_or_dlopened_by, ns->get_name());
+
+ PRINT("library \"%s\" (\"%s\") needed or dlopened by \"%s\" is not accessible for the"
+ " namespace: [name=\"%s\", ld_library_paths=\"%s\", default_library_paths=\"%s\","
+ " permitted_paths=\"%s\"]",
+ name, realpath.c_str(),
+ needed_or_dlopened_by,
+ ns->get_name(),
+ android::base::Join(ns->get_ld_library_paths(), ':').c_str(),
+ android::base::Join(ns->get_default_library_paths(), ':').c_str(),
+ android::base::Join(ns->get_permitted_paths(), ':').c_str());
+ return false;
+ }
}
- soinfo* si = soinfo_alloc(realpath.c_str(), &file_stat, file_offset, rtld_flags);
+ soinfo* si = soinfo_alloc(ns, realpath.c_str(), &file_stat, file_offset, rtld_flags);
if (si == nullptr) {
- return nullptr;
+ return false;
}
- si->base = elf_reader.load_start();
- si->size = elf_reader.load_size();
- si->load_bias = elf_reader.load_bias();
- si->phnum = elf_reader.phdr_count();
- si->phdr = elf_reader.loaded_phdr();
- if (!si->prelink_image()) {
+ task->set_soinfo(si);
+
+ // Read the ELF header and some of the segments.
+ if (!task->read(realpath.c_str(), file_stat.st_size)) {
soinfo_free(si);
- return nullptr;
+ task->set_soinfo(nullptr);
+ return false;
+ }
+
+ // find and set DT_RUNPATH and dt_soname
+ // Note that these field values are temporary and are
+ // going to be overwritten on soinfo::prelink_image
+ // with values from PT_LOAD segments.
+ const ElfReader& elf_reader = task->get_elf_reader();
+ for (const ElfW(Dyn)* d = elf_reader.dynamic(); d->d_tag != DT_NULL; ++d) {
+ if (d->d_tag == DT_RUNPATH) {
+ si->set_dt_runpath(elf_reader.get_string(d->d_un.d_val));
+ }
+ if (d->d_tag == DT_SONAME) {
+ si->set_soname(elf_reader.get_string(d->d_un.d_val));
+ }
}
- for_each_dt_needed(si, [&] (const char* name) {
- load_tasks.push_back(LoadTask::create(name, si));
+ for_each_dt_needed(task->get_elf_reader(), [&](const char* name) {
+ load_tasks->push_back(LoadTask::create(name, si, task->get_readers_map()));
});
- return si;
+ return true;
}
-static soinfo* load_library(LoadTaskList& load_tasks,
- const char* name, int rtld_flags,
- const android_dlextinfo* extinfo) {
+static bool load_library(android_namespace_t* ns,
+ LoadTask* task,
+ ZipArchiveCache* zip_archive_cache,
+ LoadTaskList* load_tasks,
+ int rtld_flags) {
+ const char* name = task->get_name();
+ soinfo* needed_by = task->get_needed_by();
+ const android_dlextinfo* extinfo = task->get_extinfo();
+
+ off64_t file_offset;
+ std::string realpath;
if (extinfo != nullptr && (extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD) != 0) {
- off64_t file_offset = 0;
+ file_offset = 0;
if ((extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET) != 0) {
file_offset = extinfo->library_fd_offset;
}
- return load_library(extinfo->library_fd, file_offset, load_tasks, name, rtld_flags, extinfo);
+
+ if (!realpath_fd(extinfo->library_fd, &realpath)) {
+ PRINT("warning: unable to get realpath for the library \"%s\" by extinfo->library_fd. "
+ "Will use given name.", name);
+ realpath = name;
+ }
+
+ task->set_fd(extinfo->library_fd, false);
+ task->set_file_offset(file_offset);
+ return load_library(ns, task, load_tasks, rtld_flags, realpath);
}
// Open the file.
- off64_t file_offset;
- int fd = open_library(name, &file_offset);
+ int fd = open_library(ns, zip_archive_cache, name, needed_by, &file_offset, &realpath);
if (fd == -1) {
DL_ERR("library \"%s\" not found", name);
- return nullptr;
+ return false;
}
- soinfo* result = load_library(fd, file_offset, load_tasks, name, rtld_flags, extinfo);
- close(fd);
- return result;
+
+ task->set_fd(fd, true);
+ task->set_file_offset(file_offset);
+
+ return load_library(ns, task, load_tasks, rtld_flags, realpath);
}
// Returns true if library was found and false in 2 cases
-// 1. The library was found but loaded under different target_sdk_version
-// (*candidate != nullptr)
+// 1. (for default namespace only) The library was found but loaded under different
+// target_sdk_version (*candidate != nullptr)
// 2. The library was not found by soname (*candidate is nullptr)
-static bool find_loaded_library_by_soname(const char* name, soinfo** candidate) {
+static bool find_loaded_library_by_soname(android_namespace_t* ns,
+ const char* name, soinfo** candidate) {
*candidate = nullptr;
// Ignore filename with path.
@@ -1365,7 +1868,7 @@ static bool find_loaded_library_by_soname(const char* name, soinfo** candidate)
uint32_t target_sdk_version = get_application_target_sdk_version();
- for (soinfo* si = solist; si != nullptr; si = si->next) {
+ return !ns->soinfo_list().visit([&](soinfo* si) {
const char* soname = si->get_soname();
if (soname != nullptr && (strcmp(name, soname) == 0)) {
// If the library was opened under different target sdk version
@@ -1375,45 +1878,68 @@ static bool find_loaded_library_by_soname(const char* name, soinfo** candidate)
// in any case.
bool is_libdl = si == solist;
if (is_libdl || (si->get_dt_flags_1() & DF_1_GLOBAL) != 0 ||
- !si->is_linked() || si->get_target_sdk_version() == target_sdk_version) {
+ !si->is_linked() || si->get_target_sdk_version() == target_sdk_version ||
+ ns != &g_default_namespace) {
*candidate = si;
- return true;
+ return false;
} else if (*candidate == nullptr) {
- // for the different sdk version - remember the first library.
+ // for the different sdk version in the default namespace
+ // remember the first library.
*candidate = si;
}
}
- }
- return false;
+ return true;
+ });
}
-static soinfo* find_library_internal(LoadTaskList& load_tasks, const char* name,
- int rtld_flags, const android_dlextinfo* extinfo) {
+static bool find_library_internal(android_namespace_t* ns,
+ LoadTask* task,
+ ZipArchiveCache* zip_archive_cache,
+ LoadTaskList* load_tasks,
+ int rtld_flags) {
soinfo* candidate;
- if (find_loaded_library_by_soname(name, &candidate)) {
- return candidate;
+ if (find_loaded_library_by_soname(ns, task->get_name(), &candidate)) {
+ task->set_soinfo(candidate);
+ return true;
+ }
+
+ if (ns != &g_default_namespace) {
+ // check public namespace
+ candidate = g_public_namespace.find_if([&](soinfo* si) {
+ return strcmp(task->get_name(), si->get_soname()) == 0;
+ });
+
+ if (candidate != nullptr) {
+ ns->add_soinfo(candidate);
+ task->set_soinfo(candidate);
+ return true;
+ }
}
// Library might still be loaded, the accurate detection
// of this fact is done by load_library.
- TRACE("[ '%s' find_loaded_library_by_soname returned false (*candidate=%s@%p). Trying harder...]",
- name, candidate == nullptr ? "n/a" : candidate->get_realpath(), candidate);
-
- soinfo* si = load_library(load_tasks, name, rtld_flags, extinfo);
+ TRACE("[ \"%s\" find_loaded_library_by_soname failed (*candidate=%s@%p). Trying harder...]",
+ task->get_name(), candidate == nullptr ? "n/a" : candidate->get_realpath(), candidate);
- // In case we were unable to load the library but there
- // is a candidate loaded under the same soname but different
- // sdk level - return it anyways.
- if (si == nullptr && candidate != nullptr) {
- si = candidate;
+ if (load_library(ns, task, zip_archive_cache, load_tasks, rtld_flags)) {
+ return true;
+ } else {
+ // In case we were unable to load the library but there
+ // is a candidate loaded under the same soname but different
+ // sdk level - return it anyways.
+ if (candidate != nullptr) {
+ task->set_soinfo(candidate);
+ return true;
+ }
}
- return si;
+ return false;
}
static void soinfo_unload(soinfo* si);
+static void soinfo_unload(soinfo* soinfos[], size_t count);
// TODO: this is slightly unusual way to construct
// the global group for relocation. Not every RTLD_GLOBAL
@@ -1422,29 +1948,68 @@ static void soinfo_unload(soinfo* si);
//
// This group consists of the main executable, LD_PRELOADs
// and libraries with the DF_1_GLOBAL flag set.
-static soinfo::soinfo_list_t make_global_group() {
+static soinfo::soinfo_list_t make_global_group(android_namespace_t* ns) {
soinfo::soinfo_list_t global_group;
- for (soinfo* si = somain; si != nullptr; si = si->next) {
+ ns->soinfo_list().for_each([&](soinfo* si) {
if ((si->get_dt_flags_1() & DF_1_GLOBAL) != 0) {
global_group.push_back(si);
}
- }
+ });
return global_group;
}
-static bool find_libraries(soinfo* start_with, const char* const library_names[],
- size_t library_names_count, soinfo* soinfos[], std::vector<soinfo*>* ld_preloads,
- size_t ld_preloads_count, int rtld_flags, const android_dlextinfo* extinfo) {
+// This function provides a list of libraries to be shared
+// by the namespace. For the default namespace this is the global
+// group (see make_global_group). For all others this is a group
+// of RTLD_GLOBAL libraries (which includes the global group from
+// the default namespace).
+static soinfo::soinfo_list_t get_shared_group(android_namespace_t* ns) {
+ if (ns == &g_default_namespace) {
+ return make_global_group(ns);
+ }
+
+ soinfo::soinfo_list_t shared_group;
+ ns->soinfo_list().for_each([&](soinfo* si) {
+ if ((si->get_rtld_flags() & RTLD_GLOBAL) != 0) {
+ shared_group.push_back(si);
+ }
+ });
+
+ return shared_group;
+}
+
+static void shuffle(std::vector<LoadTask*>* v) {
+ for (size_t i = 0, size = v->size(); i < size; ++i) {
+ size_t n = size - i;
+ size_t r = arc4random_uniform(n);
+ std::swap((*v)[n-1], (*v)[r]);
+ }
+}
+
+// add_as_children - add first-level loaded libraries (i.e. library_names[], but
+// not their transitive dependencies) as children of the start_with library.
+// This is false when find_libraries is called for dlopen(), when newly loaded
+// libraries must form a disjoint tree.
+static bool find_libraries(android_namespace_t* ns,
+ soinfo* start_with,
+ const char* const library_names[],
+ size_t library_names_count, soinfo* soinfos[],
+ std::vector<soinfo*>* ld_preloads,
+ size_t ld_preloads_count, int rtld_flags,
+ const android_dlextinfo* extinfo,
+ bool add_as_children) {
// Step 0: prepare.
LoadTaskList load_tasks;
+ std::unordered_map<const soinfo*, ElfReader> readers_map;
+
for (size_t i = 0; i < library_names_count; ++i) {
const char* name = library_names[i];
- load_tasks.push_back(LoadTask::create(name, start_with));
+ load_tasks.push_back(LoadTask::create(name, start_with, &readers_map));
}
// Construct global_group.
- soinfo::soinfo_list_t global_group = make_global_group();
+ soinfo::soinfo_list_t global_group = make_global_group(ns);
// If soinfos array is null allocate one on stack.
// The array is needed in case of failure; for example
@@ -1462,29 +2027,36 @@ static bool find_libraries(soinfo* start_with, const char* const library_names[]
// list of libraries to link - see step 2.
size_t soinfos_count = 0;
- auto failure_guard = make_scope_guard([&]() {
- // Housekeeping
- load_tasks.for_each([] (LoadTask* t) {
+ auto scope_guard = make_scope_guard([&]() {
+ for (LoadTask* t : load_tasks) {
LoadTask::deleter(t);
- });
-
- for (size_t i = 0; i<soinfos_count; ++i) {
- soinfo_unload(soinfos[i]);
}
});
- // Step 1: load and pre-link all DT_NEEDED libraries in breadth first order.
- for (LoadTask::unique_ptr task(load_tasks.pop_front());
- task.get() != nullptr; task.reset(load_tasks.pop_front())) {
+ auto failure_guard = make_scope_guard([&]() {
+ // Housekeeping
+ soinfo_unload(soinfos, soinfos_count);
+ });
+
+ ZipArchiveCache zip_archive_cache;
+
+ // Step 1: expand the list of load_tasks to include
+ // all DT_NEEDED libraries (do not load them just yet)
+ for (size_t i = 0; i<load_tasks.size(); ++i) {
+ LoadTask* task = load_tasks[i];
soinfo* needed_by = task->get_needed_by();
- soinfo* si = find_library_internal(load_tasks, task->get_name(),
- rtld_flags, needed_by == nullptr ? extinfo : nullptr);
- if (si == nullptr) {
+ bool is_dt_needed = needed_by != nullptr && (needed_by != start_with || add_as_children);
+ task->set_extinfo(is_dt_needed ? nullptr : extinfo);
+ task->set_dt_needed(is_dt_needed);
+
+ if(!find_library_internal(ns, task, &zip_archive_cache, &load_tasks, rtld_flags)) {
return false;
}
- if (needed_by != nullptr) {
+ soinfo* si = task->get_soinfo();
+
+ if (is_dt_needed) {
needed_by->add_child(si);
}
@@ -1495,11 +2067,6 @@ static bool find_libraries(soinfo* start_with, const char* const library_names[]
// When ld_preloads is not null, the first
// ld_preloads_count libs are in fact ld_preloads.
if (ld_preloads != nullptr && soinfos_count < ld_preloads_count) {
- // Add LD_PRELOADed libraries to the global group for future runs.
- // There is no need to explicitly add them to the global group
- // for this run because they are going to appear in the local
- // group in the correct order.
- si->set_dt_flags_1(si->get_dt_flags_1() | DF_1_GLOBAL);
ld_preloads->push_back(si);
}
@@ -1508,11 +2075,51 @@ static bool find_libraries(soinfo* start_with, const char* const library_names[]
}
}
- // Step 2: link libraries.
+ // Step 2: Load libraries in random order (see b/24047022)
+ LoadTaskList load_list;
+ for (auto&& task : load_tasks) {
+ soinfo* si = task->get_soinfo();
+ auto pred = [&](const LoadTask* t) {
+ return t->get_soinfo() == si;
+ };
+
+ if (!si->is_linked() &&
+ std::find_if(load_list.begin(), load_list.end(), pred) == load_list.end() ) {
+ load_list.push_back(task);
+ }
+ }
+ shuffle(&load_list);
+
+ for (auto&& task : load_list) {
+ if (!task->load()) {
+ return false;
+ }
+ }
+
+ // Step 3: pre-link all DT_NEEDED libraries in breadth first order.
+ for (auto&& task : load_tasks) {
+ soinfo* si = task->get_soinfo();
+ if (!si->is_linked() && !si->prelink_image()) {
+ return false;
+ }
+ }
+
+ // Step 4: Add LD_PRELOADed libraries to the global group for
+ // future runs. There is no need to explicitly add them to
+ // the global group for this run because they are going to
+ // appear in the local group in the correct order.
+ if (ld_preloads != nullptr) {
+ for (auto&& si : *ld_preloads) {
+ si->set_dt_flags_1(si->get_dt_flags_1() | DF_1_GLOBAL);
+ }
+ }
+
+
+ // Step 5: link libraries.
soinfo::soinfo_list_t local_group;
walk_dependencies_tree(
- start_with == nullptr ? soinfos : &start_with,
- start_with == nullptr ? soinfos_count : 1,
+ (start_with != nullptr && add_as_children) ? &start_with : soinfos,
+ (start_with != nullptr && add_as_children) ? 1 : soinfos_count,
[&] (soinfo* si) {
local_group.push_back(si);
return true;
@@ -1527,13 +2134,18 @@ static bool find_libraries(soinfo* start_with, const char* const library_names[]
if (!si->link_image(global_group, local_group, extinfo)) {
return false;
}
- si->set_linked();
}
return true;
});
if (linked) {
+ local_group.for_each([](soinfo* si) {
+ if (!si->is_linked()) {
+ si->set_linked();
+ }
+ });
+
failure_guard.disable();
}
@@ -1544,12 +2156,16 @@ static bool find_libraries(soinfo* start_with, const char* const library_names[]
return linked;
}
-static soinfo* find_library(const char* name, int rtld_flags, const android_dlextinfo* extinfo) {
+static soinfo* find_library(android_namespace_t* ns,
+ const char* name, int rtld_flags,
+ const android_dlextinfo* extinfo,
+ soinfo* needed_by) {
soinfo* si;
if (name == nullptr) {
si = somain;
- } else if (!find_libraries(nullptr, &name, 1, &si, nullptr, 0, rtld_flags, extinfo)) {
+ } else if (!find_libraries(ns, needed_by, &name, 1, &si, nullptr, 0, rtld_flags,
+ extinfo, /* add_as_children */ false)) {
return nullptr;
}
@@ -1557,101 +2173,137 @@ static soinfo* find_library(const char* name, int rtld_flags, const android_dlex
}
static void soinfo_unload(soinfo* root) {
+ if (root->is_linked()) {
+ root = root->get_local_group_root();
+ }
+
+ if (!root->can_unload()) {
+ TRACE("not unloading \"%s\" - the binary is flagged with NODELETE", root->get_realpath());
+ return;
+ }
+
+ soinfo_unload(&root, 1);
+}
+
+static void soinfo_unload(soinfo* soinfos[], size_t count) {
// Note that the library can be loaded but not linked;
// in which case there is no root but we still need
// to walk the tree and unload soinfos involved.
//
// This happens on unsuccessful dlopen, when one of
// the DT_NEEDED libraries could not be linked/found.
- if (root->is_linked()) {
- root = root->get_local_group_root();
+ if (count == 0) {
+ return;
}
- if (!root->can_unload()) {
- TRACE("not unloading '%s' - the binary is flagged with NODELETE", root->get_realpath());
- return;
+ soinfo::soinfo_list_t unload_list;
+ for (size_t i = 0; i < count; ++i) {
+ soinfo* si = soinfos[i];
+
+ if (si->can_unload()) {
+ size_t ref_count = si->is_linked() ? si->decrement_ref_count() : 0;
+ if (ref_count == 0) {
+ unload_list.push_back(si);
+ } else {
+ TRACE("not unloading '%s' group, decrementing ref_count to %zd",
+ si->get_realpath(), ref_count);
+ }
+ } else {
+ TRACE("not unloading '%s' - the binary is flagged with NODELETE", si->get_realpath());
+ return;
+ }
}
- size_t ref_count = root->is_linked() ? root->decrement_ref_count() : 0;
+ // This is used to identify soinfos outside of the load-group
+ // note that we cannot have > 1 in the array and have any of them
+ // linked. This is why we can safely use the first one.
+ soinfo* root = soinfos[0];
- if (ref_count == 0) {
- soinfo::soinfo_list_t local_unload_list;
- soinfo::soinfo_list_t external_unload_list;
- soinfo::soinfo_list_t depth_first_list;
- depth_first_list.push_back(root);
- soinfo* si = nullptr;
+ soinfo::soinfo_list_t local_unload_list;
+ soinfo::soinfo_list_t external_unload_list;
+ soinfo* si = nullptr;
- while ((si = depth_first_list.pop_front()) != nullptr) {
- if (local_unload_list.contains(si)) {
- continue;
- }
+ while ((si = unload_list.pop_front()) != nullptr) {
+ if (local_unload_list.contains(si)) {
+ continue;
+ }
- local_unload_list.push_back(si);
-
- if (si->has_min_version(0)) {
- soinfo* child = nullptr;
- while ((child = si->get_children().pop_front()) != nullptr) {
- TRACE("%s@%p needs to unload %s@%p", si->get_realpath(), si,
- child->get_realpath(), child);
-
- if (local_unload_list.contains(child)) {
- continue;
- } else if (child->is_linked() && child->get_local_group_root() != root) {
- child->get_parents().remove_if([&] (const soinfo* parent) {
- return parent == si;
- });
- external_unload_list.push_back(child);
- } else {
- depth_first_list.push_front(child);
- }
+ local_unload_list.push_back(si);
+
+ if (si->has_min_version(0)) {
+ soinfo* child = nullptr;
+ while ((child = si->get_children().pop_front()) != nullptr) {
+ TRACE("%s@%p needs to unload %s@%p", si->get_realpath(), si,
+ child->get_realpath(), child);
+
+ if (local_unload_list.contains(child)) {
+ continue;
+ } else if (child->is_linked() && child->get_local_group_root() != root) {
+ child->get_parents().remove_if([&] (const soinfo* parent) {
+ return parent == si;
+ });
+ external_unload_list.push_back(child);
+ } else {
+ unload_list.push_front(child);
}
- } else {
-#if !defined(__work_around_b_19059885__)
- __libc_fatal("soinfo for \"%s\"@%p has no version", si->get_realpath(), si);
+ }
+ } else {
+#if !defined(__work_around_b_24465209__)
+ __libc_fatal("soinfo for \"%s\"@%p has no version", si->get_realpath(), si);
#else
- PRINT("warning: soinfo for \"%s\"@%p has no version", si->get_realpath(), si);
- for_each_dt_needed(si, [&] (const char* library_name) {
- TRACE("deprecated (old format of soinfo): %s needs to unload %s",
- si->get_realpath(), library_name);
-
- soinfo* needed = find_library(library_name, RTLD_NOLOAD, nullptr);
- if (needed != nullptr) {
- // Not found: for example if symlink was deleted between dlopen and dlclose
- // Since we cannot really handle errors at this point - print and continue.
- PRINT("warning: couldn't find %s needed by %s on unload.",
- library_name, si->get_realpath());
- return;
- } else if (local_unload_list.contains(needed)) {
- // already visited
- return;
- } else if (needed->is_linked() && needed->get_local_group_root() != root) {
- // external group
- external_unload_list.push_back(needed);
- } else {
- // local group
- depth_first_list.push_front(needed);
- }
- });
+ PRINT("warning: soinfo for \"%s\"@%p has no version", si->get_realpath(), si);
+ for_each_dt_needed(si, [&] (const char* library_name) {
+ TRACE("deprecated (old format of soinfo): %s needs to unload %s",
+ si->get_realpath(), library_name);
+
+ soinfo* needed = find_library(si->get_primary_namespace(),
+ library_name, RTLD_NOLOAD, nullptr, nullptr);
+
+ if (needed != nullptr) {
+ // Not found: for example if symlink was deleted between dlopen and dlclose
+ // Since we cannot really handle errors at this point - print and continue.
+ PRINT("warning: couldn't find %s needed by %s on unload.",
+ library_name, si->get_realpath());
+ return;
+ } else if (local_unload_list.contains(needed)) {
+ // already visited
+ return;
+ } else if (needed->is_linked() && needed->get_local_group_root() != root) {
+ // external group
+ external_unload_list.push_back(needed);
+ } else {
+ // local group
+ unload_list.push_front(needed);
+ }
+ });
#endif
- }
}
+ }
- local_unload_list.for_each([](soinfo* si) {
- si->call_destructors();
- });
+ local_unload_list.for_each([](soinfo* si) {
+ si->call_destructors();
+ });
- while ((si = local_unload_list.pop_front()) != nullptr) {
- notify_gdb_of_unload(si);
- soinfo_free(si);
- }
+ while ((si = local_unload_list.pop_front()) != nullptr) {
+ notify_gdb_of_unload(si);
+ soinfo_free(si);
+ }
- while ((si = external_unload_list.pop_front()) != nullptr) {
- soinfo_unload(si);
- }
- } else {
- TRACE("not unloading '%s' group, decrementing ref_count to %zd",
- root->get_realpath(), ref_count);
+ while ((si = external_unload_list.pop_front()) != nullptr) {
+ soinfo_unload(si);
+ }
+}
+
+static std::string symbol_display_name(const char* sym_name, const char* sym_ver) {
+ if (sym_ver == nullptr) {
+ return sym_name;
}
+
+ return std::string(sym_name) + ", version " + sym_ver;
+}
+
+static android_namespace_t* get_caller_namespace(soinfo* caller) {
+ return caller != nullptr ? caller->get_primary_namespace() : g_anonymous_namespace;
}
void do_android_get_LD_LIBRARY_PATH(char* buffer, size_t buffer_size) {
@@ -1662,49 +2314,273 @@ void do_android_get_LD_LIBRARY_PATH(char* buffer, size_t buffer_size) {
// See b/17302493 for further details.
// Once the above bug is fixed, this code can be modified to use
// snprintf again.
- size_t required_len = strlen(kDefaultLdPaths[0]) + strlen(kDefaultLdPaths[1]) + 2;
+ size_t required_len = 0;
+ for (size_t i = 0; g_default_ld_paths[i] != nullptr; ++i) {
+ required_len += strlen(g_default_ld_paths[i]) + 1;
+ }
if (buffer_size < required_len) {
__libc_fatal("android_get_LD_LIBRARY_PATH failed, buffer too small: "
"buffer len %zu, required len %zu", buffer_size, required_len);
}
- char* end = stpcpy(buffer, kDefaultLdPaths[0]);
- *end = ':';
- strcpy(end + 1, kDefaultLdPaths[1]);
+ char* end = buffer;
+ for (size_t i = 0; g_default_ld_paths[i] != nullptr; ++i) {
+ if (i > 0) *end++ = ':';
+ end = stpcpy(end, g_default_ld_paths[i]);
+ }
}
void do_android_update_LD_LIBRARY_PATH(const char* ld_library_path) {
parse_LD_LIBRARY_PATH(ld_library_path);
}
-soinfo* do_dlopen(const char* name, int flags, const android_dlextinfo* extinfo) {
+void* do_dlopen(const char* name, int flags, const android_dlextinfo* extinfo,
+ void* caller_addr) {
+ soinfo* const caller = find_containing_library(caller_addr);
+
if ((flags & ~(RTLD_NOW|RTLD_LAZY|RTLD_LOCAL|RTLD_GLOBAL|RTLD_NODELETE|RTLD_NOLOAD)) != 0) {
DL_ERR("invalid flags to dlopen: %x", flags);
return nullptr;
}
+
+ android_namespace_t* ns = get_caller_namespace(caller);
+
if (extinfo != nullptr) {
if ((extinfo->flags & ~(ANDROID_DLEXT_VALID_FLAG_BITS)) != 0) {
DL_ERR("invalid extended flags to android_dlopen_ext: 0x%" PRIx64, extinfo->flags);
return nullptr;
}
+
if ((extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD) == 0 &&
(extinfo->flags & ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET) != 0) {
DL_ERR("invalid extended flag combination (ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET without "
"ANDROID_DLEXT_USE_LIBRARY_FD): 0x%" PRIx64, extinfo->flags);
return nullptr;
}
+
+ if ((extinfo->flags & ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS) != 0 &&
+ (extinfo->flags & (ANDROID_DLEXT_RESERVED_ADDRESS | ANDROID_DLEXT_RESERVED_ADDRESS_HINT)) != 0) {
+ DL_ERR("invalid extended flag combination: ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS is not "
+ "compatible with ANDROID_DLEXT_RESERVED_ADDRESS/ANDROID_DLEXT_RESERVED_ADDRESS_HINT");
+ return nullptr;
+ }
+
+ if ((extinfo->flags & ANDROID_DLEXT_USE_NAMESPACE) != 0) {
+ if (extinfo->library_namespace == nullptr) {
+ DL_ERR("ANDROID_DLEXT_USE_NAMESPACE is set but extinfo->library_namespace is null");
+ return nullptr;
+ }
+ ns = extinfo->library_namespace;
+ }
}
ProtectedDataGuard guard;
- soinfo* si = find_library(name, flags, extinfo);
+ soinfo* si = find_library(ns, name, flags, extinfo, caller);
if (si != nullptr) {
si->call_constructors();
+ return si->to_handle();
}
- return si;
+
+ return nullptr;
}
-void do_dlclose(soinfo* si) {
+int do_dladdr(const void* addr, Dl_info* info) {
+ // Determine if this address can be found in any library currently mapped.
+ soinfo* si = find_containing_library(addr);
+ if (si == nullptr) {
+ return 0;
+ }
+
+ memset(info, 0, sizeof(Dl_info));
+
+ info->dli_fname = si->get_realpath();
+ // Address at which the shared object is loaded.
+ info->dli_fbase = reinterpret_cast<void*>(si->base);
+
+ // Determine if any symbol in the library contains the specified address.
+ ElfW(Sym)* sym = si->find_symbol_by_address(addr);
+ if (sym != nullptr) {
+ info->dli_sname = si->get_string(sym->st_name);
+ info->dli_saddr = reinterpret_cast<void*>(si->resolve_symbol_address(sym));
+ }
+
+ return 1;
+}
+
+static soinfo* soinfo_from_handle(void* handle) {
+ if ((reinterpret_cast<uintptr_t>(handle) & 1) != 0) {
+ auto it = g_soinfo_handles_map.find(reinterpret_cast<uintptr_t>(handle));
+ if (it == g_soinfo_handles_map.end()) {
+ return nullptr;
+ } else {
+ return it->second;
+ }
+ }
+
+ return static_cast<soinfo*>(handle);
+}
+
+bool do_dlsym(void* handle, const char* sym_name, const char* sym_ver,
+ void* caller_addr, void** symbol) {
+#if !defined(__LP64__)
+ if (handle == nullptr) {
+ DL_ERR("dlsym failed: library handle is null");
+ return false;
+ }
+#endif
+
+ if (sym_name == nullptr) {
+ DL_ERR("dlsym failed: symbol name is null");
+ return false;
+ }
+
+ soinfo* found = nullptr;
+ const ElfW(Sym)* sym = nullptr;
+ soinfo* caller = find_containing_library(caller_addr);
+ android_namespace_t* ns = get_caller_namespace(caller);
+
+ version_info vi_instance;
+ version_info* vi = nullptr;
+
+ if (sym_ver != nullptr) {
+ vi_instance.name = sym_ver;
+ vi_instance.elf_hash = calculate_elf_hash(sym_ver);
+ vi = &vi_instance;
+ }
+
+ if (handle == RTLD_DEFAULT || handle == RTLD_NEXT) {
+ sym = dlsym_linear_lookup(ns, sym_name, vi, &found, caller, handle);
+ } else {
+ soinfo* si = soinfo_from_handle(handle);
+ if (si == nullptr) {
+ DL_ERR("dlsym failed: invalid handle: %p", handle);
+ return false;
+ }
+ sym = dlsym_handle_lookup(si, &found, sym_name, vi);
+ }
+
+ if (sym != nullptr) {
+ uint32_t bind = ELF_ST_BIND(sym->st_info);
+
+ if ((bind == STB_GLOBAL || bind == STB_WEAK) && sym->st_shndx != 0) {
+ *symbol = reinterpret_cast<void*>(found->resolve_symbol_address(sym));
+ return true;
+ }
+
+ DL_ERR("symbol \"%s\" found but not global", symbol_display_name(sym_name, sym_ver).c_str());
+ return false;
+ }
+
+ DL_ERR("undefined symbol: %s", symbol_display_name(sym_name, sym_ver).c_str());
+ return false;
+}
+
+int do_dlclose(void* handle) {
ProtectedDataGuard guard;
+ soinfo* si = soinfo_from_handle(handle);
+ if (si == nullptr) {
+ DL_ERR("invalid handle: %p", handle);
+ return -1;
+ }
+
soinfo_unload(si);
+ return 0;
+}
+
+bool init_namespaces(const char* public_ns_sonames, const char* anon_ns_library_path) {
+ CHECK(public_ns_sonames != nullptr);
+ if (g_public_namespace_initialized) {
+ DL_ERR("public namespace has already been initialized.");
+ return false;
+ }
+
+ std::vector<std::string> sonames = android::base::Split(public_ns_sonames, ":");
+
+ ProtectedDataGuard guard;
+
+ auto failure_guard = make_scope_guard([&]() {
+ g_public_namespace.clear();
+ });
+
+ for (const auto& soname : sonames) {
+ soinfo* candidate = nullptr;
+
+ find_loaded_library_by_soname(&g_default_namespace, soname.c_str(), &candidate);
+
+ if (candidate == nullptr) {
+ DL_ERR("error initializing public namespace: \"%s\" was not found"
+ " in the default namespace", soname.c_str());
+ return false;
+ }
+
+ candidate->set_nodelete();
+ g_public_namespace.push_back(candidate);
+ }
+
+ g_public_namespace_initialized = true;
+
+ // create anonymous namespace
+ // When the caller is nullptr - create_namespace will take global group
+ // from the anonymous namespace, which is fine because anonymous namespace
+ // is still pointing to the default one.
+ android_namespace_t* anon_ns =
+ create_namespace(nullptr, "(anonymous)", nullptr, anon_ns_library_path,
+ ANDROID_NAMESPACE_TYPE_REGULAR, nullptr, &g_default_namespace);
+
+ if (anon_ns == nullptr) {
+ g_public_namespace_initialized = false;
+ return false;
+ }
+ g_anonymous_namespace = anon_ns;
+ failure_guard.disable();
+ return true;
+}
+
+android_namespace_t* create_namespace(const void* caller_addr,
+ const char* name,
+ const char* ld_library_path,
+ const char* default_library_path,
+ uint64_t type,
+ const char* permitted_when_isolated_path,
+ android_namespace_t* parent_namespace) {
+ if (!g_public_namespace_initialized) {
+ DL_ERR("cannot create namespace: public namespace is not initialized.");
+ return nullptr;
+ }
+
+ if (parent_namespace == nullptr) {
+ // if parent_namespace is nullptr -> set it to the caller namespace
+ soinfo* caller_soinfo = find_containing_library(caller_addr);
+
+ parent_namespace = caller_soinfo != nullptr ?
+ caller_soinfo->get_primary_namespace() :
+ g_anonymous_namespace;
+ }
+
+ ProtectedDataGuard guard;
+ std::vector<std::string> ld_library_paths;
+ std::vector<std::string> default_library_paths;
+ std::vector<std::string> permitted_paths;
+
+ parse_path(ld_library_path, ":", &ld_library_paths);
+ parse_path(default_library_path, ":", &default_library_paths);
+ parse_path(permitted_when_isolated_path, ":", &permitted_paths);
+
+ android_namespace_t* ns = new (g_namespace_allocator.alloc()) android_namespace_t();
+ ns->set_name(name);
+ ns->set_isolated((type & ANDROID_NAMESPACE_TYPE_ISOLATED) != 0);
+ ns->set_ld_library_paths(std::move(ld_library_paths));
+ ns->set_default_library_paths(std::move(default_library_paths));
+ ns->set_permitted_paths(std::move(permitted_paths));
+
+ if ((type & ANDROID_NAMESPACE_TYPE_SHARED) != 0) {
+ // If shared - clone the parent namespace
+ ns->add_soinfos(parent_namespace->soinfo_list());
+ } else {
+ // If not shared - copy only the shared group
+ ns->add_soinfos(get_shared_group(parent_namespace));
+ }
+
+ return ns;
}
static ElfW(Addr) call_ifunc_resolver(ElfW(Addr) resolver_addr) {
@@ -1857,7 +2733,7 @@ bool soinfo::relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& r
const char* sym_name = nullptr;
ElfW(Addr) addend = get_addend(rel, reloc);
- DEBUG("Processing '%s' relocation at index %zd", get_realpath(), idx);
+ DEBUG("Processing \"%s\" relocation at index %zd", get_realpath(), idx);
if (type == R_GENERIC_NONE) {
continue;
}
@@ -2028,24 +2904,23 @@ bool soinfo::relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& r
count_relocation(kRelocAbsolute);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO ABS64 %16llx <- %16llx %s\n",
- reloc, (sym_addr + addend), sym_name);
- *reinterpret_cast<ElfW(Addr)*>(reloc) += (sym_addr + addend);
+ reloc, sym_addr + addend, sym_name);
+ *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend;
break;
case R_AARCH64_ABS32:
count_relocation(kRelocAbsolute);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO ABS32 %16llx <- %16llx %s\n",
- reloc, (sym_addr + addend), sym_name);
+ reloc, sym_addr + addend, sym_name);
{
- const ElfW(Addr) reloc_value = *reinterpret_cast<ElfW(Addr)*>(reloc);
const ElfW(Addr) min_value = static_cast<ElfW(Addr)>(INT32_MIN);
const ElfW(Addr) max_value = static_cast<ElfW(Addr)>(UINT32_MAX);
- if ((min_value <= (reloc_value + (sym_addr + addend))) &&
- ((reloc_value + (sym_addr + addend)) <= max_value)) {
- *reinterpret_cast<ElfW(Addr)*>(reloc) += (sym_addr + addend);
+ if ((min_value <= (sym_addr + addend)) &&
+ ((sym_addr + addend) <= max_value)) {
+ *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend;
} else {
DL_ERR("0x%016llx out of range 0x%016llx to 0x%016llx",
- (reloc_value + (sym_addr + addend)), min_value, max_value);
+ sym_addr + addend, min_value, max_value);
return false;
}
}
@@ -2054,17 +2929,16 @@ bool soinfo::relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& r
count_relocation(kRelocAbsolute);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO ABS16 %16llx <- %16llx %s\n",
- reloc, (sym_addr + addend), sym_name);
+ reloc, sym_addr + addend, sym_name);
{
- const ElfW(Addr) reloc_value = *reinterpret_cast<ElfW(Addr)*>(reloc);
const ElfW(Addr) min_value = static_cast<ElfW(Addr)>(INT16_MIN);
const ElfW(Addr) max_value = static_cast<ElfW(Addr)>(UINT16_MAX);
- if ((min_value <= (reloc_value + (sym_addr + addend))) &&
- ((reloc_value + (sym_addr + addend)) <= max_value)) {
- *reinterpret_cast<ElfW(Addr)*>(reloc) += (sym_addr + addend);
+ if ((min_value <= (sym_addr + addend)) &&
+ ((sym_addr + addend) <= max_value)) {
+ *reinterpret_cast<ElfW(Addr)*>(reloc) = (sym_addr + addend);
} else {
DL_ERR("0x%016llx out of range 0x%016llx to 0x%016llx",
- reloc_value + (sym_addr + addend), min_value, max_value);
+ sym_addr + addend, min_value, max_value);
return false;
}
}
@@ -2073,24 +2947,23 @@ bool soinfo::relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& r
count_relocation(kRelocRelative);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO REL64 %16llx <- %16llx - %16llx %s\n",
- reloc, (sym_addr + addend), rel->r_offset, sym_name);
- *reinterpret_cast<ElfW(Addr)*>(reloc) += (sym_addr + addend) - rel->r_offset;
+ reloc, sym_addr + addend, rel->r_offset, sym_name);
+ *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend - rel->r_offset;
break;
case R_AARCH64_PREL32:
count_relocation(kRelocRelative);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO REL32 %16llx <- %16llx - %16llx %s\n",
- reloc, (sym_addr + addend), rel->r_offset, sym_name);
+ reloc, sym_addr + addend, rel->r_offset, sym_name);
{
- const ElfW(Addr) reloc_value = *reinterpret_cast<ElfW(Addr)*>(reloc);
const ElfW(Addr) min_value = static_cast<ElfW(Addr)>(INT32_MIN);
const ElfW(Addr) max_value = static_cast<ElfW(Addr)>(UINT32_MAX);
- if ((min_value <= (reloc_value + ((sym_addr + addend) - rel->r_offset))) &&
- ((reloc_value + ((sym_addr + addend) - rel->r_offset)) <= max_value)) {
- *reinterpret_cast<ElfW(Addr)*>(reloc) += ((sym_addr + addend) - rel->r_offset);
+ if ((min_value <= (sym_addr + addend - rel->r_offset)) &&
+ ((sym_addr + addend - rel->r_offset) <= max_value)) {
+ *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend - rel->r_offset;
} else {
DL_ERR("0x%016llx out of range 0x%016llx to 0x%016llx",
- reloc_value + ((sym_addr + addend) - rel->r_offset), min_value, max_value);
+ sym_addr + addend - rel->r_offset, min_value, max_value);
return false;
}
}
@@ -2099,17 +2972,16 @@ bool soinfo::relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& r
count_relocation(kRelocRelative);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO REL16 %16llx <- %16llx - %16llx %s\n",
- reloc, (sym_addr + addend), rel->r_offset, sym_name);
+ reloc, sym_addr + addend, rel->r_offset, sym_name);
{
- const ElfW(Addr) reloc_value = *reinterpret_cast<ElfW(Addr)*>(reloc);
const ElfW(Addr) min_value = static_cast<ElfW(Addr)>(INT16_MIN);
const ElfW(Addr) max_value = static_cast<ElfW(Addr)>(UINT16_MAX);
- if ((min_value <= (reloc_value + ((sym_addr + addend) - rel->r_offset))) &&
- ((reloc_value + ((sym_addr + addend) - rel->r_offset)) <= max_value)) {
- *reinterpret_cast<ElfW(Addr)*>(reloc) += ((sym_addr + addend) - rel->r_offset);
+ if ((min_value <= (sym_addr + addend - rel->r_offset)) &&
+ ((sym_addr + addend - rel->r_offset) <= max_value)) {
+ *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend - rel->r_offset;
} else {
DL_ERR("0x%016llx out of range 0x%016llx to 0x%016llx",
- reloc_value + ((sym_addr + addend) - rel->r_offset), min_value, max_value);
+ sym_addr + addend - rel->r_offset, min_value, max_value);
return false;
}
}
@@ -2141,14 +3013,14 @@ bool soinfo::relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& r
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO R_X86_64_32 %08zx <- +%08zx %s", static_cast<size_t>(reloc),
static_cast<size_t>(sym_addr), sym_name);
- *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend;
+ *reinterpret_cast<Elf32_Addr*>(reloc) = sym_addr + addend;
break;
case R_X86_64_64:
count_relocation(kRelocRelative);
MARK(rel->r_offset);
TRACE_TYPE(RELO, "RELO R_X86_64_64 %08zx <- +%08zx %s", static_cast<size_t>(reloc),
static_cast<size_t>(sym_addr), sym_name);
- *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend;
+ *reinterpret_cast<Elf64_Addr*>(reloc) = sym_addr + addend;
break;
case R_X86_64_PC32:
count_relocation(kRelocRelative);
@@ -2156,7 +3028,7 @@ bool soinfo::relocate(const VersionTracker& version_tracker, ElfRelIteratorT&& r
TRACE_TYPE(RELO, "RELO R_X86_64_PC32 %08zx <- +%08zx (%08zx - %08zx) %s",
static_cast<size_t>(reloc), static_cast<size_t>(sym_addr - reloc),
static_cast<size_t>(sym_addr), static_cast<size_t>(reloc), sym_name);
- *reinterpret_cast<ElfW(Addr)*>(reloc) = sym_addr + addend - reloc;
+ *reinterpret_cast<Elf32_Addr*>(reloc) = sym_addr + addend - reloc;
break;
#elif defined(__arm__)
case R_ARM_ABS32:
@@ -2214,7 +3086,7 @@ void soinfo::call_array(const char* array_name __unused, linker_function_t* func
return;
}
- TRACE("[ Calling %s (size %zd) @ %p for '%s' ]", array_name, count, functions, get_realpath());
+ TRACE("[ Calling %s (size %zd) @ %p for \"%s\" ]", array_name, count, functions, get_realpath());
int begin = reverse ? (count - 1) : 0;
int end = reverse ? -1 : count;
@@ -2225,7 +3097,7 @@ void soinfo::call_array(const char* array_name __unused, linker_function_t* func
call_function("function", functions[i]);
}
- TRACE("[ Done calling %s for '%s' ]", array_name, get_realpath());
+ TRACE("[ Done calling %s for \"%s\" ]", array_name, get_realpath());
}
void soinfo::call_function(const char* function_name __unused, linker_function_t function) {
@@ -2233,9 +3105,9 @@ void soinfo::call_function(const char* function_name __unused, linker_function_t
return;
}
- TRACE("[ Calling %s @ %p for '%s' ]", function_name, function, get_realpath());
+ TRACE("[ Calling %s @ %p for \"%s\" ]", function_name, function, get_realpath());
function();
- TRACE("[ Done calling %s @ %p for '%s' ]", function_name, function, get_realpath());
+ TRACE("[ Done calling %s @ %p for \"%s\" ]", function_name, function, get_realpath());
}
void soinfo::call_pre_init_constructors() {
@@ -2263,8 +3135,7 @@ void soinfo::call_constructors() {
if (!is_main_executable() && preinit_array_ != nullptr) {
// The GNU dynamic linker silently ignores these, but we warn the developer.
- PRINT("\"%s\": ignoring %zd-entry DT_PREINIT_ARRAY in shared library!",
- get_realpath(), preinit_array_count_);
+ PRINT("\"%s\": ignoring DT_PREINIT_ARRAY in shared library!", get_realpath());
}
get_children().for_each([] (soinfo* si) {
@@ -2320,9 +3191,20 @@ void soinfo::remove_all_links() {
});
});
- // 2. Once everything untied - clear local lists.
+ // 2. Remove from the primary namespace
+ primary_namespace_->remove_soinfo(this);
+ primary_namespace_ = nullptr;
+
+ // 3. Remove from secondary namespaces
+ secondary_namespaces_.for_each([&](android_namespace_t* ns) {
+ ns->remove_soinfo(this);
+ });
+
+
+ // 4. Once everything untied - clear local lists.
parents_.clear();
children_.clear();
+ secondary_namespaces_.clear();
}
dev_t soinfo::get_st_dev() const {
@@ -2379,8 +3261,12 @@ void soinfo::set_dt_flags_1(uint32_t dt_flags_1) {
}
}
+void soinfo::set_nodelete() {
+ rtld_flags_ |= RTLD_NODELETE;
+}
+
const char* soinfo::get_realpath() const {
-#if defined(__work_around_b_19059885__)
+#if defined(__work_around_b_24465209__)
if (has_min_version(2)) {
return realpath_.c_str();
} else {
@@ -2391,8 +3277,19 @@ const char* soinfo::get_realpath() const {
#endif
}
+void soinfo::set_soname(const char* soname) {
+#if defined(__work_around_b_24465209__)
+ if (has_min_version(2)) {
+ soname_ = soname;
+ }
+ strlcpy(old_name_, soname_, sizeof(old_name_));
+#else
+ soname_ = soname;
+#endif
+}
+
const char* soinfo::get_soname() const {
-#if defined(__work_around_b_19059885__)
+#if defined(__work_around_b_24465209__)
if (has_min_version(2)) {
return soname_;
} else {
@@ -2431,6 +3328,29 @@ soinfo::soinfo_list_t& soinfo::get_parents() {
return g_empty_list;
}
+static std::vector<std::string> g_empty_runpath;
+
+const std::vector<std::string>& soinfo::get_dt_runpath() const {
+ if (has_min_version(3)) {
+ return dt_runpath_;
+ }
+
+ return g_empty_runpath;
+}
+
+android_namespace_t* soinfo::get_primary_namespace() {
+ if (has_min_version(3)) {
+ return primary_namespace_;
+ }
+
+ return &g_default_namespace;
+}
+
+void soinfo::add_secondary_namespace(android_namespace_t* secondary_ns) {
+ CHECK(has_min_version(3));
+ secondary_namespaces_.push_back(secondary_ns);
+}
+
ElfW(Addr) soinfo::resolve_symbol_address(const ElfW(Sym)* s) const {
if (ELF_ST_TYPE(s->st_info) == STT_GNU_IFUNC) {
return call_ifunc_resolver(s->st_value + load_bias);
@@ -2453,7 +3373,7 @@ bool soinfo::is_gnu_hash() const {
}
bool soinfo::can_unload() const {
- return (get_rtld_flags() & (RTLD_NODELETE | RTLD_GLOBAL)) == 0;
+ return !is_linked() || ((get_rtld_flags() & (RTLD_NODELETE | RTLD_GLOBAL)) == 0);
}
bool soinfo::is_linked() const {
@@ -2464,6 +3384,10 @@ bool soinfo::is_main_executable() const {
return (flags_ & FLAG_EXE) != 0;
}
+bool soinfo::is_linker() const {
+ return (flags_ & FLAG_LINKER) != 0;
+}
+
void soinfo::set_linked() {
flags_ |= FLAG_LINKED;
}
@@ -2488,6 +3412,19 @@ soinfo* soinfo::get_local_group_root() const {
return local_group_root_;
}
+
+void soinfo::set_mapped_by_caller(bool mapped_by_caller) {
+ if (mapped_by_caller) {
+ flags_ |= FLAG_MAPPED_BY_CALLER;
+ } else {
+ flags_ &= ~FLAG_MAPPED_BY_CALLER;
+ }
+}
+
+bool soinfo::is_mapped_by_caller() const {
+ return (flags_ & FLAG_MAPPED_BY_CALLER) != 0;
+}
+
// This function returns api-level at the time of
// dlopen/load. Note that libraries opened by system
// will always have 'current' api level.
@@ -2499,6 +3436,39 @@ uint32_t soinfo::get_target_sdk_version() const {
return local_group_root_->target_sdk_version_;
}
+uintptr_t soinfo::get_handle() const {
+ CHECK(has_min_version(3));
+ CHECK(handle_ != 0);
+ return handle_;
+}
+
+void* soinfo::to_handle() {
+ if (get_application_target_sdk_version() <= 23 || !has_min_version(3)) {
+ return this;
+ }
+
+ return reinterpret_cast<void*>(get_handle());
+}
+
+void soinfo::generate_handle() {
+ CHECK(has_min_version(3));
+ CHECK(handle_ == 0); // Make sure this is the first call
+
+ // Make sure the handle is unique and does not collide
+ // with special values which are RTLD_DEFAULT and RTLD_NEXT.
+ do {
+ arc4random_buf(&handle_, sizeof(handle_));
+ // the least significant bit for the handle is always 1
+ // making it easy to test the type of handle passed to
+ // dl* functions.
+ handle_ = handle_ | 1;
+ } while (handle_ == reinterpret_cast<uintptr_t>(RTLD_DEFAULT) ||
+ handle_ == reinterpret_cast<uintptr_t>(RTLD_NEXT) ||
+ g_soinfo_handles_map.find(handle_) != g_soinfo_handles_map.end());
+
+ g_soinfo_handles_map[handle_] = this;
+}
+
bool soinfo::prelink_image() {
/* Extract dynamic section */
ElfW(Word) dynamic_flags = 0;
@@ -2507,7 +3477,7 @@ bool soinfo::prelink_image() {
/* We can't log anything until the linker is relocated */
bool relocating_linker = (flags_ & FLAG_LINKER) != 0;
if (!relocating_linker) {
- INFO("[ linking %s ]", get_realpath());
+ INFO("[ Linking \"%s\" ]", get_realpath());
DEBUG("si->base = %p si->flags = 0x%08x", reinterpret_cast<void*>(base), flags_);
}
@@ -2867,6 +3837,10 @@ bool soinfo::prelink_image() {
verneed_cnt_ = d->d_un.d_val;
break;
+ case DT_RUNPATH:
+ // this is parsed after we have strtab initialized (see below).
+ break;
+
default:
if (!relocating_linker) {
DL_WARN("%s: unused DT entry: type %p arg %p", get_realpath(),
@@ -2876,6 +3850,12 @@ bool soinfo::prelink_image() {
}
}
+#if defined(__mips__) && !defined(__LP64__)
+ if (!mips_check_and_adjust_fp_modes()) {
+ return false;
+ }
+#endif
+
DEBUG("si->base = %p, si->strtab = %p, si->symtab = %p",
reinterpret_cast<void*>(base), strtab_, symtab_);
@@ -2900,12 +3880,13 @@ bool soinfo::prelink_image() {
// second pass - parse entries relying on strtab
for (ElfW(Dyn)* d = dynamic; d->d_tag != DT_NULL; ++d) {
- if (d->d_tag == DT_SONAME) {
- soname_ = get_string(d->d_un.d_val);
-#if defined(__work_around_b_19059885__)
- strlcpy(old_name_, soname_, sizeof(old_name_));
-#endif
- break;
+ switch (d->d_tag) {
+ case DT_SONAME:
+ set_soname(get_string(d->d_un.d_val));
+ break;
+ case DT_RUNPATH:
+ set_dt_runpath(get_string(d->d_un.d_val));
+ break;
}
}
@@ -2920,6 +3901,7 @@ bool soinfo::prelink_image() {
soname_ = basename(realpath_.c_str());
DL_WARN("%s: is missing DT_SONAME will use basename as a replacement: \"%s\"",
get_realpath(), soname_);
+ // Don't call add_dlwarning because a missing DT_SONAME isn't important enough to show in the UI
}
return true;
}
@@ -2945,17 +3927,16 @@ bool soinfo::link_image(const soinfo_list_t& global_group, const soinfo_list_t&
#if !defined(__LP64__)
if (has_text_relocations) {
// Fail if app is targeting sdk version > 22
- // TODO (dimitry): remove != __ANDROID_API__ check once http://b/20020312 is fixed
- if (get_application_target_sdk_version() != __ANDROID_API__
- && get_application_target_sdk_version() > 22) {
+ if (get_application_target_sdk_version() > 22) {
PRINT("%s: has text relocations", get_realpath());
DL_ERR("%s: has text relocations", get_realpath());
return false;
}
// Make segments writable to allow text relocations to work properly. We will later call
- // phdr_table_protect_segments() after all of them are applied and all constructors are run.
+ // phdr_table_protect_segments() after all of them are applied.
DL_WARN("%s has text relocations. This is wasting memory and prevents "
"security hardening. Please fix.", get_realpath());
+ add_dlwarning(get_realpath(), "text relocations");
if (phdr_table_unprotect_segments(phdr, phnum, load_bias) < 0) {
DL_ERR("can't unprotect loadable segments for \"%s\": %s",
get_realpath(), strerror(errno));
@@ -3043,10 +4024,9 @@ bool soinfo::link_image(const soinfo_list_t& global_group, const soinfo_list_t&
}
#endif
- /* We can also turn on GNU RELRO protection */
- if (phdr_table_protect_gnu_relro(phdr, phnum, load_bias) < 0) {
- DL_ERR("can't enable GNU RELRO protection for \"%s\": %s",
- get_realpath(), strerror(errno));
+ // We can also turn on GNU RELRO protection if we're not linking the dynamic linker
+ // itself --- it can't make system calls yet, and will have to call protect_relro later.
+ if (!is_linker() && !protect_relro()) {
return false;
}
@@ -3071,6 +4051,15 @@ bool soinfo::link_image(const soinfo_list_t& global_group, const soinfo_list_t&
return true;
}
+bool soinfo::protect_relro() {
+ if (phdr_table_protect_gnu_relro(phdr, phnum, load_bias) < 0) {
+ DL_ERR("can't enable GNU RELRO protection for \"%s\": %s",
+ get_realpath(), strerror(errno));
+ return false;
+ }
+ return true;
+}
+
/*
* This function add vdso to internal dso list.
* It helps to stack unwinding through signal handlers.
@@ -3083,7 +4072,7 @@ static void add_vdso(KernelArgumentBlock& args __unused) {
return;
}
- soinfo* si = soinfo_alloc("[vdso]", nullptr, 0, 0);
+ soinfo* si = soinfo_alloc(&g_default_namespace, "[vdso]", nullptr, 0, 0);
si->phdr = reinterpret_cast<ElfW(Phdr)*>(reinterpret_cast<char*>(ehdr_vdso) + ehdr_vdso->e_phoff);
si->phnum = ehdr_vdso->e_phnum;
@@ -3096,32 +4085,22 @@ static void add_vdso(KernelArgumentBlock& args __unused) {
#endif
}
-/*
- * This is linker soinfo for GDB. See details below.
- */
-#if defined(__LP64__)
-#define LINKER_PATH "/system/bin/linker64"
-#else
-#define LINKER_PATH "/system/bin/linker"
-#endif
-
-// This is done to avoid calling c-tor prematurely
-// because soinfo c-tor needs memory allocator
-// which might be initialized after global variables.
-static uint8_t linker_soinfo_for_gdb_buf[sizeof(soinfo)] __attribute__((aligned(8)));
-static soinfo* linker_soinfo_for_gdb = nullptr;
-
/* gdb expects the linker to be in the debug shared object list.
* Without this, gdb has trouble locating the linker's ".text"
* and ".plt" sections. Gdb could also potentially use this to
* relocate the offset of our exported 'rtld_db_dlactivity' symbol.
- * Don't use soinfo_alloc(), because the linker shouldn't
- * be on the soinfo list.
+ * Note that the linker shouldn't be on the soinfo list.
*/
static void init_linker_info_for_gdb(ElfW(Addr) linker_base) {
- linker_soinfo_for_gdb = new (linker_soinfo_for_gdb_buf) soinfo(LINKER_PATH, nullptr, 0, 0);
+ static link_map linker_link_map_for_gdb;
+#if defined(__LP64__)
+ static char kLinkerPath[] = "/system/bin/linker64";
+#else
+ static char kLinkerPath[] = "/system/bin/linker";
+#endif
- linker_soinfo_for_gdb->load_bias = linker_base;
+ linker_link_map_for_gdb.l_addr = linker_base;
+ linker_link_map_for_gdb.l_name = kLinkerPath;
/*
* Set the dynamic field in the link map otherwise gdb will complain with
@@ -3132,12 +4111,48 @@ static void init_linker_info_for_gdb(ElfW(Addr) linker_base) {
ElfW(Ehdr)* elf_hdr = reinterpret_cast<ElfW(Ehdr)*>(linker_base);
ElfW(Phdr)* phdr = reinterpret_cast<ElfW(Phdr)*>(linker_base + elf_hdr->e_phoff);
phdr_table_get_dynamic_section(phdr, elf_hdr->e_phnum, linker_base,
- &linker_soinfo_for_gdb->dynamic, nullptr);
- insert_soinfo_into_debug_map(linker_soinfo_for_gdb);
+ &linker_link_map_for_gdb.l_ld, nullptr);
+
+ insert_link_map_into_debug_map(&linker_link_map_for_gdb);
}
+static void init_default_namespace() {
+ g_default_namespace.set_name("(default)");
+ g_default_namespace.set_isolated(false);
+
+ const char *interp = phdr_table_get_interpreter_name(somain->phdr, somain->phnum,
+ somain->load_bias);
+ const char* bname = basename(interp);
+ if (bname && (strcmp(bname, "linker_asan") == 0 || strcmp(bname, "linker_asan64") == 0)) {
+ g_default_ld_paths = kAsanDefaultLdPaths;
+ } else {
+ g_default_ld_paths = kDefaultLdPaths;
+ }
+
+ std::vector<std::string> ld_default_paths;
+ for (size_t i = 0; g_default_ld_paths[i] != nullptr; ++i) {
+ ld_default_paths.push_back(g_default_ld_paths[i]);
+ }
+
+ g_default_namespace.set_default_library_paths(std::move(ld_default_paths));
+};
+
extern "C" int __system_properties_init(void);
+static const char* get_executable_path() {
+ static std::string executable_path;
+ if (executable_path.empty()) {
+ char path[PATH_MAX];
+ ssize_t path_len = readlink("/proc/self/exe", path, sizeof(path));
+ if (path_len == -1 || path_len >= static_cast<ssize_t>(sizeof(path))) {
+ __libc_fatal("readlink('/proc/self/exe') failed: %s", strerror(errno));
+ }
+ executable_path = std::string(path, path_len);
+ }
+
+ return executable_path.c_str();
+}
+
/*
* This code is called after the linker has linked itself and
* fixed it's own GOT. It is safe to make references to externs
@@ -3163,34 +4178,48 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW(
g_ld_debug_verbosity = atoi(LD_DEBUG);
}
+#if defined(__LP64__)
+ INFO("[ Android dynamic linker (64-bit) ]");
+#else
+ INFO("[ Android dynamic linker (32-bit) ]");
+#endif
+
// These should have been sanitized by __libc_init_AT_SECURE, but the test
// doesn't cost us anything.
const char* ldpath_env = nullptr;
const char* ldpreload_env = nullptr;
if (!getauxval(AT_SECURE)) {
ldpath_env = getenv("LD_LIBRARY_PATH");
+ if (ldpath_env != nullptr) {
+ INFO("[ LD_LIBRARY_PATH set to \"%s\" ]", ldpath_env);
+ }
ldpreload_env = getenv("LD_PRELOAD");
+ if (ldpreload_env != nullptr) {
+ INFO("[ LD_PRELOAD set to \"%s\" ]", ldpreload_env);
+ }
}
- INFO("[ android linker & debugger ]");
+ const char* executable_path = get_executable_path();
+ struct stat file_stat;
+ if (TEMP_FAILURE_RETRY(stat(executable_path, &file_stat)) != 0) {
+ __libc_fatal("unable to stat file for the executable \"%s\": %s", executable_path, strerror(errno));
+ }
- soinfo* si = soinfo_alloc(args.argv[0], nullptr, 0, RTLD_GLOBAL);
+ soinfo* si = soinfo_alloc(&g_default_namespace, executable_path, &file_stat, 0, RTLD_GLOBAL);
if (si == nullptr) {
- exit(EXIT_FAILURE);
+ __libc_fatal("Couldn't allocate soinfo: out of memory?");
}
/* bootstrap the link map, the main exe always needs to be first */
si->set_main_executable();
link_map* map = &(si->link_map_head);
+ // Register the main executable and the linker upfront to have
+ // gdb aware of them before loading the rest of the dependency
+ // tree.
map->l_addr = 0;
- map->l_name = args.argv[0];
- map->l_prev = nullptr;
- map->l_next = nullptr;
-
- _r_debug.r_map = map;
- r_debug_tail = map;
-
+ map->l_name = const_cast<char*>(executable_path);
+ insert_link_map_into_debug_map(map);
init_linker_info_for_gdb(linker_base);
// Extract information passed from the kernel.
@@ -3216,8 +4245,8 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW(
ElfW(Ehdr)* elf_hdr = reinterpret_cast<ElfW(Ehdr)*>(si->base);
if (elf_hdr->e_type != ET_DYN) {
- __libc_format_fd(2, "error: only position independent executables (PIE) are supported.\n");
- exit(EXIT_FAILURE);
+ __libc_fatal("\"%s\": error: only position independent executables (PIE) are supported.",
+ args.argv[0]);
}
// Use LD_LIBRARY_PATH and LD_PRELOAD (but only if we aren't setuid/setgid).
@@ -3226,9 +4255,10 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW(
somain = si;
+ init_default_namespace();
+
if (!si->prelink_image()) {
- __libc_format_fd(2, "CANNOT LINK EXECUTABLE: %s\n", linker_get_error_buffer());
- exit(EXIT_FAILURE);
+ __libc_fatal("CANNOT LINK EXECUTABLE \"%s\": %s", args.argv[0], linker_get_error_buffer());
}
// add somain to global group
@@ -3256,14 +4286,13 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW(
needed_library_name_list.copy_to_array(needed_library_names, needed_libraries_count);
if (needed_libraries_count > 0 &&
- !find_libraries(si, needed_library_names, needed_libraries_count, nullptr,
- &g_ld_preloads, ld_preloads_count, RTLD_GLOBAL, nullptr)) {
- __libc_format_fd(2, "CANNOT LINK EXECUTABLE: %s\n", linker_get_error_buffer());
- exit(EXIT_FAILURE);
+ !find_libraries(&g_default_namespace, si, needed_library_names, needed_libraries_count,
+ nullptr, &g_ld_preloads, ld_preloads_count, RTLD_GLOBAL, nullptr,
+ /* add_as_children */ true)) {
+ __libc_fatal("CANNOT LINK EXECUTABLE \"%s\": %s", args.argv[0], linker_get_error_buffer());
} else if (needed_libraries_count == 0) {
if (!si->link_image(g_empty_list, soinfo::soinfo_list_t::make_list(si), nullptr)) {
- __libc_format_fd(2, "CANNOT LINK EXECUTABLE: %s\n", linker_get_error_buffer());
- exit(EXIT_FAILURE);
+ __libc_fatal("CANNOT LINK EXECUTABLE \"%s\": %s", args.argv[0], linker_get_error_buffer());
}
si->increment_ref_count();
}
@@ -3325,7 +4354,7 @@ static ElfW(Addr) __linker_init_post_relocation(KernelArgumentBlock& args, ElfW(
fflush(stdout);
#endif
- TRACE("[ Ready to execute '%s' @ %p ]", si->get_realpath(), reinterpret_cast<void*>(si->entry));
+ TRACE("[ Ready to execute \"%s\" @ %p ]", si->get_realpath(), reinterpret_cast<void*>(si->entry));
return si->entry;
}
@@ -3353,7 +4382,9 @@ static ElfW(Addr) get_elf_exec_load_bias(const ElfW(Ehdr)* elf) {
return 0;
}
-extern "C" void _start();
+static void __linker_cannot_link(KernelArgumentBlock& args) {
+ __libc_fatal("CANNOT LINK EXECUTABLE \"%s\": %s", args.argv[0], linker_get_error_buffer());
+}
/*
* This is the entry point for the linker, called from begin.S. This
@@ -3372,7 +4403,7 @@ extern "C" ElfW(Addr) __linker_init(void* raw_args) {
ElfW(Ehdr)* elf_hdr = reinterpret_cast<ElfW(Ehdr)*>(linker_addr);
ElfW(Phdr)* phdr = reinterpret_cast<ElfW(Phdr)*>(linker_addr + elf_hdr->e_phoff);
- soinfo linker_so(nullptr, nullptr, 0, 0);
+ soinfo linker_so(nullptr, nullptr, nullptr, 0, 0);
// If the linker is not acting as PT_INTERP entry_point is equal to
// _start. Which means that the linker is running as an executable and
@@ -3381,7 +4412,10 @@ extern "C" ElfW(Addr) __linker_init(void* raw_args) {
// This happens when user tries to run 'adb shell /system/bin/linker'
// see also https://code.google.com/p/android/issues/detail?id=63174
if (reinterpret_cast<ElfW(Addr)>(&_start) == entry_point) {
- __libc_fatal("This is %s, the helper program for shared library executables.\n", args.argv[0]);
+ __libc_format_fd(STDOUT_FILENO,
+ "This is %s, the helper program for shared library executables.\n",
+ args.argv[0]);
+ exit(0);
}
linker_so.base = linker_addr;
@@ -3392,25 +4426,35 @@ extern "C" ElfW(Addr) __linker_init(void* raw_args) {
linker_so.phnum = elf_hdr->e_phnum;
linker_so.set_linker_flag();
+ // Prelink the linker so we can access linker globals.
+ if (!linker_so.prelink_image()) __linker_cannot_link(args);
+
// This might not be obvious... The reasons why we pass g_empty_list
// in place of local_group here are (1) we do not really need it, because
// linker is built with DT_SYMBOLIC and therefore relocates its symbols against
// itself without having to look into local_group and (2) allocators
// are not yet initialized, and therefore we cannot use linked_list.push_*
// functions at this point.
- if (!(linker_so.prelink_image() && linker_so.link_image(g_empty_list, g_empty_list, nullptr))) {
- // It would be nice to print an error message, but if the linker
- // can't link itself, there's no guarantee that we'll be able to
- // call write() (because it involves a GOT reference). We may as
- // well try though...
- const char* msg = "CANNOT LINK EXECUTABLE: ";
- write(2, msg, strlen(msg));
- write(2, __linker_dl_err_buf, strlen(__linker_dl_err_buf));
- write(2, "\n", 1);
- _exit(EXIT_FAILURE);
- }
+ if (!linker_so.link_image(g_empty_list, g_empty_list, nullptr)) __linker_cannot_link(args);
+
+#if defined(__i386__)
+ // On x86, we can't make system calls before this point.
+ // We can't move this up because this needs to assign to a global.
+ // Note that until we call __libc_init_main_thread below we have
+ // no TLS, so you shouldn't make a system call that can fail, because
+ // it will SEGV when it tries to set errno.
+ __libc_init_sysinfo(args);
+#endif
+
+ // Initialize the main thread (including TLS, so system calls really work).
+ __libc_init_main_thread(args);
+
+ // We didn't protect the linker's RELRO pages in link_image because we
+ // couldn't make system calls on x86 at that point, but we can now...
+ if (!linker_so.protect_relro()) __linker_cannot_link(args);
- __libc_init_tls(args);
+ // Initialize the linker's static libc's globals
+ __libc_init_globals(args);
// Initialize the linker's own global variables
linker_so.call_constructors();
@@ -3420,13 +4464,14 @@ extern "C" ElfW(Addr) __linker_init(void* raw_args) {
// before get_libdl_info().
solist = get_libdl_info();
sonext = get_libdl_info();
+ g_default_namespace.add_soinfo(get_libdl_info());
// We have successfully fixed our own relocations. It's safe to run
// the main part of the linker now.
args.abort_message_ptr = &g_abort_message;
ElfW(Addr) start_address = __linker_init_post_relocation(args, linker_addr);
- INFO("[ jumping to _start ]");
+ INFO("[ Jumping to _start (%p)... ]", reinterpret_cast<void*>(start_address));
// Return the address that the calling assembly stub should jump to.
return start_address;
diff --git a/linker/linker.h b/linker/linker.h
index 023b6721f..3ea601fa2 100644
--- a/linker/linker.h
+++ b/linker/linker.h
@@ -29,13 +29,15 @@
#ifndef _LINKER_H_
#define _LINKER_H_
+#include <dlfcn.h>
+#include <android/dlext.h>
#include <elf.h>
#include <inttypes.h>
#include <link.h>
-#include <unistd.h>
-#include <android/dlext.h>
#include <sys/stat.h>
+#include <unistd.h>
+#include "private/bionic_page.h"
#include "private/libc_logging.h"
#include "linked_list.h"
@@ -77,27 +79,19 @@
#define ELF64_R_TYPE(info) (((info) >> 56) & 0xff)
#endif
-// Returns the address of the page containing address 'x'.
-#define PAGE_START(x) ((x) & PAGE_MASK)
-
-// Returns the offset of address 'x' in its page.
-#define PAGE_OFFSET(x) ((x) & ~PAGE_MASK)
-
-// Returns the address of the next page after address 'x', unless 'x' is
-// itself at the start of a page.
-#define PAGE_END(x) PAGE_START((x) + (PAGE_SIZE-1))
-
-#define FLAG_LINKED 0x00000001
-#define FLAG_EXE 0x00000004 // The main executable
-#define FLAG_LINKER 0x00000010 // The linker itself
-#define FLAG_GNU_HASH 0x00000040 // uses gnu hash
-#define FLAG_NEW_SOINFO 0x40000000 // new soinfo format
+#define FLAG_LINKED 0x00000001
+#define FLAG_EXE 0x00000004 // The main executable
+#define FLAG_LINKER 0x00000010 // The linker itself
+#define FLAG_GNU_HASH 0x00000040 // uses gnu hash
+#define FLAG_MAPPED_BY_CALLER 0x00000080 // the map is reserved by the caller
+ // and should not be unmapped
+#define FLAG_NEW_SOINFO 0x40000000 // new soinfo format
#define SUPPORTED_DT_FLAGS_1 (DF_1_NOW | DF_1_GLOBAL | DF_1_NODELETE)
-#define SOINFO_VERSION 2
+#define SOINFO_VERSION 3
-#if defined(__work_around_b_19059885__)
+#if defined(__work_around_b_24465209__)
#define SOINFO_NAME_LEN 128
#endif
@@ -120,6 +114,16 @@ class SoinfoListAllocator {
DISALLOW_IMPLICIT_CONSTRUCTORS(SoinfoListAllocator);
};
+class NamespaceListAllocator {
+ public:
+ static LinkedListEntry<android_namespace_t>* alloc();
+ static void free(LinkedListEntry<android_namespace_t>* entry);
+
+ private:
+ // unconstructable
+ DISALLOW_IMPLICIT_CONSTRUCTORS(NamespaceListAllocator);
+};
+
class SymbolName {
public:
explicit SymbolName(const char* name)
@@ -144,7 +148,7 @@ class SymbolName {
};
struct version_info {
- version_info() : elf_hash(0), name(nullptr), target_si(nullptr) {}
+ constexpr version_info() : elf_hash(0), name(nullptr), target_si(nullptr) {}
uint32_t elf_hash;
const char* name;
@@ -172,7 +176,8 @@ class VersionTracker {
struct soinfo {
public:
typedef LinkedList<soinfo, SoinfoListAllocator> soinfo_list_t;
-#if defined(__work_around_b_19059885__)
+ typedef LinkedList<android_namespace_t, NamespaceListAllocator> android_namespace_list_t;
+#if defined(__work_around_b_24465209__)
private:
char old_name_[SOINFO_NAME_LEN];
#endif
@@ -183,13 +188,13 @@ struct soinfo {
ElfW(Addr) base;
size_t size;
-#if defined(__work_around_b_19059885__)
+#if defined(__work_around_b_24465209__)
uint32_t unused1; // DO NOT USE, maintained for compatibility.
#endif
ElfW(Dyn)* dynamic;
-#if defined(__work_around_b_19059885__)
+#if defined(__work_around_b_24465209__)
uint32_t unused2; // DO NOT USE, maintained for compatibility
uint32_t unused3; // DO NOT USE, maintained for compatibility
#endif
@@ -250,7 +255,9 @@ struct soinfo {
bool mips_relocate_got(const VersionTracker& version_tracker,
const soinfo_list_t& global_group,
const soinfo_list_t& local_group);
-
+#if !defined(__LP64__)
+ bool mips_check_and_adjust_fp_modes();
+#endif
#endif
size_t ref_count_;
public:
@@ -268,7 +275,9 @@ struct soinfo {
bool has_DT_SYMBOLIC;
public:
- soinfo(const char* name, const struct stat* file_stat, off64_t file_offset, int rtld_flags);
+ soinfo(android_namespace_t* ns, const char* name, const struct stat* file_stat,
+ off64_t file_offset, int rtld_flags);
+ ~soinfo();
void call_constructors();
void call_destructors();
@@ -276,6 +285,7 @@ struct soinfo {
bool prelink_image();
bool link_image(const soinfo_list_t& global_group, const soinfo_list_t& local_group,
const android_dlextinfo* extinfo);
+ bool protect_relro();
void add_child(soinfo* child);
void remove_all_links();
@@ -305,7 +315,7 @@ struct soinfo {
bool is_gnu_hash() const;
bool inline has_min_version(uint32_t min_version __unused) const {
-#if defined(__work_around_b_19059885__)
+#if defined(__work_around_b_24465209__)
return (flags_ & FLAG_NEW_SOINFO) != 0 && version_ >= min_version;
#else
return true;
@@ -313,17 +323,20 @@ struct soinfo {
}
bool is_linked() const;
+ bool is_linker() const;
bool is_main_executable() const;
void set_linked();
void set_linker_flag();
void set_main_executable();
+ void set_nodelete();
void increment_ref_count();
size_t decrement_ref_count();
soinfo* get_local_group_root() const;
+ void set_soname(const char* soname);
const char* get_soname() const;
const char* get_realpath() const;
const ElfW(Versym)* get_versym(size_t n) const;
@@ -336,6 +349,18 @@ struct soinfo {
uint32_t get_target_sdk_version() const;
+ void set_dt_runpath(const char *);
+ const std::vector<std::string>& get_dt_runpath() const;
+ android_namespace_t* get_primary_namespace();
+ void add_secondary_namespace(android_namespace_t* secondary_ns);
+
+ void set_mapped_by_caller(bool reserved_map);
+ bool is_mapped_by_caller() const;
+
+ uintptr_t get_handle() const;
+ void generate_handle();
+ void* to_handle();
+
private:
bool elf_lookup(SymbolName& symbol_name, const version_info* vi, uint32_t* symbol_index) const;
ElfW(Sym)* elf_addr_lookup(const void* addr);
@@ -397,6 +422,12 @@ struct soinfo {
uint32_t target_sdk_version_;
+ // version >= 3
+ std::vector<std::string> dt_runpath_;
+ android_namespace_t* primary_namespace_;
+ android_namespace_list_t secondary_namespaces_;
+ uintptr_t handle_;
+
friend soinfo* get_libdl_info();
};
@@ -418,19 +449,18 @@ soinfo* get_libdl_info();
void do_android_get_LD_LIBRARY_PATH(char*, size_t);
void do_android_update_LD_LIBRARY_PATH(const char* ld_library_path);
-soinfo* do_dlopen(const char* name, int flags, const android_dlextinfo* extinfo);
-void do_dlclose(soinfo* si);
+void* do_dlopen(const char* name, int flags, const android_dlextinfo* extinfo, void* caller_addr);
+int do_dlclose(void* handle);
int do_dl_iterate_phdr(int (*cb)(dl_phdr_info* info, size_t size, void* data), void* data);
-const ElfW(Sym)* dlsym_linear_lookup(const char* name, soinfo** found, soinfo* caller, void* handle);
-soinfo* find_containing_library(const void* addr);
+bool do_dlsym(void* handle, const char* sym_name, const char* sym_ver,
+ void* caller_addr, void** symbol);
-const ElfW(Sym)* dlsym_handle_lookup(soinfo* si, soinfo** found, const char* name);
+int do_dladdr(const void* addr, Dl_info* info);
void debuggerd_init();
extern "C" abort_msg_t* g_abort_message;
-extern "C" void notify_gdb_of_libraries();
char* linker_get_error_buffer();
size_t linker_get_error_buffer_size();
@@ -438,4 +468,39 @@ size_t linker_get_error_buffer_size();
void set_application_target_sdk_version(uint32_t target);
uint32_t get_application_target_sdk_version();
+enum {
+ /* A regular namespace is the namespace with a custom search path that does
+ * not impose any restrictions on the location of native libraries.
+ */
+ ANDROID_NAMESPACE_TYPE_REGULAR = 0,
+
+ /* An isolated namespace requires all the libraries to be on the search path
+ * or under permitted_when_isolated_path. The search path is the union of
+ * ld_library_path and default_library_path.
+ */
+ ANDROID_NAMESPACE_TYPE_ISOLATED = 1,
+
+ /* The shared namespace clones the list of libraries of the caller namespace upon creation
+ * which means that they are shared between namespaces - the caller namespace and the new one
+ * will use the same copy of a library if it was loaded prior to android_create_namespace call.
+ *
+ * Note that libraries loaded after the namespace is created will not be shared.
+ *
+ * Shared namespaces can be isolated or regular. Note that they do not inherit the search path nor
+ * permitted_path from the caller's namespace.
+ */
+ ANDROID_NAMESPACE_TYPE_SHARED = 2,
+ ANDROID_NAMESPACE_TYPE_SHARED_ISOLATED = ANDROID_NAMESPACE_TYPE_SHARED |
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+};
+
+bool init_namespaces(const char* public_ns_sonames, const char* anon_ns_library_path);
+android_namespace_t* create_namespace(const void* caller_addr,
+ const char* name,
+ const char* ld_library_path,
+ const char* default_library_path,
+ uint64_t type,
+ const char* permitted_when_isolated_path,
+ android_namespace_t* parent_namespace);
+
#endif
diff --git a/linker/linker_allocator.cpp b/linker/linker_allocator.cpp
index 1b16cf12c..57811d861 100644
--- a/linker/linker_allocator.cpp
+++ b/linker/linker_allocator.cpp
@@ -70,7 +70,7 @@ static inline uint16_t log2(size_t number) {
}
LinkerSmallObjectAllocator::LinkerSmallObjectAllocator()
- : type_(0), name_(nullptr), block_size_(0), free_pages_cnt_(0), free_blocks_list_(nullptr) {}
+ : type_(0), block_size_(0), free_pages_cnt_(0), free_blocks_list_(nullptr) {}
void* LinkerSmallObjectAllocator::alloc() {
if (free_blocks_list_ == nullptr) {
@@ -156,10 +156,9 @@ void LinkerSmallObjectAllocator::free(void* ptr) {
}
}
-void LinkerSmallObjectAllocator::init(uint32_t type, size_t block_size, const char* name) {
+void LinkerSmallObjectAllocator::init(uint32_t type, size_t block_size) {
type_ = type;
block_size_ = block_size;
- name_ = name;
}
linker_vector_t::iterator LinkerSmallObjectAllocator::find_page_record(void* ptr) {
@@ -189,13 +188,15 @@ void LinkerSmallObjectAllocator::create_page_record(void* page_addr, size_t free
}
void LinkerSmallObjectAllocator::alloc_page() {
+ static_assert(sizeof(page_info) % 16 == 0,
+ "sizeof(page_info) is not multiple of 16");
void* map_ptr = mmap(nullptr, PAGE_SIZE,
PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
if (map_ptr == MAP_FAILED) {
__libc_fatal("mmap failed");
}
- prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, map_ptr, PAGE_SIZE, name_);
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, map_ptr, PAGE_SIZE, "linker_alloc_small_objects");
memset(map_ptr, 0, PAGE_SIZE);
@@ -218,19 +219,9 @@ void LinkerSmallObjectAllocator::alloc_page() {
LinkerMemoryAllocator::LinkerMemoryAllocator() {
- static const char* allocator_names[kSmallObjectAllocatorsCount] = {
- "linker_alloc_16", // 2^4
- "linker_alloc_32", // 2^5
- "linker_alloc_64", // and so on...
- "linker_alloc_128",
- "linker_alloc_256",
- "linker_alloc_512",
- "linker_alloc_1024", // 2^10
- };
-
for (size_t i = 0; i < kSmallObjectAllocatorsCount; ++i) {
uint32_t type = i + kSmallObjectMinSizeLog2;
- allocators_[i].init(type, 1 << type, allocator_names[i]);
+ allocators_[i].init(type, 1 << type);
}
}
diff --git a/linker/linker_allocator.h b/linker/linker_allocator.h
index 2adad56fe..22a337a3c 100644
--- a/linker/linker_allocator.h
+++ b/linker/linker_allocator.h
@@ -45,7 +45,7 @@ struct page_info {
// and allocator_addr for small ones.
LinkerSmallObjectAllocator* allocator_addr;
};
-};
+} __attribute__((aligned(16)));
struct small_object_page_record {
void* page_addr;
@@ -101,7 +101,7 @@ typedef
class LinkerSmallObjectAllocator {
public:
LinkerSmallObjectAllocator();
- void init(uint32_t type, size_t block_size, const char* name);
+ void init(uint32_t type, size_t block_size);
void* alloc();
void free(void* ptr);
@@ -113,7 +113,6 @@ class LinkerSmallObjectAllocator {
void create_page_record(void* page_addr, size_t free_blocks_cnt);
uint32_t type_;
- const char* name_;
size_t block_size_;
size_t free_pages_cnt_;
diff --git a/linker/linker_block_allocator.cpp b/linker/linker_block_allocator.cpp
index fc9a75b15..23298a473 100644
--- a/linker/linker_block_allocator.cpp
+++ b/linker/linker_block_allocator.cpp
@@ -22,9 +22,14 @@
#include "private/bionic_prctl.h"
+// the multiplier should be power of 2
+static constexpr size_t round_up(size_t size, size_t multiplier) {
+ return (size + (multiplier - 1)) & ~(multiplier-1);
+}
+
struct LinkerBlockAllocatorPage {
LinkerBlockAllocatorPage* next;
- uint8_t bytes[PAGE_SIZE-sizeof(LinkerBlockAllocatorPage*)];
+ uint8_t bytes[PAGE_SIZE - 16] __attribute__((aligned(16)));
};
struct FreeBlockInfo {
@@ -33,7 +38,8 @@ struct FreeBlockInfo {
};
LinkerBlockAllocator::LinkerBlockAllocator(size_t block_size)
- : block_size_(block_size < sizeof(FreeBlockInfo) ? sizeof(FreeBlockInfo) : block_size),
+ : block_size_(
+ round_up(block_size < sizeof(FreeBlockInfo) ? sizeof(FreeBlockInfo) : block_size, 16)),
page_list_(nullptr),
free_block_list_(nullptr)
{}
@@ -95,6 +101,9 @@ void LinkerBlockAllocator::protect_all(int prot) {
}
void LinkerBlockAllocator::create_new_page() {
+ static_assert(sizeof(LinkerBlockAllocatorPage) == PAGE_SIZE,
+ "Invalid sizeof(LinkerBlockAllocatorPage)");
+
LinkerBlockAllocatorPage* page = reinterpret_cast<LinkerBlockAllocatorPage*>(
mmap(nullptr, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0));
diff --git a/linker/linker_debug.h b/linker/linker_debug.h
index 51f8d4c18..5af992916 100644
--- a/linker/linker_debug.h
+++ b/linker/linker_debug.h
@@ -55,9 +55,17 @@
*********************************************************************/
#include "private/libc_logging.h"
+#include <unistd.h>
__LIBC_HIDDEN__ extern int g_ld_debug_verbosity;
+#define CHECK(predicate) { \
+ if (!(predicate)) { \
+ __libc_fatal("%s:%d: %s CHECK '" #predicate "' failed", \
+ __FILE__, __LINE__, __FUNCTION__); \
+ } \
+ }
+
#if LINKER_DEBUG_TO_LOG
#define _PRINTVF(v, x...) \
do { \
diff --git a/linker/linker_dlwarning.cpp b/linker/linker_dlwarning.cpp
new file mode 100644
index 000000000..c53ad66bd
--- /dev/null
+++ b/linker/linker_dlwarning.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "linker_dlwarning.h"
+
+#include <strings.h>
+
+#include <string>
+
+static std::string current_msg;
+
+void add_dlwarning(const char* sopath, const char* message, const char* value) {
+ if (!current_msg.empty()) {
+ current_msg += '\n';
+ }
+
+ current_msg = current_msg + basename(sopath) + ": " + message;
+
+ if (value != nullptr) {
+ current_msg = current_msg + " \"" + value + "\"";
+ }
+}
+
+// Resets the current one (like dlerror but instead of
+// being thread-local it is process-local).
+void get_dlwarning(void* obj, void (*f)(void*, const char*)) {
+ if (current_msg.empty()) {
+ f(obj, nullptr);
+ } else {
+ std::string msg = current_msg;
+ current_msg.clear();
+ f(obj, msg.c_str());
+ }
+}
diff --git a/linker/linker_dlwarning.h b/linker/linker_dlwarning.h
new file mode 100644
index 000000000..0263c720c
--- /dev/null
+++ b/linker/linker_dlwarning.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __LINKER_DLWARNING_H
+#define __LINKER_DLWARNING_H
+
+void add_dlwarning(const char* sopath, const char* message, const char* value = nullptr);
+
+// Resets the current one (like dlerror but instead of
+// being thread-local it is process-local). The user_data
+// is used to avoid forcing user into saving the message
+// to a global variable.
+void get_dlwarning(void* user_data, void (*f)(void*, const char*));
+
+#endif /* __LINKER_DLWARNING_H */
diff --git a/linker/linker_gdb_support.cpp b/linker/linker_gdb_support.cpp
new file mode 100644
index 000000000..de7408740
--- /dev/null
+++ b/linker/linker_gdb_support.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "linker_gdb_support.h"
+
+#include <pthread.h>
+
+#include "private/ScopedPthreadMutexLocker.h"
+
+// This function is an empty stub where GDB locates a breakpoint to get notified
+// about linker activity.
+extern "C"
+void __attribute__((noinline)) __attribute__((visibility("default"))) rtld_db_dlactivity();
+
+r_debug _r_debug =
+ {1, nullptr, reinterpret_cast<uintptr_t>(&rtld_db_dlactivity), r_debug::RT_CONSISTENT, 0};
+
+static pthread_mutex_t g__r_debug_mutex = PTHREAD_MUTEX_INITIALIZER;
+static link_map* r_debug_tail = nullptr;
+
+void insert_link_map_into_debug_map(link_map* map) {
+ // Stick the new library at the end of the list.
+ // gdb tends to care more about libc than it does
+ // about leaf libraries, and ordering it this way
+ // reduces the back-and-forth over the wire.
+ if (r_debug_tail != nullptr) {
+ r_debug_tail->l_next = map;
+ map->l_prev = r_debug_tail;
+ map->l_next = nullptr;
+ } else {
+ _r_debug.r_map = map;
+ map->l_prev = nullptr;
+ map->l_next = nullptr;
+ }
+ r_debug_tail = map;
+}
+
+void remove_link_map_from_debug_map(link_map* map) {
+ if (r_debug_tail == map) {
+ r_debug_tail = map->l_prev;
+ }
+
+ if (map->l_prev) {
+ map->l_prev->l_next = map->l_next;
+ }
+ if (map->l_next) {
+ map->l_next->l_prev = map->l_prev;
+ }
+}
+
+void notify_gdb_of_load(link_map* map) {
+ ScopedPthreadMutexLocker locker(&g__r_debug_mutex);
+
+ _r_debug.r_state = r_debug::RT_ADD;
+ rtld_db_dlactivity();
+
+ insert_link_map_into_debug_map(map);
+
+ _r_debug.r_state = r_debug::RT_CONSISTENT;
+ rtld_db_dlactivity();
+}
+
+void notify_gdb_of_unload(link_map* map) {
+ ScopedPthreadMutexLocker locker(&g__r_debug_mutex);
+
+ _r_debug.r_state = r_debug::RT_DELETE;
+ rtld_db_dlactivity();
+
+ remove_link_map_from_debug_map(map);
+
+ _r_debug.r_state = r_debug::RT_CONSISTENT;
+ rtld_db_dlactivity();
+}
+
+void notify_gdb_of_libraries() {
+ _r_debug.r_state = r_debug::RT_ADD;
+ rtld_db_dlactivity();
+ _r_debug.r_state = r_debug::RT_CONSISTENT;
+ rtld_db_dlactivity();
+}
+
diff --git a/linker/linker_gdb_support.h b/linker/linker_gdb_support.h
new file mode 100644
index 000000000..2a590ba43
--- /dev/null
+++ b/linker/linker_gdb_support.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __LINKER_GDB_SUPPORT_H
+#define __LINKER_GDB_SUPPORT_H
+
+#include <link.h>
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+
+void insert_link_map_into_debug_map(link_map* map);
+void remove_link_map_from_debug_map(link_map* map);
+void notify_gdb_of_load(link_map* map);
+void notify_gdb_of_unload(link_map* map);
+void notify_gdb_of_libraries();
+
+extern struct r_debug _r_debug;
+
+__END_DECLS
+
+#endif
diff --git a/linker/linker_libc_support.c b/linker/linker_libc_support.c
index 4c49384bf..77a025245 100644
--- a/linker/linker_libc_support.c
+++ b/linker/linker_libc_support.c
@@ -15,7 +15,9 @@
*/
#include "../libc/arch-common/bionic/__dso_handle.h"
+#include "../libc/arch-common/bionic/pthread_atfork.h"
int atexit(void (*function)(void) __attribute__((__unused__))) {
return -1;
}
+
diff --git a/linker/linker_mapped_file_fragment.cpp b/linker/linker_mapped_file_fragment.cpp
new file mode 100644
index 000000000..27c1c69af
--- /dev/null
+++ b/linker/linker_mapped_file_fragment.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "linker_mapped_file_fragment.h"
+#include "linker_debug.h"
+#include "linker_utils.h"
+
+#include <inttypes.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+MappedFileFragment::MappedFileFragment() : map_start_(nullptr), map_size_(0),
+ data_(nullptr), size_ (0)
+{ }
+
+MappedFileFragment::~MappedFileFragment() {
+ if (map_start_ != nullptr) {
+ munmap(map_start_, map_size_);
+ }
+}
+
+bool MappedFileFragment::Map(int fd, off64_t base_offset, size_t elf_offset, size_t size) {
+ off64_t offset;
+ CHECK(safe_add(&offset, base_offset, elf_offset));
+
+ off64_t page_min = page_start(offset);
+ off64_t end_offset;
+
+ CHECK(safe_add(&end_offset, offset, size));
+ CHECK(safe_add(&end_offset, end_offset, page_offset(offset)));
+
+ size_t map_size = static_cast<size_t>(end_offset - page_min);
+ CHECK(map_size >= size);
+
+ uint8_t* map_start = static_cast<uint8_t*>(
+ mmap64(nullptr, map_size, PROT_READ, MAP_PRIVATE, fd, page_min));
+
+ if (map_start == MAP_FAILED) {
+ return false;
+ }
+
+ map_start_ = map_start;
+ map_size_ = map_size;
+
+ data_ = map_start + page_offset(offset);
+ size_ = size;
+
+ return true;
+}
diff --git a/linker/linker_mapped_file_fragment.h b/linker/linker_mapped_file_fragment.h
new file mode 100644
index 000000000..91bd077bd
--- /dev/null
+++ b/linker/linker_mapped_file_fragment.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LINKER_MAPPED_FILE_FRAGMENT_H
+#define LINKER_MAPPED_FILE_FRAGMENT_H
+
+#include <unistd.h>
+
+#include "private/bionic_macros.h"
+
+class MappedFileFragment {
+ public:
+ MappedFileFragment();
+ ~MappedFileFragment();
+
+ bool Map(int fd, off64_t base_offset, size_t elf_offset, size_t size);
+
+ void* data() const { return data_; }
+ size_t size() const { return size_; }
+ private:
+ void* map_start_;
+ size_t map_size_;
+ void* data_;
+ size_t size_;
+
+ DISALLOW_COPY_AND_ASSIGN(MappedFileFragment);
+};
+
+#endif /* LINKER_MAPPED_FILE_FRAGMENT_H */
diff --git a/linker/linker_mips.cpp b/linker/linker_mips.cpp
index a7a4bc064..2d565d77d 100644
--- a/linker/linker_mips.cpp
+++ b/linker/linker_mips.cpp
@@ -26,8 +26,13 @@
* SUCH DAMAGE.
*/
+#if !defined(__LP64__) && __mips_isa_rev >= 5
+#include <sys/prctl.h>
+#endif
+
#include "linker.h"
#include "linker_debug.h"
+#include "linker_phdr.h"
#include "linker_relocs.h"
#include "linker_reloc_iterators.h"
#include "linker_sleb128.h"
@@ -62,7 +67,7 @@ bool soinfo::relocate(const VersionTracker& version_tracker,
ElfW(Addr) sym_addr = 0;
const char* sym_name = nullptr;
- DEBUG("Processing '%s' relocation at index %zd", get_soname(), idx);
+ DEBUG("Processing \"%s\" relocation at index %zd", get_realpath(), idx);
if (type == R_GENERIC_NONE) {
continue;
}
@@ -84,7 +89,8 @@ bool soinfo::relocate(const VersionTracker& version_tracker,
if (s == nullptr) {
// mips does not support relocation with weak-undefined symbols
- DL_ERR("cannot locate symbol \"%s\" referenced by \"%s\"...", sym_name, get_soname());
+ DL_ERR("cannot locate symbol \"%s\" referenced by \"%s\"...",
+ sym_name, get_realpath());
return false;
} else {
// We got a definition.
@@ -171,20 +177,22 @@ bool soinfo::mips_relocate_got(const VersionTracker& version_tracker,
}
} else if (st_visibility == STV_PROTECTED) {
if (local_sym->st_value == 0) {
- DL_ERR("%s: invalid symbol \"%s\" (PROTECTED/UNDEFINED) ", get_soname(), sym_name);
+ DL_ERR("%s: invalid symbol \"%s\" (PROTECTED/UNDEFINED) ",
+ get_realpath(), sym_name);
return false;
}
s = local_sym;
lsi = this;
} else {
- DL_ERR("%s: invalid symbol \"%s\" visibility: 0x%x", get_soname(), sym_name, st_visibility);
+ DL_ERR("%s: invalid symbol \"%s\" visibility: 0x%x",
+ get_realpath(), sym_name, st_visibility);
return false;
}
if (s == nullptr) {
// We only allow an undefined symbol if this is a weak reference.
if (ELF_ST_BIND(local_sym->st_info) != STB_WEAK) {
- DL_ERR("%s: cannot locate \"%s\"...", get_soname(), sym_name);
+ DL_ERR("%s: cannot locate \"%s\"...", get_realpath(), sym_name);
return false;
}
*got = 0;
@@ -198,3 +206,134 @@ bool soinfo::mips_relocate_got(const VersionTracker& version_tracker,
return true;
}
+#if !defined(__LP64__)
+
+// Checks for mips32's various floating point abis.
+// (Mips64 Android has a single floating point abi and doesn't need any checks)
+
+// Linux kernel has declarations similar to the following
+// in <linux>/arch/mips/include/asm/elf.h,
+// but that non-uapi internal header file will never be imported
+// into bionic's kernel headers.
+
+#define PT_MIPS_ABIFLAGS 0x70000003 // is .MIPS.abiflags segment
+
+struct mips_elf_abiflags_v0 {
+ uint16_t version; // version of this structure
+ uint8_t isa_level, isa_rev, gpr_size, cpr1_size, cpr2_size;
+ uint8_t fp_abi; // mips32 ABI variants for floating point
+ uint32_t isa_ext, ases, flags1, flags2;
+};
+
+// Bits of flags1:
+#define MIPS_AFL_FLAGS1_ODDSPREG 1 // Uses odd-numbered single-prec fp regs
+
+// Some values of fp_abi: via compiler flag:
+#define MIPS_ABI_FP_DOUBLE 1 // -mdouble-float
+#define MIPS_ABI_FP_XX 5 // -mfpxx
+#define MIPS_ABI_FP_64A 7 // -mips32r* -mfp64 -mno-odd-spreg
+
+#if __mips_isa_rev >= 5
+static bool mips_fre_mode_on = false; // have set FRE=1 mode for process
+#endif
+
+bool soinfo::mips_check_and_adjust_fp_modes() {
+ mips_elf_abiflags_v0* abiflags = nullptr;
+ int mips_fpabi;
+
+ // Find soinfo's optional .MIPS.abiflags segment
+ for (size_t i = 0; i<phnum; ++i) {
+ const ElfW(Phdr)& ph = phdr[i];
+ if (ph.p_type == PT_MIPS_ABIFLAGS) {
+ if (ph.p_filesz < sizeof (mips_elf_abiflags_v0)) {
+ DL_ERR("Corrupt PT_MIPS_ABIFLAGS header found \"%s\"", get_realpath());
+ return false;
+ }
+ abiflags = reinterpret_cast<mips_elf_abiflags_v0*>(ph.p_vaddr + load_bias);
+ break;
+ }
+ }
+
+ // FP ABI-variant compatibility checks for MIPS o32 ABI
+ if (abiflags == nullptr) {
+ // Old compilers and some translators don't emit the new abiflags section.
+ const char* filename = get_realpath();
+ size_t len = strlen(filename);
+ if (len > 4 && (strcmp(filename+len-4, ".dex") == 0 ||
+ strcmp(filename+len-4, ".oat") == 0 )) {
+ // Assume dex2oat is compatible with target
+ mips_fpabi = MIPS_ABI_FP_XX;
+ } else {
+ // Old Android compilers used -mfp32 -mdouble-float -modd-spreg defaults,
+ // ie FP32 aka DOUBLE, using FR=0 mode fpregs & odd single-prec fpregs
+ mips_fpabi = MIPS_ABI_FP_DOUBLE;
+ }
+ } else {
+ mips_fpabi = abiflags->fp_abi;
+ if ( (abiflags->flags1 & MIPS_AFL_FLAGS1_ODDSPREG)
+ && (mips_fpabi == MIPS_ABI_FP_XX ||
+ mips_fpabi == MIPS_ABI_FP_64A ) ) {
+ // Android supports fewer cases than Linux
+ DL_ERR("Unsupported odd-single-prec FloatPt reg uses in \"%s\"",
+ get_realpath());
+ return false;
+ }
+ }
+ if (!(mips_fpabi == MIPS_ABI_FP_DOUBLE ||
+#if __mips_isa_rev >= 5
+ mips_fpabi == MIPS_ABI_FP_64A ||
+#endif
+ mips_fpabi == MIPS_ABI_FP_XX )) {
+ DL_ERR("Unsupported MIPS32 FloatPt ABI %d found in \"%s\"",
+ mips_fpabi, get_realpath());
+ return false;
+ }
+
+#if __mips_isa_rev >= 5
+ // Adjust process's FR Emulation mode, if needed
+ //
+ // On Mips R5 & R6, Android runs continuously in FR=1 64bit-fpreg mode.
+ // NDK mips32 apps compiled with old compilers generate FP32 code
+ // which expects FR=0 32-bit fp registers.
+ // NDK mips32 apps compiled with newer compilers generate modeless
+ // FPXX code which runs on both FR=0 and FR=1 modes.
+ // Android itself is compiled in FP64A which requires FR=1 mode.
+ // FP32, FPXX, and FP64A all interlink okay, without dynamic FR mode
+ // changes during calls. For details, see
+ // http://dmz-portal.mips.com/wiki/MIPS_O32_ABI_-_FR0_and_FR1_Interlinking
+ // Processes containing FR32 FR=0 code are run via kernel software assist,
+ // which maps all odd-numbered single-precision reg refs onto the
+ // upper half of the paired even-numbered double-precision reg.
+ // FRE=1 triggers traps to the kernel's emulator on every single-precision
+ // fp op (for both odd and even-numbered registers).
+ // Turning on FRE=1 traps is done at most once per process, simultanously
+ // for all threads of that process, when dlopen discovers FP32 code.
+ // The kernel repacks threads' registers when FRE mode is turn on or off.
+ // These asynchronous adjustments are wrong if any thread was executing
+ // FPXX code using odd-numbered single-precision regs.
+ // Current Android compilers default to the -mno-oddspreg option,
+ // and this requirement is checked by Android's dlopen.
+ // So FRE can always be safely turned on for FP32, anytime.
+ // Deferred enhancement: Allow loading of odd-spreg FPXX modules.
+
+ if (mips_fpabi == MIPS_ABI_FP_DOUBLE && !mips_fre_mode_on) {
+ // Turn on FRE mode, which emulates mode-sensitive FR=0 code on FR=1
+ // register files, by trapping to kernel on refs to single-precision regs
+ if (prctl(PR_SET_FP_MODE, PR_FP_MODE_FR|PR_FP_MODE_FRE)) {
+ DL_ERR("Kernel or cpu failed to set FRE mode required for running \"%s\"",
+ get_realpath());
+ return false;
+ }
+ DL_WARN("Using FRE=1 mode to run \"%s\"", get_realpath());
+ mips_fre_mode_on = true; // Avoid future redundant mode-switch calls
+ // FRE mode is never turned back off.
+ // Deferred enhancement:
+ // Reset FRE mode when dlclose() removes all FP32 modules
+ }
+#else
+ // Android runs continuously in FR=0 32bit-fpreg mode.
+#endif // __mips_isa_rev
+ return true;
+}
+
+#endif // __LP64___
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp
index 30118e363..136e43236 100644
--- a/linker/linker_phdr.cpp
+++ b/linker/linker_phdr.cpp
@@ -37,6 +37,9 @@
#include "linker.h"
#include "linker_debug.h"
+#include "linker_utils.h"
+
+#include "private/bionic_prctl.h"
static int GetTargetElfMachine() {
#if defined(__arm__)
@@ -133,37 +136,60 @@ static int GetTargetElfMachine() {
MAYBE_MAP_FLAG((x), PF_R, PROT_READ) | \
MAYBE_MAP_FLAG((x), PF_W, PROT_WRITE))
-ElfReader::ElfReader(const char* name, int fd, off64_t file_offset, off64_t file_size)
- : name_(name), fd_(fd), file_offset_(file_offset), file_size_(file_size),
- phdr_num_(0), phdr_mmap_(nullptr), phdr_table_(nullptr), phdr_size_(0),
- load_start_(nullptr), load_size_(0), load_bias_(0),
- loaded_phdr_(nullptr) {
+ElfReader::ElfReader()
+ : did_read_(false), did_load_(false), fd_(-1), file_offset_(0), file_size_(0), phdr_num_(0),
+ phdr_table_(nullptr), shdr_table_(nullptr), shdr_num_(0), dynamic_(nullptr), strtab_(nullptr),
+ strtab_size_(0), load_start_(nullptr), load_size_(0), load_bias_(0), loaded_phdr_(nullptr),
+ mapped_by_caller_(false) {
}
-ElfReader::~ElfReader() {
- if (phdr_mmap_ != nullptr) {
- munmap(phdr_mmap_, phdr_size_);
+bool ElfReader::Read(const char* name, int fd, off64_t file_offset, off64_t file_size) {
+ CHECK(!did_read_);
+ CHECK(!did_load_);
+ name_ = name;
+ fd_ = fd;
+ file_offset_ = file_offset;
+ file_size_ = file_size;
+
+ if (ReadElfHeader() &&
+ VerifyElfHeader() &&
+ ReadProgramHeaders() &&
+ ReadSectionHeaders() &&
+ ReadDynamicSection()) {
+ did_read_ = true;
}
+
+ return did_read_;
}
bool ElfReader::Load(const android_dlextinfo* extinfo) {
- return ReadElfHeader() &&
- VerifyElfHeader() &&
- ReadProgramHeader() &&
- ReserveAddressSpace(extinfo) &&
- LoadSegments() &&
- FindPhdr();
+ CHECK(did_read_);
+ CHECK(!did_load_);
+ if (ReserveAddressSpace(extinfo) &&
+ LoadSegments() &&
+ FindPhdr()) {
+ did_load_ = true;
+ }
+
+ return did_load_;
+}
+
+const char* ElfReader::get_string(ElfW(Word) index) const {
+ CHECK(strtab_ != nullptr);
+ CHECK(index < strtab_size_);
+
+ return strtab_ + index;
}
bool ElfReader::ReadElfHeader() {
ssize_t rc = TEMP_FAILURE_RETRY(pread64(fd_, &header_, sizeof(header_), file_offset_));
if (rc < 0) {
- DL_ERR("can't read file \"%s\": %s", name_, strerror(errno));
+ DL_ERR("can't read file \"%s\": %s", name_.c_str(), strerror(errno));
return false;
}
if (rc != sizeof(header_)) {
- DL_ERR("\"%s\" is too small to be an ELF executable: only found %zd bytes", name_,
+ DL_ERR("\"%s\" is too small to be an ELF executable: only found %zd bytes", name_.c_str(),
static_cast<size_t>(rc));
return false;
}
@@ -172,7 +198,7 @@ bool ElfReader::ReadElfHeader() {
bool ElfReader::VerifyElfHeader() {
if (memcmp(header_.e_ident, ELFMAG, SELFMAG) != 0) {
- DL_ERR("\"%s\" has bad ELF magic", name_);
+ DL_ERR("\"%s\" has bad ELF magic", name_.c_str());
return false;
}
@@ -182,73 +208,161 @@ bool ElfReader::VerifyElfHeader() {
#if defined(__LP64__)
if (elf_class != ELFCLASS64) {
if (elf_class == ELFCLASS32) {
- DL_ERR("\"%s\" is 32-bit instead of 64-bit", name_);
+ DL_ERR("\"%s\" is 32-bit instead of 64-bit", name_.c_str());
} else {
- DL_ERR("\"%s\" has unknown ELF class: %d", name_, elf_class);
+ DL_ERR("\"%s\" has unknown ELF class: %d", name_.c_str(), elf_class);
}
return false;
}
#else
if (elf_class != ELFCLASS32) {
if (elf_class == ELFCLASS64) {
- DL_ERR("\"%s\" is 64-bit instead of 32-bit", name_);
+ DL_ERR("\"%s\" is 64-bit instead of 32-bit", name_.c_str());
} else {
- DL_ERR("\"%s\" has unknown ELF class: %d", name_, elf_class);
+ DL_ERR("\"%s\" has unknown ELF class: %d", name_.c_str(), elf_class);
}
return false;
}
#endif
if (header_.e_ident[EI_DATA] != ELFDATA2LSB) {
- DL_ERR("\"%s\" not little-endian: %d", name_, header_.e_ident[EI_DATA]);
+ DL_ERR("\"%s\" not little-endian: %d", name_.c_str(), header_.e_ident[EI_DATA]);
return false;
}
if (header_.e_type != ET_DYN) {
- DL_ERR("\"%s\" has unexpected e_type: %d", name_, header_.e_type);
+ DL_ERR("\"%s\" has unexpected e_type: %d", name_.c_str(), header_.e_type);
return false;
}
if (header_.e_version != EV_CURRENT) {
- DL_ERR("\"%s\" has unexpected e_version: %d", name_, header_.e_version);
+ DL_ERR("\"%s\" has unexpected e_version: %d", name_.c_str(), header_.e_version);
return false;
}
if (header_.e_machine != GetTargetElfMachine()) {
- DL_ERR("\"%s\" has unexpected e_machine: %d", name_, header_.e_machine);
+ DL_ERR("\"%s\" has unexpected e_machine: %d", name_.c_str(), header_.e_machine);
return false;
}
return true;
}
+bool ElfReader::CheckFileRange(ElfW(Addr) offset, size_t size) {
+ off64_t range_start;
+ off64_t range_end;
+
+ return safe_add(&range_start, file_offset_, offset) &&
+ safe_add(&range_end, range_start, size) &&
+ range_start < file_size_ &&
+ range_end <= file_size_;
+}
+
// Loads the program header table from an ELF file into a read-only private
// anonymous mmap-ed block.
-bool ElfReader::ReadProgramHeader() {
+bool ElfReader::ReadProgramHeaders() {
phdr_num_ = header_.e_phnum;
// Like the kernel, we only accept program header tables that
// are smaller than 64KiB.
if (phdr_num_ < 1 || phdr_num_ > 65536/sizeof(ElfW(Phdr))) {
- DL_ERR("\"%s\" has invalid e_phnum: %zd", name_, phdr_num_);
+ DL_ERR("\"%s\" has invalid e_phnum: %zd", name_.c_str(), phdr_num_);
return false;
}
- ElfW(Addr) page_min = PAGE_START(header_.e_phoff);
- ElfW(Addr) page_max = PAGE_END(header_.e_phoff + (phdr_num_ * sizeof(ElfW(Phdr))));
- ElfW(Addr) page_offset = PAGE_OFFSET(header_.e_phoff);
+ // Boundary checks
+ size_t size = phdr_num_ * sizeof(ElfW(Phdr));
+ if (!CheckFileRange(header_.e_phoff, size)) {
+ DL_ERR("\"%s\" has invalid phdr offset/size", name_.c_str());
+ return false;
+ }
+
+ if (!phdr_fragment_.Map(fd_, file_offset_, header_.e_phoff, size)) {
+ DL_ERR("\"%s\" phdr mmap failed: %s", name_.c_str(), strerror(errno));
+ return false;
+ }
+
+ phdr_table_ = static_cast<ElfW(Phdr)*>(phdr_fragment_.data());
+ return true;
+}
+
+bool ElfReader::ReadSectionHeaders() {
+ shdr_num_ = header_.e_shnum;
- phdr_size_ = page_max - page_min;
+ if (shdr_num_ == 0) {
+ DL_ERR("\"%s\" has no section headers", name_.c_str());
+ return false;
+ }
- void* mmap_result =
- mmap64(nullptr, phdr_size_, PROT_READ, MAP_PRIVATE, fd_, file_offset_ + page_min);
- if (mmap_result == MAP_FAILED) {
- DL_ERR("\"%s\" phdr mmap failed: %s", name_, strerror(errno));
+ size_t size = shdr_num_ * sizeof(ElfW(Shdr));
+ if (!CheckFileRange(header_.e_shoff, size)) {
+ DL_ERR("\"%s\" has invalid shdr offset/size", name_.c_str());
return false;
}
- phdr_mmap_ = mmap_result;
- phdr_table_ = reinterpret_cast<ElfW(Phdr)*>(reinterpret_cast<char*>(mmap_result) + page_offset);
+ if (!shdr_fragment_.Map(fd_, file_offset_, header_.e_shoff, size)) {
+ DL_ERR("\"%s\" shdr mmap failed: %s", name_.c_str(), strerror(errno));
+ return false;
+ }
+
+ shdr_table_ = static_cast<const ElfW(Shdr)*>(shdr_fragment_.data());
+ return true;
+}
+
+bool ElfReader::ReadDynamicSection() {
+ // 1. Find .dynamic section (in section headers)
+ const ElfW(Shdr)* dynamic_shdr = nullptr;
+ for (size_t i = 0; i < shdr_num_; ++i) {
+ if (shdr_table_[i].sh_type == SHT_DYNAMIC) {
+ dynamic_shdr = &shdr_table_ [i];
+ break;
+ }
+ }
+
+ if (dynamic_shdr == nullptr) {
+ DL_ERR("\"%s\" .dynamic section header was not found", name_.c_str());
+ return false;
+ }
+
+ if (dynamic_shdr->sh_link >= shdr_num_) {
+ DL_ERR("\"%s\" .dynamic section has invalid sh_link: %d", name_.c_str(), dynamic_shdr->sh_link);
+ return false;
+ }
+
+ const ElfW(Shdr)* strtab_shdr = &shdr_table_[dynamic_shdr->sh_link];
+
+ if (strtab_shdr->sh_type != SHT_STRTAB) {
+ DL_ERR("\"%s\" .dynamic section has invalid link(%d) sh_type: %d (expected SHT_STRTAB)",
+ name_.c_str(), dynamic_shdr->sh_link, strtab_shdr->sh_type);
+ return false;
+ }
+
+ if (!CheckFileRange(dynamic_shdr->sh_offset, dynamic_shdr->sh_size)) {
+ DL_ERR("\"%s\" has invalid offset/size of .dynamic section", name_.c_str());
+ PRINT("\"%s\" has invalid offset/size of .dynamic section", name_.c_str());
+ return false;
+ }
+
+ if (!dynamic_fragment_.Map(fd_, file_offset_, dynamic_shdr->sh_offset, dynamic_shdr->sh_size)) {
+ DL_ERR("\"%s\" dynamic section mmap failed: %s", name_.c_str(), strerror(errno));
+ return false;
+ }
+
+ dynamic_ = static_cast<const ElfW(Dyn)*>(dynamic_fragment_.data());
+
+ if (!CheckFileRange(strtab_shdr->sh_offset, strtab_shdr->sh_size)) {
+ DL_ERR("\"%s\" has invalid offset/size of the .strtab section linked from .dynamic section",
+ name_.c_str());
+ return false;
+ }
+
+ if (!strtab_fragment_.Map(fd_, file_offset_, strtab_shdr->sh_offset, strtab_shdr->sh_size)) {
+ DL_ERR("\"%s\" strtab section mmap failed: %s", name_.c_str(), strerror(errno));
+ return false;
+ }
+
+ strtab_ = static_cast<const char*>(strtab_fragment_.data());
+ strtab_size_ = strtab_fragment_.size();
return true;
}
@@ -308,7 +422,7 @@ bool ElfReader::ReserveAddressSpace(const android_dlextinfo* extinfo) {
ElfW(Addr) min_vaddr;
load_size_ = phdr_table_get_load_size(phdr_table_, phdr_num_, &min_vaddr);
if (load_size_ == 0) {
- DL_ERR("\"%s\" has no loadable segments", name_);
+ DL_ERR("\"%s\" has no loadable segments", name_.c_str());
return false;
}
@@ -316,8 +430,9 @@ bool ElfReader::ReserveAddressSpace(const android_dlextinfo* extinfo) {
void* start;
size_t reserved_size = 0;
bool reserved_hint = true;
+ bool strict_hint = false;
// Assume position independent executable by default.
- uint8_t* mmap_hint = nullptr;
+ void* mmap_hint = nullptr;
if (extinfo != nullptr) {
if (extinfo->flags & ANDROID_DLEXT_RESERVED_ADDRESS) {
@@ -327,25 +442,35 @@ bool ElfReader::ReserveAddressSpace(const android_dlextinfo* extinfo) {
reserved_size = extinfo->reserved_size;
}
- if ((extinfo->flags & ANDROID_DLEXT_FORCE_FIXED_VADDR) != 0) {
+ if (addr != nullptr && (extinfo->flags & ANDROID_DLEXT_FORCE_FIXED_VADDR) != 0) {
mmap_hint = addr;
+ } else if ((extinfo->flags & ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS) != 0) {
+ mmap_hint = extinfo->reserved_addr;
+ strict_hint = true;
}
}
if (load_size_ > reserved_size) {
if (!reserved_hint) {
DL_ERR("reserved address space %zd smaller than %zd bytes needed for \"%s\"",
- reserved_size - load_size_, load_size_, name_);
+ reserved_size - load_size_, load_size_, name_.c_str());
return false;
}
int mmap_flags = MAP_PRIVATE | MAP_ANONYMOUS;
start = mmap(mmap_hint, load_size_, PROT_NONE, mmap_flags, -1, 0);
if (start == MAP_FAILED) {
- DL_ERR("couldn't reserve %zd bytes of address space for \"%s\"", load_size_, name_);
+ DL_ERR("couldn't reserve %zd bytes of address space for \"%s\"", load_size_, name_.c_str());
+ return false;
+ }
+ if (strict_hint && (start != mmap_hint)) {
+ munmap(start, load_size_);
+ DL_ERR("couldn't reserve %zd bytes of address space at %p for \"%s\"",
+ load_size_, mmap_hint, name_.c_str());
return false;
}
} else {
start = extinfo->reserved_addr;
+ mapped_by_caller_ = true;
}
load_start_ = start;
@@ -378,14 +503,14 @@ bool ElfReader::LoadSegments() {
ElfW(Addr) file_length = file_end - file_page_start;
if (file_size_ <= 0) {
- DL_ERR("\"%s\" invalid file size: %" PRId64, name_, file_size_);
+ DL_ERR("\"%s\" invalid file size: %" PRId64, name_.c_str(), file_size_);
return false;
}
- if (file_end >= static_cast<size_t>(file_size_)) {
+ if (file_end > static_cast<size_t>(file_size_)) {
DL_ERR("invalid ELF file \"%s\" load segment[%zd]:"
" p_offset (%p) + p_filesz (%p) ( = %p) past end of file (0x%" PRIx64 ")",
- name_, i, reinterpret_cast<void*>(phdr->p_offset),
+ name_.c_str(), i, reinterpret_cast<void*>(phdr->p_offset),
reinterpret_cast<void*>(phdr->p_filesz),
reinterpret_cast<void*>(file_end), file_size_);
return false;
@@ -399,7 +524,7 @@ bool ElfReader::LoadSegments() {
fd_,
file_offset_ + file_page_start);
if (seg_addr == MAP_FAILED) {
- DL_ERR("couldn't map \"%s\" segment %zd: %s", name_, i, strerror(errno));
+ DL_ERR("couldn't map \"%s\" segment %zd: %s", name_.c_str(), i, strerror(errno));
return false;
}
}
@@ -417,16 +542,19 @@ bool ElfReader::LoadSegments() {
// between them. This is done by using a private anonymous
// map for all extra pages.
if (seg_page_end > seg_file_end) {
+ size_t zeromap_size = seg_page_end - seg_file_end;
void* zeromap = mmap(reinterpret_cast<void*>(seg_file_end),
- seg_page_end - seg_file_end,
+ zeromap_size,
PFLAGS_TO_PROT(phdr->p_flags),
MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE,
-1,
0);
if (zeromap == MAP_FAILED) {
- DL_ERR("couldn't zero fill \"%s\" gap: %s", name_, strerror(errno));
+ DL_ERR("couldn't zero fill \"%s\" gap: %s", name_.c_str(), strerror(errno));
return false;
}
+
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, zeromap, zeromap_size, ".bss");
}
}
return true;
@@ -771,6 +899,26 @@ void phdr_table_get_dynamic_section(const ElfW(Phdr)* phdr_table, size_t phdr_co
}
}
+/* Return the program interpreter string, or nullptr if missing.
+ *
+ * Input:
+ * phdr_table -> program header table
+ * phdr_count -> number of entries in tables
+ * load_bias -> load bias
+ * Return:
+ * pointer to the program interpreter string.
+ */
+const char* phdr_table_get_interpreter_name(const ElfW(Phdr) * phdr_table, size_t phdr_count,
+ ElfW(Addr) load_bias) {
+ for (size_t i = 0; i<phdr_count; ++i) {
+ const ElfW(Phdr)& phdr = phdr_table[i];
+ if (phdr.p_type == PT_INTERP) {
+ return reinterpret_cast<const char*>(load_bias + phdr.p_vaddr);
+ }
+ }
+ return nullptr;
+}
+
// Sets loaded_phdr_ to the address of the program header table as it appears
// in the loaded segments in memory. This is in contrast with phdr_table_,
// which is temporary and will be released before the library is relocated.
@@ -799,7 +947,7 @@ bool ElfReader::FindPhdr() {
}
}
- DL_ERR("can't find loaded phdr for \"%s\"", name_);
+ DL_ERR("can't find loaded phdr for \"%s\"", name_.c_str());
return false;
}
@@ -809,7 +957,7 @@ bool ElfReader::FindPhdr() {
bool ElfReader::CheckPhdr(ElfW(Addr) loaded) {
const ElfW(Phdr)* phdr_limit = phdr_table_ + phdr_num_;
ElfW(Addr) loaded_end = loaded + (phdr_num_ * sizeof(ElfW(Phdr)));
- for (ElfW(Phdr)* phdr = phdr_table_; phdr < phdr_limit; ++phdr) {
+ for (const ElfW(Phdr)* phdr = phdr_table_; phdr < phdr_limit; ++phdr) {
if (phdr->p_type != PT_LOAD) {
continue;
}
@@ -820,6 +968,7 @@ bool ElfReader::CheckPhdr(ElfW(Addr) loaded) {
return true;
}
}
- DL_ERR("\"%s\" loaded phdr %p not in loadable segment", name_, reinterpret_cast<void*>(loaded));
+ DL_ERR("\"%s\" loaded phdr %p not in loadable segment",
+ name_.c_str(), reinterpret_cast<void*>(loaded));
return false;
}
diff --git a/linker/linker_phdr.h b/linker/linker_phdr.h
index 3affa66cd..89ec09494 100644
--- a/linker/linker_phdr.h
+++ b/linker/linker_phdr.h
@@ -36,30 +36,40 @@
*/
#include "linker.h"
+#include "linker_mapped_file_fragment.h"
class ElfReader {
public:
- ElfReader(const char* name, int fd, off64_t file_offset, off64_t file_size);
- ~ElfReader();
+ ElfReader();
+ bool Read(const char* name, int fd, off64_t file_offset, off64_t file_size);
bool Load(const android_dlextinfo* extinfo);
- size_t phdr_count() { return phdr_num_; }
- ElfW(Addr) load_start() { return reinterpret_cast<ElfW(Addr)>(load_start_); }
- size_t load_size() { return load_size_; }
- ElfW(Addr) load_bias() { return load_bias_; }
- const ElfW(Phdr)* loaded_phdr() { return loaded_phdr_; }
+ const char* name() const { return name_.c_str(); }
+ size_t phdr_count() const { return phdr_num_; }
+ ElfW(Addr) load_start() const { return reinterpret_cast<ElfW(Addr)>(load_start_); }
+ size_t load_size() const { return load_size_; }
+ ElfW(Addr) load_bias() const { return load_bias_; }
+ const ElfW(Phdr)* loaded_phdr() const { return loaded_phdr_; }
+ const ElfW(Dyn)* dynamic() const { return dynamic_; }
+ const char* get_string(ElfW(Word) index) const;
+ bool is_mapped_by_caller() const { return mapped_by_caller_; }
private:
bool ReadElfHeader();
bool VerifyElfHeader();
- bool ReadProgramHeader();
+ bool ReadProgramHeaders();
+ bool ReadSectionHeaders();
+ bool ReadDynamicSection();
bool ReserveAddressSpace(const android_dlextinfo* extinfo);
bool LoadSegments();
bool FindPhdr();
bool CheckPhdr(ElfW(Addr));
+ bool CheckFileRange(ElfW(Addr) offset, size_t size);
- const char* name_;
+ bool did_read_;
+ bool did_load_;
+ std::string name_;
int fd_;
off64_t file_offset_;
off64_t file_size_;
@@ -67,9 +77,19 @@ class ElfReader {
ElfW(Ehdr) header_;
size_t phdr_num_;
- void* phdr_mmap_;
- ElfW(Phdr)* phdr_table_;
- ElfW(Addr) phdr_size_;
+ MappedFileFragment phdr_fragment_;
+ const ElfW(Phdr)* phdr_table_;
+
+ MappedFileFragment shdr_fragment_;
+ const ElfW(Shdr)* shdr_table_;
+ size_t shdr_num_;
+
+ MappedFileFragment dynamic_fragment_;
+ const ElfW(Dyn)* dynamic_;
+
+ MappedFileFragment strtab_fragment_;
+ const char* strtab_;
+ size_t strtab_size_;
// First page of reserved address space.
void* load_start_;
@@ -80,6 +100,9 @@ class ElfReader {
// Loaded phdr.
const ElfW(Phdr)* loaded_phdr_;
+
+ // Is map owned by the caller
+ bool mapped_by_caller_;
};
size_t phdr_table_get_load_size(const ElfW(Phdr)* phdr_table, size_t phdr_count,
@@ -109,4 +132,7 @@ void phdr_table_get_dynamic_section(const ElfW(Phdr)* phdr_table, size_t phdr_co
ElfW(Addr) load_bias, ElfW(Dyn)** dynamic,
ElfW(Word)* dynamic_flags);
+const char* phdr_table_get_interpreter_name(const ElfW(Phdr) * phdr_table, size_t phdr_count,
+ ElfW(Addr) load_bias);
+
#endif /* LINKER_PHDR_H */
diff --git a/linker/linker_utils.cpp b/linker/linker_utils.cpp
new file mode 100644
index 000000000..fb070eed0
--- /dev/null
+++ b/linker/linker_utils.cpp
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "linker_utils.h"
+#include "linker_debug.h"
+
+bool normalize_path(const char* path, std::string* normalized_path) {
+ // Input should be an absolute path
+ if (path[0] != '/') {
+ PRINT("normalize_path - invalid input: \"%s\", the input path should be absolute", path);
+ return false;
+ }
+
+ const size_t len = strlen(path) + 1;
+ char buf[len];
+
+ const char* in_ptr = path;
+ char* out_ptr = buf;
+
+ while (*in_ptr != 0) {
+ if (*in_ptr == '/') {
+ char c1 = in_ptr[1];
+ if (c1 == '.') {
+ char c2 = in_ptr[2];
+ if (c2 == '/') {
+ in_ptr += 2;
+ continue;
+ } else if (c2 == '.' && (in_ptr[3] == '/' || in_ptr[3] == 0)) {
+ in_ptr += 3;
+ while (out_ptr > buf && *--out_ptr != '/') {
+ }
+ if (in_ptr[0] == 0) {
+ // retain '/'
+ out_ptr++;
+ }
+ continue;
+ }
+ } else if (c1 == '/') {
+ ++in_ptr;
+ continue;
+ }
+ }
+ *out_ptr++ = *in_ptr++;
+ }
+
+ *out_ptr = 0;
+ *normalized_path = buf;
+ return true;
+}
+
+bool file_is_in_dir(const std::string& file, const std::string& dir) {
+ const char* needle = dir.c_str();
+ const char* haystack = file.c_str();
+ size_t needle_len = strlen(needle);
+
+ return strncmp(haystack, needle, needle_len) == 0 &&
+ haystack[needle_len] == '/' &&
+ strchr(haystack + needle_len + 1, '/') == nullptr;
+}
+
+bool file_is_under_dir(const std::string& file, const std::string& dir) {
+ const char* needle = dir.c_str();
+ const char* haystack = file.c_str();
+ size_t needle_len = strlen(needle);
+
+ return strncmp(haystack, needle, needle_len) == 0 &&
+ haystack[needle_len] == '/';
+}
+
+const char* const kZipFileSeparator = "!/";
+
+bool parse_zip_path(const char* input_path, std::string* zip_path, std::string* entry_path) {
+ std::string normalized_path;
+ if (!normalize_path(input_path, &normalized_path)) {
+ return false;
+ }
+
+ const char* const path = normalized_path.c_str();
+ TRACE("Trying zip file open from path \"%s\" -> normalized \"%s\"", input_path, path);
+
+ // Treat an '!/' separator inside a path as the separator between the name
+ // of the zip file on disk and the subdirectory to search within it.
+ // For example, if path is "foo.zip!/bar/bas/x.so", then we search for
+ // "bar/bas/x.so" within "foo.zip".
+ const char* const separator = strstr(path, kZipFileSeparator);
+ if (separator == nullptr) {
+ return false;
+ }
+
+ char buf[512];
+ if (strlcpy(buf, path, sizeof(buf)) >= sizeof(buf)) {
+ PRINT("Warning: ignoring very long library path: %s", path);
+ return false;
+ }
+
+ buf[separator - path] = '\0';
+
+ *zip_path = buf;
+ *entry_path = &buf[separator - path + 2];
+
+ return true;
+}
+
+constexpr off64_t kPageMask = ~static_cast<off64_t>(PAGE_SIZE-1);
+
+off64_t page_start(off64_t offset) {
+ return offset & kPageMask;
+}
+
+bool safe_add(off64_t* out, off64_t a, size_t b) {
+ CHECK(a >= 0);
+ if (static_cast<uint64_t>(INT64_MAX - a) < b) {
+ return false;
+ }
+
+ *out = a + b;
+ return true;
+}
+
+size_t page_offset(off64_t offset) {
+ return static_cast<size_t>(offset & (PAGE_SIZE-1));
+}
+
diff --git a/linker/linker_utils.h b/linker/linker_utils.h
new file mode 100644
index 000000000..987eabd9c
--- /dev/null
+++ b/linker/linker_utils.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef __LINKER_UTILS_H
+#define __LINKER_UTILS_H
+
+#include <string>
+
+extern const char* const kZipFileSeparator;
+
+bool normalize_path(const char* path, std::string* normalized_path);
+bool file_is_in_dir(const std::string& file, const std::string& dir);
+bool file_is_under_dir(const std::string& file, const std::string& dir);
+bool parse_zip_path(const char* input_path, std::string* zip_path, std::string* entry_path);
+
+off64_t page_start(off64_t offset);
+size_t page_offset(off64_t offset);
+bool safe_add(off64_t* out, off64_t a, size_t b);
+
+#endif
diff --git a/linker/tests/Android.mk b/linker/tests/Android.mk
index 35992c53e..a0618771f 100644
--- a/linker/tests/Android.mk
+++ b/linker/tests/Android.mk
@@ -23,15 +23,18 @@ LOCAL_MODULE_STEM_64 := $(LOCAL_MODULE)64
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_CFLAGS += -g -Wall -Wextra -Wunused -Werror -std=gnu++11
+LOCAL_CFLAGS += -g -Wall -Wextra -Wunused -Werror
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../libc/
LOCAL_SRC_FILES := \
+ linker_globals.cpp \
linked_list_test.cpp \
linker_block_allocator_test.cpp \
../linker_block_allocator.cpp \
linker_memory_allocator_test.cpp \
- ../linker_allocator.cpp
+ ../linker_allocator.cpp \
+ linker_utils_test.cpp \
+ ../linker_utils.cpp
# for __libc_fatal
LOCAL_SRC_FILES += ../../libc/bionic/libc_logging.cpp
diff --git a/linker/tests/linked_list_test.cpp b/linker/tests/linked_list_test.cpp
index 09ad68766..12348d9be 100644
--- a/linker/tests/linked_list_test.cpp
+++ b/linker/tests/linked_list_test.cpp
@@ -133,6 +133,23 @@ TEST(linked_list, remove_if_then_pop) {
ASSERT_TRUE(list.pop_front() == nullptr);
}
+TEST(linked_list, remove_if_last_then_push_back) {
+ test_list_t list;
+
+ list.push_back("a");
+ list.push_back("b");
+ list.push_back("c");
+ list.push_back("d");
+
+ list.remove_if([](const char* c) {
+ return *c == 'c' || *c == 'd';
+ });
+
+ ASSERT_EQ("ab", test_list_to_string(list));
+ list.push_back("d");
+ ASSERT_EQ("abd", test_list_to_string(list));
+}
+
TEST(linked_list, copy_to_array) {
test_list_t list;
const size_t max_size = 128;
diff --git a/linker/tests/linker_block_allocator_test.cpp b/linker/tests/linker_block_allocator_test.cpp
index 3ef0f36f8..5adc4253e 100644
--- a/linker/tests/linker_block_allocator_test.cpp
+++ b/linker/tests/linker_block_allocator_test.cpp
@@ -53,10 +53,12 @@ TEST(linker_allocator, test_nominal) {
test_struct_nominal* ptr1 = allocator.alloc();
ASSERT_TRUE(ptr1 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
test_struct_nominal* ptr2 = allocator.alloc();
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
ASSERT_TRUE(ptr2 != nullptr);
// they should be next to each other.
- ASSERT_EQ(ptr1+1, ptr2);
+ ASSERT_EQ(reinterpret_cast<uint8_t*>(ptr1)+16, reinterpret_cast<uint8_t*>(ptr2));
ptr1->value = 42;
@@ -71,8 +73,10 @@ TEST(linker_allocator, test_small) {
char* ptr2 = reinterpret_cast<char*>(allocator.alloc());
ASSERT_TRUE(ptr1 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
ASSERT_TRUE(ptr2 != nullptr);
- ASSERT_EQ(ptr1+2*sizeof(void*), ptr2);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
+ ASSERT_EQ(ptr1+16, ptr2); // aligned to 16
}
TEST(linker_allocator, test_larger) {
@@ -82,9 +86,11 @@ TEST(linker_allocator, test_larger) {
test_struct_larger* ptr2 = allocator.alloc();
ASSERT_TRUE(ptr1 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
ASSERT_TRUE(ptr2 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
- ASSERT_EQ(ptr1+1, ptr2);
+ ASSERT_EQ(reinterpret_cast<uint8_t*>(ptr1) + 1024, reinterpret_cast<uint8_t*>(ptr2));
// lets allocate until we reach next page.
size_t n = kPageSize/sizeof(test_struct_larger) + 1 - 2;
diff --git a/libc/upstream-freebsd/android/include/spinlock.h b/linker/tests/linker_globals.cpp
index f5c378511..7762a87ce 100644
--- a/libc/upstream-freebsd/android/include/spinlock.h
+++ b/linker/tests/linker_globals.cpp
@@ -14,9 +14,6 @@
* limitations under the License.
*/
-#ifndef _BIONIC_FREEBSD_SPINLOCK_H_included
-#define _BIONIC_FREEBSD_SPINLOCK_H_included
+// To enable logging
+int g_ld_debug_verbosity = 0;
-/* TODO: until we have the FreeBSD findfp.c, this is useless. */
-
-#endif
diff --git a/linker/tests/linker_memory_allocator_test.cpp b/linker/tests/linker_memory_allocator_test.cpp
index f002a0d50..5b8553675 100644
--- a/linker/tests/linker_memory_allocator_test.cpp
+++ b/linker/tests/linker_memory_allocator_test.cpp
@@ -53,7 +53,7 @@ TEST(linker_memory, test_alloc_0) {
LinkerMemoryAllocator allocator;
void* ptr = allocator.alloc(0);
ASSERT_TRUE(ptr != nullptr);
- free(ptr);
+ allocator.free(ptr);
}
TEST(linker_memory, test_free_nullptr) {
@@ -96,6 +96,7 @@ TEST(linker_memory, test_realloc) {
ASSERT_TRUE(reallocated_ptr != nullptr);
ASSERT_TRUE(reallocated_ptr != array);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(reallocated_ptr) % 16);
ASSERT_TRUE(memcmp(reallocated_ptr, model, array_size * 2) == 0);
@@ -107,10 +108,11 @@ TEST(linker_memory, test_realloc) {
ASSERT_TRUE(reallocated_ptr != nullptr);
ASSERT_TRUE(reallocated_ptr != array);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(reallocated_ptr) % 16);
ASSERT_TRUE(memcmp(reallocated_ptr, model, 4000) == 0);
- ASSERT_EQ(nullptr, realloc(reallocated_ptr, 0));
+ ASSERT_EQ(nullptr, allocator.realloc(reallocated_ptr, 0));
}
TEST(linker_memory, test_small_smoke) {
@@ -125,7 +127,10 @@ TEST(linker_memory, test_small_smoke) {
reinterpret_cast<test_struct_small*>(allocator.alloc(sizeof(test_struct_small)));
ASSERT_TRUE(ptr1 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
ASSERT_TRUE(ptr2 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
+
ASSERT_EQ(reinterpret_cast<uintptr_t>(ptr1)+16, reinterpret_cast<uintptr_t>(ptr2));
ASSERT_TRUE(memcmp(ptr1, zeros, 16) == 0);
@@ -143,7 +148,9 @@ TEST(linker_memory, test_huge_smoke) {
reinterpret_cast<test_struct_huge*>(allocator.alloc(sizeof(test_struct_huge)));
ASSERT_TRUE(ptr1 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
ASSERT_TRUE(ptr2 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
ASSERT_TRUE(
reinterpret_cast<uintptr_t>(ptr1)/kPageSize != reinterpret_cast<uintptr_t>(ptr2)/kPageSize);
@@ -160,7 +167,9 @@ TEST(linker_memory, test_large) {
reinterpret_cast<test_struct_large*>(allocator.alloc(1024));
ASSERT_TRUE(ptr1 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr1) % 16);
ASSERT_TRUE(ptr2 != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr2) % 16);
ASSERT_EQ(reinterpret_cast<uintptr_t>(ptr1) + 1024, reinterpret_cast<uintptr_t>(ptr2));
@@ -179,6 +188,7 @@ TEST(linker_memory, test_large) {
reinterpret_cast<test_struct_large*>(allocator.alloc(sizeof(test_struct_large)));
ASSERT_TRUE(ptr_to_free != nullptr);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(ptr_to_free) % 16);
allocator.free(ptr1);
diff --git a/linker/tests/linker_utils_test.cpp b/linker/tests/linker_utils_test.cpp
new file mode 100644
index 000000000..fd749fa40
--- /dev/null
+++ b/linker/tests/linker_utils_test.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+
+#include <gtest/gtest.h>
+
+#include "../linker_utils.h"
+
+TEST(linker_utils, normalize_path_smoke) {
+ std::string output;
+ ASSERT_TRUE(normalize_path("/../root///dir/.///dir2/somedir/../zipfile!/dir/dir9//..///afile", &output));
+ ASSERT_EQ("/root/dir/dir2/zipfile!/dir/afile", output);
+
+ ASSERT_TRUE(normalize_path("/../root///dir/.///dir2/somedir/.../zipfile!/.dir/dir9//..///afile", &output));
+ ASSERT_EQ("/root/dir/dir2/somedir/.../zipfile!/.dir/afile", output);
+
+ ASSERT_TRUE(normalize_path("/root/..", &output));
+ ASSERT_EQ("/", output);
+
+ ASSERT_TRUE(normalize_path("/root/notroot/..", &output));
+ ASSERT_EQ("/root/", output);
+
+ ASSERT_TRUE(normalize_path("/a/../../b", &output));
+ ASSERT_EQ("/b", output);
+
+ output = "unchanged";
+ ASSERT_FALSE(normalize_path("root///dir/.///dir2/somedir/../zipfile!/dir/dir9//..///afile", &output));
+ ASSERT_EQ("unchanged", output);
+}
+
+TEST(linker_utils, file_is_in_dir_smoke) {
+ ASSERT_TRUE(file_is_in_dir("/foo/bar/file", "/foo/bar"));
+ ASSERT_FALSE(file_is_in_dir("/foo/bar/file", "/foo"));
+
+ ASSERT_FALSE(file_is_in_dir("/foo/bar/file", "/bar/foo"));
+
+ ASSERT_TRUE(file_is_in_dir("/file", ""));
+ ASSERT_FALSE(file_is_in_dir("/file", "/"));
+}
+
+TEST(linker_utils, file_is_under_dir_smoke) {
+ ASSERT_TRUE(file_is_under_dir("/foo/bar/file", "/foo/bar"));
+ ASSERT_TRUE(file_is_under_dir("/foo/bar/file", "/foo"));
+
+ ASSERT_FALSE(file_is_under_dir("/foo/bar/file", "/bar/foo"));
+
+ ASSERT_TRUE(file_is_under_dir("/file", ""));
+ ASSERT_TRUE(file_is_under_dir("/foo/bar/file", ""));
+ ASSERT_FALSE(file_is_under_dir("/file", "/"));
+ ASSERT_FALSE(file_is_under_dir("/foo/bar/file", "/"));
+}
+
+TEST(linker_utils, parse_zip_path_smoke) {
+ std::string zip_path;
+ std::string entry_path;
+
+ ASSERT_FALSE(parse_zip_path("/not/a/zip/path/file.zip", &zip_path, &entry_path));
+ ASSERT_FALSE(parse_zip_path("/not/a/zip/path/file.zip!path/in/zip", &zip_path, &entry_path));
+ ASSERT_TRUE(parse_zip_path("/zip/path/file.zip!/path/in/zip", &zip_path, &entry_path));
+ ASSERT_EQ("/zip/path/file.zip", zip_path);
+ ASSERT_EQ("path/in/zip", entry_path);
+
+ ASSERT_TRUE(parse_zip_path("/zip/path/file2.zip!/", &zip_path, &entry_path));
+ ASSERT_EQ("/zip/path/file2.zip", zip_path);
+ ASSERT_EQ("", entry_path);
+}
+
+TEST(linker_utils, page_start) {
+ ASSERT_EQ(0x0001000, page_start(0x0001000));
+ ASSERT_EQ(0x3002000, page_start(0x300222f));
+ ASSERT_EQ(0x6001000, page_start(0x6001fff));
+}
+
+TEST(linker_utils, page_offset) {
+ ASSERT_EQ(0x0U, page_offset(0x0001000));
+ ASSERT_EQ(0x22fU, page_offset(0x300222f));
+ ASSERT_EQ(0xfffU, page_offset(0x6001fff));
+}
+
+TEST(linker_utils, safe_add) {
+ int64_t val = 42;
+ ASSERT_FALSE(safe_add(&val, INT64_MAX-20, 21U));
+ ASSERT_EQ(42, val);
+ ASSERT_TRUE(safe_add(&val, INT64_MAX-42, 42U));
+ ASSERT_EQ(INT64_MAX, val);
+ ASSERT_TRUE(safe_add(&val, 2000, 42U));
+ ASSERT_EQ(2042, val);
+}
diff --git a/tests/Android.build.mk b/tests/Android.build.mk
index 5b2b41728..740c2f4cb 100644
--- a/tests/Android.build.mk
+++ b/tests/Android.build.mk
@@ -28,16 +28,24 @@ ifneq ($(findstring LIBRARY, $(build_target)),LIBRARY)
LOCAL_MODULE_STEM_32 := $(module)32
LOCAL_MODULE_STEM_64 := $(module)64
else
+
+ifneq ($($(module)_install_to_out_data_dir),)
+ $(module)_install_to_out_data := true
+endif
+
ifeq ($($(module)_install_to_out_data),true)
- LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$(module)
- LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/$(module)
+ ifeq ($($(module)_install_to_out_data_dir),)
+ $(module)_install_to_out_data_dir := $(module)
+ endif
+ LOCAL_MODULE_PATH_32 := $($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_DATA_NATIVE_TESTS)/$($(module)_install_to_out_data_dir)
+ LOCAL_MODULE_PATH_64 := $(TARGET_OUT_DATA_NATIVE_TESTS)/$($(module)_install_to_out_data_dir)
endif
endif
LOCAL_CLANG := $($(module)_clang_$(build_type))
ifneq ($($(module)_allow_asan),true)
-LOCAL_ADDRESS_SANITIZER := false
+LOCAL_SANITIZE := never
endif
LOCAL_FORCE_STATIC_EXECUTABLE := $($(module)_force_static_executable)
@@ -48,6 +56,10 @@ ifneq ($($(module)_multilib),)
LOCAL_MULTILIB := $($(module)_multilib)
endif
+ifneq ($($(module)_relative_path),)
+ LOCAL_MODULE_RELATIVE_PATH := $($(module)_relative_path)
+endif
+
LOCAL_CFLAGS := \
$(common_cflags) \
$($(module)_cflags) \
diff --git a/tests/Android.mk b/tests/Android.mk
index dc2e410bd..d39f4d7f5 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -40,18 +40,12 @@ test_cflags = \
test_cflags += -D__STDC_LIMIT_MACROS # For glibc.
-ifeq ($(MALLOC_IMPL),dlmalloc)
-test_cflags += -DUSE_DLMALLOC
-else
-test_cflags += -DUSE_JEMALLOC
-endif
-
-test_cppflags = \
- -std=gnu++11 \
+test_cppflags := \
libBionicStandardTests_src_files := \
arpa_inet_test.cpp \
buffer_tests.cpp \
+ bug_26110743_test.cpp \
complex_test.cpp \
ctype_test.cpp \
dirent_test.cpp \
@@ -62,14 +56,19 @@ libBionicStandardTests_src_files := \
ftw_test.cpp \
getauxval_test.cpp \
getcwd_test.cpp \
+ ifaddrs_test.cpp \
inttypes_test.cpp \
libc_logging_test.cpp \
+ libgen_basename_test.cpp \
libgen_test.cpp \
locale_test.cpp \
malloc_test.cpp \
math_test.cpp \
mntent_test.cpp \
netdb_test.cpp \
+ net_if_test.cpp \
+ netinet_in_test.cpp \
+ netinet_udp_test.cpp \
pthread_test.cpp \
pty_test.cpp \
regex_test.cpp \
@@ -79,20 +78,25 @@ libBionicStandardTests_src_files := \
setjmp_test.cpp \
signal_test.cpp \
stack_protector_test.cpp \
+ stack_protector_test_helper.cpp \
stack_unwinding_test.cpp \
stdatomic_test.cpp \
stdint_test.cpp \
+ stdio_nofortify_test.cpp \
stdio_test.cpp \
stdio_ext_test.cpp \
stdlib_test.cpp \
+ string_nofortify_test.cpp \
string_test.cpp \
string_posix_strerror_r_test.cpp \
+ strings_nofortify_test.cpp \
strings_test.cpp \
stubs_test.cpp \
sstream_test.cpp \
sys_epoll_test.cpp \
sys_mman_test.cpp \
sys_personality_test.cpp \
+ sys_prctl_test.cpp \
sys_procfs_test.cpp \
sys_resource_test.cpp \
sys_select_test.cpp \
@@ -102,7 +106,9 @@ libBionicStandardTests_src_files := \
sys_statvfs_test.cpp \
sys_syscall_test.cpp \
sys_sysinfo_test.cpp \
+ sys_sysmacros_test.cpp \
sys_time_test.cpp \
+ sys_timex_test.cpp \
sys_types_test.cpp \
sys_uio_test.cpp \
sys_vfs_test.cpp \
@@ -111,6 +117,7 @@ libBionicStandardTests_src_files := \
time_test.cpp \
uchar_test.cpp \
uniqueptr_test.cpp \
+ unistd_nofortify_test.cpp \
unistd_test.cpp \
utmp_test.cpp \
wchar_test.cpp \
@@ -118,12 +125,6 @@ libBionicStandardTests_src_files := \
libBionicStandardTests_cflags := \
$(test_cflags) \
-ifeq ($(MALLOC_IMPL),dlmalloc)
- libBionicStandardTests_cflags += -DUSE_DLMALLOC
-else
- libBionicStandardTests_cflags += -DUSE_JEMALLOC
-endif
-
libBionicStandardTests_cppflags := \
$(test_cppflags) \
@@ -137,6 +138,13 @@ libBionicStandardTests_static_libraries := \
libBionicStandardTests_ldlibs_host := \
-lrt \
+# Clang/llvm has incompatible long double (fp128) for x86_64.
+# https://llvm.org/bugs/show_bug.cgi?id=23897
+# This affects most of math_test.cpp.
+ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86_64))
+libBionicStandardTests_clang_target := false
+endif
+
module := libBionicStandardTests
module_tag := optional
build_type := target
@@ -157,11 +165,12 @@ $(foreach compiler,gcc clang, \
-D_FORTIFY_SOURCE=$(test) \
-DTEST_NAME=Fortify$(test)_$(compiler)); \
$(eval fortify$(test)-tests-$(compiler)_src_files := \
- fortify_test.cpp); \
+ fortify_test_main.cpp); \
$(eval fortify_libs += fortify$(test)-tests-$(compiler)); \
) \
)
+fortify1-tests-gcc_clang_target := false
module := fortify1-tests-gcc
module_tag := optional
build_type := target
@@ -170,6 +179,7 @@ include $(LOCAL_PATH)/Android.build.mk
build_type := host
include $(LOCAL_PATH)/Android.build.mk
+fortify2-tests-gcc_clang_target := false
module := fortify2-tests-gcc
module_tag := optional
build_type := target
@@ -231,7 +241,13 @@ build_type := target
build_target := STATIC_TEST_LIBRARY
include $(LOCAL_PATH)/Android.build.mk
build_type := host
+
+ifeq ($(HOST_OS),$(filter $(HOST_OS),linux darwin))
+saved_build_host := $(build_host)
+build_host := true
include $(LOCAL_PATH)/Android.build.mk
+build_host := $(saved_build_host)
+endif
# -----------------------------------------------------------------------------
# Library of bionic customized gtest main function, with normal gtest output format,
@@ -243,11 +259,6 @@ libBionicCtsGtestMain_cflags := $(test_cflags)
libBionicCtsGtestMain_cppflags := $(test_cppflags) -DUSING_GTEST_OUTPUT_FORMAT \
-# Temporarily fix the job count to 1 for CTS since on some devices the
-# number of online cores is incorrectly read as the total number of cores
-# in the system. When b/24376925 is fixed, this should be removed.
-libBionicCtsGtestMain_cppflags += -DJOB_COUNT_FIXED=1
-
module := libBionicCtsGtestMain
module_tag := optional
build_type := target
@@ -260,18 +271,20 @@ include $(LOCAL_PATH)/Android.build.mk
# Tests for the device using bionic's .so. Run with:
# adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests32
# adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests64
+# adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests-gcc32
+# adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests-gcc64
# -----------------------------------------------------------------------------
-bionic-unit-tests_whole_static_libraries := \
+common_bionic-unit-tests_whole_static_libraries := \
libBionicTests \
libBionicGtestMain \
-bionic-unit-tests_static_libraries := \
+common_bionic-unit-tests_static_libraries := \
libtinyxml2 \
liblog \
libbase \
# TODO: Include __cxa_thread_atexit_test.cpp to glibc tests once it is upgraded (glibc 2.18+)
-bionic-unit-tests_src_files := \
+common_bionic-unit-tests_src_files := \
atexit_test.cpp \
dl_test.cpp \
dlext_test.cpp \
@@ -279,38 +292,67 @@ bionic-unit-tests_src_files := \
dlfcn_test.cpp \
libdl_test.cpp \
pthread_dlfcn_test.cpp \
+ thread_local_test.cpp \
-bionic-unit-tests_cflags := $(test_cflags)
+common_bionic-unit-tests_cflags := $(test_cflags)
-bionic-unit-tests_conlyflags := \
+common_bionic-unit-tests_conlyflags := \
-fexceptions \
-fnon-call-exceptions \
-bionic-unit-tests_cppflags := $(test_cppflags)
+common_bionic-unit-tests_cppflags := $(test_cppflags)
-bionic-unit-tests_ldflags := \
+common_bionic-unit-tests_ldflags := \
-Wl,--export-dynamic
-bionic-unit-tests_c_includes := \
+common_bionic-unit-tests_c_includes := \
bionic/libc \
- $(call include-path-for, libpagemap) \
-bionic-unit-tests_shared_libraries_target := \
+common_bionic-unit-tests_shared_libraries_target := \
libdl \
libpagemap \
libdl_preempt_test_1 \
- libdl_preempt_test_2
-
-# TODO: clang support for thread_local on arm is done via __aeabi_read_tp()
-# which bionic does not support. Reenable this once this question is resolved.
-bionic-unit-tests_clang_target := false
+ libdl_preempt_test_2 \
+ libdl_test_df_1_global \
-bionic-unit-tests_shared_libraries_target += libdl_test_df_1_global
+# The order of these libraries matters, do not shuffle them.
+common_bionic-unit-tests_static_libraries_target := \
+ libbase \
+ libziparchive \
+ liblog \
+ libz \
+ libutils \
-module := bionic-unit-tests
module_tag := optional
build_type := target
build_target := NATIVE_TEST
+
+module := bionic-unit-tests
+bionic-unit-tests_clang_target := true
+bionic-unit-tests_whole_static_libraries := $(common_bionic-unit-tests_whole_static_libraries)
+bionic-unit-tests_static_libraries := $(common_bionic-unit-tests_static_libraries)
+bionic-unit-tests_src_files := $(common_bionic-unit-tests_src_files)
+bionic-unit-tests_cflags := $(common_bionic-unit-tests_cflags)
+bionic-unit-tests_conlyflags := $(common_bionic-unit-tests_conlyflags)
+bionic-unit-tests_cppflags := $(common_bionic-unit-tests_cppflags)
+bionic-unit-tests_ldflags := $(common_bionic-unit-tests_ldflags)
+bionic-unit-tests_c_includes := $(common_bionic-unit-tests_c_includes)
+bionic-unit-tests_shared_libraries_target := $(common_bionic-unit-tests_shared_libraries_target)
+bionic-unit-tests_static_libraries_target := $(common_bionic-unit-tests_static_libraries_target)
+include $(LOCAL_PATH)/Android.build.mk
+
+module := bionic-unit-tests-gcc
+bionic-unit-tests-gcc_clang_target := false
+bionic-unit-tests-gcc_whole_static_libraries := $(common_bionic-unit-tests_whole_static_libraries)
+bionic-unit-tests-gcc_static_libraries := $(common_bionic-unit-tests_static_libraries)
+bionic-unit-tests-gcc_src_files := $(common_bionic-unit-tests_src_files)
+bionic-unit-tests-gcc_cflags := $(common_bionic-unit-tests_cflags)
+bionic-unit-tests-gcc_conlyflags := $(common_bionic-unit-tests_conlyflags)
+bionic-unit-tests-gcc_cppflags := $(common_bionic-unit-tests_cppflags)
+bionic-unit-tests-gcc_ldflags := $(common_bionic-unit-tests_ldflags)
+bionic-unit-tests-gcc_c_includes := $(common_bionic-unit-tests_c_includes)
+bionic-unit-tests-gcc_shared_libraries_target := $(common_bionic-unit-tests_shared_libraries_target)
+bionic-unit-tests-gcc_static_libraries_target := $(common_bionic-unit-tests_static_libraries_target)
include $(LOCAL_PATH)/Android.build.mk
# -----------------------------------------------------------------------------
@@ -413,6 +455,8 @@ LOCAL_CXX = $(LOCAL_PATH)/file-check-cxx \
LOCAL_CLANG := false
LOCAL_MODULE := bionic-compile-time-tests-g++
LOCAL_CPPFLAGS := -Wall
+# Disable color diagnostics so the warnings output matches the source
+LOCAL_CPPFLAGS += -fdiagnostics-color=never
LOCAL_SRC_FILES := fortify_compilation_test.cpp
include $(BUILD_STATIC_LIBRARY)
@@ -430,6 +474,8 @@ LOCAL_CXX := $(LOCAL_PATH)/file-check-cxx \
LOCAL_CLANG := true
LOCAL_MODULE := bionic-compile-time-tests-clang++
LOCAL_CPPFLAGS := -Wall
+# Disable color diagnostics so the warnings output matches the source
+LOCAL_CPPFLAGS += -fno-color-diagnostics
# FileCheck will error if there aren't any CLANG: lines in the file, but there
# don't appear to be any cases where clang _does_ emit warnings for sn?printf :(
LOCAL_SRC_FILES :=
@@ -443,6 +489,7 @@ include $(BUILD_STATIC_LIBRARY)
# Make sure to create ANDROID_DATA/local/tmp if doesn't exist.
# Use the current target out directory as ANDROID_DATA.
# BIONIC_TEST_FLAGS is either empty or it comes from the user.
+.PHONY: bionic-unit-tests-glibc-run
bionic-unit-tests-glibc-run: bionic-unit-tests-glibc
mkdir -p $(TARGET_OUT_DATA)/local/tmp
ANDROID_DATA=$(TARGET_OUT_DATA) \
@@ -460,6 +507,7 @@ ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64))
TEST_TIMEOUT := 0
# BIONIC_TEST_FLAGS is either empty or it comes from the user.
+.PHONY: bionic-unit-tests-run-on-host32
bionic-unit-tests-run-on-host32: bionic-unit-tests bionic-prepare-run-on-host
ANDROID_DATA=$(TARGET_OUT_DATA) \
ANDROID_DNS_MODE=local \
@@ -469,6 +517,7 @@ bionic-unit-tests-run-on-host32: bionic-unit-tests bionic-prepare-run-on-host
ifeq ($(TARGET_IS_64_BIT),true)
# add target to run lp64 tests
+.PHONY: bionic-unit-tests-run-on-host64
bionic-unit-tests-run-on-host64: bionic-unit-tests bionic-prepare-run-on-host
ANDROID_DATA=$(TARGET_OUT_DATA) \
ANDROID_DNS_MODE=local \
diff --git a/tests/__cxa_thread_atexit_test.cpp b/tests/__cxa_thread_atexit_test.cpp
index e388f3b62..143296843 100644
--- a/tests/__cxa_thread_atexit_test.cpp
+++ b/tests/__cxa_thread_atexit_test.cpp
@@ -35,7 +35,12 @@ class ClassWithDtor {
std::string message;
};
+#if defined(__clang__) && defined(__aarch64__)
+// b/25642296, aarch64 clang compiled "thread_local" does not link.
+static ClassWithDtor class_with_dtor;
+#else
static thread_local ClassWithDtor class_with_dtor;
+#endif
static void* thread_nop(void* arg) {
class_with_dtor.set_message(*static_cast<std::string*>(arg));
@@ -47,7 +52,12 @@ TEST(thread_local, smoke) {
pthread_t t;
ASSERT_EQ(0, pthread_create(&t, nullptr, thread_nop, &msg));
ASSERT_EQ(0, pthread_join(t, nullptr));
+#if defined(__clang__) && defined(__aarch64__)
+ GTEST_LOG_(INFO) << "Skipping test, b/25642296, "
+ << "thread_local does not work with aarch64 clang/llvm.\n";
+#else
ASSERT_EQ("dtor called.", class_with_dtor_output);
+#endif
}
class ClassWithDtorForMainThread {
@@ -64,7 +74,13 @@ class ClassWithDtorForMainThread {
};
static void thread_atexit_main() {
+#if defined(__clang__) && defined(__aarch64__)
+ static ClassWithDtorForMainThread class_with_dtor_for_main_thread;
+ GTEST_LOG_(INFO) << "Skipping test, b/25642296, "
+ << "thread_local does not work with aarch64 clang/llvm.\n";
+#else
static thread_local ClassWithDtorForMainThread class_with_dtor_for_main_thread;
+#endif
class_with_dtor_for_main_thread.set_message("d-tor for main thread called.");
exit(0);
}
diff --git a/tests/arpa_inet_test.cpp b/tests/arpa_inet_test.cpp
index 5e533370d..a368b8fcc 100644
--- a/tests/arpa_inet_test.cpp
+++ b/tests/arpa_inet_test.cpp
@@ -24,8 +24,85 @@ TEST(arpa_inet, inet_addr) {
TEST(arpa_inet, inet_aton) {
in_addr a;
- ASSERT_EQ(1, inet_aton("127.0.0.1", &a));
+
+ // a.b.c.d
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("127.1.2.3", &a));
+ ASSERT_EQ((htonl)(0x7f010203), a.s_addr);
+
+ // a.b.c
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("127.1.2", &a));
+ ASSERT_EQ((htonl)(0x7f010002), a.s_addr);
+
+ // a.b
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("127.1", &a));
ASSERT_EQ((htonl)(0x7f000001), a.s_addr);
+
+ // a
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("0x7f000001", &a));
+ ASSERT_EQ((htonl)(0x7f000001), a.s_addr);
+
+ // Hex (0x) and mixed-case hex digits.
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("0xFf.0.0.1", &a));
+ ASSERT_EQ((htonl)(0xff000001), a.s_addr);
+
+ // Hex (0X) and mixed-case hex digits.
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("0XfF.0.0.1", &a));
+ ASSERT_EQ((htonl)(0xff000001), a.s_addr);
+
+ // Octal.
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("0177.0.0.1", &a));
+ ASSERT_EQ((htonl)(0x7f000001), a.s_addr);
+
+ a.s_addr = 0;
+ ASSERT_EQ(1, inet_aton("036", &a));
+ ASSERT_EQ((htonl)(036U), a.s_addr);
+}
+
+TEST(arpa_inet, inet_aton_nullptr) {
+ ASSERT_EQ(0, inet_aton("", nullptr));
+ ASSERT_EQ(1, inet_aton("127.0.0.1", nullptr));
+}
+
+TEST(arpa_inet, inet_aton_invalid) {
+ ASSERT_EQ(0, inet_aton("", nullptr)); // Empty.
+ ASSERT_EQ(0, inet_aton("x", nullptr)); // Leading junk.
+ ASSERT_EQ(0, inet_aton("127.0.0.1x", nullptr)); // Trailing junk.
+ ASSERT_EQ(0, inet_aton("09.0.0.1", nullptr)); // Invalid octal.
+ ASSERT_EQ(0, inet_aton("0xg.0.0.1", nullptr)); // Invalid hex.
+
+ ASSERT_EQ(0, inet_aton("1.2.3.4.5", nullptr)); // Too many dots.
+ ASSERT_EQ(0, inet_aton("1.2.3.4.", nullptr)); // Trailing dot.
+
+ // Out of range a.b.c.d form.
+ ASSERT_EQ(0, inet_aton("999.0.0.1", nullptr));
+ ASSERT_EQ(0, inet_aton("0.999.0.1", nullptr));
+ ASSERT_EQ(0, inet_aton("0.0.999.1", nullptr));
+ ASSERT_EQ(0, inet_aton("0.0.0.999", nullptr));
+
+ // Out of range a.b.c form.
+ ASSERT_EQ(0, inet_aton("256.0.0", nullptr));
+ ASSERT_EQ(0, inet_aton("0.256.0", nullptr));
+ ASSERT_EQ(0, inet_aton("0.0.0x10000", nullptr));
+
+ // Out of range a.b form.
+ ASSERT_EQ(0, inet_aton("256.0", nullptr));
+ ASSERT_EQ(0, inet_aton("0.0x1000000", nullptr));
+
+ // Out of range a form.
+ ASSERT_EQ(0, inet_aton("0x100000000", nullptr));
+
+ // 64-bit overflow.
+ ASSERT_EQ(0, inet_aton("0x10000000000000000", nullptr));
+
+ // Out of range octal.
+ ASSERT_EQ(0, inet_aton("0400.0.0.1", nullptr));
}
TEST(arpa_inet, inet_lnaof) {
@@ -45,6 +122,8 @@ TEST(arpa_inet, inet_netof) {
TEST(arpa_inet, inet_network) {
ASSERT_EQ(0x7f000001U, inet_network("127.0.0.1"));
+ ASSERT_EQ(0x7fU, inet_network("0x7f"));
+ ASSERT_EQ(~0U, inet_network(""));
}
TEST(arpa_inet, inet_ntoa) {
diff --git a/tests/atexit_test.cpp b/tests/atexit_test.cpp
index e92889d1c..67fbfd2be 100644
--- a/tests/atexit_test.cpp
+++ b/tests/atexit_test.cpp
@@ -14,7 +14,17 @@
* limitations under the License.
*/
+// To work around b/25643775, we disable clang optimization so that
+// VTT for std::__1::basic_stringstream<char, std::__1::char_traits<char>,
+// std::__1::allocator<char> >
+// will be correctly kept for other module's references.
+#if defined(__clang__) && (defined(__arm__) || defined(__aarch64__))
+#pragma clang optimize off
+#endif
#include <gtest/gtest.h>
+#if defined(__clang__) && (defined(__arm__) || defined(__aarch64__))
+#pragma clang optimize on
+#endif
#include <dlfcn.h>
#include <libgen.h>
diff --git a/tests/buffer_tests.cpp b/tests/buffer_tests.cpp
index 496738211..a5a0c2a16 100644
--- a/tests/buffer_tests.cpp
+++ b/tests/buffer_tests.cpp
@@ -256,7 +256,7 @@ void RunSingleBufferAlignTest(
VerifyFencepost(&buf_align[len]);
}
}
- delete buf;
+ delete[] buf;
}
void RunSrcDstBufferAlignTest(
@@ -292,8 +292,8 @@ void RunSrcDstBufferAlignTest(
VerifyFencepost(&dst_align[len]);
}
}
- delete src;
- delete dst;
+ delete[] src;
+ delete[] dst;
}
void RunCmpBufferAlignTest(
@@ -344,8 +344,8 @@ void RunCmpBufferAlignTest(
}
}
}
- delete buf1;
- delete buf2;
+ delete[] buf1;
+ delete[] buf2;
}
void RunSingleBufferOverreadTest(void (*test_func)(uint8_t*, size_t)) {
@@ -381,15 +381,19 @@ void RunSrcDstBufferOverreadTest(void (*test_func)(uint8_t*, uint8_t*, size_t))
// Make the second page unreadable and unwritable.
ASSERT_TRUE(mprotect(&memory[pagesize], pagesize, PROT_NONE) == 0);
- uint8_t* dst = new uint8_t[pagesize];
- for (size_t i = 0; i < pagesize; i++) {
- uint8_t* src = &memory[pagesize-i];
+ uint8_t* dst_buffer = new uint8_t[2*pagesize];
+ // Change the dst alignment as we change the source.
+ for (size_t i = 0; i < 16; i++) {
+ uint8_t* dst = &dst_buffer[i];
+ for (size_t j = 0; j < pagesize; j++) {
+ uint8_t* src = &memory[pagesize-j];
- test_func(src, dst, i);
+ test_func(src, dst, j);
+ }
}
ASSERT_TRUE(mprotect(&memory[pagesize], pagesize, PROT_READ | PROT_WRITE) == 0);
free(memory);
- delete dst;
+ delete[] dst_buffer;
}
void RunCmpBufferOverreadTest(
diff --git a/tests/bug_26110743_test.cpp b/tests/bug_26110743_test.cpp
new file mode 100644
index 000000000..c49a9dc70
--- /dev/null
+++ b/tests/bug_26110743_test.cpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/prctl.h>
+
+#include "private/ScopeGuard.h"
+
+extern "C" pid_t gettid();
+
+static void ProcSelfReadlinkBody() {
+ char buf[100];
+ char buf2[1024];
+ int fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ ASSERT_NE(-1, fd);
+ snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
+ const char* ERRORMSG = "Please apply the following two kernel patches:\n"
+ "* https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=73af963f9f3036dffed55c3a2898598186db1045\n"
+ "* https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=96d0df79f2644fc823f26c06491e182d87a90c2a\n";
+ ASSERT_NE(-1, readlink(buf, buf2, sizeof(buf2))) << ERRORMSG;
+ ASSERT_STREQ("/dev/null", buf2);
+ close(fd);
+}
+
+static void* ProcSelfReadlink(void*) {
+ ProcSelfReadlinkBody();
+ return NULL;
+}
+
+TEST(bug_26110743, ProcSelfReadlink) {
+ pthread_t t;
+ ASSERT_EQ(0, pthread_create(&t, NULL, ProcSelfReadlink, NULL));
+ void* result;
+ ASSERT_EQ(0, pthread_join(t, &result));
+ ASSERT_EQ(NULL, result);
+}
+
+TEST(bug_26110743, ProcSelfReadlink_NotDumpable) {
+ int dumpable = prctl(PR_GET_DUMPABLE, 0, 0, 0, 0);
+ prctl(PR_SET_DUMPABLE, 0, 0, 0, 0);
+ auto guard = make_scope_guard([&]() {
+ // restore dumpable
+ prctl(PR_SET_DUMPABLE, dumpable, 0, 0, 0);
+ });
+
+ pthread_t t;
+ ASSERT_EQ(0, pthread_create(&t, NULL, ProcSelfReadlink, NULL));
+ void* result;
+ ASSERT_EQ(0, pthread_join(t, &result));
+ ASSERT_EQ(NULL, result);
+}
+
+static void ProcTaskFdReadlinkBody() {
+ char buf[200];
+ char buf2[1024];
+ int fd = open("/dev/null", O_RDWR | O_CLOEXEC);
+ ASSERT_NE(-1, fd);
+ pid_t mypid = getpid();
+ pid_t mytid = gettid();
+ ASSERT_NE(mypid, mytid);
+ snprintf(buf, sizeof(buf), "/proc/%d/task/%d/fd/%d", mypid, mytid, fd);
+ const char* ERRORMSG = "Please apply the following kernel patch:\n"
+ "* https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=54708d2858e79a2bdda10bf8a20c80eb96c20613\n";
+ ASSERT_NE(-1, readlink(buf, buf2, sizeof(buf2))) << ERRORMSG;
+ ASSERT_STREQ("/dev/null", buf2);
+ close(fd);
+}
+
+static void* ProcTaskFdReadlink(void*) {
+ ProcTaskFdReadlinkBody();
+ return NULL;
+}
+
+TEST(bug_26110743, ProcTaskFdReadlink) {
+ pthread_t t;
+ ASSERT_EQ(0, pthread_create(&t, NULL, ProcTaskFdReadlink, NULL));
+ void* result;
+ ASSERT_EQ(0, pthread_join(t, &result));
+ ASSERT_EQ(NULL, result);
+}
+
+TEST(bug_26110743, ProcTaskFdReadlink_NotDumpable) {
+ int dumpable = prctl(PR_GET_DUMPABLE, 0, 0, 0, 0);
+ prctl(PR_SET_DUMPABLE, 0, 0, 0, 0);
+ auto guard = make_scope_guard([&]() {
+ // restore dumpable
+ prctl(PR_SET_DUMPABLE, dumpable, 0, 0, 0);
+ });
+
+ pthread_t t;
+ ASSERT_EQ(0, pthread_create(&t, NULL, ProcTaskFdReadlink, NULL));
+ void* result;
+ ASSERT_EQ(0, pthread_join(t, &result));
+ ASSERT_EQ(NULL, result);
+}
diff --git a/tests/dirent_test.cpp b/tests/dirent_test.cpp
index 214dd78c8..fa05ca169 100644
--- a/tests/dirent_test.cpp
+++ b/tests/dirent_test.cpp
@@ -81,6 +81,72 @@ TEST(dirent, scandir_scandir64) {
CheckProcSelf(name_set);
}
+TEST(dirent, scandirat_scandirat64) {
+ // Get everything from /proc/self...
+ dirent** entries;
+ int entry_count = scandir("/proc/self", &entries, NULL, alphasort);
+ ASSERT_GE(entry_count, 0);
+
+ int proc_fd = open("/proc", O_DIRECTORY);
+ ASSERT_NE(-1, proc_fd);
+
+ dirent** entries_at;
+ int entry_count_at = scandirat(proc_fd, "self", &entries_at, NULL, alphasort);
+ ASSERT_EQ(entry_count, entry_count_at);
+
+ dirent64** entries_at64;
+ int entry_count_at64 = scandirat64(proc_fd, "self", &entries_at64, NULL, alphasort64);
+ ASSERT_EQ(entry_count, entry_count_at64);
+
+ close(proc_fd);
+
+ // scandirat and scandirat64 should return the same results as scandir.
+ std::set<std::string> name_set, name_set_at, name_set_at64;
+ std::vector<std::string> unsorted_name_list, unsorted_name_list_at, unsorted_name_list_at64;
+ ScanEntries(entries, entry_count, name_set, unsorted_name_list);
+ ScanEntries(entries_at, entry_count_at, name_set_at, unsorted_name_list_at);
+ ScanEntries(entries_at64, entry_count_at64, name_set_at64, unsorted_name_list_at64);
+
+ ASSERT_EQ(name_set, name_set_at);
+ ASSERT_EQ(name_set, name_set_at64);
+ ASSERT_EQ(unsorted_name_list, unsorted_name_list_at);
+ ASSERT_EQ(unsorted_name_list, unsorted_name_list_at64);
+}
+
+TEST(dirent, scandir_ENOENT) {
+ dirent** entries;
+ errno = 0;
+ ASSERT_EQ(-1, scandir("/does-not-exist", &entries, nullptr, nullptr));
+ ASSERT_EQ(ENOENT, errno);
+}
+
+TEST(dirent, scandir64_ENOENT) {
+ dirent64** entries;
+ errno = 0;
+ ASSERT_EQ(-1, scandir64("/does-not-exist", &entries, nullptr, nullptr));
+ ASSERT_EQ(ENOENT, errno);
+}
+
+TEST(dirent, scandirat_ENOENT) {
+ int root_fd = open("/", O_DIRECTORY | O_RDONLY);
+ ASSERT_NE(-1, root_fd);
+ dirent** entries;
+ errno = 0;
+ ASSERT_EQ(-1, scandirat(root_fd, "does-not-exist", &entries, nullptr, nullptr));
+ ASSERT_EQ(ENOENT, errno);
+ close(root_fd);
+}
+
+TEST(dirent, scandirat64_ENOENT) {
+ int root_fd = open("/", O_DIRECTORY | O_RDONLY);
+ ASSERT_NE(-1, root_fd);
+ dirent64** entries;
+ errno = 0;
+ ASSERT_EQ(-1, scandirat64(root_fd, "does-not-exist", &entries, nullptr, nullptr));
+ ASSERT_EQ(ENOENT, errno);
+ close(root_fd);
+}
+
TEST(dirent, fdopendir_invalid) {
ASSERT_TRUE(fdopendir(-1) == NULL);
ASSERT_EQ(EBADF, errno);
diff --git a/tests/dlext_private.h b/tests/dlext_private.h
new file mode 100644
index 000000000..049db91a8
--- /dev/null
+++ b/tests/dlext_private.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __ANDROID_DLEXT_NAMESPACES_H__
+#define __ANDROID_DLEXT_NAMESPACES_H__
+
+#include <android/dlext.h>
+
+__BEGIN_DECLS
+
+/*
+ * Initializes public and anonymous namespaces. The public_ns_sonames is the list of sonames
+ * to be included into public namespace separated by colon. Example: "libc.so:libm.so:libdl.so".
+ * The libraries in this list should be loaded prior to this call.
+ *
+ * The anon_ns_library_path is the search path for anonymous namespace. The anonymous namespace
+ * is used in the case when linker cannot identify the caller of dlopen/dlsym. This happens
+ * for the code not loaded by dynamic linker; for example calls from the mono-compiled code.
+ */
+extern bool android_init_namespaces(const char* public_ns_sonames,
+ const char* anon_ns_library_path);
+
+
+enum {
+ /* A regular namespace is the namespace with a custom search path that does
+ * not impose any restrictions on the location of native libraries.
+ */
+ ANDROID_NAMESPACE_TYPE_REGULAR = 0,
+
+ /* An isolated namespace requires all the libraries to be on the search path
+ * or under permitted_when_isolated_path. The search path is the union of
+ * ld_library_path and default_library_path.
+ */
+ ANDROID_NAMESPACE_TYPE_ISOLATED = 1,
+
+ /* The shared namespace clones the list of libraries of the caller namespace upon creation
+ * which means that they are shared between namespaces - the caller namespace and the new one
+ * will use the same copy of a library if it was loaded prior to android_create_namespace call.
+ *
+ * Note that libraries loaded after the namespace is created will not be shared.
+ *
+ * Shared namespaces can be isolated or regular. Note that they do not inherit the search path nor
+ * permitted_path from the caller's namespace.
+ */
+ ANDROID_NAMESPACE_TYPE_SHARED = 2,
+ ANDROID_NAMESPACE_TYPE_SHARED_ISOLATED = ANDROID_NAMESPACE_TYPE_SHARED |
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+};
+
+/*
+ * Creates new linker namespace.
+ * ld_library_path and default_library_path represent the search path
+ * for the libraries in the namespace.
+ *
+ * The libraries in the namespace are searched by folowing order:
+ * 1. ld_library_path (Think of this as namespace-local LD_LIBRARY_PATH)
+ * 2. In directories specified by DT_RUNPATH of the "needed by" binary.
+ * 3. deault_library_path (This of this as namespace-local default library path)
+ *
+ * When type is ANDROID_NAMESPACE_TYPE_ISOLATED the resulting namespace requires all of
+ * the libraries to be on the search path or under the permitted_when_isolated_path;
+ * the search_path is ld_library_path:default_library_path. Note that the
+ * permitted_when_isolated_path path is not part of the search_path and
+ * does not affect the search order. It is a way to allow loading libraries from specific
+ * locations when using absolute path.
+ * If a library or any of its dependencies are outside of the permitted_when_isolated_path
+ * and search_path, and it is not part of the public namespace dlopen will fail.
+ */
+extern struct android_namespace_t* android_create_namespace(const char* name,
+ const char* ld_library_path,
+ const char* default_library_path,
+ uint64_t type,
+ const char* permitted_when_isolated_path,
+ android_namespace_t* parent);
+
+extern void android_set_application_target_sdk_version(uint32_t target);
+
+__END_DECLS
+
+#endif /* __ANDROID_DLEXT_NAMESPACES_H__ */
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index f901708bc..ee61d5f9b 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -30,8 +30,11 @@
#include <sys/wait.h>
#include <pagemap/pagemap.h>
+#include <ziparchive/zip_archive.h>
#include "TemporaryFile.h"
+#include "utils.h"
+#include "dlext_private.h"
#define ASSERT_DL_NOTNULL(ptr) \
ASSERT_TRUE(ptr != nullptr) << "dlerror: " << dlerror()
@@ -52,15 +55,15 @@ typedef int (*fn)(void);
#define LIBSIZE 1024*1024 // how much address space to reserve for it
#if defined(__LP64__)
-#define LIBPATH_PREFIX "/nativetest64/libdlext_test_fd/"
+#define NATIVE_TESTS_PATH "/nativetest64"
#else
-#define LIBPATH_PREFIX "/nativetest/libdlext_test_fd/"
+#define NATIVE_TESTS_PATH "/nativetest"
#endif
-#define LIBPATH LIBPATH_PREFIX "libdlext_test_fd.so"
-#define LIBZIPPATH LIBPATH_PREFIX "libdlext_test_fd_zipaligned.zip"
-
-#define LIBZIP_OFFSET 2*PAGE_SIZE
+#define LIBPATH NATIVE_TESTS_PATH "/libdlext_test_fd/libdlext_test_fd.so"
+#define LIBZIPPATH NATIVE_TESTS_PATH "/libdlext_test_zip/libdlext_test_zip_zipaligned.zip"
+#define LIBZIPPATH_WITH_RUNPATH NATIVE_TESTS_PATH "/libdlext_test_runpath_zip/libdlext_test_runpath_zip_zipaligned.zip"
+#define LIBZIP_SIMPLE_ZIP "libdir/libatest_simple_zip.so"
class DlExtTest : public ::testing::Test {
protected:
@@ -114,6 +117,10 @@ TEST_F(DlExtTest, ExtInfoUseFd) {
fn f = reinterpret_cast<fn>(dlsym(handle_, "getRandomNumber"));
ASSERT_DL_NOTNULL(f);
EXPECT_EQ(4, f());
+
+ uint32_t* taxicab_number = reinterpret_cast<uint32_t*>(dlsym(handle_, "dlopen_testlib_taxicab_number"));
+ ASSERT_DL_NOTNULL(taxicab_number);
+ EXPECT_EQ(1729U, *taxicab_number);
}
TEST_F(DlExtTest, ExtInfoUseFdWithOffset) {
@@ -122,14 +129,24 @@ TEST_F(DlExtTest, ExtInfoUseFdWithOffset) {
android_dlextinfo extinfo;
extinfo.flags = ANDROID_DLEXT_USE_LIBRARY_FD | ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET;
extinfo.library_fd = TEMP_FAILURE_RETRY(open(lib_path.c_str(), O_RDONLY | O_CLOEXEC));
- extinfo.library_fd_offset = LIBZIP_OFFSET;
+
+ // Find the offset of the shared library in the zip.
+ ZipArchiveHandle handle;
+ ASSERT_EQ(0, OpenArchive(lib_path.c_str(), &handle));
+ ZipEntry zip_entry;
+ ZipString zip_name;
+ zip_name.name = reinterpret_cast<const uint8_t*>(LIBZIP_SIMPLE_ZIP);
+ zip_name.name_length = sizeof(LIBZIP_SIMPLE_ZIP) - 1;
+ ASSERT_EQ(0, FindEntry(handle, zip_name, &zip_entry));
+ extinfo.library_fd_offset = zip_entry.offset;
+ CloseArchive(handle);
handle_ = android_dlopen_ext(lib_path.c_str(), RTLD_NOW, &extinfo);
ASSERT_DL_NOTNULL(handle_);
- fn f = reinterpret_cast<fn>(dlsym(handle_, "getRandomNumber"));
- ASSERT_DL_NOTNULL(f);
- EXPECT_EQ(4, f());
+ uint32_t* taxicab_number = reinterpret_cast<uint32_t*>(dlsym(handle_, "dlopen_testlib_taxicab_number"));
+ ASSERT_DL_NOTNULL(taxicab_number);
+ EXPECT_EQ(1729U, *taxicab_number);
}
TEST_F(DlExtTest, ExtInfoUseFdWithInvalidOffset) {
@@ -159,18 +176,24 @@ TEST_F(DlExtTest, ExtInfoUseFdWithInvalidOffset) {
ASSERT_TRUE(handle_ == nullptr);
ASSERT_SUBSTR("dlopen failed: file offset for the library \"libname_placeholder\" is negative", dlerror());
- extinfo.library_fd_offset = PAGE_SIZE;
+ extinfo.library_fd_offset = 0;
handle_ = android_dlopen_ext("libname_ignored", RTLD_NOW, &extinfo);
ASSERT_TRUE(handle_ == nullptr);
ASSERT_EQ("dlopen failed: \"" + lib_realpath + "\" has bad ELF magic", dlerror());
+ // Check if dlsym works after unsuccessful dlopen().
+ // Supply non-exiting one to make linker visit every soinfo.
+ void* sym = dlsym(RTLD_DEFAULT, "this_symbol_does_not_exist___");
+ ASSERT_TRUE(sym == nullptr);
+
close(extinfo.library_fd);
}
-TEST_F(DlExtTest, ExtInfoUseOffsetWihtoutFd) {
+TEST_F(DlExtTest, ExtInfoUseOffsetWithoutFd) {
android_dlextinfo extinfo;
extinfo.flags = ANDROID_DLEXT_USE_LIBRARY_FD_OFFSET;
- extinfo.library_fd_offset = LIBZIP_OFFSET;
+ // This offset will not be used, so it doesn't matter.
+ extinfo.library_fd_offset = 0;
handle_ = android_dlopen_ext("/some/lib/that/does_not_exist", RTLD_NOW, &extinfo);
ASSERT_TRUE(handle_ == nullptr);
@@ -214,14 +237,31 @@ TEST(dlext, android_dlopen_ext_force_load_soname_exception) {
TEST(dlfcn, dlopen_from_zip_absolute_path) {
const std::string lib_path = std::string(getenv("ANDROID_DATA")) + LIBZIPPATH;
- void* handle = dlopen((lib_path + "!/libdir/libdlext_test_fd.so").c_str(), RTLD_NOW);
+ void* handle = dlopen((lib_path + "!/libdir/libatest_simple_zip.so").c_str(), RTLD_NOW);
ASSERT_TRUE(handle != nullptr) << dlerror();
- int (*fn)(void);
- fn = reinterpret_cast<int (*)(void)>(dlsym(handle, "getRandomNumber"));
- ASSERT_TRUE(fn != nullptr);
- EXPECT_EQ(4, fn());
+ uint32_t* taxicab_number = reinterpret_cast<uint32_t*>(dlsym(handle, "dlopen_testlib_taxicab_number"));
+ ASSERT_DL_NOTNULL(taxicab_number);
+ EXPECT_EQ(1729U, *taxicab_number);
+
+ dlclose(handle);
+}
+
+TEST(dlfcn, dlopen_from_zip_with_dt_runpath) {
+ const std::string lib_path = std::string(getenv("ANDROID_DATA")) + LIBZIPPATH_WITH_RUNPATH;
+
+ void* handle = dlopen((lib_path + "!/libdir/libtest_dt_runpath_d_zip.so").c_str(), RTLD_NOW);
+
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+ typedef void *(* dlopen_b_fn)();
+ dlopen_b_fn fn = (dlopen_b_fn)dlsym(handle, "dlopen_b");
+ ASSERT_TRUE(fn != nullptr) << dlerror();
+
+ void *p = fn();
+ ASSERT_TRUE(p != nullptr) << dlerror();
+
+ dlclose(p);
dlclose(handle);
}
@@ -234,12 +274,12 @@ TEST(dlfcn, dlopen_from_zip_ld_library_path) {
ASSERT_TRUE(android_update_LD_LIBRARY_PATH != nullptr) << dlerror();
- void* handle = dlopen("libdlext_test_fd.so", RTLD_NOW);
+ void* handle = dlopen("libdlext_test_zip.so", RTLD_NOW);
ASSERT_TRUE(handle == nullptr);
android_update_LD_LIBRARY_PATH(lib_path.c_str());
- handle = dlopen("libdlext_test_fd.so", RTLD_NOW);
+ handle = dlopen("libdlext_test_zip.so", RTLD_NOW);
ASSERT_TRUE(handle != nullptr) << dlerror();
int (*fn)(void);
@@ -247,13 +287,17 @@ TEST(dlfcn, dlopen_from_zip_ld_library_path) {
ASSERT_TRUE(fn != nullptr);
EXPECT_EQ(4, fn());
+ uint32_t* taxicab_number =
+ reinterpret_cast<uint32_t*>(dlsym(handle, "dlopen_testlib_taxicab_number"));
+ ASSERT_DL_NOTNULL(taxicab_number);
+ EXPECT_EQ(1729U, *taxicab_number);
+
dlclose(handle);
}
TEST_F(DlExtTest, Reserved) {
- void* start = mmap(nullptr, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS,
- -1, 0);
+ void* start = mmap(nullptr, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
ASSERT_TRUE(start != MAP_FAILED);
android_dlextinfo extinfo;
extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS;
@@ -267,11 +311,17 @@ TEST_F(DlExtTest, Reserved) {
EXPECT_LT(reinterpret_cast<void*>(f),
reinterpret_cast<char*>(start) + LIBSIZE);
EXPECT_EQ(4, f());
+
+ // Check that after dlclose reserved address space is unmapped (and can be reused)
+ dlclose(handle_);
+ handle_ = nullptr;
+
+ void* new_start = mmap(start, PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_NE(start, new_start) << "dlclose unmapped reserved space";
}
TEST_F(DlExtTest, ReservedTooSmall) {
- void* start = mmap(nullptr, PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS,
- -1, 0);
+ void* start = mmap(nullptr, PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
ASSERT_TRUE(start != MAP_FAILED);
android_dlextinfo extinfo;
extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS;
@@ -282,8 +332,7 @@ TEST_F(DlExtTest, ReservedTooSmall) {
}
TEST_F(DlExtTest, ReservedHint) {
- void* start = mmap(nullptr, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS,
- -1, 0);
+ void* start = mmap(nullptr, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
ASSERT_TRUE(start != MAP_FAILED);
android_dlextinfo extinfo;
extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS_HINT;
@@ -300,8 +349,7 @@ TEST_F(DlExtTest, ReservedHint) {
}
TEST_F(DlExtTest, ReservedHintTooSmall) {
- void* start = mmap(nullptr, PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS,
- -1, 0);
+ void* start = mmap(nullptr, PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
ASSERT_TRUE(start != MAP_FAILED);
android_dlextinfo extinfo;
extinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS_HINT;
@@ -317,12 +365,53 @@ TEST_F(DlExtTest, ReservedHintTooSmall) {
EXPECT_EQ(4, f());
}
+TEST_F(DlExtTest, LoadAtFixedAddress) {
+ void* start = mmap(nullptr, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_TRUE(start != MAP_FAILED);
+ munmap(start, LIBSIZE);
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS;
+ extinfo.reserved_addr = start;
+
+ handle_ = android_dlopen_ext(LIBNAME, RTLD_NOW, &extinfo);
+ ASSERT_DL_NOTNULL(handle_);
+ fn f = reinterpret_cast<fn>(dlsym(handle_, "getRandomNumber"));
+ ASSERT_DL_NOTNULL(f);
+ EXPECT_GE(reinterpret_cast<void*>(f), start);
+ EXPECT_LT(reinterpret_cast<void*>(f), reinterpret_cast<char*>(start) + LIBSIZE);
+
+ EXPECT_EQ(4, f());
+ dlclose(handle_);
+ handle_ = nullptr;
+
+ // Check that dlclose unmapped the file
+ void* addr = mmap(start, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_EQ(start, addr) << "dlclose did not unmap the memory";
+}
+
+TEST_F(DlExtTest, LoadAtFixedAddressTooSmall) {
+ void* start = mmap(nullptr, LIBSIZE + PAGE_SIZE, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_TRUE(start != MAP_FAILED);
+ munmap(start, LIBSIZE + PAGE_SIZE);
+ void* new_addr = mmap(reinterpret_cast<uint8_t*>(start) + PAGE_SIZE, LIBSIZE, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_TRUE(new_addr != MAP_FAILED);
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_LOAD_AT_FIXED_ADDRESS;
+ extinfo.reserved_addr = start;
+
+ handle_ = android_dlopen_ext(LIBNAME, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle_ == nullptr);
+}
+
class DlExtRelroSharingTest : public DlExtTest {
protected:
virtual void SetUp() {
DlExtTest::SetUp();
- void* start = mmap(nullptr, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS,
- -1, 0);
+ void* start = mmap(nullptr, LIBSIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
ASSERT_TRUE(start != MAP_FAILED);
extinfo_.flags = ANDROID_DLEXT_RESERVED_ADDRESS;
extinfo_.reserved_addr = start;
@@ -354,10 +443,7 @@ protected:
// continuing in parent
ASSERT_NOERROR(close(relro_fd));
ASSERT_NOERROR(pid);
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(0, WEXITSTATUS(status));
+ AssertChildExited(pid, 0);
// reopen file for reading so it can be used
relro_fd = open(relro_file, O_RDONLY);
@@ -372,6 +458,11 @@ protected:
fn f = reinterpret_cast<fn>(dlsym(handle_, "getRandomNumber"));
ASSERT_DL_NOTNULL(f);
EXPECT_EQ(4, f());
+
+ uint32_t* taxicab_number =
+ reinterpret_cast<uint32_t*>(dlsym(handle_, "dlopen_testlib_taxicab_number"));
+ ASSERT_DL_NOTNULL(taxicab_number);
+ EXPECT_EQ(1729U, *taxicab_number);
}
void SpawnChildrenAndMeasurePss(const char* lib, bool share_relro, size_t* pss_out);
@@ -461,7 +552,7 @@ void DlExtRelroSharingTest::SpawnChildrenAndMeasurePss(const char* lib, bool sha
const int CHILDREN = 20;
// Create children
- pid_t childpid[CHILDREN];
+ pid_t child_pids[CHILDREN];
int childpipe[CHILDREN];
for (int i=0; i<CHILDREN; ++i) {
char read_buf;
@@ -506,7 +597,7 @@ void DlExtRelroSharingTest::SpawnChildrenAndMeasurePss(const char* lib, bool sha
close(child_done_pipe[0]);
// save the child's pid and the parent_done_pipe
- childpid[i] = child;
+ child_pids[i] = child;
childpipe[i] = parent_done_pipe[1];
}
@@ -514,7 +605,7 @@ void DlExtRelroSharingTest::SpawnChildrenAndMeasurePss(const char* lib, bool sha
size_t total_pss = 0;
for (int i=0; i<CHILDREN; ++i) {
size_t child_pss;
- ASSERT_NO_FATAL_FAILURE(getPss(childpid[i], &child_pss));
+ ASSERT_NO_FATAL_FAILURE(getPss(child_pids[i], &child_pss));
total_pss += child_pss;
}
*pss_out = total_pss;
@@ -523,10 +614,596 @@ void DlExtRelroSharingTest::SpawnChildrenAndMeasurePss(const char* lib, bool sha
for (int i=0; i<CHILDREN; ++i) {
ASSERT_NOERROR(close(childpipe[i]));
}
- for (int i=0; i<CHILDREN; ++i) {
- int status;
- ASSERT_EQ(childpid[i], waitpid(childpid[i], &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(0, WEXITSTATUS(status));
+ for (int i = 0; i < CHILDREN; ++i) {
+ AssertChildExited(child_pids[i], 0);
+ }
+}
+
+// Testing namespaces
+static const char* g_public_lib = "libnstest_public.so";
+
+TEST(dlext, ns_smoke) {
+ static const char* root_lib = "libnstest_root.so";
+ std::string path = std::string("libc.so:libc++.so:libdl.so:libm.so:") + g_public_lib;
+
+ ASSERT_FALSE(android_init_namespaces(path.c_str(), nullptr));
+ ASSERT_STREQ("android_init_namespaces failed: error initializing public namespace: "
+ "\"libnstest_public.so\" was not found in the default namespace", dlerror());
+
+ const std::string lib_path = std::string(getenv("ANDROID_DATA")) + NATIVE_TESTS_PATH;
+
+ const std::string lib_public_path = lib_path + "/public_namespace_libs/" + g_public_lib;
+ void* handle_public = dlopen(lib_public_path.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle_public != nullptr) << dlerror();
+
+ ASSERT_TRUE(android_init_namespaces(path.c_str(), nullptr)) << dlerror();
+
+ // Check that libraries added to public namespace are NODELETE
+ dlclose(handle_public);
+ handle_public = dlopen((lib_path + "/public_namespace_libs/" + g_public_lib).c_str(),
+ RTLD_NOW | RTLD_NOLOAD);
+
+ ASSERT_TRUE(handle_public != nullptr) << dlerror();
+
+ android_namespace_t* ns1 =
+ android_create_namespace("private", nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_REGULAR, nullptr, nullptr);
+ ASSERT_TRUE(ns1 != nullptr) << dlerror();
+
+ android_namespace_t* ns2 =
+ android_create_namespace("private_isolated", nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_ISOLATED, nullptr, nullptr);
+ ASSERT_TRUE(ns2 != nullptr) << dlerror();
+
+ // This should not have affect search path for default namespace:
+ ASSERT_TRUE(dlopen(root_lib, RTLD_NOW) == nullptr);
+ void* handle = dlopen(g_public_lib, RTLD_NOW);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+ dlclose(handle);
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns1;
+
+ void* handle1 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle1 != nullptr) << dlerror();
+
+ extinfo.library_namespace = ns2;
+ void* handle2 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle2 != nullptr) << dlerror();
+
+ ASSERT_TRUE(handle1 != handle2);
+
+ // dlopen for a public library using an absolute path should work for isolated namespaces
+ extinfo.library_namespace = ns2;
+ handle = android_dlopen_ext(lib_public_path.c_str(), RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+ ASSERT_TRUE(handle == handle_public);
+
+ dlclose(handle);
+
+ typedef const char* (*fn_t)();
+
+ fn_t ns_get_local_string1 = reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_local_string"));
+ ASSERT_TRUE(ns_get_local_string1 != nullptr) << dlerror();
+ fn_t ns_get_local_string2 = reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_local_string"));
+ ASSERT_TRUE(ns_get_local_string2 != nullptr) << dlerror();
+
+ EXPECT_STREQ("This string is local to root library", ns_get_local_string1());
+ EXPECT_STREQ("This string is local to root library", ns_get_local_string2());
+
+ ASSERT_TRUE(ns_get_local_string1() != ns_get_local_string2());
+
+ fn_t ns_get_private_extern_string1 =
+ reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_private_extern_string"));
+ ASSERT_TRUE(ns_get_private_extern_string1 != nullptr) << dlerror();
+ fn_t ns_get_private_extern_string2 =
+ reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_private_extern_string"));
+ ASSERT_TRUE(ns_get_private_extern_string2 != nullptr) << dlerror();
+
+ EXPECT_STREQ("This string is from private namespace", ns_get_private_extern_string1());
+ EXPECT_STREQ("This string is from private namespace", ns_get_private_extern_string2());
+
+ ASSERT_TRUE(ns_get_private_extern_string1() != ns_get_private_extern_string2());
+
+ fn_t ns_get_public_extern_string1 =
+ reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_public_extern_string"));
+ ASSERT_TRUE(ns_get_public_extern_string1 != nullptr) << dlerror();
+ fn_t ns_get_public_extern_string2 =
+ reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_public_extern_string"));
+ ASSERT_TRUE(ns_get_public_extern_string2 != nullptr) << dlerror();
+
+ EXPECT_STREQ("This string is from public namespace", ns_get_public_extern_string1());
+ ASSERT_TRUE(ns_get_public_extern_string1() == ns_get_public_extern_string2());
+
+ // and now check that dlopen() does the right thing in terms of preserving namespace
+ fn_t ns_get_dlopened_string1 = reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_dlopened_string"));
+ ASSERT_TRUE(ns_get_dlopened_string1 != nullptr) << dlerror();
+ fn_t ns_get_dlopened_string2 = reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_dlopened_string"));
+ ASSERT_TRUE(ns_get_dlopened_string2 != nullptr) << dlerror();
+
+ EXPECT_STREQ("This string is from private namespace (dlopened library)", ns_get_dlopened_string1());
+ EXPECT_STREQ("This string is from private namespace (dlopened library)", ns_get_dlopened_string2());
+
+ ASSERT_TRUE(ns_get_dlopened_string1() != ns_get_dlopened_string2());
+
+ dlclose(handle1);
+
+ // Check if handle2 is still alive (and well)
+ ASSERT_STREQ("This string is local to root library", ns_get_local_string2());
+ ASSERT_STREQ("This string is from private namespace", ns_get_private_extern_string2());
+ ASSERT_STREQ("This string is from public namespace", ns_get_public_extern_string2());
+ ASSERT_STREQ("This string is from private namespace (dlopened library)", ns_get_dlopened_string2());
+
+ dlclose(handle2);
+}
+
+TEST(dlext, ns_isolated) {
+ static const char* root_lib = "libnstest_root_not_isolated.so";
+ std::string path = std::string("libc.so:libc++.so:libdl.so:libm.so:") + g_public_lib;
+
+ const std::string lib_path = std::string(getenv("ANDROID_DATA")) + NATIVE_TESTS_PATH;
+ const std::string lib_public_path = lib_path + "/public_namespace_libs/" + g_public_lib;
+ void* handle_public = dlopen(lib_public_path.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle_public != nullptr) << dlerror();
+
+ android_set_application_target_sdk_version(42U); // something > 23
+
+ ASSERT_TRUE(android_init_namespaces(path.c_str(), nullptr)) << dlerror();
+
+ android_namespace_t* ns_not_isolated =
+ android_create_namespace("private", nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_REGULAR, nullptr, nullptr);
+ ASSERT_TRUE(ns_not_isolated != nullptr) << dlerror();
+
+ android_namespace_t* ns_isolated =
+ android_create_namespace("private_isolated1",
+ nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+ nullptr,
+ nullptr);
+ ASSERT_TRUE(ns_isolated != nullptr) << dlerror();
+
+ android_namespace_t* ns_isolated2 =
+ android_create_namespace("private_isolated2",
+ (lib_path + "/private_namespace_libs").c_str(),
+ nullptr,
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+ lib_path.c_str(),
+ nullptr);
+ ASSERT_TRUE(ns_isolated2 != nullptr) << dlerror();
+
+ ASSERT_TRUE(dlopen(root_lib, RTLD_NOW) == nullptr);
+ ASSERT_STREQ("dlopen failed: library \"libnstest_root_not_isolated.so\" not found", dlerror());
+
+ std::string lib_private_external_path =
+ lib_path + "/private_namespace_libs_external/libnstest_private_external.so";
+
+ // Load lib_private_external_path to default namespace
+ // (it should remain invisible for the isolated namespaces after this)
+ void* handle = dlopen(lib_private_external_path.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns_not_isolated;
+
+ void* handle1 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle1 != nullptr) << dlerror();
+
+ extinfo.library_namespace = ns_isolated;
+
+ void* handle2 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle2 == nullptr);
+ ASSERT_STREQ("dlopen failed: library \"libnstest_private_external.so\" not found", dlerror());
+
+ // Check dlopen by absolute path
+ handle2 = android_dlopen_ext(lib_private_external_path.c_str(), RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle2 == nullptr);
+ ASSERT_EQ("dlopen failed: library \"" + lib_private_external_path + "\" needed"
+ " or dlopened by \"" + get_executable_path() + "\" is not accessible"
+ " for the namespace \"private_isolated1\"", dlerror());
+
+ extinfo.library_namespace = ns_isolated2;
+
+ // this should work because isolation_path for private_isolated2 includes lib_path
+ handle2 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle2 != nullptr) << dlerror();
+ dlclose(handle2);
+
+ // Check dlopen by absolute path
+ handle2 = android_dlopen_ext(lib_private_external_path.c_str(), RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle2 != nullptr) << dlerror();
+ dlclose(handle2);
+
+ typedef const char* (*fn_t)();
+ fn_t ns_get_local_string = reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_local_string"));
+ ASSERT_TRUE(ns_get_local_string != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is local to root library", ns_get_local_string());
+
+ fn_t ns_get_private_extern_string =
+ reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_private_extern_string"));
+ ASSERT_TRUE(ns_get_private_extern_string != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is from private namespace", ns_get_private_extern_string());
+
+ fn_t ns_get_public_extern_string =
+ reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_public_extern_string"));
+ ASSERT_TRUE(ns_get_public_extern_string != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is from public namespace", ns_get_public_extern_string());
+
+ fn_t ns_get_dlopened_string = reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_dlopened_string"));
+ ASSERT_TRUE(ns_get_dlopened_string != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is from private namespace (dlopened library)", ns_get_dlopened_string());
+
+ dlclose(handle1);
+}
+
+TEST(dlext, ns_shared) {
+ static const char* root_lib = "libnstest_root_not_isolated.so";
+ static const char* root_lib_isolated = "libnstest_root.so";
+ std::string path = std::string("libc.so:libc++.so:libdl.so:libm.so:") + g_public_lib;
+
+ const std::string lib_path = std::string(getenv("ANDROID_DATA")) + NATIVE_TESTS_PATH;
+ const std::string lib_public_path = lib_path + "/public_namespace_libs/" + g_public_lib;
+ void* handle_public = dlopen(lib_public_path.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle_public != nullptr) << dlerror();
+
+ android_set_application_target_sdk_version(42U); // something > 23
+
+ ASSERT_TRUE(android_init_namespaces(path.c_str(), nullptr)) << dlerror();
+
+ // preload this library to the default namespace to check if it
+ // is shared later on.
+ void* handle_dlopened =
+ dlopen((lib_path + "/private_namespace_libs/libnstest_dlopened.so").c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle_dlopened != nullptr) << dlerror();
+
+ android_namespace_t* ns_not_isolated =
+ android_create_namespace("private", nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_REGULAR, nullptr, nullptr);
+ ASSERT_TRUE(ns_not_isolated != nullptr) << dlerror();
+
+ android_namespace_t* ns_isolated_shared =
+ android_create_namespace("private_isolated_shared", nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_ISOLATED | ANDROID_NAMESPACE_TYPE_SHARED,
+ nullptr, nullptr);
+ ASSERT_TRUE(ns_isolated_shared != nullptr) << dlerror();
+
+ ASSERT_TRUE(dlopen(root_lib, RTLD_NOW) == nullptr);
+ ASSERT_STREQ("dlopen failed: library \"libnstest_root_not_isolated.so\" not found", dlerror());
+
+ std::string lib_private_external_path =
+ lib_path + "/private_namespace_libs_external/libnstest_private_external.so";
+
+ // Load lib_private_external_path to default namespace
+ // (it should remain invisible for the isolated namespaces after this)
+ void* handle = dlopen(lib_private_external_path.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns_not_isolated;
+
+ void* handle1 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle1 != nullptr) << dlerror();
+
+ extinfo.library_namespace = ns_isolated_shared;
+
+ void* handle2 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle2 == nullptr);
+ ASSERT_STREQ("dlopen failed: library \"libnstest_private_external.so\" not found", dlerror());
+
+ // Check dlopen by absolute path
+ handle2 = android_dlopen_ext(lib_private_external_path.c_str(), RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle2 == nullptr);
+ ASSERT_EQ("dlopen failed: library \"" + lib_private_external_path + "\" needed"
+ " or dlopened by \"" + get_executable_path() + "\" is not accessible"
+ " for the namespace \"private_isolated_shared\"", dlerror());
+
+ // load libnstest_root.so to shared namespace in order to check that everything is different
+ // except shared libnstest_dlopened.so
+
+ handle2 = android_dlopen_ext(root_lib_isolated, RTLD_NOW, &extinfo);
+
+ typedef const char* (*fn_t)();
+ fn_t ns_get_local_string = reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_local_string"));
+ ASSERT_TRUE(ns_get_local_string != nullptr) << dlerror();
+ fn_t ns_get_local_string_shared = reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_local_string"));
+ ASSERT_TRUE(ns_get_local_string_shared != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is local to root library", ns_get_local_string());
+ ASSERT_STREQ("This string is local to root library", ns_get_local_string_shared());
+ ASSERT_TRUE(ns_get_local_string() != ns_get_local_string_shared());
+
+ fn_t ns_get_private_extern_string =
+ reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_private_extern_string"));
+ ASSERT_TRUE(ns_get_private_extern_string != nullptr) << dlerror();
+ fn_t ns_get_private_extern_string_shared =
+ reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_private_extern_string"));
+ ASSERT_TRUE(ns_get_private_extern_string_shared() != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is from private namespace", ns_get_private_extern_string());
+ ASSERT_STREQ("This string is from private namespace", ns_get_private_extern_string_shared());
+ ASSERT_TRUE(ns_get_private_extern_string() != ns_get_private_extern_string_shared());
+
+ fn_t ns_get_public_extern_string =
+ reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_public_extern_string"));
+ ASSERT_TRUE(ns_get_public_extern_string != nullptr) << dlerror();
+ fn_t ns_get_public_extern_string_shared =
+ reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_public_extern_string"));
+ ASSERT_TRUE(ns_get_public_extern_string_shared != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is from public namespace", ns_get_public_extern_string());
+ ASSERT_STREQ("This string is from public namespace", ns_get_public_extern_string_shared());
+ ASSERT_TRUE(ns_get_public_extern_string() == ns_get_public_extern_string_shared());
+
+ fn_t ns_get_dlopened_string = reinterpret_cast<fn_t>(dlsym(handle1, "ns_get_dlopened_string"));
+ ASSERT_TRUE(ns_get_dlopened_string != nullptr) << dlerror();
+ fn_t ns_get_dlopened_string_shared = reinterpret_cast<fn_t>(dlsym(handle2, "ns_get_dlopened_string"));
+ ASSERT_TRUE(ns_get_dlopened_string_shared != nullptr) << dlerror();
+ const char** ns_dlopened_string = static_cast<const char**>(dlsym(handle_dlopened, "g_private_dlopened_string"));
+ ASSERT_TRUE(ns_dlopened_string != nullptr) << dlerror();
+
+ ASSERT_STREQ("This string is from private namespace (dlopened library)", ns_get_dlopened_string());
+ ASSERT_STREQ("This string is from private namespace (dlopened library)", *ns_dlopened_string);
+ ASSERT_STREQ("This string is from private namespace (dlopened library)", ns_get_dlopened_string_shared());
+ ASSERT_TRUE(ns_get_dlopened_string() != ns_get_dlopened_string_shared());
+ ASSERT_TRUE(*ns_dlopened_string == ns_get_dlopened_string_shared());
+
+ dlclose(handle1);
+ dlclose(handle2);
+}
+
+TEST(dlext, ns_shared_dlclose) {
+ std::string path = "libc.so:libc++.so:libdl.so:libm.so";
+
+ const std::string lib_path = std::string(getenv("ANDROID_DATA")) + NATIVE_TESTS_PATH;
+
+ android_set_application_target_sdk_version(42U); // something > 23
+
+ ASSERT_TRUE(android_init_namespaces(path.c_str(), nullptr)) << dlerror();
+
+ // preload this library to the default namespace to check if it
+ // is shared later on.
+ void* handle_dlopened =
+ dlopen((lib_path + "/private_namespace_libs/libnstest_dlopened.so").c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle_dlopened != nullptr) << dlerror();
+
+ android_namespace_t* ns_isolated_shared =
+ android_create_namespace("private_isolated_shared", nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_ISOLATED | ANDROID_NAMESPACE_TYPE_SHARED,
+ nullptr, nullptr);
+ ASSERT_TRUE(ns_isolated_shared != nullptr) << dlerror();
+
+ // Check if "libnstest_dlopened.so" is loaded (and the same)
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns_isolated_shared;
+
+ void* handle = android_dlopen_ext("libnstest_dlopened.so", RTLD_NOW | RTLD_NOLOAD, &extinfo);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+ ASSERT_TRUE(handle == handle_dlopened);
+ dlclose(handle);
+ dlclose(handle_dlopened);
+
+ // And now check that the library cannot be found by soname (and is no longer loaded)
+ handle = android_dlopen_ext("libnstest_dlopened.so", RTLD_NOW | RTLD_NOLOAD, &extinfo);
+ ASSERT_TRUE(handle == nullptr)
+ << "Error: libnstest_dlopened.so is still accessible in shared namespace";
+
+ handle = android_dlopen_ext((lib_path + "/private_namespace_libs/libnstest_dlopened.so").c_str(),
+ RTLD_NOW | RTLD_NOLOAD, &extinfo);
+ ASSERT_TRUE(handle == nullptr)
+ << "Error: libnstest_dlopened.so is still accessible in shared namespace";
+
+ handle = dlopen("libnstest_dlopened.so", RTLD_NOW | RTLD_NOLOAD);
+ ASSERT_TRUE(handle == nullptr)
+ << "Error: libnstest_dlopened.so is still accessible in default namespace";
+
+ handle = dlopen((lib_path + "/private_namespace_libs/libnstest_dlopened.so").c_str(),
+ RTLD_NOW | RTLD_NOLOAD);
+ ASSERT_TRUE(handle == nullptr)
+ << "Error: libnstest_dlopened.so is still accessible in default namespace";
+
+ // Now lets see if the soinfo area gets reused in the wrong way:
+ // load a library to default namespace.
+ const std::string lib_public_path = lib_path + "/public_namespace_libs/" + g_public_lib;
+ void* handle_public = dlopen(lib_public_path.c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle_public != nullptr) << dlerror();
+
+ // try to find it in shared namespace
+ handle = android_dlopen_ext(g_public_lib, RTLD_NOW | RTLD_NOLOAD, &extinfo);
+ ASSERT_TRUE(handle == nullptr)
+ << "Error: " << g_public_lib << " is accessible in shared namespace";
+}
+
+TEST(dlext, ns_isolated_rtld_global) {
+ static const char* root_lib = "libnstest_root.so";
+ std::string path = "libc.so:libc++.so:libdl.so:libm.so";
+
+ ASSERT_TRUE(android_init_namespaces(path.c_str(), nullptr));
+
+ const std::string lib_path = std::string(getenv("ANDROID_DATA")) + NATIVE_TESTS_PATH;
+
+ const std::string lib_public_path = lib_path + "/public_namespace_libs";
+
+ android_namespace_t* ns1 =
+ android_create_namespace("isolated1",
+ nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+ lib_public_path.c_str(),
+ nullptr);
+ ASSERT_TRUE(ns1 != nullptr) << dlerror();
+
+ android_namespace_t* ns2 =
+ android_create_namespace("isolated2",
+ nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+ lib_public_path.c_str(),
+ nullptr);
+ ASSERT_TRUE(ns2 != nullptr) << dlerror();
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns1;
+
+ void* handle_global = android_dlopen_ext((lib_public_path + "/" + g_public_lib).c_str(),
+ RTLD_GLOBAL,
+ &extinfo);
+
+ ASSERT_TRUE(handle_global != nullptr) << dlerror();
+
+ android_namespace_t* ns1_child =
+ android_create_namespace("isolated1_child",
+ nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_ISOLATED,
+ nullptr,
+ ns1);
+
+ // Now - only ns1 and ns1 child should be able to dlopen root_lib
+ // attempt to use ns2 should result in dlerror()
+
+ // Check ns1_child first.
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns1_child;
+
+ void* handle1 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle1 != nullptr) << dlerror();
+
+ // now ns1
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns1;
+
+ handle1 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle1 != nullptr) << dlerror();
+
+ // and ns2 should fail
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns2;
+
+ handle1 = android_dlopen_ext(root_lib, RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle1 == nullptr);
+ ASSERT_STREQ("dlopen failed: library \"libnstest_public.so\" not found", dlerror());
+}
+
+TEST(dlext, ns_anonymous) {
+ static const char* root_lib = "libnstest_root.so";
+ std::string path = std::string("libc.so:libc++.so:libdl.so:libm.so:") + g_public_lib;
+
+ const std::string lib_path = std::string(getenv("ANDROID_DATA")) + NATIVE_TESTS_PATH;
+
+ const std::string lib_public_path = lib_path + "/public_namespace_libs/" + g_public_lib;
+ void* handle_public = dlopen(lib_public_path.c_str(), RTLD_NOW);
+
+ ASSERT_TRUE(handle_public != nullptr) << dlerror();
+
+ ASSERT_TRUE(android_init_namespaces(path.c_str(), (lib_path + "/private_namespace_libs").c_str()))
+ << dlerror();
+
+ android_namespace_t* ns = android_create_namespace(
+ "private", nullptr,
+ (lib_path + "/private_namespace_libs").c_str(),
+ ANDROID_NAMESPACE_TYPE_REGULAR, nullptr, nullptr);
+
+ ASSERT_TRUE(ns != nullptr) << dlerror();
+
+ std::string private_library_absolute_path = lib_path + "/private_namespace_libs/" + root_lib;
+
+ android_dlextinfo extinfo;
+ extinfo.flags = ANDROID_DLEXT_USE_NAMESPACE;
+ extinfo.library_namespace = ns;
+
+ // we are going to copy this library to anonymous mmap and call the copy of ns_get_dlopened_string
+ void* handle = android_dlopen_ext(private_library_absolute_path.c_str(), RTLD_NOW, &extinfo);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+
+ uintptr_t ns_get_dlopened_string_addr =
+ reinterpret_cast<uintptr_t>(dlsym(handle, "ns_get_dlopened_string"));
+ ASSERT_TRUE(ns_get_dlopened_string_addr != 0) << dlerror();
+ typedef const char* (*fn_t)();
+ fn_t ns_get_dlopened_string_private = reinterpret_cast<fn_t>(ns_get_dlopened_string_addr);
+
+ std::vector<map_record> maps;
+ Maps::parse_maps(&maps);
+
+ uintptr_t addr_start = 0;
+ uintptr_t addr_end = 0;
+ std::vector<map_record> maps_to_copy;
+
+ for (const auto& rec : maps) {
+ if (rec.pathname == private_library_absolute_path) {
+ if (addr_start == 0) {
+ addr_start = rec.addr_start;
+ }
+ addr_end = rec.addr_end;
+
+ maps_to_copy.push_back(rec);
+ }
}
+
+ // some sanity checks..
+ ASSERT_TRUE(addr_start > 0);
+ ASSERT_TRUE(addr_end > 0);
+ ASSERT_EQ(3U, maps_to_copy.size());
+ ASSERT_TRUE(ns_get_dlopened_string_addr > addr_start);
+ ASSERT_TRUE(ns_get_dlopened_string_addr < addr_end);
+
+ // copy
+ uintptr_t reserved_addr = reinterpret_cast<uintptr_t>(mmap(nullptr, addr_end - addr_start,
+ PROT_NONE, MAP_ANON | MAP_PRIVATE,
+ -1, 0));
+ ASSERT_TRUE(reinterpret_cast<void*>(reserved_addr) != MAP_FAILED);
+
+ for (const auto& rec : maps_to_copy) {
+ uintptr_t offset = rec.addr_start - addr_start;
+ size_t size = rec.addr_end - rec.addr_start;
+ void* addr = reinterpret_cast<void*>(reserved_addr + offset);
+ void* map = mmap(addr, size, PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0);
+ ASSERT_TRUE(map != MAP_FAILED);
+ memcpy(map, reinterpret_cast<void*>(rec.addr_start), size);
+ mprotect(map, size, rec.perms);
+ }
+
+ // call the function copy
+ uintptr_t ns_get_dlopened_string_offset = ns_get_dlopened_string_addr - addr_start;
+ fn_t ns_get_dlopened_string_anon = reinterpret_cast<fn_t>(reserved_addr + ns_get_dlopened_string_offset);
+ ASSERT_STREQ("This string is from private namespace (dlopened library)",
+ ns_get_dlopened_string_anon());
+
+ // They should belong to different namespaces (private and anonymous)
+ ASSERT_STREQ("This string is from private namespace (dlopened library)",
+ ns_get_dlopened_string_private());
+
+ ASSERT_TRUE(ns_get_dlopened_string_anon() != ns_get_dlopened_string_private());
}
+
+TEST(dlext, dlopen_handle_value_platform) {
+ void* handle = dlopen("libtest_dlsym_from_this.so", RTLD_NOW | RTLD_LOCAL);
+ ASSERT_TRUE((reinterpret_cast<uintptr_t>(handle) & 1) != 0)
+ << "dlopen should return odd value for the handle";
+ dlclose(handle);
+}
+
+TEST(dlext, dlopen_handle_value_app_compat) {
+ android_set_application_target_sdk_version(23);
+ void* handle = dlopen("libtest_dlsym_from_this.so", RTLD_NOW | RTLD_LOCAL);
+ ASSERT_TRUE(reinterpret_cast<uintptr_t>(handle) % sizeof(uintptr_t) == 0)
+ << "dlopen should return valid pointer";
+ dlclose(handle);
+}
+
diff --git a/tests/dlfcn_test.cpp b/tests/dlfcn_test.cpp
index 3c9b8e33a..f842c66ca 100644
--- a/tests/dlfcn_test.cpp
+++ b/tests/dlfcn_test.cpp
@@ -51,12 +51,12 @@ TEST(dlfcn, ctor_function_call) {
TEST(dlfcn, dlsym_in_executable) {
dlerror(); // Clear any pending errors.
- void* self = dlopen(NULL, RTLD_NOW);
- ASSERT_TRUE(self != NULL);
- ASSERT_TRUE(dlerror() == NULL);
+ void* self = dlopen(nullptr, RTLD_NOW);
+ ASSERT_TRUE(self != nullptr);
+ ASSERT_TRUE(dlerror() == nullptr);
void* sym = dlsym(self, "DlSymTestFunction");
- ASSERT_TRUE(sym != NULL);
+ ASSERT_TRUE(sym != nullptr);
void (*function)() = reinterpret_cast<void(*)()>(sym);
@@ -175,11 +175,11 @@ TEST(dlfcn, dlsym_with_dependencies) {
TEST(dlfcn, dlopen_noload) {
void* handle = dlopen("libtest_simple.so", RTLD_NOW | RTLD_NOLOAD);
- ASSERT_TRUE(handle == NULL);
+ ASSERT_TRUE(handle == nullptr);
handle = dlopen("libtest_simple.so", RTLD_NOW);
void* handle2 = dlopen("libtest_simple.so", RTLD_NOW | RTLD_NOLOAD);
- ASSERT_TRUE(handle != NULL);
- ASSERT_TRUE(handle2 != NULL);
+ ASSERT_TRUE(handle != nullptr);
+ ASSERT_TRUE(handle2 != nullptr);
ASSERT_TRUE(handle == handle2);
ASSERT_EQ(0, dlclose(handle));
ASSERT_EQ(0, dlclose(handle2));
@@ -220,11 +220,11 @@ TEST(dlfcn, ifunc) {
// first check the set case
setenv("IFUNC_CHOICE", "set", 1);
void* handle = dlopen("libtest_ifunc.so", RTLD_NOW);
- ASSERT_TRUE(handle != NULL);
+ ASSERT_TRUE(handle != nullptr);
fn_ptr foo_ptr = reinterpret_cast<fn_ptr>(dlsym(handle, "foo"));
fn_ptr foo_library_ptr = reinterpret_cast<fn_ptr>(dlsym(handle, "foo_library"));
- ASSERT_TRUE(foo_ptr != NULL);
- ASSERT_TRUE(foo_library_ptr != NULL);
+ ASSERT_TRUE(foo_ptr != nullptr);
+ ASSERT_TRUE(foo_library_ptr != nullptr);
ASSERT_EQ(strncmp("set", foo_ptr(), 3), 0);
ASSERT_EQ(strncmp("set", foo_library_ptr(), 3), 0);
dlclose(handle);
@@ -232,11 +232,11 @@ TEST(dlfcn, ifunc) {
// then check the unset case
unsetenv("IFUNC_CHOICE");
handle = dlopen("libtest_ifunc.so", RTLD_NOW);
- ASSERT_TRUE(handle != NULL);
+ ASSERT_TRUE(handle != nullptr);
foo_ptr = reinterpret_cast<fn_ptr>(dlsym(handle, "foo"));
foo_library_ptr = reinterpret_cast<fn_ptr>(dlsym(handle, "foo_library"));
- ASSERT_TRUE(foo_ptr != NULL);
- ASSERT_TRUE(foo_library_ptr != NULL);
+ ASSERT_TRUE(foo_ptr != nullptr);
+ ASSERT_TRUE(foo_library_ptr != nullptr);
ASSERT_EQ(strncmp("unset", foo_ptr(), 5), 0);
ASSERT_EQ(strncmp("unset", foo_library_ptr(), 3), 0);
dlclose(handle);
@@ -315,9 +315,9 @@ TEST(dlfcn, dlopen_check_order_dlsym) {
typedef int (*fn_t) (void);
fn_t fn, fn2;
fn = reinterpret_cast<fn_t>(dlsym(RTLD_DEFAULT, "check_order_dlsym_get_answer"));
- ASSERT_TRUE(fn != NULL) << dlerror();
+ ASSERT_TRUE(fn != nullptr) << dlerror();
fn2 = reinterpret_cast<fn_t>(dlsym(RTLD_DEFAULT, "check_order_dlsym_get_answer2"));
- ASSERT_TRUE(fn2 != NULL) << dlerror();
+ ASSERT_TRUE(fn2 != nullptr) << dlerror();
ASSERT_EQ(42, fn());
ASSERT_EQ(43, fn2());
@@ -624,8 +624,10 @@ TEST(dlfcn, dlopen_check_loop) {
handle = dlopen("libtest_with_dependency_loop.so", RTLD_NOW | RTLD_NOLOAD);
ASSERT_TRUE(handle == nullptr);
#ifdef __BIONIC__
- // TODO: glibc returns nullptr on dlerror() here. Is it bug?
ASSERT_STREQ("dlopen failed: library \"libtest_with_dependency_loop.so\" wasn't loaded and RTLD_NOLOAD prevented it", dlerror());
+#else
+ // TODO: glibc returns nullptr on dlerror() here. Is it bug?
+ ASSERT_TRUE(dlerror() == nullptr);
#endif
handle = dlopen("libtest_with_dependency_a.so", RTLD_NOW | RTLD_NOLOAD);
@@ -718,7 +720,7 @@ TEST(dlfcn, dlsym_df_1_global) {
TEST(dlfcn, dlopen_failure) {
void* self = dlopen("/does/not/exist", RTLD_NOW);
- ASSERT_TRUE(self == NULL);
+ ASSERT_TRUE(self == nullptr);
#if defined(__BIONIC__)
ASSERT_STREQ("dlopen failed: library \"/does/not/exist\" not found", dlerror());
#else
@@ -737,7 +739,7 @@ TEST(dlfcn, dlerror_concurrent) {
ASSERT_SUBSTR("/main/thread", main_thread_error);
pthread_t t;
- ASSERT_EQ(0, pthread_create(&t, NULL, ConcurrentDlErrorFn, NULL));
+ ASSERT_EQ(0, pthread_create(&t, nullptr, ConcurrentDlErrorFn, nullptr));
void* result;
ASSERT_EQ(0, pthread_join(t, &result));
char* child_thread_error = static_cast<char*>(result);
@@ -749,31 +751,23 @@ TEST(dlfcn, dlerror_concurrent) {
TEST(dlfcn, dlsym_failures) {
dlerror(); // Clear any pending errors.
- void* self = dlopen(NULL, RTLD_NOW);
- ASSERT_TRUE(self != NULL);
- ASSERT_TRUE(dlerror() == NULL);
+ void* self = dlopen(nullptr, RTLD_NOW);
+ ASSERT_TRUE(self != nullptr);
+ ASSERT_TRUE(dlerror() == nullptr);
void* sym;
#if defined(__BIONIC__) && !defined(__LP64__)
// RTLD_DEFAULT in lp32 bionic is not (void*)0
// so it can be distinguished from the NULL handle.
- sym = dlsym(NULL, "test");
- ASSERT_TRUE(sym == NULL);
- ASSERT_SUBSTR("dlsym library handle is null", dlerror());
-#endif
-
- // NULL symbol name.
-#if defined(__BIONIC__)
- // glibc marks this parameter non-null and SEGVs if you cheat.
- sym = dlsym(self, NULL);
- ASSERT_TRUE(sym == NULL);
- ASSERT_SUBSTR("", dlerror());
+ sym = dlsym(nullptr, "test");
+ ASSERT_TRUE(sym == nullptr);
+ ASSERT_STREQ("dlsym failed: library handle is null", dlerror());
#endif
// Symbol that doesn't exist.
sym = dlsym(self, "ThisSymbolDoesNotExist");
- ASSERT_TRUE(sym == NULL);
+ ASSERT_TRUE(sym == nullptr);
ASSERT_SUBSTR("undefined symbol: ThisSymbolDoesNotExist", dlerror());
ASSERT_EQ(0, dlclose(self));
@@ -781,12 +775,12 @@ TEST(dlfcn, dlsym_failures) {
TEST(dlfcn, dladdr_executable) {
dlerror(); // Clear any pending errors.
- void* self = dlopen(NULL, RTLD_NOW);
- ASSERT_TRUE(self != NULL);
- ASSERT_TRUE(dlerror() == NULL);
+ void* self = dlopen(nullptr, RTLD_NOW);
+ ASSERT_TRUE(self != nullptr);
+ ASSERT_TRUE(dlerror() == nullptr);
void* sym = dlsym(self, "DlSymTestFunction");
- ASSERT_TRUE(sym != NULL);
+ ASSERT_TRUE(sym != nullptr);
// Deliberately ask dladdr for an address inside a symbol, rather than the symbol base address.
void* addr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(sym) + 2);
@@ -796,15 +790,12 @@ TEST(dlfcn, dladdr_executable) {
ASSERT_NE(rc, 0); // Zero on error, non-zero on success.
// Get the name of this executable.
- char executable_path[PATH_MAX];
- rc = readlink("/proc/self/exe", executable_path, sizeof(executable_path));
- ASSERT_NE(rc, -1);
- executable_path[rc] = '\0';
+ const std::string& executable_path = get_executable_path();
// The filename should be that of this executable.
char dli_realpath[PATH_MAX];
ASSERT_TRUE(realpath(info.dli_fname, dli_realpath) != nullptr);
- ASSERT_STREQ(executable_path, dli_realpath);
+ ASSERT_STREQ(executable_path.c_str(), dli_realpath);
// The symbol name should be the symbol we looked up.
ASSERT_STREQ(info.dli_sname, "DlSymTestFunction");
@@ -829,11 +820,28 @@ TEST(dlfcn, dladdr_executable) {
ASSERT_EQ(0, dlclose(self));
}
+TEST(dlfcn, dlopen_executable_by_absolute_path) {
+ void* handle1 = dlopen(nullptr, RTLD_NOW);
+ ASSERT_TRUE(handle1 != nullptr) << dlerror();
+
+ void* handle2 = dlopen(get_executable_path().c_str(), RTLD_NOW);
+ ASSERT_TRUE(handle2 != nullptr) << dlerror();
+
+#if defined(__BIONIC__)
+ ASSERT_EQ(handle1, handle2);
+#else
+ GTEST_LOG_(INFO) << "Skipping ASSERT_EQ(handle1, handle2) for glibc: "
+ "it loads a separate copy of the main executable "
+ "on dlopen by absolute path.";
+#endif
+}
+
#if defined(__LP64__)
-#define BIONIC_PATH_TO_LIBC "/system/lib64/libc.so"
+#define PATH_TO_SYSTEM_LIB "/system/lib64/"
#else
-#define BIONIC_PATH_TO_LIBC "/system/lib/libc.so"
+#define PATH_TO_SYSTEM_LIB "/system/lib/"
#endif
+#define PATH_TO_LIBC PATH_TO_SYSTEM_LIB "libc.so"
TEST(dlfcn, dladdr_libc) {
#if defined(__BIONIC__)
@@ -843,7 +851,7 @@ TEST(dlfcn, dladdr_libc) {
// /system/lib is symlink when this test is executed on host.
char libc_realpath[PATH_MAX];
- ASSERT_TRUE(realpath(BIONIC_PATH_TO_LIBC, libc_realpath) == libc_realpath);
+ ASSERT_TRUE(realpath(PATH_TO_LIBC, libc_realpath) == libc_realpath);
ASSERT_STREQ(libc_realpath, info.dli_fname);
// TODO: add check for dfi_fbase
@@ -861,12 +869,12 @@ TEST(dlfcn, dladdr_invalid) {
dlerror(); // Clear any pending errors.
// No symbol corresponding to NULL.
- ASSERT_EQ(dladdr(NULL, &info), 0); // Zero on error, non-zero on success.
- ASSERT_TRUE(dlerror() == NULL); // dladdr(3) doesn't set dlerror(3).
+ ASSERT_EQ(dladdr(nullptr, &info), 0); // Zero on error, non-zero on success.
+ ASSERT_TRUE(dlerror() == nullptr); // dladdr(3) doesn't set dlerror(3).
// No symbol corresponding to a stack address.
ASSERT_EQ(dladdr(&info, &info), 0); // Zero on error, non-zero on success.
- ASSERT_TRUE(dlerror() == NULL); // dladdr(3) doesn't set dlerror(3).
+ ASSERT_TRUE(dlerror() == nullptr); // dladdr(3) doesn't set dlerror(3).
}
// GNU-style ELF hash tables are incompatible with the MIPS ABI.
@@ -922,49 +930,49 @@ TEST(dlfcn, dlopen_bad_flags) {
#if defined(__GLIBC__)
// glibc was smart enough not to define RTLD_NOW as 0, so it can detect missing flags.
- handle = dlopen(NULL, 0);
- ASSERT_TRUE(handle == NULL);
+ handle = dlopen(nullptr, 0);
+ ASSERT_TRUE(handle == nullptr);
ASSERT_SUBSTR("invalid", dlerror());
#endif
- handle = dlopen(NULL, 0xffffffff);
- ASSERT_TRUE(handle == NULL);
+ handle = dlopen(nullptr, 0xffffffff);
+ ASSERT_TRUE(handle == nullptr);
ASSERT_SUBSTR("invalid", dlerror());
// glibc actually allows you to choose both RTLD_NOW and RTLD_LAZY at the same time, and so do we.
- handle = dlopen(NULL, RTLD_NOW|RTLD_LAZY);
- ASSERT_TRUE(handle != NULL);
- ASSERT_SUBSTR(NULL, dlerror());
+ handle = dlopen(nullptr, RTLD_NOW|RTLD_LAZY);
+ ASSERT_TRUE(handle != nullptr);
+ ASSERT_SUBSTR(nullptr, dlerror());
}
TEST(dlfcn, rtld_default_unknown_symbol) {
void* addr = dlsym(RTLD_DEFAULT, "ANY_UNKNOWN_SYMBOL_NAME");
- ASSERT_TRUE(addr == NULL);
+ ASSERT_TRUE(addr == nullptr);
}
TEST(dlfcn, rtld_default_known_symbol) {
void* addr = dlsym(RTLD_DEFAULT, "fopen");
- ASSERT_TRUE(addr != NULL);
+ ASSERT_TRUE(addr != nullptr);
}
TEST(dlfcn, rtld_next_unknown_symbol) {
void* addr = dlsym(RTLD_NEXT, "ANY_UNKNOWN_SYMBOL_NAME");
- ASSERT_TRUE(addr == NULL);
+ ASSERT_TRUE(addr == nullptr);
}
TEST(dlfcn, rtld_next_known_symbol) {
void* addr = dlsym(RTLD_NEXT, "fopen");
- ASSERT_TRUE(addr != NULL);
+ ASSERT_TRUE(addr != nullptr);
}
TEST(dlfcn, dlsym_weak_func) {
dlerror();
void* handle = dlopen("libtest_dlsym_weak_func.so", RTLD_NOW);
- ASSERT_TRUE(handle != NULL);
+ ASSERT_TRUE(handle != nullptr);
int (*weak_func)();
weak_func = reinterpret_cast<int (*)()>(dlsym(handle, "weak_func"));
- ASSERT_TRUE(weak_func != NULL) << "dlerror: " << dlerror();
+ ASSERT_TRUE(weak_func != nullptr) << "dlerror: " << dlerror();
EXPECT_EQ(42, weak_func());
dlclose(handle);
}
@@ -982,8 +990,8 @@ TEST(dlfcn, dlopen_undefined_weak_func) {
TEST(dlfcn, dlopen_symlink) {
void* handle1 = dlopen("libdlext_test.so", RTLD_NOW);
void* handle2 = dlopen("libdlext_test_v2.so", RTLD_NOW);
- ASSERT_TRUE(handle1 != NULL);
- ASSERT_TRUE(handle2 != NULL);
+ ASSERT_TRUE(handle1 != nullptr);
+ ASSERT_TRUE(handle2 != nullptr);
ASSERT_EQ(handle1, handle2);
dlclose(handle1);
dlclose(handle2);
@@ -1053,6 +1061,26 @@ TEST(dlfcn, symbol_versioning_default_via_dlsym) {
dlclose(handle);
}
+TEST(dlfcn, dlvsym_smoke) {
+ void* handle = dlopen("libtest_versioned_lib.so", RTLD_NOW);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+ typedef int (*fn_t)();
+
+ {
+ fn_t fn = reinterpret_cast<fn_t>(dlvsym(handle, "versioned_function", "nonversion"));
+ ASSERT_TRUE(fn == nullptr);
+ ASSERT_SUBSTR("undefined symbol: versioned_function, version nonversion", dlerror());
+ }
+
+ {
+ fn_t fn = reinterpret_cast<fn_t>(dlvsym(handle, "versioned_function", "TESTLIB_V2"));
+ ASSERT_TRUE(fn != nullptr) << dlerror();
+ ASSERT_EQ(2, fn());
+ }
+
+ dlclose(handle);
+}
+
// This preempts the implementation from libtest_versioned_lib.so
extern "C" int version_zero_function() {
return 0;
@@ -1062,3 +1090,31 @@ extern "C" int version_zero_function() {
extern "C" int version_zero_function2() {
return 0;
}
+
+TEST(dlfcn, dt_runpath_smoke) {
+ void* handle = dlopen("libtest_dt_runpath_d.so", RTLD_NOW);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+
+ typedef void *(* dlopen_b_fn)();
+ dlopen_b_fn fn = (dlopen_b_fn)dlsym(handle, "dlopen_b");
+ ASSERT_TRUE(fn != nullptr) << dlerror();
+
+ void *p = fn();
+ ASSERT_TRUE(p != nullptr);
+
+ dlclose(handle);
+}
+
+TEST(dlfcn, dt_runpath_absolute_path) {
+ void* handle = dlopen(PATH_TO_SYSTEM_LIB "libtest_dt_runpath_d.so", RTLD_NOW);
+ ASSERT_TRUE(handle != nullptr) << dlerror();
+
+ typedef void *(* dlopen_b_fn)();
+ dlopen_b_fn fn = (dlopen_b_fn)dlsym(handle, "dlopen_b");
+ ASSERT_TRUE(fn != nullptr) << dlerror();
+
+ void *p = fn();
+ ASSERT_TRUE(p != nullptr);
+
+ dlclose(handle);
+}
diff --git a/tests/file-check-cxx b/tests/file-check-cxx
index 8ece83556..d3bc5f76f 100755
--- a/tests/file-check-cxx
+++ b/tests/file-check-cxx
@@ -2,10 +2,10 @@
FILECHECK=$1
CXX=$2
PREFIX=$3
-ARGS=${*:4}
-SOURCE=$(echo $ARGS | grep -oP '\S+\.cpp\b')
-OBJ=$(echo $ARGS | grep -oP '\S+\.o\b')
-$CXX $ARGS 2>&1 | $FILECHECK -check-prefix=$PREFIX $SOURCE
+shift 3
+SOURCE=$(echo "$@" | grep -oP '\S+\.cpp\b')
+OBJ=$(echo "$@" | grep -oP '\S+\.o\b')
+$CXX "$@" -Wno-error 2>&1 | $FILECHECK -check-prefix=$PREFIX $SOURCE
if [ "$?" -eq 0 ]; then
touch $OBJ
else
diff --git a/tests/fortify_compilation_test.cpp b/tests/fortify_compilation_test.cpp
index 537b341b9..132659716 100644
--- a/tests/fortify_compilation_test.cpp
+++ b/tests/fortify_compilation_test.cpp
@@ -21,6 +21,7 @@
#include <poll.h>
#include <stdarg.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
@@ -230,3 +231,67 @@ void test_ppoll() {
// clang should emit a warning, but doesn't
ppoll(fds, 2, &timeout, NULL);
}
+
+void test_fread_overflow() {
+ char buf[4];
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__fread_overflow' declared with attribute error: fread called with overflowing size * count
+ // clang should emit a warning, but doesn't
+ fread(buf, 2, (size_t)-1, stdin);
+}
+
+void test_fread_too_big() {
+ char buf[4];
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__fread_too_big_error' declared with attribute error: fread called with size * count bigger than buffer
+ // clang should emit a warning, but doesn't
+ fread(buf, 1, 5, stdin);
+}
+
+void test_fwrite_overflow() {
+ char buf[4] = {0};
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__fwrite_overflow' declared with attribute error: fwrite called with overflowing size * count
+ // clang should emit a warning, but doesn't
+ fwrite(buf, 2, (size_t)-1, stdout);
+}
+
+void test_fwrite_too_big() {
+ char buf[4] = {0};
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__fwrite_too_big_error' declared with attribute error: fwrite called with size * count bigger than buffer
+ // clang should emit a warning, but doesn't
+ fwrite(buf, 1, 5, stdout);
+}
+
+void test_getcwd() {
+ char buf[4];
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__getcwd_dest_size_error' declared with attribute error: getcwd called with size bigger than destination
+ // clang should emit a warning, but doesn't
+ getcwd(buf, 5);
+}
+
+void test_pwrite64_size() {
+ char buf[4] = {0};
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__pwrite64_dest_size_error' declared with attribute error: pwrite64 called with size bigger than destination
+ // clang should emit a warning, but doesn't
+ pwrite64(STDOUT_FILENO, buf, 5, 0);
+}
+
+void test_pwrite64_too_big() {
+ void *buf = calloc(atoi("5"), 1);
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__pwrite64_count_toobig_error' declared with attribute error: pwrite64 called with count > SSIZE_MAX
+ // clang should emit a warning, but doesn't
+ pwrite64(STDOUT_FILENO, buf, SIZE_MAX, 0);
+}
+
+void test_write_size() {
+ char buf[4] = {0};
+ // NOLINTNEXTLINE(whitespace/line_length)
+ // GCC: error: call to '__write_dest_size_error' declared with attribute error: write called with size bigger than destination
+ // clang should emit a warning, but doesn't
+ write(STDOUT_FILENO, buf, 5);
+}
diff --git a/tests/fortify_test.cpp b/tests/fortify_test.cpp
index 4faccb49f..4ffd5f92c 100644
--- a/tests/fortify_test.cpp
+++ b/tests/fortify_test.cpp
@@ -14,6 +14,14 @@
* limitations under the License.
*/
+// -Werror is on whether we like it or not, and we're intentionally doing awful
+// things in this file. GCC is dumb and doesn't have a specific error class for
+// the fortify failures (it's just -Werror), so we can't use anything more
+// constrained than disabling all the warnings in the file :( It also won't let
+// us use system_header in a .cpp file, so we have to #include this from
+// fortify_test_main.cpp.
+#pragma GCC system_header
+
#include <gtest/gtest.h>
#include "BionicDeathTest.h"
@@ -623,6 +631,12 @@ TEST_F(DEATHTEST, FD_ISSET_2_fortified) {
ASSERT_FORTIFY(FD_ISSET(0, set));
}
+TEST_F(DEATHTEST, getcwd_fortified) {
+ char buf[1];
+ size_t ct = atoi("2"); // prevent optimizations
+ ASSERT_FORTIFY(getcwd(buf, ct));
+}
+
TEST_F(DEATHTEST, pread_fortified) {
char buf[1];
size_t ct = atoi("2"); // prevent optimizations
@@ -639,6 +653,22 @@ TEST_F(DEATHTEST, pread64_fortified) {
close(fd);
}
+TEST_F(DEATHTEST, pwrite_fortified) {
+ char buf[1] = {0};
+ size_t ct = atoi("2"); // prevent optimizations
+ int fd = open("/dev/null", O_WRONLY);
+ ASSERT_FORTIFY(pwrite(fd, buf, ct, 0));
+ close(fd);
+}
+
+TEST_F(DEATHTEST, pwrite64_fortified) {
+ char buf[1] = {0};
+ size_t ct = atoi("2"); // prevent optimizations
+ int fd = open("/dev/null", O_WRONLY);
+ ASSERT_FORTIFY(pwrite64(fd, buf, ct, 0));
+ close(fd);
+}
+
TEST_F(DEATHTEST, read_fortified) {
char buf[1];
size_t ct = atoi("2"); // prevent optimizations
@@ -647,6 +677,30 @@ TEST_F(DEATHTEST, read_fortified) {
close(fd);
}
+TEST_F(DEATHTEST, write_fortified) {
+ char buf[1] = {0};
+ size_t ct = atoi("2"); // prevent optimizations
+ int fd = open("/dev/null", O_WRONLY);
+ ASSERT_EXIT(write(fd, buf, ct), testing::KilledBySignal(SIGABRT), "");
+ close(fd);
+}
+
+TEST_F(DEATHTEST, fread_fortified) {
+ char buf[1];
+ size_t ct = atoi("2"); // prevent optimizations
+ FILE* fp = fopen("/dev/null", "r");
+ ASSERT_FORTIFY(fread(buf, 1, ct, fp));
+ fclose(fp);
+}
+
+TEST_F(DEATHTEST, fwrite_fortified) {
+ char buf[1] = {0};
+ size_t ct = atoi("2"); // prevent optimizations
+ FILE* fp = fopen("/dev/null", "w");
+ ASSERT_FORTIFY(fwrite(buf, 1, ct, fp));
+ fclose(fp);
+}
+
TEST_F(DEATHTEST, readlink_fortified) {
char buf[1];
size_t ct = atoi("2"); // prevent optimizations
diff --git a/tests/fortify_test_main.cpp b/tests/fortify_test_main.cpp
new file mode 100644
index 000000000..8e52d42e5
--- /dev/null
+++ b/tests/fortify_test_main.cpp
@@ -0,0 +1,17 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "fortify_test.cpp"
diff --git a/tests/getauxval_test.cpp b/tests/getauxval_test.cpp
index 6ce00f14a..63bc9636d 100644
--- a/tests/getauxval_test.cpp
+++ b/tests/getauxval_test.cpp
@@ -16,6 +16,7 @@
#include <errno.h>
#include <sys/cdefs.h>
+#include <sys/utsname.h>
#include <gtest/gtest.h>
// getauxval() was only added as of glibc version 2.16.
@@ -36,28 +37,51 @@
TEST(getauxval, expected_values) {
#if defined(GETAUXVAL_CAN_COMPILE)
- ASSERT_EQ((unsigned long int) 0, getauxval(AT_SECURE));
+ ASSERT_EQ(0UL, getauxval(AT_SECURE));
ASSERT_EQ(getuid(), getauxval(AT_UID));
ASSERT_EQ(geteuid(), getauxval(AT_EUID));
ASSERT_EQ(getgid(), getauxval(AT_GID));
ASSERT_EQ(getegid(), getauxval(AT_EGID));
- ASSERT_EQ((unsigned long int) getpagesize(), getauxval(AT_PAGESZ));
+ ASSERT_EQ(static_cast<unsigned long>(getpagesize()), getauxval(AT_PAGESZ));
- ASSERT_NE((unsigned long int) 0, getauxval(AT_PHDR));
- ASSERT_NE((unsigned long int) 0, getauxval(AT_PHNUM));
- ASSERT_NE((unsigned long int) 0, getauxval(AT_ENTRY));
- ASSERT_NE((unsigned long int) 0, getauxval(AT_PAGESZ));
+ ASSERT_NE(0UL, getauxval(AT_PHDR));
+ ASSERT_NE(0UL, getauxval(AT_PHNUM));
+ ASSERT_NE(0UL, getauxval(AT_ENTRY));
+ ASSERT_NE(0UL, getauxval(AT_PAGESZ));
#else
- GTEST_LOG_(INFO) << "This test does nothing.\n";
+ GTEST_LOG_(INFO) << "This test requires a C library with getauxval.\n";
#endif
}
TEST(getauxval, unexpected_values) {
#if defined(GETAUXVAL_CAN_COMPILE)
errno = 0;
- ASSERT_EQ((unsigned long int) 0, getauxval(0xdeadbeef));
+ ASSERT_EQ(0UL, getauxval(0xdeadbeef));
ASSERT_EQ(ENOENT, errno);
#else
- GTEST_LOG_(INFO) << "This test does nothing.\n";
+ GTEST_LOG_(INFO) << "This test requires a C library with getauxval.\n";
#endif
}
+
+TEST(getauxval, arm_has_AT_HWCAP2) {
+#if defined(__arm__)
+ // There are no known 32-bit processors that implement any of these instructions, so rather
+ // than require that OEMs backport kernel patches, let's just ignore old hardware. Strictly
+ // speaking this would be fooled by someone choosing to ship a 32-bit kernel on 64-bit hardware,
+ // but that doesn't seem very likely in 2016.
+ utsname u;
+ ASSERT_EQ(0, uname(&u));
+ if (strcmp(u.machine, "aarch64") == 0) {
+ // If this test fails, apps that use getauxval to decide at runtime whether crypto hardware is
+ // available will incorrectly assume that it isn't, and will have really bad performance.
+ // If this test fails, ensure that you've enabled COMPAT_BINFMT_ELF in your kernel configuration.
+ // Note that 0 ("I don't support any of these things") is a legitimate response --- we need
+ // to check errno to see whether we got a "true" 0 or a "not found" 0.
+ errno = 0;
+ getauxval(AT_HWCAP2);
+ ASSERT_EQ(0, errno) << "64-bit kernel not reporting AT_HWCAP2 to 32-bit ARM process";
+ return;
+ }
+#endif
+ GTEST_LOG_(INFO) << "This test is only meaningful for 32-bit ARM code on 64-bit devices.\n";
+}
diff --git a/tests/gtest_main.cpp b/tests/gtest_main.cpp
index 5d25a4cd9..2b5864688 100644
--- a/tests/gtest_main.cpp
+++ b/tests/gtest_main.cpp
@@ -26,15 +26,31 @@
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
-#include <time.h>
#include <unistd.h>
+#include <chrono>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
-#include "BionicDeathTest.h" // For selftest.
+#ifndef TEMP_FAILURE_RETRY
+
+/* Used to retry syscalls that can return EINTR. */
+#define TEMP_FAILURE_RETRY(exp) ({ \
+ __typeof__(exp) _rc; \
+ do { \
+ _rc = (exp); \
+ } while (_rc == -1 && errno == EINTR); \
+ _rc; })
+
+#endif
+
+static std::string g_executable_path;
+
+const std::string& get_executable_path() {
+ return g_executable_path;
+}
namespace testing {
namespace internal {
@@ -90,7 +106,7 @@ static void PrintHelpInfo() {
" Don't use isolation mode, run all tests in a single process.\n"
" --deadline=[TIME_IN_MS]\n"
" Run each test in no longer than [TIME_IN_MS] time.\n"
- " It takes effect only in isolation mode. Deafult deadline is 60000 ms.\n"
+ " It takes effect only in isolation mode. Deafult deadline is 90000 ms.\n"
" --warnline=[TIME_IN_MS]\n"
" Test running longer than [TIME_IN_MS] will be warned.\n"
" It takes effect only in isolation mode. Default warnline is 2000 ms.\n"
@@ -221,10 +237,8 @@ void TestResultPrinter::OnTestPartResult(const testing::TestPartResult& result)
}
static int64_t NanoTime() {
- struct timespec t;
- t.tv_sec = t.tv_nsec = 0;
- clock_gettime(CLOCK_MONOTONIC, &t);
- return static_cast<int64_t>(t.tv_sec) * 1000000000LL + t.tv_nsec;
+ std::chrono::nanoseconds duration(std::chrono::steady_clock::now().time_since_epoch());
+ return static_cast<int64_t>(duration.count());
}
static bool EnumerateTests(int argc, char** argv, std::vector<TestCase>& testcase_list) {
@@ -256,7 +270,7 @@ static bool EnumerateTests(int argc, char** argv, std::vector<TestCase>& testcas
while (*p != '\0' && isspace(*p)) {
++p;
}
- if (*p != '\0') {
+ if (*p != '\0' && *p != '#') {
// This is not we want, gtest must meet with some error when parsing the arguments.
fprintf(stderr, "argument error, check with --help\n");
return false;
@@ -434,6 +448,36 @@ static void OnTestIterationEndPrint(const std::vector<TestCase>& testcase_list,
fflush(stdout);
}
+std::string XmlEscape(const std::string& xml) {
+ std::string escaped;
+ escaped.reserve(xml.size());
+
+ for (auto c : xml) {
+ switch (c) {
+ case '<':
+ escaped.append("&lt;");
+ break;
+ case '>':
+ escaped.append("&gt;");
+ break;
+ case '&':
+ escaped.append("&amp;");
+ break;
+ case '\'':
+ escaped.append("&apos;");
+ break;
+ case '"':
+ escaped.append("&quot;");
+ break;
+ default:
+ escaped.append(1, c);
+ break;
+ }
+ }
+
+ return escaped;
+}
+
// Output xml file when --gtest_output is used, write this function as we can't reuse
// gtest.cc:XmlUnitTestResultPrinter. The reason is XmlUnitTestResultPrinter is totally
// defined in gtest.cc and not expose to outside. What's more, as we don't run gtest in
@@ -489,7 +533,8 @@ void OnTestIterationEndXmlPrint(const std::string& xml_output_filename,
} else {
fputs(">\n", fp);
const std::string& test_output = testcase.GetTest(j).GetTestOutput();
- fprintf(fp, " <failure message=\"%s\" type=\"\">\n", test_output.c_str());
+ const std::string escaped_test_output = XmlEscape(test_output);
+ fprintf(fp, " <failure message=\"%s\" type=\"\">\n", escaped_test_output.c_str());
fputs(" </failure>\n", fp);
fputs(" </testcase>\n", fp);
}
@@ -501,6 +546,43 @@ void OnTestIterationEndXmlPrint(const std::string& xml_output_filename,
fclose(fp);
}
+static bool sigint_flag;
+static bool sigquit_flag;
+
+static void signal_handler(int sig) {
+ if (sig == SIGINT) {
+ sigint_flag = true;
+ } else if (sig == SIGQUIT) {
+ sigquit_flag = true;
+ }
+}
+
+static bool RegisterSignalHandler() {
+ sigint_flag = false;
+ sigquit_flag = false;
+ sig_t ret = signal(SIGINT, signal_handler);
+ if (ret != SIG_ERR) {
+ ret = signal(SIGQUIT, signal_handler);
+ }
+ if (ret == SIG_ERR) {
+ perror("RegisterSignalHandler");
+ return false;
+ }
+ return true;
+}
+
+static bool UnregisterSignalHandler() {
+ sig_t ret = signal(SIGINT, SIG_DFL);
+ if (ret != SIG_ERR) {
+ ret = signal(SIGQUIT, SIG_DFL);
+ }
+ if (ret == SIG_ERR) {
+ perror("UnregisterSignalHandler");
+ return false;
+ }
+ return true;
+}
+
struct ChildProcInfo {
pid_t pid;
int64_t start_time_ns;
@@ -531,11 +613,14 @@ static void ChildProcessFn(int argc, char** argv, const std::string& test_name)
}
static ChildProcInfo RunChildProcess(const std::string& test_name, int testcase_id, int test_id,
- sigset_t sigmask, int argc, char** argv) {
+ int argc, char** argv) {
int pipefd[2];
- int ret = pipe2(pipefd, O_NONBLOCK);
- if (ret == -1) {
- perror("pipe2 in RunTestInSeparateProc");
+ if (pipe(pipefd) == -1) {
+ perror("pipe in RunTestInSeparateProc");
+ exit(1);
+ }
+ if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) == -1) {
+ perror("fcntl in RunTestInSeparateProc");
exit(1);
}
pid_t pid = fork();
@@ -550,8 +635,7 @@ static ChildProcInfo RunChildProcess(const std::string& test_name, int testcase_
dup2(pipefd[1], STDOUT_FILENO);
dup2(pipefd[1], STDERR_FILENO);
- if (sigprocmask(SIG_SETMASK, &sigmask, NULL) == -1) {
- perror("sigprocmask SIG_SETMASK");
+ if (!UnregisterSignalHandler()) {
exit(1);
}
ChildProcessFn(argc, argv, test_name);
@@ -572,42 +656,29 @@ static ChildProcInfo RunChildProcess(const std::string& test_name, int testcase_
static void HandleSignals(std::vector<TestCase>& testcase_list,
std::vector<ChildProcInfo>& child_proc_list) {
- sigset_t waiting_mask;
- sigemptyset(&waiting_mask);
- sigaddset(&waiting_mask, SIGINT);
- sigaddset(&waiting_mask, SIGQUIT);
- timespec timeout;
- timeout.tv_sec = timeout.tv_nsec = 0;
- while (true) {
- int signo = TEMP_FAILURE_RETRY(sigtimedwait(&waiting_mask, NULL, &timeout));
- if (signo == -1) {
- if (errno == EAGAIN) {
- return; // Timeout, no pending signals.
+ if (sigquit_flag) {
+ sigquit_flag = false;
+ // Print current running tests.
+ printf("List of current running tests:\n");
+ for (const auto& child_proc : child_proc_list) {
+ if (child_proc.pid != 0) {
+ std::string test_name = testcase_list[child_proc.testcase_id].GetTestName(child_proc.test_id);
+ int64_t current_time_ns = NanoTime();
+ int64_t run_time_ms = (current_time_ns - child_proc.start_time_ns) / 1000000;
+ printf(" %s (%" PRId64 " ms)\n", test_name.c_str(), run_time_ms);
}
- perror("sigtimedwait");
- exit(1);
- } else if (signo == SIGQUIT) {
- // Print current running tests.
- printf("List of current running tests:\n");
- for (auto& child_proc : child_proc_list) {
- if (child_proc.pid != 0) {
- std::string test_name = testcase_list[child_proc.testcase_id].GetTestName(child_proc.test_id);
- int64_t current_time_ns = NanoTime();
- int64_t run_time_ms = (current_time_ns - child_proc.start_time_ns) / 1000000;
- printf(" %s (%" PRId64 " ms)\n", test_name.c_str(), run_time_ms);
- }
- }
- } else if (signo == SIGINT) {
- // Kill current running tests.
- for (auto& child_proc : child_proc_list) {
- if (child_proc.pid != 0) {
- // Send SIGKILL to ensure the child process can be killed unconditionally.
- kill(child_proc.pid, SIGKILL);
- }
+ }
+ } else if (sigint_flag) {
+ sigint_flag = false;
+ // Kill current running tests.
+ for (const auto& child_proc : child_proc_list) {
+ if (child_proc.pid != 0) {
+ // Send SIGKILL to ensure the child process can be killed unconditionally.
+ kill(child_proc.pid, SIGKILL);
}
- // SIGINT kills the parent process as well.
- exit(1);
}
+ // SIGINT kills the parent process as well.
+ exit(1);
}
}
@@ -639,6 +710,30 @@ static size_t CheckChildProcTimeout(std::vector<ChildProcInfo>& child_proc_list)
return timeout_child_count;
}
+static void ReadChildProcOutput(std::vector<TestCase>& testcase_list,
+ std::vector<ChildProcInfo>& child_proc_list) {
+ for (const auto& child_proc : child_proc_list) {
+ TestCase& testcase = testcase_list[child_proc.testcase_id];
+ int test_id = child_proc.test_id;
+ while (true) {
+ char buf[1024];
+ ssize_t bytes_read = TEMP_FAILURE_RETRY(read(child_proc.child_read_fd, buf, sizeof(buf) - 1));
+ if (bytes_read > 0) {
+ buf[bytes_read] = '\0';
+ testcase.GetTest(test_id).AppendTestOutput(buf);
+ } else if (bytes_read == 0) {
+ break; // Read end.
+ } else {
+ if (errno == EAGAIN) {
+ break;
+ }
+ perror("failed to read child_read_fd");
+ exit(1);
+ }
+ }
+ }
+}
+
static void WaitChildProcs(std::vector<TestCase>& testcase_list,
std::vector<ChildProcInfo>& child_proc_list) {
size_t finished_child_count = 0;
@@ -663,6 +758,7 @@ static void WaitChildProcs(std::vector<TestCase>& testcase_list,
finished_child_count += CheckChildProcTimeout(child_proc_list);
}
+ ReadChildProcOutput(testcase_list, child_proc_list);
if (finished_child_count > 0) {
return;
}
@@ -696,26 +792,6 @@ static void CollectChildTestResult(const ChildProcInfo& child_proc, TestCase& te
kill(child_proc.pid, SIGKILL);
WaitForOneChild(child_proc.pid);
}
-
- while (true) {
- char buf[1024];
- ssize_t bytes_read = TEMP_FAILURE_RETRY(read(child_proc.child_read_fd, buf, sizeof(buf) - 1));
- if (bytes_read > 0) {
- buf[bytes_read] = '\0';
- testcase.GetTest(test_id).AppendTestOutput(buf);
- } else if (bytes_read == 0) {
- break; // Read end.
- } else {
- if (errno == EAGAIN) {
- // No data is available. This rarely happens, only when the child process created other
- // processes which have not exited so far. But the child process has already exited or
- // been killed, so the test has finished, and we shouldn't wait further.
- break;
- }
- perror("read child_read_fd in RunTestInSeparateProc");
- exit(1);
- }
- }
close(child_proc.child_read_fd);
if (child_proc.timed_out) {
@@ -734,8 +810,14 @@ static void CollectChildTestResult(const ChildProcInfo& child_proc, TestCase& te
testcase.GetTest(test_id).AppendTestOutput(buf);
} else {
- testcase.SetTestResult(test_id, WEXITSTATUS(child_proc.exit_status) == 0 ?
- TEST_SUCCESS : TEST_FAILED);
+ int exitcode = WEXITSTATUS(child_proc.exit_status);
+ testcase.SetTestResult(test_id, exitcode == 0 ? TEST_SUCCESS : TEST_FAILED);
+ if (exitcode != 0) {
+ char buf[1024];
+ snprintf(buf, sizeof(buf), "%s exited with exitcode %d.\n",
+ testcase.GetTestName(test_id).c_str(), exitcode);
+ testcase.GetTest(test_id).AppendTestOutput(buf);
+ }
}
}
@@ -750,13 +832,7 @@ static bool RunTestInSeparateProc(int argc, char** argv, std::vector<TestCase>&
testing::UnitTest::GetInstance()->listeners().default_result_printer());
testing::UnitTest::GetInstance()->listeners().Append(new TestResultPrinter);
- // Signals are blocked here as we want to handle them in HandleSignals() later.
- sigset_t block_mask, orig_mask;
- sigemptyset(&block_mask);
- sigaddset(&block_mask, SIGINT);
- sigaddset(&block_mask, SIGQUIT);
- if (sigprocmask(SIG_BLOCK, &block_mask, &orig_mask) == -1) {
- perror("sigprocmask SIG_BLOCK");
+ if (!RegisterSignalHandler()) {
exit(1);
}
@@ -785,7 +861,7 @@ static bool RunTestInSeparateProc(int argc, char** argv, std::vector<TestCase>&
while (child_proc_list.size() < job_count && next_testcase_id < testcase_list.size()) {
std::string test_name = testcase_list[next_testcase_id].GetTestName(next_test_id);
ChildProcInfo child_proc = RunChildProcess(test_name, next_testcase_id, next_test_id,
- orig_mask, argc, argv);
+ argc, argv);
child_proc_list.push_back(child_proc);
if (++next_test_id == testcase_list[next_testcase_id].TestCount()) {
next_test_id = 0;
@@ -830,9 +906,7 @@ static bool RunTestInSeparateProc(int argc, char** argv, std::vector<TestCase>&
}
}
- // Restore signal mask.
- if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) == -1) {
- perror("sigprocmask SIG_SETMASK");
+ if (!UnregisterSignalHandler()) {
exit(1);
}
@@ -840,11 +914,7 @@ static bool RunTestInSeparateProc(int argc, char** argv, std::vector<TestCase>&
}
static size_t GetDefaultJobCount() {
-#if defined(JOB_COUNT_FIXED)
- return JOB_COUNT_FIXED;
-#else
return static_cast<size_t>(sysconf(_SC_NPROCESSORS_ONLN));
-#endif
}
static void AddPathSeparatorInTestProgramPath(std::vector<char*>& args) {
@@ -853,15 +923,8 @@ static void AddPathSeparatorInTestProgramPath(std::vector<char*>& args) {
// The reason is that gtest uses clone() + execve() to run DeathTest in threadsafe mode,
// and execve() doesn't read environment variable PATH, so execve() will not success
// until we specify the absolute path or relative path of the test program directly.
- if (strchr(args[0], '/') == NULL) {
- char path[PATH_MAX];
- ssize_t path_len = readlink("/proc/self/exe", path, sizeof(path));
- if (path_len <= 0 || path_len >= static_cast<ssize_t>(sizeof(path))) {
- perror("readlink");
- exit(1);
- }
- path[path_len] = '\0';
- args[0] = strdup(path);
+ if (strchr(args[0], '/') == nullptr) {
+ args[0] = strdup(g_executable_path.c_str());
}
}
@@ -1048,7 +1111,19 @@ static bool PickOptions(std::vector<char*>& args, IsolationTestOptions& options)
return true;
}
+static std::string get_proc_self_exe() {
+ char path[PATH_MAX];
+ ssize_t path_len = readlink("/proc/self/exe", path, sizeof(path));
+ if (path_len <= 0 || path_len >= static_cast<ssize_t>(sizeof(path))) {
+ perror("readlink");
+ exit(1);
+ }
+
+ return std::string(path, path_len);
+}
+
int main(int argc, char** argv) {
+ g_executable_path = get_proc_self_exe();
std::vector<char*> arg_list;
for (int i = 0; i < argc; ++i) {
arg_list.push_back(argv[i]);
@@ -1107,7 +1182,12 @@ TEST(bionic_selftest, test_signal_SEGV_terminated) {
*p = 3;
}
-class bionic_selftest_DeathTest : public BionicDeathTest {};
+class bionic_selftest_DeathTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ }
+};
static void deathtest_helper_success() {
ASSERT_EQ(1, 1);
diff --git a/tests/ifaddrs_test.cpp b/tests/ifaddrs_test.cpp
new file mode 100644
index 000000000..9f01619d9
--- /dev/null
+++ b/tests/ifaddrs_test.cpp
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <ifaddrs.h>
+
+#include <dirent.h>
+#include <linux/if_packet.h>
+#include <net/ethernet.h>
+#include <net/if.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/ioctl.h>
+
+#include <algorithm>
+#include <map>
+#include <vector>
+
+TEST(ifaddrs, freeifaddrs_null) {
+ freeifaddrs(nullptr);
+}
+
+// We can't statically say much about what network interfaces are available, but we can be pretty
+// sure there's a loopback interface, and that it has IPv4, IPv6, and AF_PACKET entries.
+TEST(ifaddrs, getifaddrs_lo) {
+ ifaddrs* addrs = nullptr;
+
+ ASSERT_EQ(0, getifaddrs(&addrs));
+ ASSERT_TRUE(addrs != nullptr);
+
+ ifaddrs* lo_inet4 = nullptr;
+ ifaddrs* lo_inet6 = nullptr;
+ ifaddrs* lo_packet = nullptr;
+ for (ifaddrs* addr = addrs; addr != nullptr; addr = addr->ifa_next) {
+ if (addr->ifa_name && strcmp(addr->ifa_name, "lo") == 0) {
+ if (addr->ifa_addr && addr->ifa_addr->sa_family == AF_INET) lo_inet4 = addr;
+ else if (addr->ifa_addr && addr->ifa_addr->sa_family == AF_INET6) lo_inet6 = addr;
+ else if (addr->ifa_addr && addr->ifa_addr->sa_family == AF_PACKET) lo_packet = addr;
+ }
+ }
+
+ // Does the IPv4 entry look right?
+ ASSERT_TRUE(lo_inet4 != nullptr);
+ const sockaddr_in* sa_inet4 = reinterpret_cast<const sockaddr_in*>(lo_inet4->ifa_addr);
+ ASSERT_TRUE(ntohl(sa_inet4->sin_addr.s_addr) == INADDR_LOOPBACK);
+
+ // Does the IPv6 entry look right?
+ ASSERT_TRUE(lo_inet6 != nullptr);
+ const sockaddr_in6* sa_inet6 = reinterpret_cast<const sockaddr_in6*>(lo_inet6->ifa_addr);
+ ASSERT_TRUE(IN6_IS_ADDR_LOOPBACK(&sa_inet6->sin6_addr));
+
+ // Does the AF_PACKET entry look right?
+ ASSERT_TRUE(lo_packet != nullptr);
+ const sockaddr_ll* sa_ll = reinterpret_cast<const sockaddr_ll*>(lo_packet->ifa_addr);
+ ASSERT_EQ(6, sa_ll->sll_halen);
+
+ freeifaddrs(addrs);
+}
+
+// Check that getifaddrs sees the same list of interfaces as /sys/class/net.
+TEST(ifaddrs, getifaddrs_interfaces) {
+ std::vector<std::string> ifaddrs_socks;
+ {
+ ifaddrs* addrs;
+ ASSERT_EQ(0, getifaddrs(&addrs));
+
+ for (ifaddrs* addr = addrs; addr != nullptr; addr = addr->ifa_next) {
+ int family = addr->ifa_addr ? addr->ifa_addr->sa_family :
+ addr->ifa_broadaddr ? addr->ifa_broadaddr->sa_family :
+ AF_UNSPEC;
+
+ if (family == AF_PACKET || family == AF_UNSPEC) {
+ ifaddrs_socks.push_back(std::string(addr->ifa_name));
+ }
+ }
+
+ freeifaddrs(addrs);
+ }
+
+ std::vector<std::string> sys_class_net;
+ {
+ std::unique_ptr<DIR, decltype(&closedir)> d(opendir("/sys/class/net"), closedir);
+ ASSERT_TRUE(d != nullptr);
+ dirent* dir;
+ while ((dir = readdir(d.get())) != nullptr) {
+ if (dir->d_type == DT_LNK) {
+ sys_class_net.push_back(std::string(dir->d_name));
+ }
+ }
+ }
+
+ ASSERT_TRUE(std::is_permutation(ifaddrs_socks.begin(), ifaddrs_socks.end(),
+ sys_class_net.begin()));
+}
+
+static void CheckAddressIsInSet(const std::string& if_name, bool unicast,
+ const std::set<in_addr_t>& addrs) {
+ ifreq ifr;
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_addr.sa_family = AF_INET;
+ if_name.copy(ifr.ifr_name, IFNAMSIZ - 1);
+
+ int fd = socket(AF_INET, SOCK_DGRAM, 0);
+ ASSERT_TRUE(fd != -1);
+
+ int request = SIOCGIFADDR;
+ if (!unicast) {
+ // For non-unicast, the specific ioctl to use depends on whether the IFF_BROADCAST flag is set.
+ ASSERT_EQ(0, ioctl(fd, SIOCGIFFLAGS, &ifr)) << if_name << ' ' << strerror(errno);
+ request = ((ifr.ifr_flags & IFF_BROADCAST) != 0) ? SIOCGIFBRDADDR : SIOCGIFDSTADDR;
+ }
+
+ ASSERT_EQ(0, ioctl(fd, request, &ifr)) << if_name << ' ' << strerror(errno);
+ close(fd);
+
+ sockaddr_in* sock = reinterpret_cast<sockaddr_in*>(&ifr.ifr_addr);
+ in_addr_t addr = sock->sin_addr.s_addr;
+
+ EXPECT_TRUE(addrs.find(addr) != addrs.end()) << if_name << ' ' << std::hex << ntohl(addr);
+}
+
+TEST(ifaddrs, getifaddrs_INET) {
+ std::map<std::string, std::set<in_addr_t>> inet_addrs;
+ std::map<std::string, std::set<in_addr_t>> broad_addrs;
+
+ // Collect the IPv4 addresses for each interface.
+ ifaddrs* addrs;
+ ASSERT_EQ(0, getifaddrs(&addrs));
+ for (ifaddrs* addr = addrs; addr != nullptr; addr = addr->ifa_next) {
+ if (addr->ifa_name && addr->ifa_addr && addr->ifa_addr->sa_family == AF_INET) {
+ auto sock = reinterpret_cast<sockaddr_in*>(addr->ifa_addr);
+ inet_addrs[addr->ifa_name].insert(sock->sin_addr.s_addr);
+ }
+ if (addr->ifa_name && addr->ifa_broadaddr && addr->ifa_broadaddr->sa_family == AF_INET) {
+ auto sock = reinterpret_cast<sockaddr_in*>(addr->ifa_broadaddr);
+ broad_addrs[addr->ifa_name].insert(sock->sin_addr.s_addr);
+ }
+ }
+ freeifaddrs(addrs);
+
+ // Check that the addresses returned by the SIOCGIFADDR and SIOCGIFBRDADDR/SIOCGIFDSTADDR ioctls
+ // are in our collections.
+ for (const auto& it : inet_addrs) CheckAddressIsInSet(it.first, true, it.second);
+ for (const auto& it : broad_addrs) CheckAddressIsInSet(it.first, false, it.second);
+}
+
+static void print_sockaddr_ll(const char* what, const sockaddr* p) {
+ const sockaddr_ll* s = reinterpret_cast<const sockaddr_ll*>(p);
+ printf("\t\t%s\t", what);
+ for (int i = 0; i < s->sll_halen; ++i) {
+ if (i > 0) printf(":");
+ printf("%02X", s->sll_addr[i]);
+ }
+ printf(" (%d bytes)\n", s->sll_halen);
+}
+
+static void print_sockaddr_inet(const char* what, const sockaddr* addr) {
+ char host[NI_MAXHOST];
+ int family = addr->sa_family;
+ int error = getnameinfo(addr,
+ (family == AF_INET) ? sizeof(sockaddr_in) : sizeof(sockaddr_in6),
+ host, NI_MAXHOST, nullptr, 0, NI_NUMERICHOST);
+ if (error != 0) {
+ printf("%d getnameinfo() failed: %s\n", family, gai_strerror(error));
+ strcpy(host, "???");
+ }
+ printf("\t\t%s: <%s>\n", what, host);
+}
+
+static const char* FamilyToName(int family) {
+ if (family == AF_INET) return "AF_INET";
+ if (family == AF_INET6) return "AF_INET6";
+ if (family == AF_PACKET) return "AF_PACKET";
+ if (family == AF_UNSPEC) return "AF_UNSPEC";
+ return "?";
+}
+
+static std::string FlagsToString(short flags) {
+ std::string result;
+ if ((flags & IFF_UP) != 0) result += " UP";
+ if ((flags & IFF_BROADCAST) != 0) result += " BROADCAST";
+ if ((flags & IFF_DEBUG) != 0) result += " DEBUG";
+ if ((flags & IFF_LOOPBACK) != 0) result += " LOOPBACK";
+ if ((flags & IFF_POINTOPOINT) != 0) result += " POINTOPOINT";
+ if ((flags & IFF_NOTRAILERS) != 0) result += " NOTRAILERS";
+ if ((flags & IFF_RUNNING) != 0) result += " RUNNING";
+ if ((flags & IFF_NOARP) != 0) result += " NOARP";
+ if ((flags & IFF_PROMISC) != 0) result += " PROMISC";
+ if ((flags & IFF_ALLMULTI) != 0) result += " ALLMULTI";
+ if ((flags & IFF_MASTER) != 0) result += " MASTER";
+ if ((flags & IFF_SLAVE) != 0) result += " SLAVE";
+ if ((flags & IFF_MULTICAST) != 0) result += " MULTICAST";
+ if ((flags & IFF_PORTSEL) != 0) result += " PORTSEL";
+ if ((flags & IFF_AUTOMEDIA) != 0) result += " AUTOMEDIA";
+ if ((flags & IFF_DYNAMIC) != 0) result += " DYNAMIC";
+#if defined(IFF_LOWER_UP)
+ if ((flags & IFF_LOWER_UP) != 0) result += " LOWER_UP";
+#endif
+#if defined(IFF_DORMANT)
+ if ((flags & IFF_DORMANT) != 0) result += " DORMANT";
+#endif
+#if defined(IFF_ECHO)
+ if ((flags & IFF_ECHO) != 0) result += " ECHO";
+#endif
+ return result;
+}
+
+// Not really a test, but a useful debugging tool.
+TEST(ifaddrs, dump) {
+ ifaddrs* addrs;
+ ASSERT_EQ(0, getifaddrs(&addrs));
+
+ for (ifaddrs* ifa = addrs; ifa != nullptr; ifa = ifa->ifa_next) {
+ int family = ifa->ifa_addr ? ifa->ifa_addr->sa_family :
+ ifa->ifa_broadaddr ? ifa->ifa_broadaddr->sa_family : AF_UNSPEC;
+
+ printf("\t%s\n"
+ "\t\t%s (%d) flags=%#x%s\n",
+ ifa->ifa_name, FamilyToName(family), family,
+ ifa->ifa_flags, FlagsToString(ifa->ifa_flags).c_str());
+
+ if (family == AF_PACKET) {
+ if (ifa->ifa_addr) print_sockaddr_ll("hwaddr", ifa->ifa_addr);
+ if (ifa->ifa_broadaddr) print_sockaddr_ll("hwbroad", ifa->ifa_addr);
+ } else if (family == AF_INET || family == AF_INET6) {
+ if (ifa->ifa_addr) print_sockaddr_inet("address", ifa->ifa_addr);
+ if (ifa->ifa_broadaddr && (ifa->ifa_flags & (IFF_BROADCAST | IFF_POINTOPOINT)) != 0) {
+ print_sockaddr_inet((ifa->ifa_flags & IFF_BROADCAST) ? "broadcast" : "destination",
+ ifa->ifa_broadaddr);
+ }
+ }
+
+ fflush(stdout);
+ }
+
+ freeifaddrs(addrs);
+}
+
+TEST(ifaddrs, inet6_scope_ids) {
+ ifaddrs* addrs;
+ ASSERT_EQ(0, getifaddrs(&addrs));
+
+ for (ifaddrs* ifa = addrs; ifa != nullptr; ifa = ifa->ifa_next) {
+ if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET6) {
+ sockaddr_in6* sa6 = reinterpret_cast<sockaddr_in6*>(ifa->ifa_addr);
+ // Any link-local IPv6 address should have a scope id. (http://b/27219454.)
+ // 0 isn't a valid interface index, so that would mean the scope id wasn't set.
+ if (IN6_IS_ADDR_LINKLOCAL(&sa6->sin6_addr) || IN6_IS_ADDR_MC_LINKLOCAL(&sa6->sin6_addr)) {
+ ASSERT_NE(sa6->sin6_scope_id, 0U);
+ }
+ }
+ }
+
+ freeifaddrs(addrs);
+}
diff --git a/tests/libgen_basename_test.cpp b/tests/libgen_basename_test.cpp
new file mode 100644
index 000000000..d97e0da28
--- /dev/null
+++ b/tests/libgen_basename_test.cpp
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GNU_SOURCE
+ #define _GNU_SOURCE 1
+#endif
+
+#include <string.h>
+
+#if defined(basename)
+ #error basename should not be defined at this point
+#endif
+
+static const char* gnu_basename(const char* in) {
+ return basename(in);
+}
+
+#include <libgen.h>
+
+#if !defined(basename)
+ #error basename should be defined at this point
+#endif
+
+static char* posix_basename(char* in) {
+ return basename(in);
+}
+
+#include <errno.h>
+#include <gtest/gtest.h>
+
+static void __TestGnuBasename(const char* in, const char* expected_out, int line) {
+ errno = 0;
+ const char* out = gnu_basename(in);
+ ASSERT_STREQ(expected_out, out) << "(" << line << "): " << in << std::endl;
+ ASSERT_EQ(0, errno) << "(" << line << "): " << in << std::endl;
+}
+
+static void __TestPosixBasename(const char* in, const char* expected_out, int line) {
+ char* writable_in = (in != NULL) ? strdup(in) : NULL;
+ errno = 0;
+ const char* out = posix_basename(&writable_in[0]);
+ ASSERT_STREQ(expected_out, out) << "(" << line << "): " << in << std::endl;
+ ASSERT_EQ(0, errno) << "(" << line << "): " << in << std::endl;
+ free(writable_in);
+}
+
+#define TestGnuBasename(in, expected) __TestGnuBasename(in, expected, __LINE__)
+#define TestPosixBasename(in, expected) __TestPosixBasename(in, expected, __LINE__)
+
+TEST(libgen_basename, gnu_basename) {
+ // GNU's basename doesn't accept NULL
+ // TestGnuBasename(NULL, ".");
+ TestGnuBasename("", "");
+ TestGnuBasename("/usr/lib", "lib");
+ TestGnuBasename("/system/bin/sh/", "");
+ TestGnuBasename("/usr/", "");
+ TestGnuBasename("usr", "usr");
+ TestGnuBasename("/", "");
+ TestGnuBasename(".", ".");
+ TestGnuBasename("..", "..");
+ TestGnuBasename("///", "");
+ TestGnuBasename("//usr//lib//", "");
+}
+
+TEST(libgen_basename, posix_basename) {
+ TestPosixBasename(NULL, ".");
+ TestPosixBasename("", ".");
+ TestPosixBasename("/usr/lib", "lib");
+ TestPosixBasename("/system/bin/sh/", "sh");
+ TestPosixBasename("/usr/", "usr");
+ TestPosixBasename("usr", "usr");
+ TestPosixBasename("/", "/");
+ TestPosixBasename(".", ".");
+ TestPosixBasename("..", "..");
+ TestPosixBasename("///", "/");
+ TestPosixBasename("//usr//lib//", "lib");
+}
diff --git a/tests/libgen_test.cpp b/tests/libgen_test.cpp
index e9a5d5c44..8a37a3fd6 100644
--- a/tests/libgen_test.cpp
+++ b/tests/libgen_test.cpp
@@ -19,15 +19,6 @@
#include <errno.h>
#include <gtest/gtest.h>
-static void TestBasename(const char* in, const char* expected_out) {
- char* writable_in = (in != NULL) ? strdup(in) : NULL;
- errno = 0;
- const char* out = basename(&writable_in[0]);
- ASSERT_STREQ(expected_out, out) << in;
- ASSERT_EQ(0, errno) << in;
- free(writable_in);
-}
-
static void TestDirname(const char* in, const char* expected_out) {
char* writable_in = (in != NULL) ? strdup(in) : NULL;
errno = 0;
@@ -37,21 +28,6 @@ static void TestDirname(const char* in, const char* expected_out) {
free(writable_in);
}
-// Do not use basename as the test name, it's defined to another value in glibc
-// so leads to a differently named test on host versus target architectures.
-TEST(libgen, posix_basename) {
- TestBasename(NULL, ".");
- TestBasename("", ".");
- TestBasename("/usr/lib", "lib");
- TestBasename("/usr/", "usr");
- TestBasename("usr", "usr");
- TestBasename("/", "/");
- TestBasename(".", ".");
- TestBasename("..", "..");
- TestBasename("///", "/");
- TestBasename("//usr//lib//", "lib");
-}
-
TEST(libgen, dirname) {
TestDirname(NULL, ".");
TestDirname("", ".");
diff --git a/tests/libs/Android.build.dlext_testzip.mk b/tests/libs/Android.build.dlext_testzip.mk
index 7cc0dae90..56be1e222 100644
--- a/tests/libs/Android.build.dlext_testzip.mk
+++ b/tests/libs/Android.build.dlext_testzip.mk
@@ -18,24 +18,67 @@
# Library used by dlext tests - zipped and aligned
# -----------------------------------------------------------------------------
+BIONIC_TESTS_ZIPALIGN := $(HOST_OUT_EXECUTABLES)/bionic_tests_zipalign
+
include $(CLEAR_VARS)
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE := libdlext_test_fd_zipaligned
+LOCAL_MODULE := libdlext_test_zip_zipaligned
LOCAL_MODULE_SUFFIX := .zip
LOCAL_MODULE_TAGS := tests
-LOCAL_MODULE_PATH := $($(bionic_2nd_arch_prefix)TARGET_OUT_DATA_NATIVE_TESTS)/libdlext_test_fd
+LOCAL_MODULE_PATH := $($(bionic_2nd_arch_prefix)TARGET_OUT_DATA_NATIVE_TESTS)/libdlext_test_zip
LOCAL_2ND_ARCH_VAR_PREFIX := $(bionic_2nd_arch_prefix)
include $(BUILD_SYSTEM)/base_rules.mk
my_shared_libs := \
- $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libdlext_test_fd.so
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libdlext_test_zip.so \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libatest_simple_zip.so
-$(LOCAL_BUILT_MODULE): PRIVATE_ALIGNMENT := 4096 # PAGE_SIZE
-$(LOCAL_BUILT_MODULE) : $(my_shared_libs) | $(ZIPALIGN)
- @echo "Zipalign $(PRIVATE_ALIGNMENT): $@"
+$(LOCAL_BUILT_MODULE) : $(my_shared_libs) | $(BIONIC_TESTS_ZIPALIGN)
+ @echo "Aligning zip: $@"
$(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)/libdir
$(hide) cp $^ $(dir $@)/libdir
- $(hide) (cd $(dir $@) && touch empty_file.txt && zip -rD0 $(notdir $@).unaligned empty_file.txt libdir/*.so)
- $(hide) $(ZIPALIGN) $(PRIVATE_ALIGNMENT) $@.unaligned $@
+ $(hide) (cd $(dir $@) && touch empty_file.txt && zip -qrD0 $(notdir $@).unaligned empty_file.txt libdir/*.so)
+ $(hide) $(BIONIC_TESTS_ZIPALIGN) 4096 $@.unaligned $@
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_MODULE := libdlext_test_runpath_zip_zipaligned
+LOCAL_MODULE_SUFFIX := .zip
+LOCAL_MODULE_TAGS := tests
+LOCAL_MODULE_PATH := $($(bionic_2nd_arch_prefix)TARGET_OUT_DATA_NATIVE_TESTS)/libdlext_test_runpath_zip
+LOCAL_2ND_ARCH_VAR_PREFIX := $(bionic_2nd_arch_prefix)
+
+include $(BUILD_SYSTEM)/base_rules.mk
+my_shared_libs := \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_d_zip.so \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_b.so \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_a.so \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_c.so \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_x.so
+
+
+$(LOCAL_BUILT_MODULE) : PRIVATE_LIB_D := \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_d_zip.so
+$(LOCAL_BUILT_MODULE) : PRIVATE_LIB_A := \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_a.so
+$(LOCAL_BUILT_MODULE) : PRIVATE_LIB_B := \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_b.so
+$(LOCAL_BUILT_MODULE) : PRIVATE_LIB_C := \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_c.so
+$(LOCAL_BUILT_MODULE) : PRIVATE_LIB_X := \
+ $($(bionic_2nd_arch_prefix)TARGET_OUT_INTERMEDIATE_LIBRARIES)/libtest_dt_runpath_x.so
+$(LOCAL_BUILT_MODULE) : $(my_shared_libs) | $(BIONIC_TESTS_ZIPALIGN)
+ @echo "Aligning zip: $@"
+ $(hide) rm -rf $(dir $@) && mkdir -p $(dir $@)/libdir && \
+ mkdir -p $(dir $@)/libdir/dt_runpath_a && mkdir -p $(dir $@)/libdir/dt_runpath_b_c_x
+ $(hide) cp $(PRIVATE_LIB_D) $(dir $@)/libdir
+ $(hide) cp $(PRIVATE_LIB_A) $(dir $@)/libdir/dt_runpath_a
+ $(hide) cp $(PRIVATE_LIB_B) $(dir $@)/libdir/dt_runpath_b_c_x
+ $(hide) cp $(PRIVATE_LIB_C) $(dir $@)/libdir/dt_runpath_b_c_x
+ $(hide) cp $(PRIVATE_LIB_X) $(dir $@)/libdir/dt_runpath_b_c_x
+ $(hide) (cd $(dir $@) && touch empty_file.txt && zip -qrD0 $(notdir $@).unaligned empty_file.txt libdir)
+ $(hide) $(BIONIC_TESTS_ZIPALIGN) 4096 $@.unaligned $@
+
diff --git a/tests/libs/Android.build.dt_runpath.mk b/tests/libs/Android.build.dt_runpath.mk
new file mode 100644
index 000000000..4544bb151
--- /dev/null
+++ b/tests/libs/Android.build.dt_runpath.mk
@@ -0,0 +1,94 @@
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# -----------------------------------------------------------------------------
+# Libraries used by dt_runpath tests.
+# -----------------------------------------------------------------------------
+
+#
+# Dependencies
+#
+# libtest_dt_runpath_d.so runpath: ${ORIGIN}/dt_runpath_b_c_x
+# |-> dt_runpath_b_c_x/libtest_dt_runpath_b.so runpath: ${ORIGIN}/../dt_runpath_a
+# | |-> dt_runpath_a/libtest_dt_runpath_a.so
+# |-> dt_runpath_b_c_x/libtest_dt_runpath_c.so runpath: ${ORIGIN}/invalid_dt_runpath
+# | |-> libtest_dt_runpath_a.so (soname)
+#
+# This one is used to test dlopen
+# dt_runpath_b_c_x/libtest_dt_runpath_x.so
+#
+
+# A leaf library in a non-standard directory.
+libtest_dt_runpath_a_src_files := \
+ empty.cpp
+
+libtest_dt_runpath_a_relative_path := dt_runpath_a
+module := libtest_dt_runpath_a
+include $(LOCAL_PATH)/Android.build.testlib.mk
+
+# Depends on library A with a DT_RUNPATH
+libtest_dt_runpath_b_src_files := \
+ empty.cpp
+
+libtest_dt_runpath_b_shared_libraries := libtest_dt_runpath_a
+libtest_dt_runpath_b_ldflags := -Wl,--rpath,\$${ORIGIN}/../dt_runpath_a -Wl,--enable-new-dtags
+libtest_dt_runpath_b_relative_path := dt_runpath_b_c_x
+module := libtest_dt_runpath_b
+include $(LOCAL_PATH)/Android.build.testlib.mk
+
+# Depends on library A with an incorrect DT_RUNPATH. This does not matter
+# because B is the first in the D (below) dependency order, and library A
+# is already loaded using the correct DT_RUNPATH from library B.
+libtest_dt_runpath_c_src_files := \
+ empty.cpp
+
+libtest_dt_runpath_c_shared_libraries := libtest_dt_runpath_a
+libtest_dt_runpath_c_ldflags := -Wl,--rpath,\$${ORIGIN}/invalid_dt_runpath -Wl,--enable-new-dtags
+libtest_dt_runpath_c_relative_path := dt_runpath_b_c_x
+module := libtest_dt_runpath_c
+include $(LOCAL_PATH)/Android.build.testlib.mk
+
+# D depends on B and C with DT_RUNPATH.
+libtest_dt_runpath_d_src_files := \
+ dlopen_b.cpp
+
+libtest_dt_runpath_d_shared_libraries := libtest_dt_runpath_b libtest_dt_runpath_c
+libtest_dt_runpath_d_ldflags := -Wl,--rpath,\$${ORIGIN}/dt_runpath_b_c_x -Wl,--enable-new-dtags
+module := libtest_dt_runpath_d
+include $(LOCAL_PATH)/Android.build.testlib.mk
+
+# D version for open-from-zip test with runpath
+libtest_dt_runpath_d_zip_src_files := \
+ dlopen_b.cpp
+
+libtest_dt_runpath_d_zip_shared_libraries := libtest_dt_runpath_b libtest_dt_runpath_c
+libtest_dt_runpath_d_zip_ldflags := -Wl,--rpath,\$${ORIGIN}/dt_runpath_b_c_x -Wl,--enable-new-dtags
+libtest_dt_runpath_d_zip_install_to_out_data := true
+module := libtest_dt_runpath_d_zip
+module_tag := optional
+build_type := target
+build_target := SHARED_LIBRARY
+include $(TEST_PATH)/Android.build.mk
+
+
+# A leaf library in a directory library D has DT_RUNPATH for.
+libtest_dt_runpath_x_src_files := \
+ empty.cpp
+
+libtest_dt_runpath_x_relative_path := dt_runpath_b_c_x
+module := libtest_dt_runpath_x
+include $(LOCAL_PATH)/Android.build.testlib.mk
+
diff --git a/tests/libs/Android.build.linker_namespaces.mk b/tests/libs/Android.build.linker_namespaces.mk
new file mode 100644
index 000000000..f91378057
--- /dev/null
+++ b/tests/libs/Android.build.linker_namespaces.mk
@@ -0,0 +1,84 @@
+#
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# -----------------------------------------------------------------------------
+# This set of libraries are used to verify linker namespaces.
+# -----------------------------------------------------------------------------
+
+# -----------------------------------------------------------------------------
+# Test cases
+# 1. Check that private libraries loaded in different namespaces are
+# different. Check that dlsym does not confuse them.
+# 2. Check that public libraries loaded in different namespaces are shared
+# between them.
+# 3. Check that namespace sticks on dlopen
+#
+# Dependency tree (visibility)
+# libnstest_root.so (this should be local to the namespace)
+# +-> libnstest_public.so
+# +-> libnstest_private.so
+#
+# libnstest_dlopened.so (library in private namespace dlopened from libnstest_root.so)
+# -----------------------------------------------------------------------------
+libnstest_root_src_files := namespaces_root.cpp
+libnstest_root_shared_libraries := libnstest_public libnstest_private
+libnstest_root_install_to_out_data_dir := private_namespace_libs
+module := libnstest_root
+include $(LOCAL_PATH)/Android.build.target.testlib.mk
+
+libnstest_public_src_files := namespaces_public.cpp
+module := libnstest_public
+libnstest_public_install_to_out_data_dir := public_namespace_libs
+include $(LOCAL_PATH)/Android.build.target.testlib.mk
+
+libnstest_private_src_files := namespaces_private.cpp
+libnstest_private_install_to_out_data_dir := private_namespace_libs
+module := libnstest_private
+include $(LOCAL_PATH)/Android.build.target.testlib.mk
+
+libnstest_dlopened_src_files := namespaces_dlopened.cpp
+libnstest_dlopened_install_to_out_data_dir := private_namespace_libs
+module := libnstest_dlopened
+include $(LOCAL_PATH)/Android.build.target.testlib.mk
+
+# -----------------------------------------------------------------------------
+# This set of libraries is to test isolated namespaces
+#
+# Isolated namespaces do not allow loading of the library outside of
+# the search paths.
+#
+# This library cannot be loaded in isolated namespace because one of DT_NEEDED
+# libraries is outside of the search paths.
+#
+# libnstest_root_not_isolated.so (DT_RUNPATH = $ORIGIN/../private_namespace_libs_external/)
+# +-> libnstest_public.so
+# +-> libnstest_private_external.so (located in $ORIGIN/../private_namespace_libs_external/)
+#
+# Search path: $NATIVE_TESTS/private_namespace_libs/
+# -----------------------------------------------------------------------------
+libnstest_root_not_isolated_src_files := namespaces_root.cpp
+libnstest_root_not_isolated_shared_libraries := libnstest_public libnstest_private_external
+libnstest_root_not_isolated_install_to_out_data_dir := private_namespace_libs
+libnstest_root_not_isolated_ldflags := -Wl,--rpath,\$$ORIGIN/../private_namespace_libs_external \
+ -Wl,--enable-new-dtags
+
+module := libnstest_root_not_isolated
+include $(LOCAL_PATH)/Android.build.target.testlib.mk
+
+libnstest_private_external_src_files := namespaces_private.cpp
+libnstest_private_external_install_to_out_data_dir := private_namespace_libs_external
+module := libnstest_private_external
+include $(LOCAL_PATH)/Android.build.target.testlib.mk
diff --git a/tests/libs/Android.build.target.testlib.mk b/tests/libs/Android.build.target.testlib.mk
new file mode 100644
index 000000000..1e767c2c1
--- /dev/null
+++ b/tests/libs/Android.build.target.testlib.mk
@@ -0,0 +1,20 @@
+#
+# Copyright (C) 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+build_target := SHARED_LIBRARY
+build_type := target
+include $(TEST_PATH)/Android.build.mk
+
diff --git a/tests/libs/Android.mk b/tests/libs/Android.mk
index 5b9630625..506d6f280 100644
--- a/tests/libs/Android.mk
+++ b/tests/libs/Android.mk
@@ -17,14 +17,16 @@
LOCAL_PATH := $(call my-dir)
TEST_PATH := $(LOCAL_PATH)/..
-common_cppflags += -std=gnu++11
+common_cppflags :=
common_additional_dependencies := \
$(LOCAL_PATH)/Android.mk \
+ $(LOCAL_PATH)/Android.build.dt_runpath.mk \
$(LOCAL_PATH)/Android.build.dlext_testzip.mk \
$(LOCAL_PATH)/Android.build.dlopen_2_parents_reloc.mk \
$(LOCAL_PATH)/Android.build.dlopen_check_order_dlsym.mk \
$(LOCAL_PATH)/Android.build.dlopen_check_order_reloc_siblings.mk \
$(LOCAL_PATH)/Android.build.dlopen_check_order_reloc_main_executable.mk \
+ $(LOCAL_PATH)/Android.build.linker_namespaces.mk \
$(LOCAL_PATH)/Android.build.pthread_atfork.mk \
$(LOCAL_PATH)/Android.build.testlib.mk \
$(LOCAL_PATH)/Android.build.versioned_lib.mk \
@@ -102,6 +104,8 @@ libdlext_test_norelro_src_files := \
libdlext_test_norelro_ldflags := \
-Wl,-z,norelro \
+libdlext_test_norelro_shared_libraries := libtest_simple
+
module := libdlext_test_norelro
module_tag := optional
build_type := target
@@ -114,6 +118,8 @@ include $(TEST_PATH)/Android.build.mk
libdlext_test_fd_src_files := \
dlext_test_library.cpp \
+libdlext_test_fd_shared_libraries := libtest_simple
+
libdlext_test_fd_install_to_out_data := true
module := libdlext_test_fd
module_tag := optional
@@ -121,6 +127,32 @@ build_type := target
build_target := SHARED_LIBRARY
include $(TEST_PATH)/Android.build.mk
+
+# -----------------------------------------------------------------------------
+# Libraries used by dlext tests for open from a zip-file
+# -----------------------------------------------------------------------------
+libdlext_test_zip_src_files := \
+ dlext_test_library.cpp \
+
+libdlext_test_zip_shared_libraries := libatest_simple_zip
+
+libdlext_test_zip_install_to_out_data := true
+module := libdlext_test_zip
+module_tag := optional
+build_type := target
+build_target := SHARED_LIBRARY
+include $(TEST_PATH)/Android.build.mk
+
+libatest_simple_zip_src_files := \
+ dlopen_testlib_simple.cpp
+
+libatest_simple_zip_install_to_out_data := true
+module := libatest_simple_zip
+module_tag := optional
+build_type := target
+build_target := SHARED_LIBRARY
+include $(TEST_PATH)/Android.build.mk
+
# ----------------------------------------------------------------------------
# Library with soname which does not match filename
# ----------------------------------------------------------------------------
@@ -182,6 +214,16 @@ module := libtest_nodelete_dt_flags_1
include $(LOCAL_PATH)/Android.build.testlib.mk
# -----------------------------------------------------------------------------
+# Build test helper libraries for linker namespaces
+# -----------------------------------------------------------------------------
+include $(LOCAL_PATH)/Android.build.linker_namespaces.mk
+
+# -----------------------------------------------------------------------------
+# Build DT_RUNPATH test helper libraries
+# -----------------------------------------------------------------------------
+include $(LOCAL_PATH)/Android.build.dt_runpath.mk
+
+# -----------------------------------------------------------------------------
# Build library with two parents
# -----------------------------------------------------------------------------
include $(LOCAL_PATH)/Android.build.dlopen_2_parents_reloc.mk
@@ -444,3 +486,18 @@ libtest_dlopen_from_ctor_main_shared_libraries := libtest_dlopen_from_ctor
module := libtest_dlopen_from_ctor_main
include $(LOCAL_PATH)/Android.build.testlib.mk
+
+# -----------------------------------------------------------------------------
+# Tool to use to align the shared libraries in a zip file.
+# -----------------------------------------------------------------------------
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := bionic_tests_zipalign.cpp
+LOCAL_MODULE := bionic_tests_zipalign
+LOCAL_CFLAGS := -Wall -Werror
+
+LOCAL_STATIC_LIBRARIES := libziparchive-host liblog libbase libz libutils
+
+LOCAL_MODULE_HOST_OS := darwin linux windows
+
+include $(BUILD_HOST_EXECUTABLE)
diff --git a/tests/libs/bionic_tests_zipalign.cpp b/tests/libs/bionic_tests_zipalign.cpp
new file mode 100644
index 000000000..a72820f64
--- /dev/null
+++ b/tests/libs/bionic_tests_zipalign.cpp
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include <ziparchive/zip_archive.h>
+#include <ziparchive/zip_archive_stream_entry.h>
+#include <ziparchive/zip_writer.h>
+
+static void usage() {
+ fprintf(stderr, "usage: bionic_tests_zipalign ALIGNMENT INPUT_ZIP_FILE OUTPUT_ZIP_FILE\n");
+ fprintf(stderr, " ALIGNMENT:\n");
+ fprintf(stderr, " The new alignment of all entries in the new zip file.\n");
+ fprintf(stderr, " INPUT_ZIP_FILE:\n");
+ fprintf(stderr, " The input zip file that will be read but left unmodified.\n");
+ fprintf(stderr, " OUTPUT_ZIP_FILE:\n");
+ fprintf(stderr, " The output zip file that will be created from the input file.\n");
+}
+
+typedef std::pair<ZipEntry*, ZipString*> ZipData;
+
+static bool GetEntries(ZipArchiveHandle handle, std::vector<ZipData>* entries) {
+ void* cookie;
+ int32_t return_value = StartIteration(handle, &cookie, nullptr, nullptr);
+ if (return_value != 0) {
+ fprintf(stderr, "Unable to iterate over entries: %s\n", ErrorCodeString(return_value));
+ return false;
+ }
+
+ ZipEntry entry;
+ ZipString name;
+ while ((return_value = Next(cookie, &entry, &name)) == 0) {
+ entries->push_back(std::make_pair(new ZipEntry(entry), new ZipString(name)));
+ }
+ if (return_value != -1) {
+ fprintf(stderr, "Error while iterating over zip entries: %s\n", ErrorCodeString(return_value));
+ } else {
+ // Sort by offset.
+ std::sort(entries->begin(), entries->end(),
+ [](ZipData a, ZipData b) { return a.first->offset < b.first->offset; });
+ }
+
+ EndIteration(cookie);
+ return return_value == -1;
+}
+
+static bool CreateAlignedZip(ZipArchiveHandle& handle, FILE* zip_dst, uint32_t alignment) {
+ std::vector<ZipData> entries;
+ // We will not free the memory created in entries since the program
+ // terminates right after this function is called.
+ if (!GetEntries(handle, &entries)) {
+ return false;
+ }
+
+ ZipWriter writer(zip_dst);
+
+ int32_t error;
+ for (auto& entry : entries) {
+ ZipEntry* zip_entry = entry.first;
+ ZipString* zip_str = entry.second;
+
+ size_t flags = 0;
+ if ((zip_entry->method & kCompressDeflated) != 0) {
+ flags |= ZipWriter::kCompress;
+ }
+ std::string zip_name(reinterpret_cast<const char*>(zip_str->name), zip_str->name_length);
+ error = writer.StartAlignedEntry(zip_name.c_str(), flags, alignment);
+ if (error != 0) {
+ fprintf(stderr, "StartAlignedEntry failed: %s\n", ZipWriter::ErrorCodeString(error));
+ return false;
+ }
+ std::unique_ptr<ZipArchiveStreamEntry> stream(
+ ZipArchiveStreamEntry::Create(handle, *zip_entry));
+ const std::vector<uint8_t>* data;
+ while ((data = stream->Read()) != nullptr) {
+ error = writer.WriteBytes(data->data(), data->size());
+ if (error != 0) {
+ fprintf(stderr, "WriteBytes failed: %s\n", ZipWriter::ErrorCodeString(error));
+ return false;
+ }
+ }
+ if (!stream->Verify()) {
+ fprintf(stderr, "Failed to verify zip stream writer entry.\n");
+ return false;
+ }
+ error = writer.FinishEntry();
+ if (error != 0) {
+ fprintf(stderr, "FinishEntry failed: %s\n", ZipWriter::ErrorCodeString(error));
+ }
+ }
+
+ error = writer.Finish();
+ if (error != 0) {
+ fprintf(stderr, "Finish failed: %s\n", ZipWriter::ErrorCodeString(error));
+ return false;
+ }
+ return true;
+}
+
+int main(int argc, char* argv[]) {
+ if (argc != 4) {
+ usage();
+ return 1;
+ }
+
+ char* end;
+ unsigned long int alignment = strtoul(argv[1], &end, 10);
+ if ((alignment == ULONG_MAX && errno == ERANGE) || *end != '\0') {
+ fprintf(stderr, "ALIGNMENT value is not a valid number: %s\n", argv[1]);
+ usage();
+ return 1;
+ }
+ if (((alignment - 1) & alignment) != 0) {
+ fprintf(stderr, "ALIGNMENT value is not a power of 2: %s\n", argv[1]);
+ return 1;
+ }
+
+ ZipArchiveHandle handle;
+
+ int32_t return_value = OpenArchive(argv[2], &handle);
+ if (return_value != 0) {
+ CloseArchive(handle);
+ fprintf(stderr, "Unable to open '%s': %s\n", argv[2], ErrorCodeString(return_value));
+ return false;
+ }
+
+ FILE* zip_dst = fopen(argv[3], "we");
+ if (zip_dst == nullptr) {
+ fprintf(stderr, "Unable to create '%s': %s\n", argv[3], strerror(errno));
+ return 1;
+ }
+
+ bool success = CreateAlignedZip(handle, zip_dst, static_cast<uint32_t>(alignment));
+
+ CloseArchive(handle);
+ fclose(zip_dst);
+
+ return success ? 0 : 1;
+}
diff --git a/tests/libs/dlopen_b.cpp b/tests/libs/dlopen_b.cpp
new file mode 100644
index 000000000..cd81e16c1
--- /dev/null
+++ b/tests/libs/dlopen_b.cpp
@@ -0,0 +1,16 @@
+#include <dlfcn.h>
+extern "C" void *dlopen_b() {
+ // TODO (dimitry): this is to work around http://b/20049306
+ // remove once it is fixed
+ static int dummy = 0;
+
+ // This is supposed to succeed because this library has DT_RUNPATH
+ // for libtest_dt_runpath_x.so which should be taken into account
+ // by dlopen.
+ void *handle = dlopen("libtest_dt_runpath_x.so", RTLD_NOW);
+ if (handle != nullptr) {
+ dummy++;
+ return handle;
+ }
+ return nullptr;
+}
diff --git a/tests/libs/namespaces_dlopened.cpp b/tests/libs/namespaces_dlopened.cpp
new file mode 100644
index 000000000..9d11689c4
--- /dev/null
+++ b/tests/libs/namespaces_dlopened.cpp
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const char* g_private_dlopened_string = "This string is from private namespace "
+ "(dlopened library)";
+
diff --git a/tests/libs/namespaces_private.cpp b/tests/libs/namespaces_private.cpp
new file mode 100644
index 000000000..07cab70ce
--- /dev/null
+++ b/tests/libs/namespaces_private.cpp
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const char* g_private_extern_string = "This string is from private namespace";
+
diff --git a/tests/libs/namespaces_public.cpp b/tests/libs/namespaces_public.cpp
new file mode 100644
index 000000000..bb2a8de68
--- /dev/null
+++ b/tests/libs/namespaces_public.cpp
@@ -0,0 +1,18 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const char* g_public_extern_string = "This string is from public namespace";
+
diff --git a/tests/libs/namespaces_root.cpp b/tests/libs/namespaces_root.cpp
new file mode 100644
index 000000000..b0006c7e5
--- /dev/null
+++ b/tests/libs/namespaces_root.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <dlfcn.h>
+
+static const char* g_local_string = "This string is local to root library";
+extern "C" const char* g_private_extern_string;
+extern "C" const char* g_public_extern_string;
+
+bool g_dlopened = false;
+
+extern "C" const char* ns_get_local_string() {
+ return g_local_string;
+}
+
+extern "C" const char* ns_get_private_extern_string() {
+ return g_private_extern_string;
+}
+
+extern "C" const char* ns_get_public_extern_string() {
+ return g_public_extern_string;
+}
+
+extern "C" const char* ns_get_dlopened_string() {
+ void* handle = dlopen("libnstest_dlopened.so", RTLD_NOW | RTLD_GLOBAL);
+ if (handle == nullptr) {
+ return nullptr;
+ }
+
+ const char** result = static_cast<const char**>(dlsym(handle, "g_private_dlopened_string"));
+ if (result == nullptr) {
+ return nullptr;
+ } else {
+ g_dlopened = true;
+ }
+
+ return *result;
+}
diff --git a/tests/malloc_test.cpp b/tests/malloc_test.cpp
index b76625a7a..8fba1c449 100644
--- a/tests/malloc_test.cpp
+++ b/tests/malloc_test.cpp
@@ -372,3 +372,131 @@ TEST(malloc, malloc_info) {
}
#endif
}
+
+TEST(malloc, calloc_usable_size) {
+ for (size_t size = 1; size <= 2048; size++) {
+ void* pointer = malloc(size);
+ ASSERT_TRUE(pointer != nullptr);
+ memset(pointer, 0xeb, malloc_usable_size(pointer));
+ free(pointer);
+
+ // We should get a previous pointer that has been set to non-zero.
+ // If calloc does not zero out all of the data, this will fail.
+ uint8_t* zero_mem = reinterpret_cast<uint8_t*>(calloc(1, size));
+ ASSERT_TRUE(pointer != nullptr);
+ size_t usable_size = malloc_usable_size(zero_mem);
+ for (size_t i = 0; i < usable_size; i++) {
+ ASSERT_EQ(0, zero_mem[i]) << "Failed at allocation size " << size << " at byte " << i;
+ }
+ free(zero_mem);
+ }
+}
+
+TEST(malloc, malloc_0) {
+ void* p = malloc(0);
+ ASSERT_TRUE(p != nullptr);
+ free(p);
+}
+
+TEST(malloc, calloc_0_0) {
+ void* p = calloc(0, 0);
+ ASSERT_TRUE(p != nullptr);
+ free(p);
+}
+
+TEST(malloc, calloc_0_1) {
+ void* p = calloc(0, 1);
+ ASSERT_TRUE(p != nullptr);
+ free(p);
+}
+
+TEST(malloc, calloc_1_0) {
+ void* p = calloc(1, 0);
+ ASSERT_TRUE(p != nullptr);
+ free(p);
+}
+
+TEST(malloc, realloc_nullptr_0) {
+ // realloc(nullptr, size) is actually malloc(size).
+ void* p = realloc(nullptr, 0);
+ ASSERT_TRUE(p != nullptr);
+ free(p);
+}
+
+TEST(malloc, realloc_0) {
+ void* p = malloc(1024);
+ ASSERT_TRUE(p != nullptr);
+ // realloc(p, 0) is actually free(p).
+ void* p2 = realloc(p, 0);
+ ASSERT_TRUE(p2 == nullptr);
+}
+
+constexpr size_t MAX_LOOPS = 200;
+
+// Make sure that memory returned by malloc is aligned to allow these data types.
+TEST(malloc, verify_alignment) {
+ uint32_t** values_32 = new uint32_t*[MAX_LOOPS];
+ uint64_t** values_64 = new uint64_t*[MAX_LOOPS];
+ long double** values_ldouble = new long double*[MAX_LOOPS];
+ // Use filler to attempt to force the allocator to get potentially bad alignments.
+ void** filler = new void*[MAX_LOOPS];
+
+ for (size_t i = 0; i < MAX_LOOPS; i++) {
+ // Check uint32_t pointers.
+ filler[i] = malloc(1);
+ ASSERT_TRUE(filler[i] != nullptr);
+
+ values_32[i] = reinterpret_cast<uint32_t*>(malloc(sizeof(uint32_t)));
+ ASSERT_TRUE(values_32[i] != nullptr);
+ *values_32[i] = i;
+ ASSERT_EQ(*values_32[i], i);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_32[i]) & (sizeof(uint32_t) - 1));
+
+ free(filler[i]);
+ }
+
+ for (size_t i = 0; i < MAX_LOOPS; i++) {
+ // Check uint64_t pointers.
+ filler[i] = malloc(1);
+ ASSERT_TRUE(filler[i] != nullptr);
+
+ values_64[i] = reinterpret_cast<uint64_t*>(malloc(sizeof(uint64_t)));
+ ASSERT_TRUE(values_64[i] != nullptr);
+ *values_64[i] = 0x1000 + i;
+ ASSERT_EQ(*values_64[i], 0x1000 + i);
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_64[i]) & (sizeof(uint64_t) - 1));
+
+ free(filler[i]);
+ }
+
+ for (size_t i = 0; i < MAX_LOOPS; i++) {
+ // Check long double pointers.
+ filler[i] = malloc(1);
+ ASSERT_TRUE(filler[i] != nullptr);
+
+ values_ldouble[i] = reinterpret_cast<long double*>(malloc(sizeof(long double)));
+ ASSERT_TRUE(values_ldouble[i] != nullptr);
+ *values_ldouble[i] = 5.5 + i;
+ ASSERT_DOUBLE_EQ(*values_ldouble[i], 5.5 + i);
+ // 32 bit glibc has a long double size of 12 bytes, so hardcode the
+ // required alignment to 0x7.
+#if !defined(__BIONIC__) && !defined(__LP64__)
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & 0x7);
+#else
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(values_ldouble[i]) & (sizeof(long double) - 1));
+#endif
+
+ free(filler[i]);
+ }
+
+ for (size_t i = 0; i < MAX_LOOPS; i++) {
+ free(values_32[i]);
+ free(values_64[i]);
+ free(values_ldouble[i]);
+ }
+
+ delete[] filler;
+ delete[] values_32;
+ delete[] values_64;
+ delete[] values_ldouble;
+}
diff --git a/tests/math_data/llrint_intel_data.h b/tests/math_data/llrint_intel_data.h
new file mode 100644
index 000000000..a6861c294
--- /dev/null
+++ b/tests/math_data/llrint_intel_data.h
@@ -0,0 +1,1242 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+static data_llong_1_t<double> g_llrint_intel_data[] = {
+ { // Entry 0
+ (long long int)0.0,
+ -0x1.0p-1074
+ },
+ { // Entry 1
+ (long long int)0.0,
+ -0.0
+ },
+ { // Entry 2
+ (long long int)0.0,
+ 0x1.0p-1074
+ },
+ { // Entry 3
+ (long long int)0.0,
+ 0x1.fffffffffffffp-2
+ },
+ { // Entry 4
+ (long long int)0.0,
+ 0x1.0p-1
+ },
+ { // Entry 5
+ (long long int)0x1.p0,
+ 0x1.0000000000001p-1
+ },
+ { // Entry 6
+ (long long int)0x1.p0,
+ 0x1.fffffffffffffp-1
+ },
+ { // Entry 7
+ (long long int)0x1.p0,
+ 0x1.0p0
+ },
+ { // Entry 8
+ (long long int)0x1.p0,
+ 0x1.0000000000001p0
+ },
+ { // Entry 9
+ (long long int)0x1.p0,
+ 0x1.7ffffffffffffp0
+ },
+ { // Entry 10
+ (long long int)0x1.p1,
+ 0x1.8p0
+ },
+ { // Entry 11
+ (long long int)0x1.p1,
+ 0x1.8000000000001p0
+ },
+ { // Entry 12
+ (long long int)0x1.p1,
+ 0x1.fffffffffffffp0
+ },
+ { // Entry 13
+ (long long int)0x1.p1,
+ 0x1.0p1
+ },
+ { // Entry 14
+ (long long int)0x1.p1,
+ 0x1.0000000000001p1
+ },
+ { // Entry 15
+ (long long int)0x1.p1,
+ 0x1.3ffffffffffffp1
+ },
+ { // Entry 16
+ (long long int)0x1.p1,
+ 0x1.4p1
+ },
+ { // Entry 17
+ (long long int)0x1.80p1,
+ 0x1.4000000000001p1
+ },
+ { // Entry 18
+ (long long int)0x1.90p6,
+ 0x1.8ffffffffffffp6
+ },
+ { // Entry 19
+ (long long int)0x1.90p6,
+ 0x1.9p6
+ },
+ { // Entry 20
+ (long long int)0x1.90p6,
+ 0x1.9000000000001p6
+ },
+ { // Entry 21
+ (long long int)0x1.90p6,
+ 0x1.91fffffffffffp6
+ },
+ { // Entry 22
+ (long long int)0x1.90p6,
+ 0x1.920p6
+ },
+ { // Entry 23
+ (long long int)0x1.94p6,
+ 0x1.9200000000001p6
+ },
+ { // Entry 24
+ (long long int)0x1.f4p9,
+ 0x1.f3fffffffffffp9
+ },
+ { // Entry 25
+ (long long int)0x1.f4p9,
+ 0x1.f40p9
+ },
+ { // Entry 26
+ (long long int)0x1.f4p9,
+ 0x1.f400000000001p9
+ },
+ { // Entry 27
+ (long long int)0x1.f4p9,
+ 0x1.f43ffffffffffp9
+ },
+ { // Entry 28
+ (long long int)0x1.f4p9,
+ 0x1.f44p9
+ },
+ { // Entry 29
+ (long long int)0x1.f480p9,
+ 0x1.f440000000001p9
+ },
+ { // Entry 30
+ (long long int)0x1.p50,
+ 0x1.fffffffffffffp49
+ },
+ { // Entry 31
+ (long long int)0x1.p50,
+ 0x1.0p50
+ },
+ { // Entry 32
+ (long long int)0x1.p50,
+ 0x1.0000000000001p50
+ },
+ { // Entry 33
+ (long long int)0x1.p51,
+ 0x1.fffffffffffffp50
+ },
+ { // Entry 34
+ (long long int)0x1.p51,
+ 0x1.0p51
+ },
+ { // Entry 35
+ (long long int)0x1.p51,
+ 0x1.0000000000001p51
+ },
+ { // Entry 36
+ (long long int)0x1.p52,
+ 0x1.fffffffffffffp51
+ },
+ { // Entry 37
+ (long long int)0x1.p52,
+ 0x1.0p52
+ },
+ { // Entry 38
+ (long long int)0x1.00000000000010p52,
+ 0x1.0000000000001p52
+ },
+ { // Entry 39
+ (long long int)0x1.fffffffffffff0p52,
+ 0x1.fffffffffffffp52
+ },
+ { // Entry 40
+ (long long int)0x1.p53,
+ 0x1.0p53
+ },
+ { // Entry 41
+ (long long int)0x1.00000000000010p53,
+ 0x1.0000000000001p53
+ },
+ { // Entry 42
+ (long long int)0x1.fffffffffffff0p53,
+ 0x1.fffffffffffffp53
+ },
+ { // Entry 43
+ (long long int)0x1.p54,
+ 0x1.0p54
+ },
+ { // Entry 44
+ (long long int)0x1.00000000000010p54,
+ 0x1.0000000000001p54
+ },
+ { // Entry 45
+ (long long int)-0x1.p0,
+ -0x1.0000000000001p-1
+ },
+ { // Entry 46
+ (long long int)0.0,
+ -0x1.0p-1
+ },
+ { // Entry 47
+ (long long int)0.0,
+ -0x1.fffffffffffffp-2
+ },
+ { // Entry 48
+ (long long int)-0x1.p0,
+ -0x1.0000000000001p0
+ },
+ { // Entry 49
+ (long long int)-0x1.p0,
+ -0x1.0p0
+ },
+ { // Entry 50
+ (long long int)-0x1.p0,
+ -0x1.fffffffffffffp-1
+ },
+ { // Entry 51
+ (long long int)-0x1.p1,
+ -0x1.8000000000001p0
+ },
+ { // Entry 52
+ (long long int)-0x1.p1,
+ -0x1.8p0
+ },
+ { // Entry 53
+ (long long int)-0x1.p0,
+ -0x1.7ffffffffffffp0
+ },
+ { // Entry 54
+ (long long int)-0x1.p1,
+ -0x1.0000000000001p1
+ },
+ { // Entry 55
+ (long long int)-0x1.p1,
+ -0x1.0p1
+ },
+ { // Entry 56
+ (long long int)-0x1.p1,
+ -0x1.fffffffffffffp0
+ },
+ { // Entry 57
+ (long long int)-0x1.80p1,
+ -0x1.4000000000001p1
+ },
+ { // Entry 58
+ (long long int)-0x1.p1,
+ -0x1.4p1
+ },
+ { // Entry 59
+ (long long int)-0x1.p1,
+ -0x1.3ffffffffffffp1
+ },
+ { // Entry 60
+ (long long int)-0x1.90p6,
+ -0x1.9000000000001p6
+ },
+ { // Entry 61
+ (long long int)-0x1.90p6,
+ -0x1.9p6
+ },
+ { // Entry 62
+ (long long int)-0x1.90p6,
+ -0x1.8ffffffffffffp6
+ },
+ { // Entry 63
+ (long long int)-0x1.94p6,
+ -0x1.9200000000001p6
+ },
+ { // Entry 64
+ (long long int)-0x1.90p6,
+ -0x1.920p6
+ },
+ { // Entry 65
+ (long long int)-0x1.90p6,
+ -0x1.91fffffffffffp6
+ },
+ { // Entry 66
+ (long long int)-0x1.f4p9,
+ -0x1.f400000000001p9
+ },
+ { // Entry 67
+ (long long int)-0x1.f4p9,
+ -0x1.f40p9
+ },
+ { // Entry 68
+ (long long int)-0x1.f4p9,
+ -0x1.f3fffffffffffp9
+ },
+ { // Entry 69
+ (long long int)-0x1.f480p9,
+ -0x1.f440000000001p9
+ },
+ { // Entry 70
+ (long long int)-0x1.f4p9,
+ -0x1.f44p9
+ },
+ { // Entry 71
+ (long long int)-0x1.f4p9,
+ -0x1.f43ffffffffffp9
+ },
+ { // Entry 72
+ (long long int)-0x1.p50,
+ -0x1.0000000000001p50
+ },
+ { // Entry 73
+ (long long int)-0x1.p50,
+ -0x1.0p50
+ },
+ { // Entry 74
+ (long long int)-0x1.p50,
+ -0x1.fffffffffffffp49
+ },
+ { // Entry 75
+ (long long int)-0x1.p51,
+ -0x1.0000000000001p51
+ },
+ { // Entry 76
+ (long long int)-0x1.p51,
+ -0x1.0p51
+ },
+ { // Entry 77
+ (long long int)-0x1.p51,
+ -0x1.fffffffffffffp50
+ },
+ { // Entry 78
+ (long long int)-0x1.00000000000010p52,
+ -0x1.0000000000001p52
+ },
+ { // Entry 79
+ (long long int)-0x1.p52,
+ -0x1.0p52
+ },
+ { // Entry 80
+ (long long int)-0x1.p52,
+ -0x1.fffffffffffffp51
+ },
+ { // Entry 81
+ (long long int)-0x1.00000000000010p53,
+ -0x1.0000000000001p53
+ },
+ { // Entry 82
+ (long long int)-0x1.p53,
+ -0x1.0p53
+ },
+ { // Entry 83
+ (long long int)-0x1.fffffffffffff0p52,
+ -0x1.fffffffffffffp52
+ },
+ { // Entry 84
+ (long long int)-0x1.00000000000010p54,
+ -0x1.0000000000001p54
+ },
+ { // Entry 85
+ (long long int)-0x1.p54,
+ -0x1.0p54
+ },
+ { // Entry 86
+ (long long int)-0x1.fffffffffffff0p53,
+ -0x1.fffffffffffffp53
+ },
+ { // Entry 87
+ (long long int)0x1.p30,
+ 0x1.fffffffffffffp29
+ },
+ { // Entry 88
+ (long long int)0x1.p30,
+ 0x1.0p30
+ },
+ { // Entry 89
+ (long long int)0x1.p30,
+ 0x1.0000000000001p30
+ },
+ { // Entry 90
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff7ffffep30
+ },
+ { // Entry 91
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff7fffffp30
+ },
+ { // Entry 92
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff80p30
+ },
+ { // Entry 93
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff800001p30
+ },
+ { // Entry 94
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff800002p30
+ },
+ { // Entry 95
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff9ffffep30
+ },
+ { // Entry 96
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff9fffffp30
+ },
+ { // Entry 97
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffffa0p30
+ },
+ { // Entry 98
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffa00001p30
+ },
+ { // Entry 99
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffa00002p30
+ },
+ { // Entry 100
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffbffffep30
+ },
+ { // Entry 101
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffbfffffp30
+ },
+ { // Entry 102
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffc0p30
+ },
+ { // Entry 103
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffc00001p30
+ },
+ { // Entry 104
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffc00002p30
+ },
+ { // Entry 105
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffdffffep30
+ },
+ { // Entry 106
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffdfffffp30
+ },
+ { // Entry 107
+ (long long int)0x1.p31,
+ 0x1.fffffffe0p30
+ },
+ { // Entry 108
+ (long long int)0x1.p31,
+ 0x1.fffffffe00001p30
+ },
+ { // Entry 109
+ (long long int)0x1.p31,
+ 0x1.fffffffe00002p30
+ },
+ { // Entry 110
+ (long long int)0x1.p31,
+ 0x1.ffffffffffffep30
+ },
+ { // Entry 111
+ (long long int)0x1.p31,
+ 0x1.fffffffffffffp30
+ },
+ { // Entry 112
+ (long long int)0x1.p31,
+ 0x1.0p31
+ },
+ { // Entry 113
+ (long long int)0x1.p31,
+ 0x1.0000000000001p31
+ },
+ { // Entry 114
+ (long long int)0x1.p31,
+ 0x1.0000000000002p31
+ },
+ { // Entry 115
+ (long long int)0x1.p31,
+ 0x1.00000000ffffep31
+ },
+ { // Entry 116
+ (long long int)0x1.p31,
+ 0x1.00000000fffffp31
+ },
+ { // Entry 117
+ (long long int)0x1.p31,
+ 0x1.000000010p31
+ },
+ { // Entry 118
+ (long long int)0x1.00000002p31,
+ 0x1.0000000100001p31
+ },
+ { // Entry 119
+ (long long int)0x1.00000002p31,
+ 0x1.0000000100002p31
+ },
+ { // Entry 120
+ (long long int)0x1.ffffffe0p30,
+ 0x1.ffffffep30
+ },
+ { // Entry 121
+ (long long int)0x1.ffffffe4p30,
+ 0x1.ffffffe40p30
+ },
+ { // Entry 122
+ (long long int)0x1.ffffffe8p30,
+ 0x1.ffffffe80p30
+ },
+ { // Entry 123
+ (long long int)0x1.ffffffecp30,
+ 0x1.ffffffec0p30
+ },
+ { // Entry 124
+ (long long int)0x1.fffffff0p30,
+ 0x1.fffffffp30
+ },
+ { // Entry 125
+ (long long int)0x1.fffffff4p30,
+ 0x1.fffffff40p30
+ },
+ { // Entry 126
+ (long long int)0x1.fffffff8p30,
+ 0x1.fffffff80p30
+ },
+ { // Entry 127
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffc0p30
+ },
+ { // Entry 128
+ (long long int)0x1.p31,
+ 0x1.0p31
+ },
+ { // Entry 129
+ (long long int)0x1.00000002p31,
+ 0x1.000000020p31
+ },
+ { // Entry 130
+ (long long int)-0x1.p30,
+ -0x1.0000000000001p30
+ },
+ { // Entry 131
+ (long long int)-0x1.p30,
+ -0x1.0p30
+ },
+ { // Entry 132
+ (long long int)-0x1.p30,
+ -0x1.fffffffffffffp29
+ },
+ { // Entry 133
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffff800002p30
+ },
+ { // Entry 134
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffff800001p30
+ },
+ { // Entry 135
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffff80p30
+ },
+ { // Entry 136
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffff7fffffp30
+ },
+ { // Entry 137
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffff7ffffep30
+ },
+ { // Entry 138
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffa00002p30
+ },
+ { // Entry 139
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffa00001p30
+ },
+ { // Entry 140
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffffa0p30
+ },
+ { // Entry 141
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffff9fffffp30
+ },
+ { // Entry 142
+ (long long int)-0x1.fffffff8p30,
+ -0x1.fffffff9ffffep30
+ },
+ { // Entry 143
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffc00002p30
+ },
+ { // Entry 144
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffc00001p30
+ },
+ { // Entry 145
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffc0p30
+ },
+ { // Entry 146
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffbfffffp30
+ },
+ { // Entry 147
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffbffffep30
+ },
+ { // Entry 148
+ (long long int)-0x1.p31,
+ -0x1.fffffffe00002p30
+ },
+ { // Entry 149
+ (long long int)-0x1.p31,
+ -0x1.fffffffe00001p30
+ },
+ { // Entry 150
+ (long long int)-0x1.p31,
+ -0x1.fffffffe0p30
+ },
+ { // Entry 151
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffdfffffp30
+ },
+ { // Entry 152
+ (long long int)-0x1.fffffffcp30,
+ -0x1.fffffffdffffep30
+ },
+ { // Entry 153
+ (long long int)-0x1.p31,
+ -0x1.0000000000002p31
+ },
+ { // Entry 154
+ (long long int)-0x1.p31,
+ -0x1.0000000000001p31
+ },
+ { // Entry 155
+ (long long int)-0x1.p31,
+ -0x1.0p31
+ },
+ { // Entry 156
+ (long long int)-0x1.p31,
+ -0x1.fffffffffffffp30
+ },
+ { // Entry 157
+ (long long int)-0x1.p31,
+ -0x1.ffffffffffffep30
+ },
+ { // Entry 158
+ (long long int)-0x1.00000002p31,
+ -0x1.0000000100002p31
+ },
+ { // Entry 159
+ (long long int)-0x1.00000002p31,
+ -0x1.0000000100001p31
+ },
+ { // Entry 160
+ (long long int)-0x1.p31,
+ -0x1.000000010p31
+ },
+ { // Entry 161
+ (long long int)-0x1.p31,
+ -0x1.00000000fffffp31
+ },
+ { // Entry 162
+ (long long int)-0x1.p31,
+ -0x1.00000000ffffep31
+ },
+ { // Entry 163
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 164
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 165
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 166
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 167
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 168
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 169
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 170
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 171
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 172
+ (long long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 173
+ (long long int)0x1.ffffffffffffe0p61,
+ 0x1.ffffffffffffep61
+ },
+ { // Entry 174
+ (long long int)0x1.fffffffffffff0p61,
+ 0x1.fffffffffffffp61
+ },
+ { // Entry 175
+ (long long int)0x1.p62,
+ 0x1.0p62
+ },
+ { // Entry 176
+ (long long int)0x1.00000000000010p62,
+ 0x1.0000000000001p62
+ },
+ { // Entry 177
+ (long long int)0x1.00000000000020p62,
+ 0x1.0000000000002p62
+ },
+ { // Entry 178
+ (long long int)0x1.ffffffffffffe0p62,
+ 0x1.ffffffffffffep62
+ },
+ { // Entry 179
+ (long long int)0x1.fffffffffffff0p62,
+ 0x1.fffffffffffffp62
+ },
+ { // Entry 180
+ (long long int)-0x1.00000000000020p62,
+ -0x1.0000000000002p62
+ },
+ { // Entry 181
+ (long long int)-0x1.00000000000010p62,
+ -0x1.0000000000001p62
+ },
+ { // Entry 182
+ (long long int)-0x1.p62,
+ -0x1.0p62
+ },
+ { // Entry 183
+ (long long int)-0x1.fffffffffffff0p61,
+ -0x1.fffffffffffffp61
+ },
+ { // Entry 184
+ (long long int)-0x1.ffffffffffffe0p61,
+ -0x1.ffffffffffffep61
+ },
+ { // Entry 185
+ (long long int)-0x1.p63,
+ -0x1.0p63
+ },
+ { // Entry 186
+ (long long int)-0x1.fffffffffffff0p62,
+ -0x1.fffffffffffffp62
+ },
+ { // Entry 187
+ (long long int)-0x1.ffffffffffffe0p62,
+ -0x1.ffffffffffffep62
+ },
+ { // Entry 188
+ (long long int)0x1.p62,
+ 0x1.0p62
+ },
+ { // Entry 189
+ (long long int)-0x1.p62,
+ -0x1.0p62
+ },
+ { // Entry 190
+ (long long int)-0x1.p63,
+ -0x1.0p63
+ },
+ { // Entry 191
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffbfffffp30
+ },
+ { // Entry 192
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffc0p30
+ },
+ { // Entry 193
+ (long long int)0x1.fffffffcp30,
+ 0x1.fffffffc00001p30
+ },
+ { // Entry 194
+ (long long int)-0x1.p31,
+ -0x1.0000000000001p31
+ },
+ { // Entry 195
+ (long long int)-0x1.p31,
+ -0x1.0p31
+ },
+ { // Entry 196
+ (long long int)-0x1.p31,
+ -0x1.fffffffffffffp30
+ },
+ { // Entry 197
+ (long long int)0x1.p2,
+ 0x1.fffffffffffffp1
+ },
+ { // Entry 198
+ (long long int)0x1.p2,
+ 0x1.0p2
+ },
+ { // Entry 199
+ (long long int)0x1.p2,
+ 0x1.0000000000001p2
+ },
+ { // Entry 200
+ (long long int)0x1.p3,
+ 0x1.fffffffffffffp2
+ },
+ { // Entry 201
+ (long long int)0x1.p3,
+ 0x1.0p3
+ },
+ { // Entry 202
+ (long long int)0x1.p3,
+ 0x1.0000000000001p3
+ },
+ { // Entry 203
+ (long long int)0x1.p4,
+ 0x1.fffffffffffffp3
+ },
+ { // Entry 204
+ (long long int)0x1.p4,
+ 0x1.0p4
+ },
+ { // Entry 205
+ (long long int)0x1.p4,
+ 0x1.0000000000001p4
+ },
+ { // Entry 206
+ (long long int)0x1.p5,
+ 0x1.fffffffffffffp4
+ },
+ { // Entry 207
+ (long long int)0x1.p5,
+ 0x1.0p5
+ },
+ { // Entry 208
+ (long long int)0x1.p5,
+ 0x1.0000000000001p5
+ },
+ { // Entry 209
+ (long long int)0x1.p6,
+ 0x1.fffffffffffffp5
+ },
+ { // Entry 210
+ (long long int)0x1.p6,
+ 0x1.0p6
+ },
+ { // Entry 211
+ (long long int)0x1.p6,
+ 0x1.0000000000001p6
+ },
+ { // Entry 212
+ (long long int)0x1.p7,
+ 0x1.fffffffffffffp6
+ },
+ { // Entry 213
+ (long long int)0x1.p7,
+ 0x1.0p7
+ },
+ { // Entry 214
+ (long long int)0x1.p7,
+ 0x1.0000000000001p7
+ },
+ { // Entry 215
+ (long long int)0x1.p8,
+ 0x1.fffffffffffffp7
+ },
+ { // Entry 216
+ (long long int)0x1.p8,
+ 0x1.0p8
+ },
+ { // Entry 217
+ (long long int)0x1.p8,
+ 0x1.0000000000001p8
+ },
+ { // Entry 218
+ (long long int)0x1.p9,
+ 0x1.fffffffffffffp8
+ },
+ { // Entry 219
+ (long long int)0x1.p9,
+ 0x1.0p9
+ },
+ { // Entry 220
+ (long long int)0x1.p9,
+ 0x1.0000000000001p9
+ },
+ { // Entry 221
+ (long long int)0x1.p10,
+ 0x1.fffffffffffffp9
+ },
+ { // Entry 222
+ (long long int)0x1.p10,
+ 0x1.0p10
+ },
+ { // Entry 223
+ (long long int)0x1.p10,
+ 0x1.0000000000001p10
+ },
+ { // Entry 224
+ (long long int)0x1.p11,
+ 0x1.fffffffffffffp10
+ },
+ { // Entry 225
+ (long long int)0x1.p11,
+ 0x1.0p11
+ },
+ { // Entry 226
+ (long long int)0x1.p11,
+ 0x1.0000000000001p11
+ },
+ { // Entry 227
+ (long long int)0x1.p12,
+ 0x1.fffffffffffffp11
+ },
+ { // Entry 228
+ (long long int)0x1.p12,
+ 0x1.0p12
+ },
+ { // Entry 229
+ (long long int)0x1.p12,
+ 0x1.0000000000001p12
+ },
+ { // Entry 230
+ (long long int)0x1.p2,
+ 0x1.1ffffffffffffp2
+ },
+ { // Entry 231
+ (long long int)0x1.p2,
+ 0x1.2p2
+ },
+ { // Entry 232
+ (long long int)0x1.40p2,
+ 0x1.2000000000001p2
+ },
+ { // Entry 233
+ (long long int)0x1.p3,
+ 0x1.0ffffffffffffp3
+ },
+ { // Entry 234
+ (long long int)0x1.p3,
+ 0x1.1p3
+ },
+ { // Entry 235
+ (long long int)0x1.20p3,
+ 0x1.1000000000001p3
+ },
+ { // Entry 236
+ (long long int)0x1.p4,
+ 0x1.07fffffffffffp4
+ },
+ { // Entry 237
+ (long long int)0x1.p4,
+ 0x1.080p4
+ },
+ { // Entry 238
+ (long long int)0x1.10p4,
+ 0x1.0800000000001p4
+ },
+ { // Entry 239
+ (long long int)0x1.p5,
+ 0x1.03fffffffffffp5
+ },
+ { // Entry 240
+ (long long int)0x1.p5,
+ 0x1.040p5
+ },
+ { // Entry 241
+ (long long int)0x1.08p5,
+ 0x1.0400000000001p5
+ },
+ { // Entry 242
+ (long long int)0x1.p6,
+ 0x1.01fffffffffffp6
+ },
+ { // Entry 243
+ (long long int)0x1.p6,
+ 0x1.020p6
+ },
+ { // Entry 244
+ (long long int)0x1.04p6,
+ 0x1.0200000000001p6
+ },
+ { // Entry 245
+ (long long int)0x1.p7,
+ 0x1.00fffffffffffp7
+ },
+ { // Entry 246
+ (long long int)0x1.p7,
+ 0x1.010p7
+ },
+ { // Entry 247
+ (long long int)0x1.02p7,
+ 0x1.0100000000001p7
+ },
+ { // Entry 248
+ (long long int)0x1.p8,
+ 0x1.007ffffffffffp8
+ },
+ { // Entry 249
+ (long long int)0x1.p8,
+ 0x1.008p8
+ },
+ { // Entry 250
+ (long long int)0x1.01p8,
+ 0x1.0080000000001p8
+ },
+ { // Entry 251
+ (long long int)0x1.p9,
+ 0x1.003ffffffffffp9
+ },
+ { // Entry 252
+ (long long int)0x1.p9,
+ 0x1.004p9
+ },
+ { // Entry 253
+ (long long int)0x1.0080p9,
+ 0x1.0040000000001p9
+ },
+ { // Entry 254
+ (long long int)0x1.p10,
+ 0x1.001ffffffffffp10
+ },
+ { // Entry 255
+ (long long int)0x1.p10,
+ 0x1.002p10
+ },
+ { // Entry 256
+ (long long int)0x1.0040p10,
+ 0x1.0020000000001p10
+ },
+ { // Entry 257
+ (long long int)0x1.0040p10,
+ 0x1.005ffffffffffp10
+ },
+ { // Entry 258
+ (long long int)0x1.0080p10,
+ 0x1.006p10
+ },
+ { // Entry 259
+ (long long int)0x1.0080p10,
+ 0x1.0060000000001p10
+ },
+ { // Entry 260
+ (long long int)0x1.p11,
+ 0x1.000ffffffffffp11
+ },
+ { // Entry 261
+ (long long int)0x1.p11,
+ 0x1.001p11
+ },
+ { // Entry 262
+ (long long int)0x1.0020p11,
+ 0x1.0010000000001p11
+ },
+ { // Entry 263
+ (long long int)0x1.p12,
+ 0x1.0007fffffffffp12
+ },
+ { // Entry 264
+ (long long int)0x1.p12,
+ 0x1.00080p12
+ },
+ { // Entry 265
+ (long long int)0x1.0010p12,
+ 0x1.0008000000001p12
+ },
+ { // Entry 266
+ (long long int)0x1.80p1,
+ 0x1.921fb54442d18p1
+ },
+ { // Entry 267
+ (long long int)-0x1.80p1,
+ -0x1.921fb54442d18p1
+ },
+ { // Entry 268
+ (long long int)0x1.p1,
+ 0x1.921fb54442d18p0
+ },
+ { // Entry 269
+ (long long int)-0x1.p1,
+ -0x1.921fb54442d18p0
+ },
+ { // Entry 270
+ (long long int)0x1.p0,
+ 0x1.0000000000001p0
+ },
+ { // Entry 271
+ (long long int)-0x1.p0,
+ -0x1.0000000000001p0
+ },
+ { // Entry 272
+ (long long int)0x1.p0,
+ 0x1.0p0
+ },
+ { // Entry 273
+ (long long int)-0x1.p0,
+ -0x1.0p0
+ },
+ { // Entry 274
+ (long long int)0x1.p0,
+ 0x1.fffffffffffffp-1
+ },
+ { // Entry 275
+ (long long int)-0x1.p0,
+ -0x1.fffffffffffffp-1
+ },
+ { // Entry 276
+ (long long int)0x1.p0,
+ 0x1.921fb54442d18p-1
+ },
+ { // Entry 277
+ (long long int)-0x1.p0,
+ -0x1.921fb54442d18p-1
+ },
+ { // Entry 278
+ (long long int)0.0,
+ 0x1.0000000000001p-1022
+ },
+ { // Entry 279
+ (long long int)0.0,
+ -0x1.0000000000001p-1022
+ },
+ { // Entry 280
+ (long long int)0.0,
+ 0x1.0p-1022
+ },
+ { // Entry 281
+ (long long int)0.0,
+ -0x1.0p-1022
+ },
+ { // Entry 282
+ (long long int)0.0,
+ 0x1.ffffffffffffep-1023
+ },
+ { // Entry 283
+ (long long int)0.0,
+ -0x1.ffffffffffffep-1023
+ },
+ { // Entry 284
+ (long long int)0.0,
+ 0x1.ffffffffffffcp-1023
+ },
+ { // Entry 285
+ (long long int)0.0,
+ -0x1.ffffffffffffcp-1023
+ },
+ { // Entry 286
+ (long long int)0.0,
+ 0x1.0p-1073
+ },
+ { // Entry 287
+ (long long int)0.0,
+ -0x1.0p-1073
+ },
+ { // Entry 288
+ (long long int)0.0,
+ 0x1.0p-1074
+ },
+ { // Entry 289
+ (long long int)0.0,
+ -0x1.0p-1074
+ },
+ { // Entry 290
+ (long long int)0.0,
+ 0.0
+ },
+ { // Entry 291
+ (long long int)0.0,
+ -0.0
+ },
+ { // Entry 292
+ (long long int)0x1.p1,
+ 0x1.8p0
+ },
+ { // Entry 293
+ (long long int)-0x1.p1,
+ -0x1.8p0
+ },
+ { // Entry 294
+ (long long int)0x1.p1,
+ 0x1.4p1
+ },
+ { // Entry 295
+ (long long int)-0x1.p1,
+ -0x1.4p1
+ },
+ { // Entry 296
+ (long long int)0.0,
+ 0x1.fffffp-2
+ },
+ { // Entry 297
+ (long long int)0.0,
+ 0x1.0p-1
+ },
+ { // Entry 298
+ (long long int)0x1.p0,
+ 0x1.00001p-1
+ },
+ { // Entry 299
+ (long long int)0.0,
+ -0x1.fffffp-2
+ },
+ { // Entry 300
+ (long long int)0.0,
+ -0x1.0p-1
+ },
+ { // Entry 301
+ (long long int)-0x1.p0,
+ -0x1.00001p-1
+ },
+ { // Entry 302
+ (long long int)0x1.p1,
+ 0x1.80001p0
+ },
+ { // Entry 303
+ (long long int)0x1.p0,
+ 0x1.7ffffp0
+ },
+ { // Entry 304
+ (long long int)-0x1.p1,
+ -0x1.80001p0
+ },
+ { // Entry 305
+ (long long int)-0x1.p0,
+ -0x1.7ffffp0
+ }
+}; \ No newline at end of file
diff --git a/tests/math_data/llrintf_intel_data.h b/tests/math_data/llrintf_intel_data.h
new file mode 100644
index 000000000..ecb22da12
--- /dev/null
+++ b/tests/math_data/llrintf_intel_data.h
@@ -0,0 +1,1242 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+static data_llong_1_t<float> g_llrintf_intel_data[] = {
+ { // Entry 0
+ (long long int)0.0,
+ -0x1.p-149
+ },
+ { // Entry 1
+ (long long int)0.0,
+ 0.0
+ },
+ { // Entry 2
+ (long long int)0.0,
+ 0x1.p-149
+ },
+ { // Entry 3
+ (long long int)0.0,
+ 0x1.fffffep-2
+ },
+ { // Entry 4
+ (long long int)0.0,
+ 0x1.p-1
+ },
+ { // Entry 5
+ (long long int)0x1.p0,
+ 0x1.000002p-1
+ },
+ { // Entry 6
+ (long long int)0x1.p0,
+ 0x1.fffffep-1
+ },
+ { // Entry 7
+ (long long int)0x1.p0,
+ 0x1.p0
+ },
+ { // Entry 8
+ (long long int)0x1.p0,
+ 0x1.000002p0
+ },
+ { // Entry 9
+ (long long int)0x1.p0,
+ 0x1.7ffffep0
+ },
+ { // Entry 10
+ (long long int)0x1.p1,
+ 0x1.80p0
+ },
+ { // Entry 11
+ (long long int)0x1.p1,
+ 0x1.800002p0
+ },
+ { // Entry 12
+ (long long int)0x1.p1,
+ 0x1.fffffep0
+ },
+ { // Entry 13
+ (long long int)0x1.p1,
+ 0x1.p1
+ },
+ { // Entry 14
+ (long long int)0x1.p1,
+ 0x1.000002p1
+ },
+ { // Entry 15
+ (long long int)0x1.p1,
+ 0x1.3ffffep1
+ },
+ { // Entry 16
+ (long long int)0x1.p1,
+ 0x1.40p1
+ },
+ { // Entry 17
+ (long long int)0x1.80p1,
+ 0x1.400002p1
+ },
+ { // Entry 18
+ (long long int)0x1.90p6,
+ 0x1.8ffffep6
+ },
+ { // Entry 19
+ (long long int)0x1.90p6,
+ 0x1.90p6
+ },
+ { // Entry 20
+ (long long int)0x1.90p6,
+ 0x1.900002p6
+ },
+ { // Entry 21
+ (long long int)0x1.90p6,
+ 0x1.91fffep6
+ },
+ { // Entry 22
+ (long long int)0x1.90p6,
+ 0x1.92p6
+ },
+ { // Entry 23
+ (long long int)0x1.94p6,
+ 0x1.920002p6
+ },
+ { // Entry 24
+ (long long int)0x1.f4p9,
+ 0x1.f3fffep9
+ },
+ { // Entry 25
+ (long long int)0x1.f4p9,
+ 0x1.f4p9
+ },
+ { // Entry 26
+ (long long int)0x1.f4p9,
+ 0x1.f40002p9
+ },
+ { // Entry 27
+ (long long int)0x1.f4p9,
+ 0x1.f43ffep9
+ },
+ { // Entry 28
+ (long long int)0x1.f4p9,
+ 0x1.f440p9
+ },
+ { // Entry 29
+ (long long int)0x1.f480p9,
+ 0x1.f44002p9
+ },
+ { // Entry 30
+ (long long int)0x1.p21,
+ 0x1.fffffep20
+ },
+ { // Entry 31
+ (long long int)0x1.p21,
+ 0x1.p21
+ },
+ { // Entry 32
+ (long long int)0x1.p21,
+ 0x1.000002p21
+ },
+ { // Entry 33
+ (long long int)0x1.p22,
+ 0x1.fffffep21
+ },
+ { // Entry 34
+ (long long int)0x1.p22,
+ 0x1.p22
+ },
+ { // Entry 35
+ (long long int)0x1.p22,
+ 0x1.000002p22
+ },
+ { // Entry 36
+ (long long int)0x1.p23,
+ 0x1.fffffep22
+ },
+ { // Entry 37
+ (long long int)0x1.p23,
+ 0x1.p23
+ },
+ { // Entry 38
+ (long long int)0x1.000002p23,
+ 0x1.000002p23
+ },
+ { // Entry 39
+ (long long int)0x1.fffffep23,
+ 0x1.fffffep23
+ },
+ { // Entry 40
+ (long long int)0x1.p24,
+ 0x1.p24
+ },
+ { // Entry 41
+ (long long int)0x1.000002p24,
+ 0x1.000002p24
+ },
+ { // Entry 42
+ (long long int)0x1.fffffep24,
+ 0x1.fffffep24
+ },
+ { // Entry 43
+ (long long int)0x1.p25,
+ 0x1.p25
+ },
+ { // Entry 44
+ (long long int)0x1.000002p25,
+ 0x1.000002p25
+ },
+ { // Entry 45
+ (long long int)-0x1.p0,
+ -0x1.000002p-1
+ },
+ { // Entry 46
+ (long long int)0.0,
+ -0x1.p-1
+ },
+ { // Entry 47
+ (long long int)0.0,
+ -0x1.fffffep-2
+ },
+ { // Entry 48
+ (long long int)-0x1.p0,
+ -0x1.000002p0
+ },
+ { // Entry 49
+ (long long int)-0x1.p0,
+ -0x1.p0
+ },
+ { // Entry 50
+ (long long int)-0x1.p0,
+ -0x1.fffffep-1
+ },
+ { // Entry 51
+ (long long int)-0x1.p1,
+ -0x1.800002p0
+ },
+ { // Entry 52
+ (long long int)-0x1.p1,
+ -0x1.80p0
+ },
+ { // Entry 53
+ (long long int)-0x1.p0,
+ -0x1.7ffffep0
+ },
+ { // Entry 54
+ (long long int)-0x1.p1,
+ -0x1.000002p1
+ },
+ { // Entry 55
+ (long long int)-0x1.p1,
+ -0x1.p1
+ },
+ { // Entry 56
+ (long long int)-0x1.p1,
+ -0x1.fffffep0
+ },
+ { // Entry 57
+ (long long int)-0x1.80p1,
+ -0x1.400002p1
+ },
+ { // Entry 58
+ (long long int)-0x1.p1,
+ -0x1.40p1
+ },
+ { // Entry 59
+ (long long int)-0x1.p1,
+ -0x1.3ffffep1
+ },
+ { // Entry 60
+ (long long int)-0x1.90p6,
+ -0x1.900002p6
+ },
+ { // Entry 61
+ (long long int)-0x1.90p6,
+ -0x1.90p6
+ },
+ { // Entry 62
+ (long long int)-0x1.90p6,
+ -0x1.8ffffep6
+ },
+ { // Entry 63
+ (long long int)-0x1.94p6,
+ -0x1.920002p6
+ },
+ { // Entry 64
+ (long long int)-0x1.90p6,
+ -0x1.92p6
+ },
+ { // Entry 65
+ (long long int)-0x1.90p6,
+ -0x1.91fffep6
+ },
+ { // Entry 66
+ (long long int)-0x1.f4p9,
+ -0x1.f40002p9
+ },
+ { // Entry 67
+ (long long int)-0x1.f4p9,
+ -0x1.f4p9
+ },
+ { // Entry 68
+ (long long int)-0x1.f4p9,
+ -0x1.f3fffep9
+ },
+ { // Entry 69
+ (long long int)-0x1.f480p9,
+ -0x1.f44002p9
+ },
+ { // Entry 70
+ (long long int)-0x1.f4p9,
+ -0x1.f440p9
+ },
+ { // Entry 71
+ (long long int)-0x1.f4p9,
+ -0x1.f43ffep9
+ },
+ { // Entry 72
+ (long long int)-0x1.p21,
+ -0x1.000002p21
+ },
+ { // Entry 73
+ (long long int)-0x1.p21,
+ -0x1.p21
+ },
+ { // Entry 74
+ (long long int)-0x1.p21,
+ -0x1.fffffep20
+ },
+ { // Entry 75
+ (long long int)-0x1.p22,
+ -0x1.000002p22
+ },
+ { // Entry 76
+ (long long int)-0x1.p22,
+ -0x1.p22
+ },
+ { // Entry 77
+ (long long int)-0x1.p22,
+ -0x1.fffffep21
+ },
+ { // Entry 78
+ (long long int)-0x1.000002p23,
+ -0x1.000002p23
+ },
+ { // Entry 79
+ (long long int)-0x1.p23,
+ -0x1.p23
+ },
+ { // Entry 80
+ (long long int)-0x1.p23,
+ -0x1.fffffep22
+ },
+ { // Entry 81
+ (long long int)-0x1.000002p24,
+ -0x1.000002p24
+ },
+ { // Entry 82
+ (long long int)-0x1.p24,
+ -0x1.p24
+ },
+ { // Entry 83
+ (long long int)-0x1.fffffep23,
+ -0x1.fffffep23
+ },
+ { // Entry 84
+ (long long int)-0x1.000002p25,
+ -0x1.000002p25
+ },
+ { // Entry 85
+ (long long int)-0x1.p25,
+ -0x1.p25
+ },
+ { // Entry 86
+ (long long int)-0x1.fffffep24,
+ -0x1.fffffep24
+ },
+ { // Entry 87
+ (long long int)0x1.fffffep29,
+ 0x1.fffffep29
+ },
+ { // Entry 88
+ (long long int)0x1.p30,
+ 0x1.p30
+ },
+ { // Entry 89
+ (long long int)0x1.000002p30,
+ 0x1.000002p30
+ },
+ { // Entry 90
+ (long long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 91
+ (long long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 92
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 93
+ (long long int)0x1.000002p31,
+ 0x1.000002p31
+ },
+ { // Entry 94
+ (long long int)0x1.000004p31,
+ 0x1.000004p31
+ },
+ { // Entry 95
+ (long long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 96
+ (long long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 97
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 98
+ (long long int)0x1.000002p31,
+ 0x1.000002p31
+ },
+ { // Entry 99
+ (long long int)0x1.000004p31,
+ 0x1.000004p31
+ },
+ { // Entry 100
+ (long long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 101
+ (long long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 102
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 103
+ (long long int)0x1.000002p31,
+ 0x1.000002p31
+ },
+ { // Entry 104
+ (long long int)0x1.000004p31,
+ 0x1.000004p31
+ },
+ { // Entry 105
+ (long long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 106
+ (long long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 107
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 108
+ (long long int)0x1.000002p31,
+ 0x1.000002p31
+ },
+ { // Entry 109
+ (long long int)0x1.000004p31,
+ 0x1.000004p31
+ },
+ { // Entry 110
+ (long long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 111
+ (long long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 112
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 113
+ (long long int)0x1.000002p31,
+ 0x1.000002p31
+ },
+ { // Entry 114
+ (long long int)0x1.000004p31,
+ 0x1.000004p31
+ },
+ { // Entry 115
+ (long long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 116
+ (long long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 117
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 118
+ (long long int)0x1.000002p31,
+ 0x1.000002p31
+ },
+ { // Entry 119
+ (long long int)0x1.000004p31,
+ 0x1.000004p31
+ },
+ { // Entry 120
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 121
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 122
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 123
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 124
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 125
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 126
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 127
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 128
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 129
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 130
+ (long long int)-0x1.000002p30,
+ -0x1.000002p30
+ },
+ { // Entry 131
+ (long long int)-0x1.p30,
+ -0x1.p30
+ },
+ { // Entry 132
+ (long long int)-0x1.fffffep29,
+ -0x1.fffffep29
+ },
+ { // Entry 133
+ (long long int)-0x1.000004p31,
+ -0x1.000004p31
+ },
+ { // Entry 134
+ (long long int)-0x1.000002p31,
+ -0x1.000002p31
+ },
+ { // Entry 135
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 136
+ (long long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 137
+ (long long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 138
+ (long long int)-0x1.000004p31,
+ -0x1.000004p31
+ },
+ { // Entry 139
+ (long long int)-0x1.000002p31,
+ -0x1.000002p31
+ },
+ { // Entry 140
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 141
+ (long long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 142
+ (long long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 143
+ (long long int)-0x1.000004p31,
+ -0x1.000004p31
+ },
+ { // Entry 144
+ (long long int)-0x1.000002p31,
+ -0x1.000002p31
+ },
+ { // Entry 145
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 146
+ (long long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 147
+ (long long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 148
+ (long long int)-0x1.000004p31,
+ -0x1.000004p31
+ },
+ { // Entry 149
+ (long long int)-0x1.000002p31,
+ -0x1.000002p31
+ },
+ { // Entry 150
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 151
+ (long long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 152
+ (long long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 153
+ (long long int)-0x1.000004p31,
+ -0x1.000004p31
+ },
+ { // Entry 154
+ (long long int)-0x1.000002p31,
+ -0x1.000002p31
+ },
+ { // Entry 155
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 156
+ (long long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 157
+ (long long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 158
+ (long long int)-0x1.000004p31,
+ -0x1.000004p31
+ },
+ { // Entry 159
+ (long long int)-0x1.000002p31,
+ -0x1.000002p31
+ },
+ { // Entry 160
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 161
+ (long long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 162
+ (long long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 163
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 164
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 165
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 166
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 167
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 168
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 169
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 170
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 171
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 172
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 173
+ (long long int)0x1.fffffcp61,
+ 0x1.fffffcp61
+ },
+ { // Entry 174
+ (long long int)0x1.fffffep61,
+ 0x1.fffffep61
+ },
+ { // Entry 175
+ (long long int)0x1.p62,
+ 0x1.p62
+ },
+ { // Entry 176
+ (long long int)0x1.000002p62,
+ 0x1.000002p62
+ },
+ { // Entry 177
+ (long long int)0x1.000004p62,
+ 0x1.000004p62
+ },
+ { // Entry 178
+ (long long int)0x1.fffffcp62,
+ 0x1.fffffcp62
+ },
+ { // Entry 179
+ (long long int)0x1.fffffep62,
+ 0x1.fffffep62
+ },
+ { // Entry 180
+ (long long int)-0x1.000004p62,
+ -0x1.000004p62
+ },
+ { // Entry 181
+ (long long int)-0x1.000002p62,
+ -0x1.000002p62
+ },
+ { // Entry 182
+ (long long int)-0x1.p62,
+ -0x1.p62
+ },
+ { // Entry 183
+ (long long int)-0x1.fffffep61,
+ -0x1.fffffep61
+ },
+ { // Entry 184
+ (long long int)-0x1.fffffcp61,
+ -0x1.fffffcp61
+ },
+ { // Entry 185
+ (long long int)-0x1.p63,
+ -0x1.p63
+ },
+ { // Entry 186
+ (long long int)-0x1.fffffep62,
+ -0x1.fffffep62
+ },
+ { // Entry 187
+ (long long int)-0x1.fffffcp62,
+ -0x1.fffffcp62
+ },
+ { // Entry 188
+ (long long int)0x1.p62,
+ 0x1.p62
+ },
+ { // Entry 189
+ (long long int)-0x1.p62,
+ -0x1.p62
+ },
+ { // Entry 190
+ (long long int)-0x1.p63,
+ -0x1.p63
+ },
+ { // Entry 191
+ (long long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 192
+ (long long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 193
+ (long long int)0x1.p31,
+ 0x1.p31
+ },
+ { // Entry 194
+ (long long int)-0x1.000002p31,
+ -0x1.000002p31
+ },
+ { // Entry 195
+ (long long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 196
+ (long long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 197
+ (long long int)0x1.p2,
+ 0x1.fffffep1
+ },
+ { // Entry 198
+ (long long int)0x1.p2,
+ 0x1.p2
+ },
+ { // Entry 199
+ (long long int)0x1.p2,
+ 0x1.000002p2
+ },
+ { // Entry 200
+ (long long int)0x1.p3,
+ 0x1.fffffep2
+ },
+ { // Entry 201
+ (long long int)0x1.p3,
+ 0x1.p3
+ },
+ { // Entry 202
+ (long long int)0x1.p3,
+ 0x1.000002p3
+ },
+ { // Entry 203
+ (long long int)0x1.p4,
+ 0x1.fffffep3
+ },
+ { // Entry 204
+ (long long int)0x1.p4,
+ 0x1.p4
+ },
+ { // Entry 205
+ (long long int)0x1.p4,
+ 0x1.000002p4
+ },
+ { // Entry 206
+ (long long int)0x1.p5,
+ 0x1.fffffep4
+ },
+ { // Entry 207
+ (long long int)0x1.p5,
+ 0x1.p5
+ },
+ { // Entry 208
+ (long long int)0x1.p5,
+ 0x1.000002p5
+ },
+ { // Entry 209
+ (long long int)0x1.p6,
+ 0x1.fffffep5
+ },
+ { // Entry 210
+ (long long int)0x1.p6,
+ 0x1.p6
+ },
+ { // Entry 211
+ (long long int)0x1.p6,
+ 0x1.000002p6
+ },
+ { // Entry 212
+ (long long int)0x1.p7,
+ 0x1.fffffep6
+ },
+ { // Entry 213
+ (long long int)0x1.p7,
+ 0x1.p7
+ },
+ { // Entry 214
+ (long long int)0x1.p7,
+ 0x1.000002p7
+ },
+ { // Entry 215
+ (long long int)0x1.p8,
+ 0x1.fffffep7
+ },
+ { // Entry 216
+ (long long int)0x1.p8,
+ 0x1.p8
+ },
+ { // Entry 217
+ (long long int)0x1.p8,
+ 0x1.000002p8
+ },
+ { // Entry 218
+ (long long int)0x1.p9,
+ 0x1.fffffep8
+ },
+ { // Entry 219
+ (long long int)0x1.p9,
+ 0x1.p9
+ },
+ { // Entry 220
+ (long long int)0x1.p9,
+ 0x1.000002p9
+ },
+ { // Entry 221
+ (long long int)0x1.p10,
+ 0x1.fffffep9
+ },
+ { // Entry 222
+ (long long int)0x1.p10,
+ 0x1.p10
+ },
+ { // Entry 223
+ (long long int)0x1.p10,
+ 0x1.000002p10
+ },
+ { // Entry 224
+ (long long int)0x1.p11,
+ 0x1.fffffep10
+ },
+ { // Entry 225
+ (long long int)0x1.p11,
+ 0x1.p11
+ },
+ { // Entry 226
+ (long long int)0x1.p11,
+ 0x1.000002p11
+ },
+ { // Entry 227
+ (long long int)0x1.p12,
+ 0x1.fffffep11
+ },
+ { // Entry 228
+ (long long int)0x1.p12,
+ 0x1.p12
+ },
+ { // Entry 229
+ (long long int)0x1.p12,
+ 0x1.000002p12
+ },
+ { // Entry 230
+ (long long int)0x1.p2,
+ 0x1.1ffffep2
+ },
+ { // Entry 231
+ (long long int)0x1.p2,
+ 0x1.20p2
+ },
+ { // Entry 232
+ (long long int)0x1.40p2,
+ 0x1.200002p2
+ },
+ { // Entry 233
+ (long long int)0x1.p3,
+ 0x1.0ffffep3
+ },
+ { // Entry 234
+ (long long int)0x1.p3,
+ 0x1.10p3
+ },
+ { // Entry 235
+ (long long int)0x1.20p3,
+ 0x1.100002p3
+ },
+ { // Entry 236
+ (long long int)0x1.p4,
+ 0x1.07fffep4
+ },
+ { // Entry 237
+ (long long int)0x1.p4,
+ 0x1.08p4
+ },
+ { // Entry 238
+ (long long int)0x1.10p4,
+ 0x1.080002p4
+ },
+ { // Entry 239
+ (long long int)0x1.p5,
+ 0x1.03fffep5
+ },
+ { // Entry 240
+ (long long int)0x1.p5,
+ 0x1.04p5
+ },
+ { // Entry 241
+ (long long int)0x1.08p5,
+ 0x1.040002p5
+ },
+ { // Entry 242
+ (long long int)0x1.p6,
+ 0x1.01fffep6
+ },
+ { // Entry 243
+ (long long int)0x1.p6,
+ 0x1.02p6
+ },
+ { // Entry 244
+ (long long int)0x1.04p6,
+ 0x1.020002p6
+ },
+ { // Entry 245
+ (long long int)0x1.p7,
+ 0x1.00fffep7
+ },
+ { // Entry 246
+ (long long int)0x1.p7,
+ 0x1.01p7
+ },
+ { // Entry 247
+ (long long int)0x1.02p7,
+ 0x1.010002p7
+ },
+ { // Entry 248
+ (long long int)0x1.p8,
+ 0x1.007ffep8
+ },
+ { // Entry 249
+ (long long int)0x1.p8,
+ 0x1.0080p8
+ },
+ { // Entry 250
+ (long long int)0x1.01p8,
+ 0x1.008002p8
+ },
+ { // Entry 251
+ (long long int)0x1.p9,
+ 0x1.003ffep9
+ },
+ { // Entry 252
+ (long long int)0x1.p9,
+ 0x1.0040p9
+ },
+ { // Entry 253
+ (long long int)0x1.0080p9,
+ 0x1.004002p9
+ },
+ { // Entry 254
+ (long long int)0x1.p10,
+ 0x1.001ffep10
+ },
+ { // Entry 255
+ (long long int)0x1.p10,
+ 0x1.0020p10
+ },
+ { // Entry 256
+ (long long int)0x1.0040p10,
+ 0x1.002002p10
+ },
+ { // Entry 257
+ (long long int)0x1.0040p10,
+ 0x1.005ffep10
+ },
+ { // Entry 258
+ (long long int)0x1.0080p10,
+ 0x1.0060p10
+ },
+ { // Entry 259
+ (long long int)0x1.0080p10,
+ 0x1.006002p10
+ },
+ { // Entry 260
+ (long long int)0x1.p11,
+ 0x1.000ffep11
+ },
+ { // Entry 261
+ (long long int)0x1.p11,
+ 0x1.0010p11
+ },
+ { // Entry 262
+ (long long int)0x1.0020p11,
+ 0x1.001002p11
+ },
+ { // Entry 263
+ (long long int)0x1.p12,
+ 0x1.0007fep12
+ },
+ { // Entry 264
+ (long long int)0x1.p12,
+ 0x1.0008p12
+ },
+ { // Entry 265
+ (long long int)0x1.0010p12,
+ 0x1.000802p12
+ },
+ { // Entry 266
+ (long long int)0x1.80p1,
+ 0x1.921fb6p1
+ },
+ { // Entry 267
+ (long long int)-0x1.80p1,
+ -0x1.921fb6p1
+ },
+ { // Entry 268
+ (long long int)0x1.p1,
+ 0x1.921fb6p0
+ },
+ { // Entry 269
+ (long long int)-0x1.p1,
+ -0x1.921fb6p0
+ },
+ { // Entry 270
+ (long long int)0x1.p0,
+ 0x1.000002p0
+ },
+ { // Entry 271
+ (long long int)-0x1.p0,
+ -0x1.000002p0
+ },
+ { // Entry 272
+ (long long int)0x1.p0,
+ 0x1.p0
+ },
+ { // Entry 273
+ (long long int)-0x1.p0,
+ -0x1.p0
+ },
+ { // Entry 274
+ (long long int)0x1.p0,
+ 0x1.fffffep-1
+ },
+ { // Entry 275
+ (long long int)-0x1.p0,
+ -0x1.fffffep-1
+ },
+ { // Entry 276
+ (long long int)0x1.p0,
+ 0x1.921fb6p-1
+ },
+ { // Entry 277
+ (long long int)-0x1.p0,
+ -0x1.921fb6p-1
+ },
+ { // Entry 278
+ (long long int)0.0,
+ 0x1.000002p-126
+ },
+ { // Entry 279
+ (long long int)0.0,
+ -0x1.000002p-126
+ },
+ { // Entry 280
+ (long long int)0.0,
+ 0x1.p-126
+ },
+ { // Entry 281
+ (long long int)0.0,
+ -0x1.p-126
+ },
+ { // Entry 282
+ (long long int)0.0,
+ 0x1.fffffcp-127
+ },
+ { // Entry 283
+ (long long int)0.0,
+ -0x1.fffffcp-127
+ },
+ { // Entry 284
+ (long long int)0.0,
+ 0x1.fffff8p-127
+ },
+ { // Entry 285
+ (long long int)0.0,
+ -0x1.fffff8p-127
+ },
+ { // Entry 286
+ (long long int)0.0,
+ 0x1.p-148
+ },
+ { // Entry 287
+ (long long int)0.0,
+ -0x1.p-148
+ },
+ { // Entry 288
+ (long long int)0.0,
+ 0x1.p-149
+ },
+ { // Entry 289
+ (long long int)0.0,
+ -0x1.p-149
+ },
+ { // Entry 290
+ (long long int)0.0,
+ 0.0f
+ },
+ { // Entry 291
+ (long long int)0.0,
+ -0.0f
+ },
+ { // Entry 292
+ (long long int)0x1.p1,
+ 0x1.80p0
+ },
+ { // Entry 293
+ (long long int)-0x1.p1,
+ -0x1.80p0
+ },
+ { // Entry 294
+ (long long int)0x1.p1,
+ 0x1.40p1
+ },
+ { // Entry 295
+ (long long int)-0x1.p1,
+ -0x1.40p1
+ },
+ { // Entry 296
+ (long long int)0.0,
+ 0x1.fffff0p-2
+ },
+ { // Entry 297
+ (long long int)0.0,
+ 0x1.p-1
+ },
+ { // Entry 298
+ (long long int)0x1.p0,
+ 0x1.000010p-1
+ },
+ { // Entry 299
+ (long long int)0.0,
+ -0x1.fffff0p-2
+ },
+ { // Entry 300
+ (long long int)0.0,
+ -0x1.p-1
+ },
+ { // Entry 301
+ (long long int)-0x1.p0,
+ -0x1.000010p-1
+ },
+ { // Entry 302
+ (long long int)0x1.p1,
+ 0x1.800010p0
+ },
+ { // Entry 303
+ (long long int)0x1.p0,
+ 0x1.7ffff0p0
+ },
+ { // Entry 304
+ (long long int)-0x1.p1,
+ -0x1.800010p0
+ },
+ { // Entry 305
+ (long long int)-0x1.p0,
+ -0x1.7ffff0p0
+ }
+}; \ No newline at end of file
diff --git a/tests/math_data/lrint_intel_data.h b/tests/math_data/lrint_intel_data.h
new file mode 100644
index 000000000..a034be419
--- /dev/null
+++ b/tests/math_data/lrint_intel_data.h
@@ -0,0 +1,982 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+static data_long_1_t<double> g_lrint_intel_data[] = {
+ { // Entry 0
+ (long int)0.0,
+ -0x1.0p-1074
+ },
+ { // Entry 1
+ (long int)0.0,
+ -0.0
+ },
+ { // Entry 2
+ (long int)0.0,
+ 0x1.0p-1074
+ },
+ { // Entry 3
+ (long int)0.0,
+ 0x1.fffffffffffffp-2
+ },
+ { // Entry 4
+ (long int)0.0,
+ 0x1.0p-1
+ },
+ { // Entry 5
+ (long int)0x1.p0,
+ 0x1.0000000000001p-1
+ },
+ { // Entry 6
+ (long int)0x1.p0,
+ 0x1.fffffffffffffp-1
+ },
+ { // Entry 7
+ (long int)0x1.p0,
+ 0x1.0p0
+ },
+ { // Entry 8
+ (long int)0x1.p0,
+ 0x1.0000000000001p0
+ },
+ { // Entry 9
+ (long int)0x1.p0,
+ 0x1.7ffffffffffffp0
+ },
+ { // Entry 10
+ (long int)0x1.p1,
+ 0x1.8p0
+ },
+ { // Entry 11
+ (long int)0x1.p1,
+ 0x1.8000000000001p0
+ },
+ { // Entry 12
+ (long int)0x1.p1,
+ 0x1.fffffffffffffp0
+ },
+ { // Entry 13
+ (long int)0x1.p1,
+ 0x1.0p1
+ },
+ { // Entry 14
+ (long int)0x1.p1,
+ 0x1.0000000000001p1
+ },
+ { // Entry 15
+ (long int)0x1.p1,
+ 0x1.3ffffffffffffp1
+ },
+ { // Entry 16
+ (long int)0x1.p1,
+ 0x1.4p1
+ },
+ { // Entry 17
+ (long int)0x1.80p1,
+ 0x1.4000000000001p1
+ },
+ { // Entry 18
+ (long int)0x1.90p6,
+ 0x1.8ffffffffffffp6
+ },
+ { // Entry 19
+ (long int)0x1.90p6,
+ 0x1.9p6
+ },
+ { // Entry 20
+ (long int)0x1.90p6,
+ 0x1.9000000000001p6
+ },
+ { // Entry 21
+ (long int)0x1.90p6,
+ 0x1.91fffffffffffp6
+ },
+ { // Entry 22
+ (long int)0x1.90p6,
+ 0x1.920p6
+ },
+ { // Entry 23
+ (long int)0x1.94p6,
+ 0x1.9200000000001p6
+ },
+ { // Entry 24
+ (long int)0x1.f4p9,
+ 0x1.f3fffffffffffp9
+ },
+ { // Entry 25
+ (long int)0x1.f4p9,
+ 0x1.f40p9
+ },
+ { // Entry 26
+ (long int)0x1.f4p9,
+ 0x1.f400000000001p9
+ },
+ { // Entry 27
+ (long int)0x1.f4p9,
+ 0x1.f43ffffffffffp9
+ },
+ { // Entry 28
+ (long int)0x1.f4p9,
+ 0x1.f44p9
+ },
+ { // Entry 29
+ (long int)0x1.f480p9,
+ 0x1.f440000000001p9
+ },
+ { // Entry 30
+ (long int)-0x1.p0,
+ -0x1.0000000000001p-1
+ },
+ { // Entry 31
+ (long int)0.0,
+ -0x1.0p-1
+ },
+ { // Entry 32
+ (long int)0.0,
+ -0x1.fffffffffffffp-2
+ },
+ { // Entry 33
+ (long int)-0x1.p0,
+ -0x1.0000000000001p0
+ },
+ { // Entry 34
+ (long int)-0x1.p0,
+ -0x1.0p0
+ },
+ { // Entry 35
+ (long int)-0x1.p0,
+ -0x1.fffffffffffffp-1
+ },
+ { // Entry 36
+ (long int)-0x1.p1,
+ -0x1.8000000000001p0
+ },
+ { // Entry 37
+ (long int)-0x1.p1,
+ -0x1.8p0
+ },
+ { // Entry 38
+ (long int)-0x1.p0,
+ -0x1.7ffffffffffffp0
+ },
+ { // Entry 39
+ (long int)-0x1.p1,
+ -0x1.0000000000001p1
+ },
+ { // Entry 40
+ (long int)-0x1.p1,
+ -0x1.0p1
+ },
+ { // Entry 41
+ (long int)-0x1.p1,
+ -0x1.fffffffffffffp0
+ },
+ { // Entry 42
+ (long int)-0x1.80p1,
+ -0x1.4000000000001p1
+ },
+ { // Entry 43
+ (long int)-0x1.p1,
+ -0x1.4p1
+ },
+ { // Entry 44
+ (long int)-0x1.p1,
+ -0x1.3ffffffffffffp1
+ },
+ { // Entry 45
+ (long int)-0x1.90p6,
+ -0x1.9000000000001p6
+ },
+ { // Entry 46
+ (long int)-0x1.90p6,
+ -0x1.9p6
+ },
+ { // Entry 47
+ (long int)-0x1.90p6,
+ -0x1.8ffffffffffffp6
+ },
+ { // Entry 48
+ (long int)-0x1.94p6,
+ -0x1.9200000000001p6
+ },
+ { // Entry 49
+ (long int)-0x1.90p6,
+ -0x1.920p6
+ },
+ { // Entry 50
+ (long int)-0x1.90p6,
+ -0x1.91fffffffffffp6
+ },
+ { // Entry 51
+ (long int)-0x1.f4p9,
+ -0x1.f400000000001p9
+ },
+ { // Entry 52
+ (long int)-0x1.f4p9,
+ -0x1.f40p9
+ },
+ { // Entry 53
+ (long int)-0x1.f4p9,
+ -0x1.f3fffffffffffp9
+ },
+ { // Entry 54
+ (long int)-0x1.f480p9,
+ -0x1.f440000000001p9
+ },
+ { // Entry 55
+ (long int)-0x1.f4p9,
+ -0x1.f44p9
+ },
+ { // Entry 56
+ (long int)-0x1.f4p9,
+ -0x1.f43ffffffffffp9
+ },
+ { // Entry 57
+ (long int)0x1.p30,
+ 0x1.fffffffffffffp29
+ },
+ { // Entry 58
+ (long int)0x1.p30,
+ 0x1.0p30
+ },
+ { // Entry 59
+ (long int)0x1.p30,
+ 0x1.0000000000001p30
+ },
+ { // Entry 60
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff7ffffep30
+ },
+ { // Entry 61
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff7fffffp30
+ },
+ { // Entry 62
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff80p30
+ },
+ { // Entry 63
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff800001p30
+ },
+ { // Entry 64
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff800002p30
+ },
+ { // Entry 65
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff9ffffep30
+ },
+ { // Entry 66
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff9fffffp30
+ },
+ { // Entry 67
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffffa0p30
+ },
+ { // Entry 68
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffa00001p30
+ },
+ { // Entry 69
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffa00002p30
+ },
+ { // Entry 70
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffbffffep30
+ },
+ { // Entry 71
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffbfffffp30
+ },
+ { // Entry 72
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffc0p30
+ },
+ { // Entry 73
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffc00001p30
+ },
+ { // Entry 74
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffc00002p30
+ },
+ { // Entry 75
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffdffffep30
+ },
+ { // Entry 76
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffdfffffp30
+ },
+ { // Entry 77
+ (long int)0x1.ffffffe0p30,
+ 0x1.ffffffep30
+ },
+ { // Entry 78
+ (long int)0x1.ffffffe4p30,
+ 0x1.ffffffe40p30
+ },
+ { // Entry 79
+ (long int)0x1.ffffffe8p30,
+ 0x1.ffffffe80p30
+ },
+ { // Entry 80
+ (long int)0x1.ffffffecp30,
+ 0x1.ffffffec0p30
+ },
+ { // Entry 81
+ (long int)0x1.fffffff0p30,
+ 0x1.fffffffp30
+ },
+ { // Entry 82
+ (long int)0x1.fffffff4p30,
+ 0x1.fffffff40p30
+ },
+ { // Entry 83
+ (long int)0x1.fffffff8p30,
+ 0x1.fffffff80p30
+ },
+ { // Entry 84
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffc0p30
+ },
+ { // Entry 85
+ (long int)-0x1.p30,
+ -0x1.0000000000001p30
+ },
+ { // Entry 86
+ (long int)-0x1.p30,
+ -0x1.0p30
+ },
+ { // Entry 87
+ (long int)-0x1.p30,
+ -0x1.fffffffffffffp29
+ },
+ { // Entry 88
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffff800002p30
+ },
+ { // Entry 89
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffff800001p30
+ },
+ { // Entry 90
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffff80p30
+ },
+ { // Entry 91
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffff7fffffp30
+ },
+ { // Entry 92
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffff7ffffep30
+ },
+ { // Entry 93
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffa00002p30
+ },
+ { // Entry 94
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffa00001p30
+ },
+ { // Entry 95
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffffa0p30
+ },
+ { // Entry 96
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffff9fffffp30
+ },
+ { // Entry 97
+ (long int)-0x1.fffffff8p30,
+ -0x1.fffffff9ffffep30
+ },
+ { // Entry 98
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffc00002p30
+ },
+ { // Entry 99
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffc00001p30
+ },
+ { // Entry 100
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffc0p30
+ },
+ { // Entry 101
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffbfffffp30
+ },
+ { // Entry 102
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffbffffep30
+ },
+ { // Entry 103
+ (long int)-0x1.p31,
+ -0x1.fffffffe00002p30
+ },
+ { // Entry 104
+ (long int)-0x1.p31,
+ -0x1.fffffffe00001p30
+ },
+ { // Entry 105
+ (long int)-0x1.p31,
+ -0x1.fffffffe0p30
+ },
+ { // Entry 106
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffdfffffp30
+ },
+ { // Entry 107
+ (long int)-0x1.fffffffcp30,
+ -0x1.fffffffdffffep30
+ },
+ { // Entry 108
+ (long int)-0x1.p31,
+ -0x1.0000000000002p31
+ },
+ { // Entry 109
+ (long int)-0x1.p31,
+ -0x1.0000000000001p31
+ },
+ { // Entry 110
+ (long int)-0x1.p31,
+ -0x1.0p31
+ },
+ { // Entry 111
+ (long int)-0x1.p31,
+ -0x1.fffffffffffffp30
+ },
+ { // Entry 112
+ (long int)-0x1.p31,
+ -0x1.ffffffffffffep30
+ },
+ { // Entry 113
+ (long int)-0x1.p31,
+ -0x1.000000010p31
+ },
+ { // Entry 114
+ (long int)-0x1.p31,
+ -0x1.00000000fffffp31
+ },
+ { // Entry 115
+ (long int)-0x1.p31,
+ -0x1.00000000ffffep31
+ },
+ { // Entry 116
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 117
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 118
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 119
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 120
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 121
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 122
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 123
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 124
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 125
+ (long int)-0x1.ffffffe0p30,
+ -0x1.ffffffep30
+ },
+ { // Entry 126
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffbfffffp30
+ },
+ { // Entry 127
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffc0p30
+ },
+ { // Entry 128
+ (long int)0x1.fffffffcp30,
+ 0x1.fffffffc00001p30
+ },
+ { // Entry 129
+ (long int)-0x1.p31,
+ -0x1.0000000000001p31
+ },
+ { // Entry 130
+ (long int)-0x1.p31,
+ -0x1.0p31
+ },
+ { // Entry 131
+ (long int)-0x1.p31,
+ -0x1.fffffffffffffp30
+ },
+ { // Entry 132
+ (long int)0x1.p2,
+ 0x1.fffffffffffffp1
+ },
+ { // Entry 133
+ (long int)0x1.p2,
+ 0x1.0p2
+ },
+ { // Entry 134
+ (long int)0x1.p2,
+ 0x1.0000000000001p2
+ },
+ { // Entry 135
+ (long int)0x1.p3,
+ 0x1.fffffffffffffp2
+ },
+ { // Entry 136
+ (long int)0x1.p3,
+ 0x1.0p3
+ },
+ { // Entry 137
+ (long int)0x1.p3,
+ 0x1.0000000000001p3
+ },
+ { // Entry 138
+ (long int)0x1.p4,
+ 0x1.fffffffffffffp3
+ },
+ { // Entry 139
+ (long int)0x1.p4,
+ 0x1.0p4
+ },
+ { // Entry 140
+ (long int)0x1.p4,
+ 0x1.0000000000001p4
+ },
+ { // Entry 141
+ (long int)0x1.p5,
+ 0x1.fffffffffffffp4
+ },
+ { // Entry 142
+ (long int)0x1.p5,
+ 0x1.0p5
+ },
+ { // Entry 143
+ (long int)0x1.p5,
+ 0x1.0000000000001p5
+ },
+ { // Entry 144
+ (long int)0x1.p6,
+ 0x1.fffffffffffffp5
+ },
+ { // Entry 145
+ (long int)0x1.p6,
+ 0x1.0p6
+ },
+ { // Entry 146
+ (long int)0x1.p6,
+ 0x1.0000000000001p6
+ },
+ { // Entry 147
+ (long int)0x1.p7,
+ 0x1.fffffffffffffp6
+ },
+ { // Entry 148
+ (long int)0x1.p7,
+ 0x1.0p7
+ },
+ { // Entry 149
+ (long int)0x1.p7,
+ 0x1.0000000000001p7
+ },
+ { // Entry 150
+ (long int)0x1.p8,
+ 0x1.fffffffffffffp7
+ },
+ { // Entry 151
+ (long int)0x1.p8,
+ 0x1.0p8
+ },
+ { // Entry 152
+ (long int)0x1.p8,
+ 0x1.0000000000001p8
+ },
+ { // Entry 153
+ (long int)0x1.p9,
+ 0x1.fffffffffffffp8
+ },
+ { // Entry 154
+ (long int)0x1.p9,
+ 0x1.0p9
+ },
+ { // Entry 155
+ (long int)0x1.p9,
+ 0x1.0000000000001p9
+ },
+ { // Entry 156
+ (long int)0x1.p10,
+ 0x1.fffffffffffffp9
+ },
+ { // Entry 157
+ (long int)0x1.p10,
+ 0x1.0p10
+ },
+ { // Entry 158
+ (long int)0x1.p10,
+ 0x1.0000000000001p10
+ },
+ { // Entry 159
+ (long int)0x1.p11,
+ 0x1.fffffffffffffp10
+ },
+ { // Entry 160
+ (long int)0x1.p11,
+ 0x1.0p11
+ },
+ { // Entry 161
+ (long int)0x1.p11,
+ 0x1.0000000000001p11
+ },
+ { // Entry 162
+ (long int)0x1.p12,
+ 0x1.fffffffffffffp11
+ },
+ { // Entry 163
+ (long int)0x1.p12,
+ 0x1.0p12
+ },
+ { // Entry 164
+ (long int)0x1.p12,
+ 0x1.0000000000001p12
+ },
+ { // Entry 165
+ (long int)0x1.p2,
+ 0x1.1ffffffffffffp2
+ },
+ { // Entry 166
+ (long int)0x1.p2,
+ 0x1.2p2
+ },
+ { // Entry 167
+ (long int)0x1.40p2,
+ 0x1.2000000000001p2
+ },
+ { // Entry 168
+ (long int)0x1.p3,
+ 0x1.0ffffffffffffp3
+ },
+ { // Entry 169
+ (long int)0x1.p3,
+ 0x1.1p3
+ },
+ { // Entry 170
+ (long int)0x1.20p3,
+ 0x1.1000000000001p3
+ },
+ { // Entry 171
+ (long int)0x1.p4,
+ 0x1.07fffffffffffp4
+ },
+ { // Entry 172
+ (long int)0x1.p4,
+ 0x1.080p4
+ },
+ { // Entry 173
+ (long int)0x1.10p4,
+ 0x1.0800000000001p4
+ },
+ { // Entry 174
+ (long int)0x1.p5,
+ 0x1.03fffffffffffp5
+ },
+ { // Entry 175
+ (long int)0x1.p5,
+ 0x1.040p5
+ },
+ { // Entry 176
+ (long int)0x1.08p5,
+ 0x1.0400000000001p5
+ },
+ { // Entry 177
+ (long int)0x1.p6,
+ 0x1.01fffffffffffp6
+ },
+ { // Entry 178
+ (long int)0x1.p6,
+ 0x1.020p6
+ },
+ { // Entry 179
+ (long int)0x1.04p6,
+ 0x1.0200000000001p6
+ },
+ { // Entry 180
+ (long int)0x1.p7,
+ 0x1.00fffffffffffp7
+ },
+ { // Entry 181
+ (long int)0x1.p7,
+ 0x1.010p7
+ },
+ { // Entry 182
+ (long int)0x1.02p7,
+ 0x1.0100000000001p7
+ },
+ { // Entry 183
+ (long int)0x1.p8,
+ 0x1.007ffffffffffp8
+ },
+ { // Entry 184
+ (long int)0x1.p8,
+ 0x1.008p8
+ },
+ { // Entry 185
+ (long int)0x1.01p8,
+ 0x1.0080000000001p8
+ },
+ { // Entry 186
+ (long int)0x1.p9,
+ 0x1.003ffffffffffp9
+ },
+ { // Entry 187
+ (long int)0x1.p9,
+ 0x1.004p9
+ },
+ { // Entry 188
+ (long int)0x1.0080p9,
+ 0x1.0040000000001p9
+ },
+ { // Entry 189
+ (long int)0x1.p10,
+ 0x1.001ffffffffffp10
+ },
+ { // Entry 190
+ (long int)0x1.p10,
+ 0x1.002p10
+ },
+ { // Entry 191
+ (long int)0x1.0040p10,
+ 0x1.0020000000001p10
+ },
+ { // Entry 192
+ (long int)0x1.0040p10,
+ 0x1.005ffffffffffp10
+ },
+ { // Entry 193
+ (long int)0x1.0080p10,
+ 0x1.006p10
+ },
+ { // Entry 194
+ (long int)0x1.0080p10,
+ 0x1.0060000000001p10
+ },
+ { // Entry 195
+ (long int)0x1.p11,
+ 0x1.000ffffffffffp11
+ },
+ { // Entry 196
+ (long int)0x1.p11,
+ 0x1.001p11
+ },
+ { // Entry 197
+ (long int)0x1.0020p11,
+ 0x1.0010000000001p11
+ },
+ { // Entry 198
+ (long int)0x1.p12,
+ 0x1.0007fffffffffp12
+ },
+ { // Entry 199
+ (long int)0x1.p12,
+ 0x1.00080p12
+ },
+ { // Entry 200
+ (long int)0x1.0010p12,
+ 0x1.0008000000001p12
+ },
+ { // Entry 201
+ (long int)0x1.80p1,
+ 0x1.921fb54442d18p1
+ },
+ { // Entry 202
+ (long int)-0x1.80p1,
+ -0x1.921fb54442d18p1
+ },
+ { // Entry 203
+ (long int)0x1.p1,
+ 0x1.921fb54442d18p0
+ },
+ { // Entry 204
+ (long int)-0x1.p1,
+ -0x1.921fb54442d18p0
+ },
+ { // Entry 205
+ (long int)0x1.p0,
+ 0x1.0000000000001p0
+ },
+ { // Entry 206
+ (long int)-0x1.p0,
+ -0x1.0000000000001p0
+ },
+ { // Entry 207
+ (long int)0x1.p0,
+ 0x1.0p0
+ },
+ { // Entry 208
+ (long int)-0x1.p0,
+ -0x1.0p0
+ },
+ { // Entry 209
+ (long int)0x1.p0,
+ 0x1.fffffffffffffp-1
+ },
+ { // Entry 210
+ (long int)-0x1.p0,
+ -0x1.fffffffffffffp-1
+ },
+ { // Entry 211
+ (long int)0x1.p0,
+ 0x1.921fb54442d18p-1
+ },
+ { // Entry 212
+ (long int)-0x1.p0,
+ -0x1.921fb54442d18p-1
+ },
+ { // Entry 213
+ (long int)0.0,
+ 0x1.0000000000001p-1022
+ },
+ { // Entry 214
+ (long int)0.0,
+ -0x1.0000000000001p-1022
+ },
+ { // Entry 215
+ (long int)0.0,
+ 0x1.0p-1022
+ },
+ { // Entry 216
+ (long int)0.0,
+ -0x1.0p-1022
+ },
+ { // Entry 217
+ (long int)0.0,
+ 0x1.ffffffffffffep-1023
+ },
+ { // Entry 218
+ (long int)0.0,
+ -0x1.ffffffffffffep-1023
+ },
+ { // Entry 219
+ (long int)0.0,
+ 0x1.ffffffffffffcp-1023
+ },
+ { // Entry 220
+ (long int)0.0,
+ -0x1.ffffffffffffcp-1023
+ },
+ { // Entry 221
+ (long int)0.0,
+ 0x1.0p-1073
+ },
+ { // Entry 222
+ (long int)0.0,
+ -0x1.0p-1073
+ },
+ { // Entry 223
+ (long int)0.0,
+ 0x1.0p-1074
+ },
+ { // Entry 224
+ (long int)0.0,
+ -0x1.0p-1074
+ },
+ { // Entry 225
+ (long int)0.0,
+ 0.0
+ },
+ { // Entry 226
+ (long int)0.0,
+ -0.0
+ },
+ { // Entry 227
+ (long int)0x1.p1,
+ 0x1.8p0
+ },
+ { // Entry 228
+ (long int)-0x1.p1,
+ -0x1.8p0
+ },
+ { // Entry 229
+ (long int)0x1.p1,
+ 0x1.4p1
+ },
+ { // Entry 230
+ (long int)-0x1.p1,
+ -0x1.4p1
+ },
+ { // Entry 231
+ (long int)0.0,
+ 0x1.fffffp-2
+ },
+ { // Entry 232
+ (long int)0.0,
+ 0x1.0p-1
+ },
+ { // Entry 233
+ (long int)0x1.p0,
+ 0x1.00001p-1
+ },
+ { // Entry 234
+ (long int)0.0,
+ -0x1.fffffp-2
+ },
+ { // Entry 235
+ (long int)0.0,
+ -0x1.0p-1
+ },
+ { // Entry 236
+ (long int)-0x1.p0,
+ -0x1.00001p-1
+ },
+ { // Entry 237
+ (long int)0x1.p1,
+ 0x1.80001p0
+ },
+ { // Entry 238
+ (long int)0x1.p0,
+ 0x1.7ffffp0
+ },
+ { // Entry 239
+ (long int)-0x1.p1,
+ -0x1.80001p0
+ },
+ { // Entry 240
+ (long int)-0x1.p0,
+ -0x1.7ffffp0
+ }
+}; \ No newline at end of file
diff --git a/tests/math_data/lrintf_intel_data.h b/tests/math_data/lrintf_intel_data.h
new file mode 100644
index 000000000..bd771b20b
--- /dev/null
+++ b/tests/math_data/lrintf_intel_data.h
@@ -0,0 +1,1002 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+static data_long_1_t<float> g_lrintf_intel_data[] = {
+ { // Entry 0
+ (long int)0.0,
+ -0x1.p-149
+ },
+ { // Entry 1
+ (long int)0.0,
+ 0.0
+ },
+ { // Entry 2
+ (long int)0.0,
+ 0x1.p-149
+ },
+ { // Entry 3
+ (long int)0.0,
+ 0x1.fffffep-2
+ },
+ { // Entry 4
+ (long int)0.0,
+ 0x1.p-1
+ },
+ { // Entry 5
+ (long int)0x1.p0,
+ 0x1.000002p-1
+ },
+ { // Entry 6
+ (long int)0x1.p0,
+ 0x1.fffffep-1
+ },
+ { // Entry 7
+ (long int)0x1.p0,
+ 0x1.p0
+ },
+ { // Entry 8
+ (long int)0x1.p0,
+ 0x1.000002p0
+ },
+ { // Entry 9
+ (long int)0x1.p0,
+ 0x1.7ffffep0
+ },
+ { // Entry 10
+ (long int)0x1.p1,
+ 0x1.80p0
+ },
+ { // Entry 11
+ (long int)0x1.p1,
+ 0x1.800002p0
+ },
+ { // Entry 12
+ (long int)0x1.p1,
+ 0x1.fffffep0
+ },
+ { // Entry 13
+ (long int)0x1.p1,
+ 0x1.p1
+ },
+ { // Entry 14
+ (long int)0x1.p1,
+ 0x1.000002p1
+ },
+ { // Entry 15
+ (long int)0x1.p1,
+ 0x1.3ffffep1
+ },
+ { // Entry 16
+ (long int)0x1.p1,
+ 0x1.40p1
+ },
+ { // Entry 17
+ (long int)0x1.80p1,
+ 0x1.400002p1
+ },
+ { // Entry 18
+ (long int)0x1.90p6,
+ 0x1.8ffffep6
+ },
+ { // Entry 19
+ (long int)0x1.90p6,
+ 0x1.90p6
+ },
+ { // Entry 20
+ (long int)0x1.90p6,
+ 0x1.900002p6
+ },
+ { // Entry 21
+ (long int)0x1.90p6,
+ 0x1.91fffep6
+ },
+ { // Entry 22
+ (long int)0x1.90p6,
+ 0x1.92p6
+ },
+ { // Entry 23
+ (long int)0x1.94p6,
+ 0x1.920002p6
+ },
+ { // Entry 24
+ (long int)0x1.f4p9,
+ 0x1.f3fffep9
+ },
+ { // Entry 25
+ (long int)0x1.f4p9,
+ 0x1.f4p9
+ },
+ { // Entry 26
+ (long int)0x1.f4p9,
+ 0x1.f40002p9
+ },
+ { // Entry 27
+ (long int)0x1.f4p9,
+ 0x1.f43ffep9
+ },
+ { // Entry 28
+ (long int)0x1.f4p9,
+ 0x1.f440p9
+ },
+ { // Entry 29
+ (long int)0x1.f480p9,
+ 0x1.f44002p9
+ },
+ { // Entry 30
+ (long int)0x1.p21,
+ 0x1.fffffep20
+ },
+ { // Entry 31
+ (long int)0x1.p21,
+ 0x1.p21
+ },
+ { // Entry 32
+ (long int)0x1.p21,
+ 0x1.000002p21
+ },
+ { // Entry 33
+ (long int)0x1.p22,
+ 0x1.fffffep21
+ },
+ { // Entry 34
+ (long int)0x1.p22,
+ 0x1.p22
+ },
+ { // Entry 35
+ (long int)0x1.p22,
+ 0x1.000002p22
+ },
+ { // Entry 36
+ (long int)0x1.p23,
+ 0x1.fffffep22
+ },
+ { // Entry 37
+ (long int)0x1.p23,
+ 0x1.p23
+ },
+ { // Entry 38
+ (long int)0x1.000002p23,
+ 0x1.000002p23
+ },
+ { // Entry 39
+ (long int)0x1.fffffep23,
+ 0x1.fffffep23
+ },
+ { // Entry 40
+ (long int)0x1.p24,
+ 0x1.p24
+ },
+ { // Entry 41
+ (long int)0x1.000002p24,
+ 0x1.000002p24
+ },
+ { // Entry 42
+ (long int)0x1.fffffep24,
+ 0x1.fffffep24
+ },
+ { // Entry 43
+ (long int)0x1.p25,
+ 0x1.p25
+ },
+ { // Entry 44
+ (long int)0x1.000002p25,
+ 0x1.000002p25
+ },
+ { // Entry 45
+ (long int)-0x1.p0,
+ -0x1.000002p-1
+ },
+ { // Entry 46
+ (long int)0.0,
+ -0x1.p-1
+ },
+ { // Entry 47
+ (long int)0.0,
+ -0x1.fffffep-2
+ },
+ { // Entry 48
+ (long int)-0x1.p0,
+ -0x1.000002p0
+ },
+ { // Entry 49
+ (long int)-0x1.p0,
+ -0x1.p0
+ },
+ { // Entry 50
+ (long int)-0x1.p0,
+ -0x1.fffffep-1
+ },
+ { // Entry 51
+ (long int)-0x1.p1,
+ -0x1.800002p0
+ },
+ { // Entry 52
+ (long int)-0x1.p1,
+ -0x1.80p0
+ },
+ { // Entry 53
+ (long int)-0x1.p0,
+ -0x1.7ffffep0
+ },
+ { // Entry 54
+ (long int)-0x1.p1,
+ -0x1.000002p1
+ },
+ { // Entry 55
+ (long int)-0x1.p1,
+ -0x1.p1
+ },
+ { // Entry 56
+ (long int)-0x1.p1,
+ -0x1.fffffep0
+ },
+ { // Entry 57
+ (long int)-0x1.80p1,
+ -0x1.400002p1
+ },
+ { // Entry 58
+ (long int)-0x1.p1,
+ -0x1.40p1
+ },
+ { // Entry 59
+ (long int)-0x1.p1,
+ -0x1.3ffffep1
+ },
+ { // Entry 60
+ (long int)-0x1.90p6,
+ -0x1.900002p6
+ },
+ { // Entry 61
+ (long int)-0x1.90p6,
+ -0x1.90p6
+ },
+ { // Entry 62
+ (long int)-0x1.90p6,
+ -0x1.8ffffep6
+ },
+ { // Entry 63
+ (long int)-0x1.94p6,
+ -0x1.920002p6
+ },
+ { // Entry 64
+ (long int)-0x1.90p6,
+ -0x1.92p6
+ },
+ { // Entry 65
+ (long int)-0x1.90p6,
+ -0x1.91fffep6
+ },
+ { // Entry 66
+ (long int)-0x1.f4p9,
+ -0x1.f40002p9
+ },
+ { // Entry 67
+ (long int)-0x1.f4p9,
+ -0x1.f4p9
+ },
+ { // Entry 68
+ (long int)-0x1.f4p9,
+ -0x1.f3fffep9
+ },
+ { // Entry 69
+ (long int)-0x1.f480p9,
+ -0x1.f44002p9
+ },
+ { // Entry 70
+ (long int)-0x1.f4p9,
+ -0x1.f440p9
+ },
+ { // Entry 71
+ (long int)-0x1.f4p9,
+ -0x1.f43ffep9
+ },
+ { // Entry 72
+ (long int)-0x1.p21,
+ -0x1.000002p21
+ },
+ { // Entry 73
+ (long int)-0x1.p21,
+ -0x1.p21
+ },
+ { // Entry 74
+ (long int)-0x1.p21,
+ -0x1.fffffep20
+ },
+ { // Entry 75
+ (long int)-0x1.p22,
+ -0x1.000002p22
+ },
+ { // Entry 76
+ (long int)-0x1.p22,
+ -0x1.p22
+ },
+ { // Entry 77
+ (long int)-0x1.p22,
+ -0x1.fffffep21
+ },
+ { // Entry 78
+ (long int)-0x1.000002p23,
+ -0x1.000002p23
+ },
+ { // Entry 79
+ (long int)-0x1.p23,
+ -0x1.p23
+ },
+ { // Entry 80
+ (long int)-0x1.p23,
+ -0x1.fffffep22
+ },
+ { // Entry 81
+ (long int)-0x1.000002p24,
+ -0x1.000002p24
+ },
+ { // Entry 82
+ (long int)-0x1.p24,
+ -0x1.p24
+ },
+ { // Entry 83
+ (long int)-0x1.fffffep23,
+ -0x1.fffffep23
+ },
+ { // Entry 84
+ (long int)-0x1.000002p25,
+ -0x1.000002p25
+ },
+ { // Entry 85
+ (long int)-0x1.p25,
+ -0x1.p25
+ },
+ { // Entry 86
+ (long int)-0x1.fffffep24,
+ -0x1.fffffep24
+ },
+ { // Entry 87
+ (long int)0x1.fffffep29,
+ 0x1.fffffep29
+ },
+ { // Entry 88
+ (long int)0x1.p30,
+ 0x1.p30
+ },
+ { // Entry 89
+ (long int)0x1.000002p30,
+ 0x1.000002p30
+ },
+ { // Entry 90
+ (long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 91
+ (long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 92
+ (long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 93
+ (long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 94
+ (long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 95
+ (long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 96
+ (long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 97
+ (long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 98
+ (long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 99
+ (long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 100
+ (long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 101
+ (long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 102
+ (long int)-0x1.000002p30,
+ -0x1.000002p30
+ },
+ { // Entry 103
+ (long int)-0x1.p30,
+ -0x1.p30
+ },
+ { // Entry 104
+ (long int)-0x1.fffffep29,
+ -0x1.fffffep29
+ },
+ { // Entry 105
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 106
+ (long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 107
+ (long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 108
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 109
+ (long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 110
+ (long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 111
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 112
+ (long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 113
+ (long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 114
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 115
+ (long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 116
+ (long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 117
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 118
+ (long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 119
+ (long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 120
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 121
+ (long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 122
+ (long int)-0x1.fffffcp30,
+ -0x1.fffffcp30
+ },
+ { // Entry 123
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 124
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 125
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 126
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 127
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 128
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 129
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 130
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 131
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 132
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 133
+ (long int)0x1.fffffcp30,
+ 0x1.fffffcp30
+ },
+ { // Entry 134
+ (long int)0x1.fffffep30,
+ 0x1.fffffep30
+ },
+ { // Entry 135
+ (long int)-0x1.p31,
+ -0x1.p31
+ },
+ { // Entry 136
+ (long int)-0x1.fffffep30,
+ -0x1.fffffep30
+ },
+ { // Entry 137
+ (long int)0x1.p2,
+ 0x1.fffffep1
+ },
+ { // Entry 138
+ (long int)0x1.p2,
+ 0x1.p2
+ },
+ { // Entry 139
+ (long int)0x1.p2,
+ 0x1.000002p2
+ },
+ { // Entry 140
+ (long int)0x1.p3,
+ 0x1.fffffep2
+ },
+ { // Entry 141
+ (long int)0x1.p3,
+ 0x1.p3
+ },
+ { // Entry 142
+ (long int)0x1.p3,
+ 0x1.000002p3
+ },
+ { // Entry 143
+ (long int)0x1.p4,
+ 0x1.fffffep3
+ },
+ { // Entry 144
+ (long int)0x1.p4,
+ 0x1.p4
+ },
+ { // Entry 145
+ (long int)0x1.p4,
+ 0x1.000002p4
+ },
+ { // Entry 146
+ (long int)0x1.p5,
+ 0x1.fffffep4
+ },
+ { // Entry 147
+ (long int)0x1.p5,
+ 0x1.p5
+ },
+ { // Entry 148
+ (long int)0x1.p5,
+ 0x1.000002p5
+ },
+ { // Entry 149
+ (long int)0x1.p6,
+ 0x1.fffffep5
+ },
+ { // Entry 150
+ (long int)0x1.p6,
+ 0x1.p6
+ },
+ { // Entry 151
+ (long int)0x1.p6,
+ 0x1.000002p6
+ },
+ { // Entry 152
+ (long int)0x1.p7,
+ 0x1.fffffep6
+ },
+ { // Entry 153
+ (long int)0x1.p7,
+ 0x1.p7
+ },
+ { // Entry 154
+ (long int)0x1.p7,
+ 0x1.000002p7
+ },
+ { // Entry 155
+ (long int)0x1.p8,
+ 0x1.fffffep7
+ },
+ { // Entry 156
+ (long int)0x1.p8,
+ 0x1.p8
+ },
+ { // Entry 157
+ (long int)0x1.p8,
+ 0x1.000002p8
+ },
+ { // Entry 158
+ (long int)0x1.p9,
+ 0x1.fffffep8
+ },
+ { // Entry 159
+ (long int)0x1.p9,
+ 0x1.p9
+ },
+ { // Entry 160
+ (long int)0x1.p9,
+ 0x1.000002p9
+ },
+ { // Entry 161
+ (long int)0x1.p10,
+ 0x1.fffffep9
+ },
+ { // Entry 162
+ (long int)0x1.p10,
+ 0x1.p10
+ },
+ { // Entry 163
+ (long int)0x1.p10,
+ 0x1.000002p10
+ },
+ { // Entry 164
+ (long int)0x1.p11,
+ 0x1.fffffep10
+ },
+ { // Entry 165
+ (long int)0x1.p11,
+ 0x1.p11
+ },
+ { // Entry 166
+ (long int)0x1.p11,
+ 0x1.000002p11
+ },
+ { // Entry 167
+ (long int)0x1.p12,
+ 0x1.fffffep11
+ },
+ { // Entry 168
+ (long int)0x1.p12,
+ 0x1.p12
+ },
+ { // Entry 169
+ (long int)0x1.p12,
+ 0x1.000002p12
+ },
+ { // Entry 170
+ (long int)0x1.p2,
+ 0x1.1ffffep2
+ },
+ { // Entry 171
+ (long int)0x1.p2,
+ 0x1.20p2
+ },
+ { // Entry 172
+ (long int)0x1.40p2,
+ 0x1.200002p2
+ },
+ { // Entry 173
+ (long int)0x1.p3,
+ 0x1.0ffffep3
+ },
+ { // Entry 174
+ (long int)0x1.p3,
+ 0x1.10p3
+ },
+ { // Entry 175
+ (long int)0x1.20p3,
+ 0x1.100002p3
+ },
+ { // Entry 176
+ (long int)0x1.p4,
+ 0x1.07fffep4
+ },
+ { // Entry 177
+ (long int)0x1.p4,
+ 0x1.08p4
+ },
+ { // Entry 178
+ (long int)0x1.10p4,
+ 0x1.080002p4
+ },
+ { // Entry 179
+ (long int)0x1.p5,
+ 0x1.03fffep5
+ },
+ { // Entry 180
+ (long int)0x1.p5,
+ 0x1.04p5
+ },
+ { // Entry 181
+ (long int)0x1.08p5,
+ 0x1.040002p5
+ },
+ { // Entry 182
+ (long int)0x1.p6,
+ 0x1.01fffep6
+ },
+ { // Entry 183
+ (long int)0x1.p6,
+ 0x1.02p6
+ },
+ { // Entry 184
+ (long int)0x1.04p6,
+ 0x1.020002p6
+ },
+ { // Entry 185
+ (long int)0x1.p7,
+ 0x1.00fffep7
+ },
+ { // Entry 186
+ (long int)0x1.p7,
+ 0x1.01p7
+ },
+ { // Entry 187
+ (long int)0x1.02p7,
+ 0x1.010002p7
+ },
+ { // Entry 188
+ (long int)0x1.p8,
+ 0x1.007ffep8
+ },
+ { // Entry 189
+ (long int)0x1.p8,
+ 0x1.0080p8
+ },
+ { // Entry 190
+ (long int)0x1.01p8,
+ 0x1.008002p8
+ },
+ { // Entry 191
+ (long int)0x1.p9,
+ 0x1.003ffep9
+ },
+ { // Entry 192
+ (long int)0x1.p9,
+ 0x1.0040p9
+ },
+ { // Entry 193
+ (long int)0x1.0080p9,
+ 0x1.004002p9
+ },
+ { // Entry 194
+ (long int)0x1.p10,
+ 0x1.001ffep10
+ },
+ { // Entry 195
+ (long int)0x1.p10,
+ 0x1.0020p10
+ },
+ { // Entry 196
+ (long int)0x1.0040p10,
+ 0x1.002002p10
+ },
+ { // Entry 197
+ (long int)0x1.0040p10,
+ 0x1.005ffep10
+ },
+ { // Entry 198
+ (long int)0x1.0080p10,
+ 0x1.0060p10
+ },
+ { // Entry 199
+ (long int)0x1.0080p10,
+ 0x1.006002p10
+ },
+ { // Entry 200
+ (long int)0x1.p11,
+ 0x1.000ffep11
+ },
+ { // Entry 201
+ (long int)0x1.p11,
+ 0x1.0010p11
+ },
+ { // Entry 202
+ (long int)0x1.0020p11,
+ 0x1.001002p11
+ },
+ { // Entry 203
+ (long int)0x1.p12,
+ 0x1.0007fep12
+ },
+ { // Entry 204
+ (long int)0x1.p12,
+ 0x1.0008p12
+ },
+ { // Entry 205
+ (long int)0x1.0010p12,
+ 0x1.000802p12
+ },
+ { // Entry 206
+ (long int)0x1.80p1,
+ 0x1.921fb6p1
+ },
+ { // Entry 207
+ (long int)-0x1.80p1,
+ -0x1.921fb6p1
+ },
+ { // Entry 208
+ (long int)0x1.p1,
+ 0x1.921fb6p0
+ },
+ { // Entry 209
+ (long int)-0x1.p1,
+ -0x1.921fb6p0
+ },
+ { // Entry 210
+ (long int)0x1.p0,
+ 0x1.000002p0
+ },
+ { // Entry 211
+ (long int)-0x1.p0,
+ -0x1.000002p0
+ },
+ { // Entry 212
+ (long int)0x1.p0,
+ 0x1.p0
+ },
+ { // Entry 213
+ (long int)-0x1.p0,
+ -0x1.p0
+ },
+ { // Entry 214
+ (long int)0x1.p0,
+ 0x1.fffffep-1
+ },
+ { // Entry 215
+ (long int)-0x1.p0,
+ -0x1.fffffep-1
+ },
+ { // Entry 216
+ (long int)0x1.p0,
+ 0x1.921fb6p-1
+ },
+ { // Entry 217
+ (long int)-0x1.p0,
+ -0x1.921fb6p-1
+ },
+ { // Entry 218
+ (long int)0.0,
+ 0x1.000002p-126
+ },
+ { // Entry 219
+ (long int)0.0,
+ -0x1.000002p-126
+ },
+ { // Entry 220
+ (long int)0.0,
+ 0x1.p-126
+ },
+ { // Entry 221
+ (long int)0.0,
+ -0x1.p-126
+ },
+ { // Entry 222
+ (long int)0.0,
+ 0x1.fffffcp-127
+ },
+ { // Entry 223
+ (long int)0.0,
+ -0x1.fffffcp-127
+ },
+ { // Entry 224
+ (long int)0.0,
+ 0x1.fffff8p-127
+ },
+ { // Entry 225
+ (long int)0.0,
+ -0x1.fffff8p-127
+ },
+ { // Entry 226
+ (long int)0.0,
+ 0x1.p-148
+ },
+ { // Entry 227
+ (long int)0.0,
+ -0x1.p-148
+ },
+ { // Entry 228
+ (long int)0.0,
+ 0x1.p-149
+ },
+ { // Entry 229
+ (long int)0.0,
+ -0x1.p-149
+ },
+ { // Entry 230
+ (long int)0.0,
+ 0.0f
+ },
+ { // Entry 231
+ (long int)0.0,
+ -0.0f
+ },
+ { // Entry 232
+ (long int)0x1.p1,
+ 0x1.80p0
+ },
+ { // Entry 233
+ (long int)-0x1.p1,
+ -0x1.80p0
+ },
+ { // Entry 234
+ (long int)0x1.p1,
+ 0x1.40p1
+ },
+ { // Entry 235
+ (long int)-0x1.p1,
+ -0x1.40p1
+ },
+ { // Entry 236
+ (long int)0.0,
+ 0x1.fffff0p-2
+ },
+ { // Entry 237
+ (long int)0.0,
+ 0x1.p-1
+ },
+ { // Entry 238
+ (long int)0x1.p0,
+ 0x1.000010p-1
+ },
+ { // Entry 239
+ (long int)0.0,
+ -0x1.fffff0p-2
+ },
+ { // Entry 240
+ (long int)0.0,
+ -0x1.p-1
+ },
+ { // Entry 241
+ (long int)-0x1.p0,
+ -0x1.000010p-1
+ },
+ { // Entry 242
+ (long int)0x1.p1,
+ 0x1.800010p0
+ },
+ { // Entry 243
+ (long int)0x1.p0,
+ 0x1.7ffff0p0
+ },
+ { // Entry 244
+ (long int)-0x1.p1,
+ -0x1.800010p0
+ },
+ { // Entry 245
+ (long int)-0x1.p0,
+ -0x1.7ffff0p0
+ }
+}; \ No newline at end of file
diff --git a/tests/math_data_test.h b/tests/math_data_test.h
index 8aa2bf180..0aba70163 100644
--- a/tests/math_data_test.h
+++ b/tests/math_data_test.h
@@ -30,6 +30,18 @@ struct data_int_1_t {
T1 input;
};
+template <typename T1>
+struct data_long_1_t {
+ long expected;
+ T1 input;
+};
+
+template <typename T1>
+struct data_llong_1_t {
+ long long expected;
+ T1 input;
+};
+
template <typename RT, typename T1, typename T2>
struct data_1_2_t {
RT expected;
@@ -157,6 +169,28 @@ void DoMathDataTest(data_int_1_t<T> (&data)[N], int f(T)) {
}
}
+// Runs through the array 'data' applying 'f' to each of the input values
+// and asserting that the result is within ULP ulps of the expected value.
+// For testing a (double) -> long int function like lrint(3).
+template <size_t ULP, typename T, size_t N>
+void DoMathDataTest(data_long_1_t<T> (&data)[N], long f(T)) {
+ fesetenv(FE_DFL_ENV);
+ for (size_t i = 0; i < N; ++i) {
+ EXPECT_EQ(data[i].expected, f(data[i].input)) << "Failed on element " << i;
+ }
+}
+
+// Runs through the array 'data' applying 'f' to each of the input values
+// and asserting that the result is within ULP ulps of the expected value.
+// For testing a (double) -> long long int function like llrint(3).
+template <size_t ULP, typename T, size_t N>
+void DoMathDataTest(data_llong_1_t<T> (&data)[N], long long f(T)) {
+ fesetenv(FE_DFL_ENV);
+ for (size_t i = 0; i < N; ++i) {
+ EXPECT_EQ(data[i].expected, f(data[i].input)) << "Failed on element " << i;
+ }
+}
+
// Runs through the array 'data' applying 'f' to each of the pairs of input values
// and asserting that the result is within ULP ulps of the expected value.
// For testing a (double, double) -> double function like pow(3).
diff --git a/tests/math_test.cpp b/tests/math_test.cpp
index e616e9b08..c805cc29d 100644
--- a/tests/math_test.cpp
+++ b/tests/math_test.cpp
@@ -1639,6 +1639,16 @@ TEST(math, ldexpf_intel) {
DoMathDataTest<1>(g_ldexpf_intel_data, ldexpf);
}
+#include "math_data/llrint_intel_data.h"
+TEST(math, llrint_intel) {
+ DoMathDataTest<1>(g_llrint_intel_data, llrint);
+}
+
+#include "math_data/llrintf_intel_data.h"
+TEST(math, llrintf_intel) {
+ DoMathDataTest<1>(g_llrintf_intel_data, llrintf);
+}
+
#include "math_data/log_intel_data.h"
TEST(math, log_intel) {
DoMathDataTest<1>(g_log_intel_data, log);
@@ -1689,6 +1699,16 @@ TEST(math, logbf_intel) {
DoMathDataTest<1>(g_logbf_intel_data, logbf);
}
+#include "math_data/lrint_intel_data.h"
+TEST(math, lrint_intel) {
+ DoMathDataTest<1>(g_lrint_intel_data, lrint);
+}
+
+#include "math_data/lrintf_intel_data.h"
+TEST(math, lrintf_intel) {
+ DoMathDataTest<1>(g_lrintf_intel_data, lrintf);
+}
+
#include "math_data/modf_intel_data.h"
TEST(math, modf_intel) {
DoMathDataTest<1>(g_modf_intel_data, modf);
diff --git a/tests/net_if_test.cpp b/tests/net_if_test.cpp
new file mode 100644
index 000000000..caaed5fb7
--- /dev/null
+++ b/tests/net_if_test.cpp
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <net/if.h>
+
+#include <errno.h>
+#include <ifaddrs.h>
+
+#include <gtest/gtest.h>
+
+TEST(net_if, if_nametoindex_if_indextoname) {
+ unsigned index;
+ index = if_nametoindex("lo");
+ ASSERT_NE(index, 0U);
+
+ char buf[IF_NAMESIZE] = {};
+ char* name = if_indextoname(index, buf);
+ ASSERT_STREQ("lo", name);
+}
+
+TEST(net_if, if_nametoindex_fail) {
+ unsigned index = if_nametoindex("this-interface-does-not-exist");
+ ASSERT_EQ(0U, index);
+}
+
+TEST(net_if, if_nameindex) {
+ struct if_nameindex* list = if_nameindex();
+ ASSERT_TRUE(list != nullptr);
+
+ ASSERT_TRUE(list->if_index != 0);
+
+ std::set<std::string> if_nameindex_names;
+ char buf[IF_NAMESIZE] = {};
+ bool saw_lo = false;
+ for (struct if_nameindex* it = list; it->if_index != 0; ++it) {
+ fprintf(stderr, "\t%d\t%s\n", it->if_index, it->if_name);
+ if_nameindex_names.insert(it->if_name);
+ EXPECT_EQ(it->if_index, if_nametoindex(it->if_name));
+ EXPECT_STREQ(it->if_name, if_indextoname(it->if_index, buf));
+ if (strcmp(it->if_name, "lo") == 0) saw_lo = true;
+ }
+ ASSERT_TRUE(saw_lo);
+ if_freenameindex(list);
+
+ std::set<std::string> getifaddrs_names;
+ ifaddrs* ifa;
+ ASSERT_EQ(0, getifaddrs(&ifa));
+ for (ifaddrs* it = ifa; it != nullptr; it = it->ifa_next) {
+ getifaddrs_names.insert(it->ifa_name);
+ }
+ freeifaddrs(ifa);
+
+ ASSERT_EQ(getifaddrs_names, if_nameindex_names);
+}
+
+TEST(net_if, if_freenameindex_nullptr) {
+#if defined(__BIONIC__)
+ if_freenameindex(nullptr);
+#endif
+}
diff --git a/tests/netinet_in_test.cpp b/tests/netinet_in_test.cpp
new file mode 100644
index 000000000..a3377709f
--- /dev/null
+++ b/tests/netinet_in_test.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <netinet/in.h>
+
+#include <errno.h>
+
+#include <gtest/gtest.h>
+
+TEST(netinet_in, bindresvport) {
+ // This isn't something we can usually test, so just check the symbol's there.
+ ASSERT_EQ(-1, bindresvport(-1, nullptr));
+}
+
+TEST(netinet_in, in6addr_any) {
+ in6_addr any = IN6ADDR_ANY_INIT;
+ ASSERT_EQ(0, memcmp(&any, &in6addr_any, sizeof(in6addr_any)));
+}
+
+TEST(netinet_in, in6addr_loopback) {
+ in6_addr loopback = IN6ADDR_LOOPBACK_INIT;
+ ASSERT_EQ(0, memcmp(&loopback, &in6addr_loopback, sizeof(in6addr_loopback)));
+}
diff --git a/tests/netinet_udp_test.cpp b/tests/netinet_udp_test.cpp
new file mode 100644
index 000000000..661458ed1
--- /dev/null
+++ b/tests/netinet_udp_test.cpp
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <netinet/udp.h>
+
+#include <gtest/gtest.h>
+
+#if defined(__BIONIC__)
+ #define UDPHDR_USES_ANON_UNION
+#elif defined(__GLIBC_PREREQ)
+ #if __GLIBC_PREREQ(2, 18)
+ #define UDPHDR_USES_ANON_UNION
+ #endif
+#endif
+
+TEST(netinet_udp, compat) {
+#if defined(UDPHDR_USES_ANON_UNION)
+ static_assert(offsetof(udphdr, uh_sport) == offsetof(udphdr, source), "udphdr::source");
+ static_assert(offsetof(udphdr, uh_dport) == offsetof(udphdr, dest), "udphdr::dest");
+ static_assert(offsetof(udphdr, uh_ulen) == offsetof(udphdr, len), "udphdr::len");
+ static_assert(offsetof(udphdr, uh_sum) == offsetof(udphdr, check), "udphdr::check");
+
+ udphdr u;
+ u.uh_sport = 0x1111;
+ u.uh_dport = 0x2222;
+ u.uh_ulen = 0x3333;
+ u.uh_sum = 0x4444;
+ ASSERT_EQ(0x1111, u.source);
+ ASSERT_EQ(0x2222, u.dest);
+ ASSERT_EQ(0x3333, u.len);
+ ASSERT_EQ(0x4444, u.check);
+#endif
+}
diff --git a/tests/pthread_dlfcn_test.cpp b/tests/pthread_dlfcn_test.cpp
index 5e8b2061e..64423dada 100644
--- a/tests/pthread_dlfcn_test.cpp
+++ b/tests/pthread_dlfcn_test.cpp
@@ -17,6 +17,8 @@
#include <dlfcn.h>
+#include "utils.h"
+
static int g_atfork_prepare_calls = 0;
static void AtForkPrepare1() { g_atfork_prepare_calls = (g_atfork_prepare_calls * 10) + 1; }
static void AtForkPrepare2() { g_atfork_prepare_calls = (g_atfork_prepare_calls * 10) + 2; }
@@ -49,7 +51,7 @@ TEST(pthread, pthread_atfork_with_dlclose) {
ASSERT_EQ(0, pthread_atfork(AtForkPrepare4, AtForkParent4, AtForkChild4));
- int pid = fork();
+ pid_t pid = fork();
ASSERT_NE(-1, pid) << strerror(errno);
@@ -64,8 +66,7 @@ TEST(pthread, pthread_atfork_with_dlclose) {
EXPECT_EQ(0, dlclose(handle));
g_atfork_prepare_calls = g_atfork_parent_calls = g_atfork_child_calls = 0;
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
+ AssertChildExited(pid, 0);
pid = fork();
@@ -79,5 +80,5 @@ TEST(pthread, pthread_atfork_with_dlclose) {
ASSERT_EQ(14, g_atfork_parent_calls);
ASSERT_EQ(41, g_atfork_prepare_calls);
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
+ AssertChildExited(pid, 0);
}
diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp
index e21025578..0313171e6 100755
--- a/tests/pthread_test.cpp
+++ b/tests/pthread_test.cpp
@@ -30,18 +30,14 @@
#include <unwind.h>
#include <atomic>
-#include <regex>
#include <vector>
-#include <base/file.h>
-#include <base/stringprintf.h>
-
+#include "private/bionic_constants.h"
#include "private/bionic_macros.h"
#include "private/ScopeGuard.h"
#include "BionicDeathTest.h"
#include "ScopedSignalHandler.h"
-
-extern "C" pid_t gettid();
+#include "utils.h"
TEST(pthread, pthread_key_create) {
pthread_key_t key;
@@ -68,7 +64,7 @@ TEST(pthread, pthread_key_many_distinct) {
std::vector<pthread_key_t> keys;
auto scope_guard = make_scope_guard([&keys]{
- for (auto key : keys) {
+ for (const auto& key : keys) {
EXPECT_EQ(0, pthread_key_delete(key));
}
});
@@ -106,7 +102,7 @@ TEST(pthread, pthread_key_not_exceed_PTHREAD_KEYS_MAX) {
}
// Don't leak keys.
- for (auto key : keys) {
+ for (const auto& key : keys) {
EXPECT_EQ(0, pthread_key_delete(key));
}
keys.clear();
@@ -145,10 +141,7 @@ TEST(pthread, pthread_key_fork) {
_exit(99);
}
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(99, WEXITSTATUS(status));
+ AssertChildExited(pid, 99);
ASSERT_EQ(expected, pthread_getspecific(key));
ASSERT_EQ(0, pthread_key_delete(key));
@@ -162,7 +155,7 @@ TEST(pthread, pthread_key_dirty) {
pthread_key_t key;
ASSERT_EQ(0, pthread_key_create(&key, NULL));
- size_t stack_size = 128 * 1024;
+ size_t stack_size = 640 * 1024;
void* stack = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
ASSERT_NE(MAP_FAILED, stack);
memset(stack, 0xff, stack_size);
@@ -220,13 +213,13 @@ class SpinFunctionHelper {
while (spin_flag_) {}
return NULL;
}
- static volatile bool spin_flag_;
+ static std::atomic<bool> spin_flag_;
};
// It doesn't matter if spin_flag_ is used in several tests,
// because it is always set to false after each test. Each thread
// loops on spin_flag_ can find it becomes false at some time.
-volatile bool SpinFunctionHelper::spin_flag_ = false;
+std::atomic<bool> SpinFunctionHelper::spin_flag_;
static void* JoinFn(void* arg) {
return reinterpret_cast<void*>(pthread_join(reinterpret_cast<pthread_t>(arg), NULL));
@@ -419,6 +412,8 @@ TEST(pthread, pthread_setname_np__other) {
pthread_t t1;
ASSERT_EQ(0, pthread_create(&t1, NULL, spinhelper.GetFunction(), NULL));
ASSERT_EQ(0, pthread_setname_np(t1, "short 2"));
+ spinhelper.UnSpin();
+ ASSERT_EQ(0, pthread_join(t1, nullptr));
}
TEST(pthread, pthread_setname_np__no_such_thread) {
@@ -469,6 +464,8 @@ TEST(pthread, pthread_getcpuclockid__clock_gettime) {
ASSERT_EQ(0, pthread_getcpuclockid(t, &c));
timespec ts;
ASSERT_EQ(0, clock_gettime(c, &ts));
+ spinhelper.UnSpin();
+ ASSERT_EQ(0, pthread_join(t, nullptr));
}
TEST(pthread, pthread_getcpuclockid__no_such_thread) {
@@ -537,7 +534,7 @@ TEST(pthread, pthread_join__race) {
// http://b/11693195 --- pthread_join could return before the thread had actually exited.
// If the joiner unmapped the thread's stack, that could lead to SIGSEGV in the thread.
for (size_t i = 0; i < 1024; ++i) {
- size_t stack_size = 64*1024;
+ size_t stack_size = 640*1024;
void* stack = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
pthread_attr_t a;
@@ -719,58 +716,47 @@ TEST(pthread, pthread_rwlock_smoke) {
ASSERT_EQ(0, pthread_rwlock_destroy(&l));
}
-static void WaitUntilThreadSleep(std::atomic<pid_t>& pid) {
- while (pid == 0) {
- usleep(1000);
- }
- std::string filename = android::base::StringPrintf("/proc/%d/stat", pid.load());
- std::regex regex {R"(\s+S\s+)"};
-
- while (true) {
- std::string content;
- ASSERT_TRUE(android::base::ReadFileToString(filename, &content));
- if (std::regex_search(content, regex)) {
- break;
- }
- usleep(1000);
- }
-}
-
struct RwlockWakeupHelperArg {
pthread_rwlock_t lock;
enum Progress {
LOCK_INITIALIZED,
LOCK_WAITING,
LOCK_RELEASED,
- LOCK_ACCESSED
+ LOCK_ACCESSED,
+ LOCK_TIMEDOUT,
};
std::atomic<Progress> progress;
std::atomic<pid_t> tid;
+ std::function<int (pthread_rwlock_t*)> trylock_function;
+ std::function<int (pthread_rwlock_t*)> lock_function;
+ std::function<int (pthread_rwlock_t*, const timespec*)> timed_lock_function;
};
-static void pthread_rwlock_reader_wakeup_writer_helper(RwlockWakeupHelperArg* arg) {
+static void pthread_rwlock_wakeup_helper(RwlockWakeupHelperArg* arg) {
arg->tid = gettid();
ASSERT_EQ(RwlockWakeupHelperArg::LOCK_INITIALIZED, arg->progress);
arg->progress = RwlockWakeupHelperArg::LOCK_WAITING;
- ASSERT_EQ(EBUSY, pthread_rwlock_trywrlock(&arg->lock));
- ASSERT_EQ(0, pthread_rwlock_wrlock(&arg->lock));
+ ASSERT_EQ(EBUSY, arg->trylock_function(&arg->lock));
+ ASSERT_EQ(0, arg->lock_function(&arg->lock));
ASSERT_EQ(RwlockWakeupHelperArg::LOCK_RELEASED, arg->progress);
ASSERT_EQ(0, pthread_rwlock_unlock(&arg->lock));
arg->progress = RwlockWakeupHelperArg::LOCK_ACCESSED;
}
-TEST(pthread, pthread_rwlock_reader_wakeup_writer) {
+static void test_pthread_rwlock_reader_wakeup_writer(std::function<int (pthread_rwlock_t*)> lock_function) {
RwlockWakeupHelperArg wakeup_arg;
ASSERT_EQ(0, pthread_rwlock_init(&wakeup_arg.lock, NULL));
ASSERT_EQ(0, pthread_rwlock_rdlock(&wakeup_arg.lock));
wakeup_arg.progress = RwlockWakeupHelperArg::LOCK_INITIALIZED;
wakeup_arg.tid = 0;
+ wakeup_arg.trylock_function = pthread_rwlock_trywrlock;
+ wakeup_arg.lock_function = lock_function;
pthread_t thread;
ASSERT_EQ(0, pthread_create(&thread, NULL,
- reinterpret_cast<void* (*)(void*)>(pthread_rwlock_reader_wakeup_writer_helper), &wakeup_arg));
+ reinterpret_cast<void* (*)(void*)>(pthread_rwlock_wakeup_helper), &wakeup_arg));
WaitUntilThreadSleep(wakeup_arg.tid);
ASSERT_EQ(RwlockWakeupHelperArg::LOCK_WAITING, wakeup_arg.progress);
@@ -782,29 +768,31 @@ TEST(pthread, pthread_rwlock_reader_wakeup_writer) {
ASSERT_EQ(0, pthread_rwlock_destroy(&wakeup_arg.lock));
}
-static void pthread_rwlock_writer_wakeup_reader_helper(RwlockWakeupHelperArg* arg) {
- arg->tid = gettid();
- ASSERT_EQ(RwlockWakeupHelperArg::LOCK_INITIALIZED, arg->progress);
- arg->progress = RwlockWakeupHelperArg::LOCK_WAITING;
-
- ASSERT_EQ(EBUSY, pthread_rwlock_tryrdlock(&arg->lock));
- ASSERT_EQ(0, pthread_rwlock_rdlock(&arg->lock));
- ASSERT_EQ(RwlockWakeupHelperArg::LOCK_RELEASED, arg->progress);
- ASSERT_EQ(0, pthread_rwlock_unlock(&arg->lock));
+TEST(pthread, pthread_rwlock_reader_wakeup_writer) {
+ test_pthread_rwlock_reader_wakeup_writer(pthread_rwlock_wrlock);
+}
- arg->progress = RwlockWakeupHelperArg::LOCK_ACCESSED;
+TEST(pthread, pthread_rwlock_reader_wakeup_writer_timedwait) {
+ timespec ts;
+ ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
+ ts.tv_sec += 1;
+ test_pthread_rwlock_reader_wakeup_writer([&](pthread_rwlock_t* lock) {
+ return pthread_rwlock_timedwrlock(lock, &ts);
+ });
}
-TEST(pthread, pthread_rwlock_writer_wakeup_reader) {
+static void test_pthread_rwlock_writer_wakeup_reader(std::function<int (pthread_rwlock_t*)> lock_function) {
RwlockWakeupHelperArg wakeup_arg;
ASSERT_EQ(0, pthread_rwlock_init(&wakeup_arg.lock, NULL));
ASSERT_EQ(0, pthread_rwlock_wrlock(&wakeup_arg.lock));
wakeup_arg.progress = RwlockWakeupHelperArg::LOCK_INITIALIZED;
wakeup_arg.tid = 0;
+ wakeup_arg.trylock_function = pthread_rwlock_tryrdlock;
+ wakeup_arg.lock_function = lock_function;
pthread_t thread;
ASSERT_EQ(0, pthread_create(&thread, NULL,
- reinterpret_cast<void* (*)(void*)>(pthread_rwlock_writer_wakeup_reader_helper), &wakeup_arg));
+ reinterpret_cast<void* (*)(void*)>(pthread_rwlock_wakeup_helper), &wakeup_arg));
WaitUntilThreadSleep(wakeup_arg.tid);
ASSERT_EQ(RwlockWakeupHelperArg::LOCK_WAITING, wakeup_arg.progress);
@@ -816,6 +804,85 @@ TEST(pthread, pthread_rwlock_writer_wakeup_reader) {
ASSERT_EQ(0, pthread_rwlock_destroy(&wakeup_arg.lock));
}
+TEST(pthread, pthread_rwlock_writer_wakeup_reader) {
+ test_pthread_rwlock_writer_wakeup_reader(pthread_rwlock_rdlock);
+}
+
+TEST(pthread, pthread_rwlock_writer_wakeup_reader_timedwait) {
+ timespec ts;
+ ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
+ ts.tv_sec += 1;
+ test_pthread_rwlock_writer_wakeup_reader([&](pthread_rwlock_t* lock) {
+ return pthread_rwlock_timedrdlock(lock, &ts);
+ });
+}
+
+static void pthread_rwlock_wakeup_timeout_helper(RwlockWakeupHelperArg* arg) {
+ arg->tid = gettid();
+ ASSERT_EQ(RwlockWakeupHelperArg::LOCK_INITIALIZED, arg->progress);
+ arg->progress = RwlockWakeupHelperArg::LOCK_WAITING;
+
+ ASSERT_EQ(EBUSY, arg->trylock_function(&arg->lock));
+
+ timespec ts;
+ ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
+ ASSERT_EQ(ETIMEDOUT, arg->timed_lock_function(&arg->lock, &ts));
+ ts.tv_nsec = -1;
+ ASSERT_EQ(EINVAL, arg->timed_lock_function(&arg->lock, &ts));
+ ts.tv_nsec = NS_PER_S;
+ ASSERT_EQ(EINVAL, arg->timed_lock_function(&arg->lock, &ts));
+ ts.tv_nsec = NS_PER_S - 1;
+ ts.tv_sec = -1;
+ ASSERT_EQ(ETIMEDOUT, arg->timed_lock_function(&arg->lock, &ts));
+ ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
+ ts.tv_sec += 1;
+ ASSERT_EQ(ETIMEDOUT, arg->timed_lock_function(&arg->lock, &ts));
+ ASSERT_EQ(RwlockWakeupHelperArg::LOCK_WAITING, arg->progress);
+ arg->progress = RwlockWakeupHelperArg::LOCK_TIMEDOUT;
+}
+
+TEST(pthread, pthread_rwlock_timedrdlock_timeout) {
+ RwlockWakeupHelperArg wakeup_arg;
+ ASSERT_EQ(0, pthread_rwlock_init(&wakeup_arg.lock, nullptr));
+ ASSERT_EQ(0, pthread_rwlock_wrlock(&wakeup_arg.lock));
+ wakeup_arg.progress = RwlockWakeupHelperArg::LOCK_INITIALIZED;
+ wakeup_arg.tid = 0;
+ wakeup_arg.trylock_function = pthread_rwlock_tryrdlock;
+ wakeup_arg.timed_lock_function = pthread_rwlock_timedrdlock;
+
+ pthread_t thread;
+ ASSERT_EQ(0, pthread_create(&thread, nullptr,
+ reinterpret_cast<void* (*)(void*)>(pthread_rwlock_wakeup_timeout_helper), &wakeup_arg));
+ WaitUntilThreadSleep(wakeup_arg.tid);
+ ASSERT_EQ(RwlockWakeupHelperArg::LOCK_WAITING, wakeup_arg.progress);
+
+ ASSERT_EQ(0, pthread_join(thread, nullptr));
+ ASSERT_EQ(RwlockWakeupHelperArg::LOCK_TIMEDOUT, wakeup_arg.progress);
+ ASSERT_EQ(0, pthread_rwlock_unlock(&wakeup_arg.lock));
+ ASSERT_EQ(0, pthread_rwlock_destroy(&wakeup_arg.lock));
+}
+
+TEST(pthread, pthread_rwlock_timedwrlock_timeout) {
+ RwlockWakeupHelperArg wakeup_arg;
+ ASSERT_EQ(0, pthread_rwlock_init(&wakeup_arg.lock, nullptr));
+ ASSERT_EQ(0, pthread_rwlock_rdlock(&wakeup_arg.lock));
+ wakeup_arg.progress = RwlockWakeupHelperArg::LOCK_INITIALIZED;
+ wakeup_arg.tid = 0;
+ wakeup_arg.trylock_function = pthread_rwlock_trywrlock;
+ wakeup_arg.timed_lock_function = pthread_rwlock_timedwrlock;
+
+ pthread_t thread;
+ ASSERT_EQ(0, pthread_create(&thread, nullptr,
+ reinterpret_cast<void* (*)(void*)>(pthread_rwlock_wakeup_timeout_helper), &wakeup_arg));
+ WaitUntilThreadSleep(wakeup_arg.tid);
+ ASSERT_EQ(RwlockWakeupHelperArg::LOCK_WAITING, wakeup_arg.progress);
+
+ ASSERT_EQ(0, pthread_join(thread, nullptr));
+ ASSERT_EQ(RwlockWakeupHelperArg::LOCK_TIMEDOUT, wakeup_arg.progress);
+ ASSERT_EQ(0, pthread_rwlock_unlock(&wakeup_arg.lock));
+ ASSERT_EQ(0, pthread_rwlock_destroy(&wakeup_arg.lock));
+}
+
class RwlockKindTestHelper {
private:
struct ThreadArg {
@@ -967,7 +1034,7 @@ TEST(pthread, pthread_atfork_smoke) {
ASSERT_EQ(0, pthread_atfork(AtForkPrepare1, AtForkParent1, AtForkChild1));
ASSERT_EQ(0, pthread_atfork(AtForkPrepare2, AtForkParent2, AtForkChild2));
- int pid = fork();
+ pid_t pid = fork();
ASSERT_NE(-1, pid) << strerror(errno);
// Child and parent calls are made in the order they were registered.
@@ -979,8 +1046,7 @@ TEST(pthread, pthread_atfork_smoke) {
// Prepare calls are made in the reverse order.
ASSERT_EQ(21, g_atfork_prepare_calls);
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
+ AssertChildExited(pid, 0);
}
TEST(pthread, pthread_attr_getscope) {
@@ -1060,36 +1126,44 @@ class pthread_CondWakeupTest : public ::testing::Test {
};
std::atomic<Progress> progress;
pthread_t thread;
+ std::function<int (pthread_cond_t* cond, pthread_mutex_t* mutex)> wait_function;
protected:
- virtual void SetUp() {
- ASSERT_EQ(0, pthread_mutex_init(&mutex, NULL));
- ASSERT_EQ(0, pthread_cond_init(&cond, NULL));
- progress = INITIALIZED;
- ASSERT_EQ(0,
- pthread_create(&thread, NULL, reinterpret_cast<void* (*)(void*)>(WaitThreadFn), this));
+ void SetUp() override {
+ ASSERT_EQ(0, pthread_mutex_init(&mutex, nullptr));
}
- virtual void TearDown() {
- ASSERT_EQ(0, pthread_join(thread, NULL));
- ASSERT_EQ(FINISHED, progress);
- ASSERT_EQ(0, pthread_cond_destroy(&cond));
- ASSERT_EQ(0, pthread_mutex_destroy(&mutex));
+ void InitCond(clockid_t clock=CLOCK_REALTIME) {
+ pthread_condattr_t attr;
+ ASSERT_EQ(0, pthread_condattr_init(&attr));
+ ASSERT_EQ(0, pthread_condattr_setclock(&attr, clock));
+ ASSERT_EQ(0, pthread_cond_init(&cond, &attr));
+ ASSERT_EQ(0, pthread_condattr_destroy(&attr));
}
- void SleepUntilProgress(Progress expected_progress) {
- while (progress != expected_progress) {
+ void StartWaitingThread(std::function<int (pthread_cond_t* cond, pthread_mutex_t* mutex)> wait_function) {
+ progress = INITIALIZED;
+ this->wait_function = wait_function;
+ ASSERT_EQ(0, pthread_create(&thread, NULL, reinterpret_cast<void* (*)(void*)>(WaitThreadFn), this));
+ while (progress != WAITING) {
usleep(5000);
}
usleep(5000);
}
+ void TearDown() override {
+ ASSERT_EQ(0, pthread_join(thread, nullptr));
+ ASSERT_EQ(FINISHED, progress);
+ ASSERT_EQ(0, pthread_cond_destroy(&cond));
+ ASSERT_EQ(0, pthread_mutex_destroy(&mutex));
+ }
+
private:
static void WaitThreadFn(pthread_CondWakeupTest* test) {
ASSERT_EQ(0, pthread_mutex_lock(&test->mutex));
test->progress = WAITING;
while (test->progress == WAITING) {
- ASSERT_EQ(0, pthread_cond_wait(&test->cond, &test->mutex));
+ ASSERT_EQ(0, test->wait_function(&test->cond, &test->mutex));
}
ASSERT_EQ(SIGNALED, test->progress);
test->progress = FINISHED;
@@ -1097,39 +1171,65 @@ class pthread_CondWakeupTest : public ::testing::Test {
}
};
-TEST_F(pthread_CondWakeupTest, signal) {
- SleepUntilProgress(WAITING);
+TEST_F(pthread_CondWakeupTest, signal_wait) {
+ InitCond();
+ StartWaitingThread([](pthread_cond_t* cond, pthread_mutex_t* mutex) {
+ return pthread_cond_wait(cond, mutex);
+ });
progress = SIGNALED;
- pthread_cond_signal(&cond);
+ ASSERT_EQ(0, pthread_cond_signal(&cond));
}
-TEST_F(pthread_CondWakeupTest, broadcast) {
- SleepUntilProgress(WAITING);
+TEST_F(pthread_CondWakeupTest, broadcast_wait) {
+ InitCond();
+ StartWaitingThread([](pthread_cond_t* cond, pthread_mutex_t* mutex) {
+ return pthread_cond_wait(cond, mutex);
+ });
progress = SIGNALED;
- pthread_cond_broadcast(&cond);
+ ASSERT_EQ(0, pthread_cond_broadcast(&cond));
}
-TEST(pthread, pthread_mutex_timedlock) {
- pthread_mutex_t m;
- ASSERT_EQ(0, pthread_mutex_init(&m, NULL));
-
- // If the mutex is already locked, pthread_mutex_timedlock should time out.
- ASSERT_EQ(0, pthread_mutex_lock(&m));
-
+TEST_F(pthread_CondWakeupTest, signal_timedwait_CLOCK_REALTIME) {
+ InitCond(CLOCK_REALTIME);
timespec ts;
ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
- ts.tv_nsec += 1;
- ASSERT_EQ(ETIMEDOUT, pthread_mutex_timedlock(&m, &ts));
+ ts.tv_sec += 1;
+ StartWaitingThread([&](pthread_cond_t* cond, pthread_mutex_t* mutex) {
+ return pthread_cond_timedwait(cond, mutex, &ts);
+ });
+ progress = SIGNALED;
+ ASSERT_EQ(0, pthread_cond_signal(&cond));
+}
- // If the mutex is unlocked, pthread_mutex_timedlock should succeed.
- ASSERT_EQ(0, pthread_mutex_unlock(&m));
+TEST_F(pthread_CondWakeupTest, signal_timedwait_CLOCK_MONOTONIC) {
+ InitCond(CLOCK_MONOTONIC);
+ timespec ts;
+ ASSERT_EQ(0, clock_gettime(CLOCK_MONOTONIC, &ts));
+ ts.tv_sec += 1;
+ StartWaitingThread([&](pthread_cond_t* cond, pthread_mutex_t* mutex) {
+ return pthread_cond_timedwait(cond, mutex, &ts);
+ });
+ progress = SIGNALED;
+ ASSERT_EQ(0, pthread_cond_signal(&cond));
+}
+TEST(pthread, pthread_cond_timedwait_timeout) {
+ pthread_mutex_t mutex;
+ ASSERT_EQ(0, pthread_mutex_init(&mutex, nullptr));
+ pthread_cond_t cond;
+ ASSERT_EQ(0, pthread_cond_init(&cond, nullptr));
+ ASSERT_EQ(0, pthread_mutex_lock(&mutex));
+ timespec ts;
ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
- ts.tv_nsec += 1;
- ASSERT_EQ(0, pthread_mutex_timedlock(&m, &ts));
-
- ASSERT_EQ(0, pthread_mutex_unlock(&m));
- ASSERT_EQ(0, pthread_mutex_destroy(&m));
+ ASSERT_EQ(ETIMEDOUT, pthread_cond_timedwait(&cond, &mutex, &ts));
+ ts.tv_nsec = -1;
+ ASSERT_EQ(EINVAL, pthread_cond_timedwait(&cond, &mutex, &ts));
+ ts.tv_nsec = NS_PER_S;
+ ASSERT_EQ(EINVAL, pthread_cond_timedwait(&cond, &mutex, &ts));
+ ts.tv_nsec = NS_PER_S - 1;
+ ts.tv_sec = -1;
+ ASSERT_EQ(ETIMEDOUT, pthread_cond_timedwait(&cond, &mutex, &ts));
+ ASSERT_EQ(0, pthread_mutex_unlock(&mutex));
}
TEST(pthread, pthread_attr_getstack__main_thread) {
@@ -1155,31 +1255,30 @@ TEST(pthread, pthread_attr_getstack__main_thread) {
// The two methods of asking for the stack size should agree.
EXPECT_EQ(stack_size, stack_size2);
+#if defined(__BIONIC__)
// What does /proc/self/maps' [stack] line say?
void* maps_stack_hi = NULL;
- FILE* fp = fopen("/proc/self/maps", "r");
- ASSERT_TRUE(fp != NULL);
- char line[BUFSIZ];
- while (fgets(line, sizeof(line), fp) != NULL) {
- uintptr_t lo, hi;
- char name[10];
- sscanf(line, "%" PRIxPTR "-%" PRIxPTR " %*4s %*x %*x:%*x %*d %10s", &lo, &hi, name);
- if (strcmp(name, "[stack]") == 0) {
- maps_stack_hi = reinterpret_cast<void*>(hi);
+ std::vector<map_record> maps;
+ ASSERT_TRUE(Maps::parse_maps(&maps));
+ for (const auto& map : maps) {
+ if (map.pathname == "[stack]") {
+ maps_stack_hi = reinterpret_cast<void*>(map.addr_end);
break;
}
}
- fclose(fp);
+
+ // The high address of the /proc/self/maps [stack] region should equal stack_base + stack_size.
+ // Remember that the stack grows down (and is mapped in on demand), so the low address of the
+ // region isn't very interesting.
+ EXPECT_EQ(maps_stack_hi, reinterpret_cast<uint8_t*>(stack_base) + stack_size);
// The stack size should correspond to RLIMIT_STACK.
rlimit rl;
ASSERT_EQ(0, getrlimit(RLIMIT_STACK, &rl));
uint64_t original_rlim_cur = rl.rlim_cur;
-#if defined(__BIONIC__)
if (rl.rlim_cur == RLIM_INFINITY) {
rl.rlim_cur = 8 * 1024 * 1024; // Bionic reports unlimited stacks as 8MiB.
}
-#endif
EXPECT_EQ(rl.rlim_cur, stack_size);
auto guard = make_scope_guard([&rl, original_rlim_cur]() {
@@ -1187,11 +1286,6 @@ TEST(pthread, pthread_attr_getstack__main_thread) {
ASSERT_EQ(0, setrlimit(RLIMIT_STACK, &rl));
});
- // The high address of the /proc/self/maps [stack] region should equal stack_base + stack_size.
- // Remember that the stack grows down (and is mapped in on demand), so the low address of the
- // region isn't very interesting.
- EXPECT_EQ(maps_stack_hi, reinterpret_cast<uint8_t*>(stack_base) + stack_size);
-
//
// What if RLIMIT_STACK is smaller than the stack's current extent?
//
@@ -1219,6 +1313,76 @@ TEST(pthread, pthread_attr_getstack__main_thread) {
EXPECT_EQ(stack_size, stack_size2);
ASSERT_EQ(6666U, stack_size);
+#endif
+}
+
+struct GetStackSignalHandlerArg {
+ volatile bool done;
+ void* signal_handler_sp;
+ void* main_stack_base;
+ size_t main_stack_size;
+};
+
+static GetStackSignalHandlerArg getstack_signal_handler_arg;
+
+static void getstack_signal_handler(int sig) {
+ ASSERT_EQ(SIGUSR1, sig);
+ // Use sleep() to make current thread be switched out by the kernel to provoke the error.
+ sleep(1);
+ pthread_attr_t attr;
+ ASSERT_EQ(0, pthread_getattr_np(pthread_self(), &attr));
+ void* stack_base;
+ size_t stack_size;
+ ASSERT_EQ(0, pthread_attr_getstack(&attr, &stack_base, &stack_size));
+ getstack_signal_handler_arg.signal_handler_sp = &attr;
+ getstack_signal_handler_arg.main_stack_base = stack_base;
+ getstack_signal_handler_arg.main_stack_size = stack_size;
+ getstack_signal_handler_arg.done = true;
+}
+
+// The previous code obtained the main thread's stack by reading the entry in
+// /proc/self/task/<pid>/maps that was labeled [stack]. Unfortunately, on x86/x86_64, the kernel
+// relies on sp0 in task state segment(tss) to label the stack map with [stack]. If the kernel
+// switches a process while the main thread is in an alternate stack, then the kernel will label
+// the wrong map with [stack]. This test verifies that when the above situation happens, the main
+// thread's stack is found correctly.
+TEST(pthread, pthread_attr_getstack_in_signal_handler) {
+ // This test is only meaningful for the main thread, so make sure we're running on it!
+ ASSERT_EQ(getpid(), syscall(__NR_gettid));
+
+ const size_t sig_stack_size = 16 * 1024;
+ void* sig_stack = mmap(NULL, sig_stack_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
+ -1, 0);
+ ASSERT_NE(MAP_FAILED, sig_stack);
+ stack_t ss;
+ ss.ss_sp = sig_stack;
+ ss.ss_size = sig_stack_size;
+ ss.ss_flags = 0;
+ stack_t oss;
+ ASSERT_EQ(0, sigaltstack(&ss, &oss));
+
+ pthread_attr_t attr;
+ ASSERT_EQ(0, pthread_getattr_np(pthread_self(), &attr));
+ void* main_stack_base;
+ size_t main_stack_size;
+ ASSERT_EQ(0, pthread_attr_getstack(&attr, &main_stack_base, &main_stack_size));
+
+ ScopedSignalHandler handler(SIGUSR1, getstack_signal_handler, SA_ONSTACK);
+ getstack_signal_handler_arg.done = false;
+ kill(getpid(), SIGUSR1);
+ ASSERT_EQ(true, getstack_signal_handler_arg.done);
+
+ // Verify if the stack used by the signal handler is the alternate stack just registered.
+ ASSERT_LE(sig_stack, getstack_signal_handler_arg.signal_handler_sp);
+ ASSERT_GE(reinterpret_cast<char*>(sig_stack) + sig_stack_size,
+ getstack_signal_handler_arg.signal_handler_sp);
+
+ // Verify if the main thread's stack got in the signal handler is correct.
+ ASSERT_EQ(main_stack_base, getstack_signal_handler_arg.main_stack_base);
+ ASSERT_LE(main_stack_size, getstack_signal_handler_arg.main_stack_size);
+
+ ASSERT_EQ(0, sigaltstack(&oss, nullptr));
+ ASSERT_EQ(0, munmap(sig_stack, sig_stack_size));
}
static void pthread_attr_getstack_18908062_helper(void*) {
@@ -1245,11 +1409,14 @@ TEST(pthread, pthread_attr_getstack_18908062) {
}
#if defined(__BIONIC__)
-static pthread_mutex_t gettid_mutex;
+static pthread_mutex_t pthread_gettid_np_mutex = PTHREAD_MUTEX_INITIALIZER;
+
static void* pthread_gettid_np_helper(void* arg) {
- pthread_mutex_lock(&gettid_mutex);
*reinterpret_cast<pid_t*>(arg) = gettid();
- pthread_mutex_unlock(&gettid_mutex);
+
+ // Wait for our parent to call pthread_gettid_np on us before exiting.
+ pthread_mutex_lock(&pthread_gettid_np_mutex);
+ pthread_mutex_unlock(&pthread_gettid_np_mutex);
return NULL;
}
#endif
@@ -1258,17 +1425,19 @@ TEST(pthread, pthread_gettid_np) {
#if defined(__BIONIC__)
ASSERT_EQ(gettid(), pthread_gettid_np(pthread_self()));
+ // Ensure the other thread doesn't exit until after we've called
+ // pthread_gettid_np on it.
+ pthread_mutex_lock(&pthread_gettid_np_mutex);
+
pid_t t_gettid_result;
pthread_t t;
- pthread_mutex_init(&gettid_mutex, NULL);
- pthread_mutex_lock(&gettid_mutex);
pthread_create(&t, NULL, pthread_gettid_np_helper, &t_gettid_result);
pid_t t_pthread_gettid_np_result = pthread_gettid_np(t);
- pthread_mutex_unlock(&gettid_mutex);
+ // Release the other thread and wait for it to exit.
+ pthread_mutex_unlock(&pthread_gettid_np_mutex);
pthread_join(t, NULL);
- pthread_mutex_destroy(&gettid_mutex);
ASSERT_EQ(t_gettid_result, t_pthread_gettid_np_result);
#else
@@ -1370,6 +1539,9 @@ TEST(pthread, pthread_mutex_lock_NORMAL) {
ASSERT_EQ(0, pthread_mutex_lock(&m.lock));
ASSERT_EQ(0, pthread_mutex_unlock(&m.lock));
+ ASSERT_EQ(0, pthread_mutex_trylock(&m.lock));
+ ASSERT_EQ(EBUSY, pthread_mutex_trylock(&m.lock));
+ ASSERT_EQ(0, pthread_mutex_unlock(&m.lock));
}
TEST(pthread, pthread_mutex_lock_ERRORCHECK) {
@@ -1392,6 +1564,8 @@ TEST(pthread, pthread_mutex_lock_RECURSIVE) {
ASSERT_EQ(0, pthread_mutex_unlock(&m.lock));
ASSERT_EQ(0, pthread_mutex_unlock(&m.lock));
ASSERT_EQ(0, pthread_mutex_trylock(&m.lock));
+ ASSERT_EQ(0, pthread_mutex_trylock(&m.lock));
+ ASSERT_EQ(0, pthread_mutex_unlock(&m.lock));
ASSERT_EQ(0, pthread_mutex_unlock(&m.lock));
ASSERT_EQ(EPERM, pthread_mutex_unlock(&m.lock));
}
@@ -1489,6 +1663,35 @@ TEST(pthread, pthread_mutex_owner_tid_limit) {
#endif
}
+TEST(pthread, pthread_mutex_timedlock) {
+ pthread_mutex_t m;
+ ASSERT_EQ(0, pthread_mutex_init(&m, nullptr));
+
+ // If the mutex is already locked, pthread_mutex_timedlock should time out.
+ ASSERT_EQ(0, pthread_mutex_lock(&m));
+
+ timespec ts;
+ ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
+ ASSERT_EQ(ETIMEDOUT, pthread_mutex_timedlock(&m, &ts));
+ ts.tv_nsec = -1;
+ ASSERT_EQ(EINVAL, pthread_mutex_timedlock(&m, &ts));
+ ts.tv_nsec = NS_PER_S;
+ ASSERT_EQ(EINVAL, pthread_mutex_timedlock(&m, &ts));
+ ts.tv_nsec = NS_PER_S - 1;
+ ts.tv_sec = -1;
+ ASSERT_EQ(ETIMEDOUT, pthread_mutex_timedlock(&m, &ts));
+
+ // If the mutex is unlocked, pthread_mutex_timedlock should succeed.
+ ASSERT_EQ(0, pthread_mutex_unlock(&m));
+
+ ASSERT_EQ(0, clock_gettime(CLOCK_REALTIME, &ts));
+ ts.tv_sec += 1;
+ ASSERT_EQ(0, pthread_mutex_timedlock(&m, &ts));
+
+ ASSERT_EQ(0, pthread_mutex_unlock(&m));
+ ASSERT_EQ(0, pthread_mutex_destroy(&m));
+}
+
class StrictAlignmentAllocator {
public:
void* allocate(size_t size, size_t alignment) {
@@ -1501,8 +1704,8 @@ class StrictAlignmentAllocator {
}
~StrictAlignmentAllocator() {
- for (auto& p : allocated_array) {
- delete [] p;
+ for (const auto& p : allocated_array) {
+ delete[] p;
}
}
@@ -1602,3 +1805,155 @@ TEST(pthread, big_enough_signal_stack_for_64bit_arch) {
kill(getpid(), SIGUSR1);
ASSERT_TRUE(signal_handler_on_altstack_done);
}
+
+TEST(pthread, pthread_barrierattr_smoke) {
+ pthread_barrierattr_t attr;
+ ASSERT_EQ(0, pthread_barrierattr_init(&attr));
+ int pshared;
+ ASSERT_EQ(0, pthread_barrierattr_getpshared(&attr, &pshared));
+ ASSERT_EQ(PTHREAD_PROCESS_PRIVATE, pshared);
+ ASSERT_EQ(0, pthread_barrierattr_setpshared(&attr, PTHREAD_PROCESS_SHARED));
+ ASSERT_EQ(0, pthread_barrierattr_getpshared(&attr, &pshared));
+ ASSERT_EQ(PTHREAD_PROCESS_SHARED, pshared);
+ ASSERT_EQ(0, pthread_barrierattr_destroy(&attr));
+}
+
+struct BarrierTestHelperData {
+ size_t thread_count;
+ pthread_barrier_t barrier;
+ std::atomic<int> finished_mask;
+ std::atomic<int> serial_thread_count;
+ size_t iteration_count;
+ std::atomic<size_t> finished_iteration_count;
+
+ BarrierTestHelperData(size_t thread_count, size_t iteration_count)
+ : thread_count(thread_count), finished_mask(0), serial_thread_count(0),
+ iteration_count(iteration_count), finished_iteration_count(0) {
+ }
+};
+
+struct BarrierTestHelperArg {
+ int id;
+ BarrierTestHelperData* data;
+};
+
+static void BarrierTestHelper(BarrierTestHelperArg* arg) {
+ for (size_t i = 0; i < arg->data->iteration_count; ++i) {
+ int result = pthread_barrier_wait(&arg->data->barrier);
+ if (result == PTHREAD_BARRIER_SERIAL_THREAD) {
+ arg->data->serial_thread_count++;
+ } else {
+ ASSERT_EQ(0, result);
+ }
+ arg->data->finished_mask |= (1 << arg->id);
+ if (arg->data->finished_mask == ((1 << arg->data->thread_count) - 1)) {
+ ASSERT_EQ(1, arg->data->serial_thread_count);
+ arg->data->finished_iteration_count++;
+ arg->data->finished_mask = 0;
+ arg->data->serial_thread_count = 0;
+ }
+ }
+}
+
+TEST(pthread, pthread_barrier_smoke) {
+ const size_t BARRIER_ITERATION_COUNT = 10;
+ const size_t BARRIER_THREAD_COUNT = 10;
+ BarrierTestHelperData data(BARRIER_THREAD_COUNT, BARRIER_ITERATION_COUNT);
+ ASSERT_EQ(0, pthread_barrier_init(&data.barrier, nullptr, data.thread_count));
+ std::vector<pthread_t> threads(data.thread_count);
+ std::vector<BarrierTestHelperArg> args(threads.size());
+ for (size_t i = 0; i < threads.size(); ++i) {
+ args[i].id = i;
+ args[i].data = &data;
+ ASSERT_EQ(0, pthread_create(&threads[i], nullptr,
+ reinterpret_cast<void* (*)(void*)>(BarrierTestHelper), &args[i]));
+ }
+ for (size_t i = 0; i < threads.size(); ++i) {
+ ASSERT_EQ(0, pthread_join(threads[i], nullptr));
+ }
+ ASSERT_EQ(data.iteration_count, data.finished_iteration_count);
+ ASSERT_EQ(0, pthread_barrier_destroy(&data.barrier));
+}
+
+struct BarrierDestroyTestArg {
+ std::atomic<int> tid;
+ pthread_barrier_t* barrier;
+};
+
+static void BarrierDestroyTestHelper(BarrierDestroyTestArg* arg) {
+ arg->tid = gettid();
+ ASSERT_EQ(0, pthread_barrier_wait(arg->barrier));
+}
+
+TEST(pthread, pthread_barrier_destroy) {
+ pthread_barrier_t barrier;
+ ASSERT_EQ(0, pthread_barrier_init(&barrier, nullptr, 2));
+ pthread_t thread;
+ BarrierDestroyTestArg arg;
+ arg.tid = 0;
+ arg.barrier = &barrier;
+ ASSERT_EQ(0, pthread_create(&thread, nullptr,
+ reinterpret_cast<void* (*)(void*)>(BarrierDestroyTestHelper), &arg));
+ WaitUntilThreadSleep(arg.tid);
+ ASSERT_EQ(EBUSY, pthread_barrier_destroy(&barrier));
+ ASSERT_EQ(PTHREAD_BARRIER_SERIAL_THREAD, pthread_barrier_wait(&barrier));
+ // Verify if the barrier can be destroyed directly after pthread_barrier_wait().
+ ASSERT_EQ(0, pthread_barrier_destroy(&barrier));
+ ASSERT_EQ(0, pthread_join(thread, nullptr));
+#if defined(__BIONIC__)
+ ASSERT_EQ(EINVAL, pthread_barrier_destroy(&barrier));
+#endif
+}
+
+struct BarrierOrderingTestHelperArg {
+ pthread_barrier_t* barrier;
+ size_t* array;
+ size_t array_length;
+ size_t id;
+};
+
+void BarrierOrderingTestHelper(BarrierOrderingTestHelperArg* arg) {
+ const size_t ITERATION_COUNT = 10000;
+ for (size_t i = 1; i <= ITERATION_COUNT; ++i) {
+ arg->array[arg->id] = i;
+ int result = pthread_barrier_wait(arg->barrier);
+ ASSERT_TRUE(result == 0 || result == PTHREAD_BARRIER_SERIAL_THREAD);
+ for (size_t j = 0; j < arg->array_length; ++j) {
+ ASSERT_EQ(i, arg->array[j]);
+ }
+ result = pthread_barrier_wait(arg->barrier);
+ ASSERT_TRUE(result == 0 || result == PTHREAD_BARRIER_SERIAL_THREAD);
+ }
+}
+
+TEST(pthread, pthread_barrier_check_ordering) {
+ const size_t THREAD_COUNT = 4;
+ pthread_barrier_t barrier;
+ ASSERT_EQ(0, pthread_barrier_init(&barrier, nullptr, THREAD_COUNT));
+ size_t array[THREAD_COUNT];
+ std::vector<pthread_t> threads(THREAD_COUNT);
+ std::vector<BarrierOrderingTestHelperArg> args(THREAD_COUNT);
+ for (size_t i = 0; i < THREAD_COUNT; ++i) {
+ args[i].barrier = &barrier;
+ args[i].array = array;
+ args[i].array_length = THREAD_COUNT;
+ args[i].id = i;
+ ASSERT_EQ(0, pthread_create(&threads[i], nullptr,
+ reinterpret_cast<void* (*)(void*)>(BarrierOrderingTestHelper),
+ &args[i]));
+ }
+ for (size_t i = 0; i < THREAD_COUNT; ++i) {
+ ASSERT_EQ(0, pthread_join(threads[i], nullptr));
+ }
+}
+
+TEST(pthread, pthread_spinlock_smoke) {
+ pthread_spinlock_t lock;
+ ASSERT_EQ(0, pthread_spin_init(&lock, 0));
+ ASSERT_EQ(0, pthread_spin_trylock(&lock));
+ ASSERT_EQ(0, pthread_spin_unlock(&lock));
+ ASSERT_EQ(0, pthread_spin_lock(&lock));
+ ASSERT_EQ(EBUSY, pthread_spin_trylock(&lock));
+ ASSERT_EQ(0, pthread_spin_unlock(&lock));
+ ASSERT_EQ(0, pthread_spin_destroy(&lock));
+}
diff --git a/tests/pty_test.cpp b/tests/pty_test.cpp
index 7fe97e9af..91d1f5eec 100644
--- a/tests/pty_test.cpp
+++ b/tests/pty_test.cpp
@@ -19,6 +19,8 @@
#include <pty.h>
#include <sys/ioctl.h>
+#include "utils.h"
+
TEST(pty, openpty) {
int master, slave;
char name[32];
@@ -58,10 +60,7 @@ TEST(pty, forkpty) {
ASSERT_EQ(sid, getsid(0));
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(0, WEXITSTATUS(status));
+ AssertChildExited(pid, 0);
close(master);
}
diff --git a/tests/regex_test.cpp b/tests/regex_test.cpp
index d02622190..0e7f8dd7f 100644
--- a/tests/regex_test.cpp
+++ b/tests/regex_test.cpp
@@ -36,3 +36,24 @@ TEST(regex, smoke) {
regfree(&re);
}
+
+TEST(regex, match_offsets) {
+ regex_t re;
+ regmatch_t matches[1];
+ ASSERT_EQ(0, regcomp(&re, "b", 0));
+ ASSERT_EQ(0, regexec(&re, "abc", 1, matches, 0));
+ ASSERT_EQ(1, matches[0].rm_so);
+ ASSERT_EQ(2, matches[0].rm_eo);
+ regfree(&re);
+}
+
+TEST(regex, regerror_NULL_0) {
+ regex_t re;
+ int error = regcomp(&re, "*", REG_EXTENDED);
+ ASSERT_NE(0, error);
+
+ // Passing a null pointer and a size of 0 is a legitimate way to ask
+ // how large a buffer we would need for the error message.
+ int error_length = regerror(error, &re, nullptr, 0);
+ ASSERT_GT(error_length, 0);
+}
diff --git a/tests/semaphore_test.cpp b/tests/semaphore_test.cpp
index e517f818f..7dc72259a 100644
--- a/tests/semaphore_test.cpp
+++ b/tests/semaphore_test.cpp
@@ -24,6 +24,7 @@
#include <unistd.h>
#include "private/bionic_constants.h"
+#include "ScopedSignalHandler.h"
TEST(semaphore, sem_init) {
sem_t s;
@@ -117,10 +118,27 @@ TEST(semaphore, sem_timedwait) {
ts.tv_nsec = -1;
ASSERT_EQ(-1, sem_timedwait(&s, &ts));
ASSERT_EQ(EINVAL, errno);
+ errno = 0;
+ ts.tv_nsec = NS_PER_S;
+ ASSERT_EQ(-1, sem_timedwait(&s, &ts));
+ ASSERT_EQ(EINVAL, errno);
+
+ errno = 0;
+ ts.tv_nsec = NS_PER_S - 1;
+ ts.tv_sec = -1;
+ ASSERT_EQ(-1, sem_timedwait(&s, &ts));
+ ASSERT_EQ(ETIMEDOUT, errno);
ASSERT_EQ(0, sem_destroy(&s));
}
+TEST(semaphore_DeathTest, sem_timedwait_null_timeout) {
+ sem_t s;
+ ASSERT_EQ(0, sem_init(&s, 0, 0));
+
+ ASSERT_EXIT(sem_timedwait(&s, nullptr), testing::KilledBySignal(SIGSEGV), "");
+}
+
TEST(semaphore, sem_getvalue) {
sem_t s;
ASSERT_EQ(0, sem_init(&s, 0, 0));
@@ -141,3 +159,71 @@ TEST(semaphore, sem_getvalue) {
ASSERT_EQ(0, sem_getvalue(&s, &i));
ASSERT_EQ(1, i);
}
+
+extern "C" void android_set_application_target_sdk_version(uint32_t target);
+
+static void sem_wait_test_signal_handler(int) {
+}
+
+static void* SemWaitEINTRThreadFn(void* arg) {
+ sem_t* sem = reinterpret_cast<sem_t*>(arg);
+ uintptr_t have_eintr = 0;
+ uintptr_t have_error = 0;
+ while (true) {
+ int result = sem_wait(sem);
+ if (result == 0) {
+ break;
+ }
+ if (result == -1) {
+ if (errno == EINTR) {
+ have_eintr = 1;
+ } else {
+ have_error = 1;
+ break;
+ }
+ }
+ }
+ return reinterpret_cast<void*>((have_eintr << 1) | have_error);
+}
+
+TEST(semaphore, sem_wait_no_EINTR_in_sdk_less_equal_than_23) {
+#if defined(__BIONIC__)
+ android_set_application_target_sdk_version(23U);
+ sem_t s;
+ ASSERT_EQ(0, sem_init(&s, 0, 0));
+ ScopedSignalHandler handler(SIGUSR1, sem_wait_test_signal_handler);
+ pthread_t thread;
+ ASSERT_EQ(0, pthread_create(&thread, nullptr, SemWaitEINTRThreadFn, &s));
+ // Give some time for the thread to run sem_wait.
+ usleep(500000);
+ ASSERT_EQ(0, pthread_kill(thread, SIGUSR1));
+ // Give some time for the thread to handle signal.
+ usleep(500000);
+ ASSERT_EQ(0, sem_post(&s));
+ void* result;
+ ASSERT_EQ(0, pthread_join(thread, &result));
+ ASSERT_EQ(0U, reinterpret_cast<uintptr_t>(result));
+#else
+ GTEST_LOG_(INFO) << "This test tests sem_wait's compatibility for old sdk versions";
+#endif
+}
+
+TEST(semaphore, sem_wait_EINTR_in_sdk_greater_than_23) {
+#if defined(__BIONIC__)
+ android_set_application_target_sdk_version(24U);
+#endif
+ sem_t s;
+ ASSERT_EQ(0, sem_init(&s, 0, 0));
+ ScopedSignalHandler handler(SIGUSR1, sem_wait_test_signal_handler);
+ pthread_t thread;
+ ASSERT_EQ(0, pthread_create(&thread, nullptr, SemWaitEINTRThreadFn, &s));
+ // Give some time for the thread to run sem_wait.
+ usleep(500000);
+ ASSERT_EQ(0, pthread_kill(thread, SIGUSR1));
+ // Give some time for the thread to handle signal.
+ usleep(500000);
+ ASSERT_EQ(0, sem_post(&s));
+ void* result;
+ ASSERT_EQ(0, pthread_join(thread, &result));
+ ASSERT_EQ(2U, reinterpret_cast<uintptr_t>(result));
+}
diff --git a/tests/setjmp_test.cpp b/tests/setjmp_test.cpp
index a3b5885c3..b7e856fcf 100644
--- a/tests/setjmp_test.cpp
+++ b/tests/setjmp_test.cpp
@@ -212,3 +212,52 @@ TEST(setjmp, setjmp_fp_registers) {
CHECK_FREGS;
}
}
+
+#if defined(__arm__)
+#define __JB_SIGFLAG 0
+#elif defined(__aarch64__)
+#define __JB_SIGFLAG 0
+#elif defined(__i386__)
+#define __JB_SIGFLAG 7
+#elif defined(__x86_64)
+#define __JB_SIGFLAG 8
+#elif defined(__mips__) && defined(__LP64__)
+#define __JB_SIGFLAG 1
+#elif defined(__mips__)
+#define __JB_SIGFLAG 2
+#endif
+
+TEST(setjmp, setjmp_cookie) {
+ jmp_buf jb;
+ int value = setjmp(jb);
+ ASSERT_EQ(0, value);
+
+#if defined(__mips__) && !defined(__LP64__)
+ // round address to 8-byte boundry
+ uintptr_t jb_aligned = reinterpret_cast<uintptr_t>(jb) & ~7L;
+ long* sigflag = reinterpret_cast<long*>(jb_aligned) + __JB_SIGFLAG;
+#else
+ long* sigflag = reinterpret_cast<long*>(jb) + __JB_SIGFLAG;
+#endif
+
+ // Make sure there's actually a cookie.
+ EXPECT_NE(0, *sigflag & ~1);
+
+ // Wipe it out
+ *sigflag &= 1;
+ EXPECT_DEATH(longjmp(jb, 0), "");
+}
+
+TEST(setjmp, setjmp_cookie_checksum) {
+ jmp_buf jb;
+ int value = setjmp(jb);
+
+ if (value == 0) {
+ // Flip a bit.
+ reinterpret_cast<long*>(jb)[0] ^= 1;
+
+ EXPECT_DEATH(longjmp(jb, 1), "checksum mismatch");
+ } else {
+ fprintf(stderr, "setjmp_cookie_checksum: longjmp succeeded?");
+ }
+}
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp
index f8fdc3f99..c5128eafc 100644
--- a/tests/signal_test.cpp
+++ b/tests/signal_test.cpp
@@ -14,12 +14,14 @@
* limitations under the License.
*/
+#include <errno.h>
#include <signal.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <unistd.h>
#include <gtest/gtest.h>
-#include <errno.h>
-
#include "ScopedSignalHandler.h"
static size_t SIGNAL_MIN() {
@@ -375,3 +377,48 @@ TEST(signal, sigtimedwait_timeout) {
ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &original_set, NULL));
}
+
+#if defined(__BIONIC__)
+TEST(signal, rt_tgsigqueueinfo) {
+ // Test whether rt_tgsigqueueinfo allows sending arbitrary si_code values to self.
+ // If this fails, your kernel needs commit 66dd34a to be backported.
+ static constexpr char error_msg[] =
+ "\nPlease ensure that the following kernel patch has been applied:\n"
+ "* https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=66dd34ad31e5963d72a700ec3f2449291d322921\n";
+ static siginfo received;
+
+ struct sigaction handler;
+ memset(&handler, 0, sizeof(handler));
+ handler.sa_sigaction = [](int, siginfo_t* siginfo, void*) { received = *siginfo; };
+ handler.sa_flags = SA_SIGINFO;
+
+ ASSERT_EQ(0, sigaction(SIGUSR1, &handler, nullptr));
+
+ siginfo sent;
+ memset(&sent, 0, sizeof(sent));
+
+ sent.si_code = SI_TKILL;
+ ASSERT_EQ(0, syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), SIGUSR1, &sent))
+ << "rt_tgsigqueueinfo failed: " << strerror(errno) << error_msg;
+ ASSERT_EQ(sent.si_code, received.si_code) << "rt_tgsigqueueinfo modified si_code, expected "
+ << sent.si_code << ", received " << received.si_code
+ << error_msg;
+
+ sent.si_code = SI_USER;
+ ASSERT_EQ(0, syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), SIGUSR1, &sent))
+ << "rt_tgsigqueueinfo failed: " << strerror(errno) << error_msg;
+ ASSERT_EQ(sent.si_code, received.si_code) << "rt_tgsigqueueinfo modified si_code, expected "
+ << sent.si_code << ", received " << received.si_code
+ << error_msg;
+}
+
+#if defined(__arm__) || defined(__aarch64__) || defined(__i386__) || defined(__x86_64__)
+TEST(signal, sigset_size) {
+ // The setjmp implementations for ARM, AArch64, x86, and x86_64 assume that sigset_t can fit in a
+ // long. This is true because ARM and x86 have broken rt signal support, and AArch64 and x86_64
+ // both have a SIGRTMAX defined as 64.
+ static_assert(sizeof(sigset_t) <= sizeof(long), "sigset_t doesn't fit in a long");
+}
+
+#endif
+#endif
diff --git a/tests/stack_protector_test.cpp b/tests/stack_protector_test.cpp
index 22285d123..5f5a24174 100644
--- a/tests/stack_protector_test.cpp
+++ b/tests/stack_protector_test.cpp
@@ -27,108 +27,83 @@
#include <unistd.h>
#include <set>
-extern "C" pid_t gettid();
-
-// For x86, bionic and glibc have per-thread stack guard values (all identical).
-#if defined(__i386__)
-static uint32_t GetGuardFromTls() {
- uint32_t guard;
- asm ("mov %%gs:0x14, %0": "=d" (guard));
- return guard;
-}
+#include "private/bionic_tls.h"
+
+extern "C" pid_t gettid(); // glibc defines this but doesn't declare it anywhere.
+
+#if defined(__BIONIC__)
+extern uintptr_t __stack_chk_guard;
+#endif
struct stack_protector_checker {
std::set<pid_t> tids;
- std::set<uint32_t> guards;
+ std::set<void*> guards;
void Check() {
pid_t tid = gettid();
- uint32_t guard = GetGuardFromTls();
+ void* guard = __get_tls()[TLS_SLOT_STACK_GUARD];
- printf("[thread %d] %%gs:0x14 = 0x%08x\n", tid, guard);
+ printf("[thread %d] TLS stack guard = %p\n", tid, guard);
// Duplicate tid. gettid(2) bug? Seeing this would be very upsetting.
ASSERT_TRUE(tids.find(tid) == tids.end());
- // Uninitialized guard. Our bug. Note this is potentially flaky; we _could_ get
- // four random zero bytes, but it should be vanishingly unlikely.
- ASSERT_NE(guard, 0U);
+ // Uninitialized guard. Our bug. Note this is potentially flaky; we _could_
+ // get four random zero bytes, but it should be vanishingly unlikely.
+ ASSERT_NE(guard, nullptr);
+
+#if defined(__BIONIC__)
+ // bionic always has the global too.
+ ASSERT_EQ(__stack_chk_guard, reinterpret_cast<uintptr_t>(guard));
+#endif
tids.insert(tid);
guards.insert(guard);
}
};
-static void* ThreadGuardHelper(void* arg) {
- stack_protector_checker* checker = reinterpret_cast<stack_protector_checker*>(arg);
- checker->Check();
- return NULL;
-}
-#endif // __i386__
-
TEST(stack_protector, same_guard_per_thread) {
-#if defined(__i386__)
+ // Everyone has the TLS slot set, even if their stack protector
+ // implementation doesn't yet use it.
stack_protector_checker checker;
- size_t thread_count = 10;
- for (size_t i = 0; i < thread_count; ++i) {
+
+ // Check the main thread.
+ ASSERT_EQ(getpid(), gettid()); // We are the main thread, right?
+ checker.Check();
+
+ size_t thread_count = 9;
+ for (size_t i = 1; i < thread_count; ++i) {
pthread_t t;
- ASSERT_EQ(0, pthread_create(&t, NULL, ThreadGuardHelper, &checker));
+ ASSERT_EQ(0, pthread_create(&t, NULL, [](void* arg) -> void* {
+ stack_protector_checker* checker = reinterpret_cast<stack_protector_checker*>(arg);
+ checker->Check();
+ return nullptr;
+ }, &checker));
void* result;
ASSERT_EQ(0, pthread_join(t, &result));
ASSERT_EQ(NULL, result);
}
ASSERT_EQ(thread_count, checker.tids.size());
- // bionic and glibc use the same guard for every thread.
+ // Both bionic and glibc use the same guard for every thread.
ASSERT_EQ(1U, checker.guards.size());
-#else // __i386__
- GTEST_LOG_(INFO) << "This test does nothing.\n";
-#endif // __i386__
}
-// For ARM and MIPS, glibc has a global stack check guard value.
-#if defined(__BIONIC__) || defined(__arm__) || defined(__mips__)
-#define TEST_STACK_CHK_GUARD
-
-// Bionic has the global for x86 too, to support binaries that can run on
-// Android releases that didn't implement the TLS guard value.
-extern "C" uintptr_t __stack_chk_guard;
-
-/*
- * When this function returns, the stack canary will be inconsistent
- * with the previous value, which will generate a call to __stack_chk_fail(),
- * eventually resulting in a SIGABRT.
- *
- * This must be marked with "__attribute__ ((noinline))", to ensure the
- * compiler generates the proper stack guards around this function.
- */
-static char* dummy_buf;
-
-__attribute__ ((noinline))
-static void do_modify_stack_chk_guard() {
- char buf[128];
- // Store local array's address to global variable to force compiler to generate stack guards.
- dummy_buf = buf;
- __stack_chk_guard = 0x12345678;
-}
-
-#endif
-
TEST(stack_protector, global_guard) {
-#if defined(TEST_STACK_CHK_GUARD)
+#if defined(__BIONIC__)
+ // Bionic always has a global, even if it's using TLS.
ASSERT_NE(0, gettid());
ASSERT_NE(0U, __stack_chk_guard);
-#else // TEST_STACK_CHK_GUARD
- GTEST_LOG_(INFO) << "This test does nothing.\n";
-#endif // TEST_STACK_CHK_GUARD
+#else
+ GTEST_LOG_(INFO) << "glibc doesn't have a global __stack_chk_guard.\n";
+#endif
}
class stack_protector_DeathTest : public BionicDeathTest {};
TEST_F(stack_protector_DeathTest, modify_stack_protector) {
-#if defined(TEST_STACK_CHK_GUARD)
- ASSERT_EXIT(do_modify_stack_chk_guard(), testing::KilledBySignal(SIGABRT), "");
-#else // TEST_STACK_CHK_GUARD
- GTEST_LOG_(INFO) << "This test does nothing.\n";
-#endif // TEST_STACK_CHK_GUARD
+ // In another file to prevent inlining, which removes stack protection.
+ extern void modify_stack_protector_test();
+ ASSERT_EXIT(modify_stack_protector_test(),
+ testing::KilledBySignal(SIGABRT), "stack corruption detected");
}
diff --git a/tests/stack_protector_test_helper.cpp b/tests/stack_protector_test_helper.cpp
new file mode 100644
index 000000000..53a5e05de
--- /dev/null
+++ b/tests/stack_protector_test_helper.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Deliberately overwrite the stack canary.
+__attribute__((noinline)) void modify_stack_protector_test() {
+ char buf[128];
+ // We can't use memset here because it's fortified, and we want to test
+ // the line of defense *after* that.
+ // Without volatile, the generic x86/x86-64 targets don't write to the stack.
+ volatile char* p = buf;
+ int size = static_cast<int>(sizeof(buf) + 1);
+#if __x86_64__
+ // The generic x86-64 target leaves an 8-byte gap between `buf` and the stack guard.
+ // We only need to corrupt one byte though.
+ size += 8;
+#endif
+ while ((p - buf) < size) *p++ = '\0';
+}
diff --git a/tests/stdio_ext_test.cpp b/tests/stdio_ext_test.cpp
index c95cbbdd5..78725675d 100644
--- a/tests/stdio_ext_test.cpp
+++ b/tests/stdio_ext_test.cpp
@@ -30,6 +30,7 @@
#include <locale.h>
#include "TemporaryFile.h"
+#include "utils.h"
TEST(stdio_ext, __fbufsize) {
FILE* fp = fopen("/proc/version", "r");
@@ -140,3 +141,24 @@ TEST(stdio_ext, __fsetlocking) {
ASSERT_EQ(FSETLOCKING_INTERNAL, __fsetlocking(fp, FSETLOCKING_QUERY));
fclose(fp);
}
+
+static void LockingByCallerHelper(std::atomic<pid_t>* pid) {
+ *pid = gettid();
+ flockfile(stdout);
+ funlockfile(stdout);
+}
+
+TEST(stdio_ext, __fsetlocking_BYCALLER) {
+ // Check if users can use flockfile/funlockfile to protect stdio operations.
+ int old_state = __fsetlocking(stdout, FSETLOCKING_BYCALLER);
+ flockfile(stdout);
+ pthread_t thread;
+ std::atomic<pid_t> pid(0);
+ ASSERT_EQ(0, pthread_create(&thread, nullptr,
+ reinterpret_cast<void* (*)(void*)>(LockingByCallerHelper), &pid));
+ WaitUntilThreadSleep(pid);
+ funlockfile(stdout);
+
+ ASSERT_EQ(0, pthread_join(thread, nullptr));
+ __fsetlocking(stdout, old_state);
+}
diff --git a/tests/stdio_nofortify_test.cpp b/tests/stdio_nofortify_test.cpp
new file mode 100644
index 000000000..9bdcb03cf
--- /dev/null
+++ b/tests/stdio_nofortify_test.cpp
@@ -0,0 +1,12 @@
+
+#ifdef _FORTIFY_SOURCE
+#undef _FORTIFY_SOURCE
+#endif
+
+#define NOFORTIFY
+
+#include "stdio_test.cpp"
+
+#if defined(_FORTIFY_SOURCE)
+#error "_FORTIFY_SOURCE has been redefined, fix the code to remove this redefinition."
+#endif
diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp
index 62677cdff..7e826124f 100644
--- a/tests/stdio_test.cpp
+++ b/tests/stdio_test.cpp
@@ -31,14 +31,20 @@
#include "TemporaryFile.h"
-TEST(stdio, flockfile_18208568_stderr) {
+#if defined(NOFORTIFY)
+#define STDIO_TEST stdio_nofortify
+#else
+#define STDIO_TEST stdio
+#endif
+
+TEST(STDIO_TEST, flockfile_18208568_stderr) {
// Check that we have a _recursive_ mutex for flockfile.
flockfile(stderr);
feof(stderr); // We don't care about the result, but this needs to take the lock.
funlockfile(stderr);
}
-TEST(stdio, flockfile_18208568_regular) {
+TEST(STDIO_TEST, flockfile_18208568_regular) {
// We never had a bug for streams other than stdin/stdout/stderr, but test anyway.
FILE* fp = fopen("/dev/null", "w");
ASSERT_TRUE(fp != NULL);
@@ -48,7 +54,7 @@ TEST(stdio, flockfile_18208568_regular) {
fclose(fp);
}
-TEST(stdio, tmpfile_fileno_fprintf_rewind_fgets) {
+TEST(STDIO_TEST, tmpfile_fileno_fprintf_rewind_fgets) {
FILE* fp = tmpfile();
ASSERT_TRUE(fp != NULL);
@@ -73,7 +79,13 @@ TEST(stdio, tmpfile_fileno_fprintf_rewind_fgets) {
fclose(fp);
}
-TEST(stdio, dprintf) {
+TEST(STDIO_TEST, tmpfile64) {
+ FILE* fp = tmpfile64();
+ ASSERT_TRUE(fp != nullptr);
+ fclose(fp);
+}
+
+TEST(STDIO_TEST, dprintf) {
TemporaryFile tf;
int rc = dprintf(tf.fd, "hello\n");
@@ -91,7 +103,7 @@ TEST(stdio, dprintf) {
fclose(tfile);
}
-TEST(stdio, getdelim) {
+TEST(STDIO_TEST, getdelim) {
FILE* fp = tmpfile();
ASSERT_TRUE(fp != NULL);
@@ -126,7 +138,7 @@ TEST(stdio, getdelim) {
fclose(fp);
}
-TEST(stdio, getdelim_invalid) {
+TEST(STDIO_TEST, getdelim_invalid) {
FILE* fp = tmpfile();
ASSERT_TRUE(fp != NULL);
@@ -151,7 +163,7 @@ TEST(stdio, getdelim_invalid) {
fclose(fp);
}
-TEST(stdio, getdelim_directory) {
+TEST(STDIO_TEST, getdelim_directory) {
FILE* fp = fopen("/proc", "r");
ASSERT_TRUE(fp != NULL);
char* word_read;
@@ -160,7 +172,7 @@ TEST(stdio, getdelim_directory) {
fclose(fp);
}
-TEST(stdio, getline) {
+TEST(STDIO_TEST, getline) {
FILE* fp = tmpfile();
ASSERT_TRUE(fp != NULL);
@@ -202,7 +214,7 @@ TEST(stdio, getline) {
fclose(fp);
}
-TEST(stdio, getline_invalid) {
+TEST(STDIO_TEST, getline_invalid) {
FILE* fp = tmpfile();
ASSERT_TRUE(fp != NULL);
@@ -227,7 +239,7 @@ TEST(stdio, getline_invalid) {
fclose(fp);
}
-TEST(stdio, printf_ssize_t) {
+TEST(STDIO_TEST, printf_ssize_t) {
// http://b/8253769
ASSERT_EQ(sizeof(ssize_t), sizeof(long int));
ASSERT_EQ(sizeof(ssize_t), sizeof(size_t));
@@ -240,20 +252,20 @@ TEST(stdio, printf_ssize_t) {
}
// https://code.google.com/p/android/issues/detail?id=64886
-TEST(stdio, snprintf_a) {
+TEST(STDIO_TEST, snprintf_a) {
char buf[BUFSIZ];
EXPECT_EQ(23, snprintf(buf, sizeof(buf), "<%a>", 9990.235));
EXPECT_STREQ("<0x1.3831e147ae148p+13>", buf);
}
-TEST(stdio, snprintf_lc) {
+TEST(STDIO_TEST, snprintf_lc) {
char buf[BUFSIZ];
wint_t wc = L'a';
EXPECT_EQ(3, snprintf(buf, sizeof(buf), "<%lc>", wc));
EXPECT_STREQ("<a>", buf);
}
-TEST(stdio, snprintf_ls) {
+TEST(STDIO_TEST, snprintf_ls) {
char buf[BUFSIZ];
wchar_t* ws = NULL;
EXPECT_EQ(8, snprintf(buf, sizeof(buf), "<%ls>", ws));
@@ -265,7 +277,7 @@ TEST(stdio, snprintf_ls) {
EXPECT_STREQ("<hi>", buf);
}
-TEST(stdio, snprintf_n) {
+TEST(STDIO_TEST, snprintf_n) {
#if defined(__BIONIC__)
// http://b/14492135
char buf[32];
@@ -274,11 +286,11 @@ TEST(stdio, snprintf_n) {
EXPECT_EQ(1234, i);
EXPECT_STREQ("a n b", buf);
#else
- GTEST_LOG_(INFO) << "This test does nothing.\n";
+ GTEST_LOG_(INFO) << "This test does nothing on glibc.\n";
#endif
}
-TEST(stdio, snprintf_smoke) {
+TEST(STDIO_TEST, snprintf_smoke) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "a");
@@ -401,7 +413,7 @@ void CheckInfNan(int snprintf_fn(T*, size_t, const T*, ...),
EXPECT_STREQ(minus_inf, buf) << fmt_plus;
}
-TEST(stdio, snprintf_inf_nan) {
+TEST(STDIO_TEST, snprintf_inf_nan) {
CheckInfNan(snprintf, "%a", "%+a", "-inf", "inf", "+inf", "-nan", "nan", "+nan");
CheckInfNan(snprintf, "%A", "%+A", "-INF", "INF", "+INF", "-NAN", "NAN", "+NAN");
CheckInfNan(snprintf, "%e", "%+e", "-inf", "inf", "+inf", "-nan", "nan", "+nan");
@@ -412,7 +424,7 @@ TEST(stdio, snprintf_inf_nan) {
CheckInfNan(snprintf, "%G", "%+G", "-INF", "INF", "+INF", "-NAN", "NAN", "+NAN");
}
-TEST(stdio, wsprintf_inf_nan) {
+TEST(STDIO_TEST, wsprintf_inf_nan) {
CheckInfNan(swprintf, L"%a", L"%+a", L"-inf", L"inf", L"+inf", L"-nan", L"nan", L"+nan");
CheckInfNan(swprintf, L"%A", L"%+A", L"-INF", L"INF", L"+INF", L"-NAN", L"NAN", L"+NAN");
CheckInfNan(swprintf, L"%e", L"%+e", L"-inf", L"inf", L"+inf", L"-nan", L"nan", L"+nan");
@@ -423,19 +435,19 @@ TEST(stdio, wsprintf_inf_nan) {
CheckInfNan(swprintf, L"%G", L"%+G", L"-INF", L"INF", L"+INF", L"-NAN", L"NAN", L"+NAN");
}
-TEST(stdio, snprintf_d_INT_MAX) {
+TEST(STDIO_TEST, snprintf_d_INT_MAX) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%d", INT_MAX);
EXPECT_STREQ("2147483647", buf);
}
-TEST(stdio, snprintf_d_INT_MIN) {
+TEST(STDIO_TEST, snprintf_d_INT_MIN) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%d", INT_MIN);
EXPECT_STREQ("-2147483648", buf);
}
-TEST(stdio, snprintf_ld_LONG_MAX) {
+TEST(STDIO_TEST, snprintf_ld_LONG_MAX) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%ld", LONG_MAX);
#if __LP64__
@@ -445,7 +457,7 @@ TEST(stdio, snprintf_ld_LONG_MAX) {
#endif
}
-TEST(stdio, snprintf_ld_LONG_MIN) {
+TEST(STDIO_TEST, snprintf_ld_LONG_MIN) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%ld", LONG_MIN);
#if __LP64__
@@ -455,19 +467,19 @@ TEST(stdio, snprintf_ld_LONG_MIN) {
#endif
}
-TEST(stdio, snprintf_lld_LLONG_MAX) {
+TEST(STDIO_TEST, snprintf_lld_LLONG_MAX) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%lld", LLONG_MAX);
EXPECT_STREQ("9223372036854775807", buf);
}
-TEST(stdio, snprintf_lld_LLONG_MIN) {
+TEST(STDIO_TEST, snprintf_lld_LLONG_MIN) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%lld", LLONG_MIN);
EXPECT_STREQ("-9223372036854775808", buf);
}
-TEST(stdio, snprintf_e) {
+TEST(STDIO_TEST, snprintf_e) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%e", 1.5);
@@ -477,7 +489,7 @@ TEST(stdio, snprintf_e) {
EXPECT_STREQ("1.500000e+00", buf);
}
-TEST(stdio, snprintf_negative_zero_5084292) {
+TEST(STDIO_TEST, snprintf_negative_zero_5084292) {
char buf[BUFSIZ];
snprintf(buf, sizeof(buf), "%e", -0.0);
@@ -498,7 +510,7 @@ TEST(stdio, snprintf_negative_zero_5084292) {
EXPECT_STREQ("-0X0P+0", buf);
}
-TEST(stdio, snprintf_utf8_15439554) {
+TEST(STDIO_TEST, snprintf_utf8_15439554) {
locale_t cloc = newlocale(LC_ALL, "C.UTF-8", 0);
locale_t old_locale = uselocale(cloc);
@@ -522,7 +534,41 @@ TEST(stdio, snprintf_utf8_15439554) {
freelocale(cloc);
}
-TEST(stdio, fprintf_failures_7229520) {
+static void* snprintf_small_stack_fn(void*) {
+ // Make life (realistically) hard for ourselves by allocating our own buffer for the result.
+ char buf[PATH_MAX];
+ snprintf(buf, sizeof(buf), "/proc/%d", getpid());
+ return nullptr;
+}
+
+TEST(STDIO_TEST, snprintf_small_stack) {
+ // Is it safe to call snprintf on a thread with a small stack?
+ // (The snprintf implementation puts some pretty large buffers on the stack.)
+ pthread_attr_t a;
+ ASSERT_EQ(0, pthread_attr_init(&a));
+ ASSERT_EQ(0, pthread_attr_setstacksize(&a, PTHREAD_STACK_MIN));
+
+ pthread_t t;
+ ASSERT_EQ(0, pthread_create(&t, &a, snprintf_small_stack_fn, nullptr));
+ ASSERT_EQ(0, pthread_join(t, nullptr));
+}
+
+TEST(STDIO_TEST, snprintf_asterisk_overflow) {
+ char buf[128];
+ ASSERT_EQ(5, snprintf(buf, sizeof(buf), "%.*s%c", 4, "hello world", '!'));
+ ASSERT_EQ(12, snprintf(buf, sizeof(buf), "%.*s%c", INT_MAX/2, "hello world", '!'));
+ ASSERT_EQ(12, snprintf(buf, sizeof(buf), "%.*s%c", INT_MAX-1, "hello world", '!'));
+ ASSERT_EQ(12, snprintf(buf, sizeof(buf), "%.*s%c", INT_MAX, "hello world", '!'));
+ ASSERT_EQ(12, snprintf(buf, sizeof(buf), "%.*s%c", -1, "hello world", '!'));
+
+ // INT_MAX-1, INT_MAX, INT_MAX+1.
+ ASSERT_EQ(12, snprintf(buf, sizeof(buf), "%.2147483646s%c", "hello world", '!'));
+ ASSERT_EQ(12, snprintf(buf, sizeof(buf), "%.2147483647s%c", "hello world", '!'));
+ ASSERT_EQ(-1, snprintf(buf, sizeof(buf), "%.2147483648s%c", "hello world", '!'));
+ ASSERT_EQ(ENOMEM, errno);
+}
+
+TEST(STDIO_TEST, fprintf_failures_7229520) {
// http://b/7229520
FILE* fp;
@@ -545,7 +591,7 @@ TEST(stdio, fprintf_failures_7229520) {
ASSERT_EQ(-1, fclose(fp));
}
-TEST(stdio, popen) {
+TEST(STDIO_TEST, popen) {
FILE* fp = popen("cat /proc/version", "r");
ASSERT_TRUE(fp != NULL);
@@ -557,7 +603,7 @@ TEST(stdio, popen) {
ASSERT_EQ(0, pclose(fp));
}
-TEST(stdio, getc) {
+TEST(STDIO_TEST, getc) {
FILE* fp = fopen("/proc/version", "r");
ASSERT_TRUE(fp != NULL);
ASSERT_EQ('L', getc(fp));
@@ -568,14 +614,14 @@ TEST(stdio, getc) {
fclose(fp);
}
-TEST(stdio, putc) {
+TEST(STDIO_TEST, putc) {
FILE* fp = fopen("/proc/version", "r");
ASSERT_TRUE(fp != NULL);
ASSERT_EQ(EOF, putc('x', fp));
fclose(fp);
}
-TEST(stdio, sscanf) {
+TEST(STDIO_TEST, sscanf) {
char s1[123];
int i1;
double d1;
@@ -586,7 +632,7 @@ TEST(stdio, sscanf) {
ASSERT_DOUBLE_EQ(1.23, d1);
}
-TEST(stdio, cantwrite_EBADF) {
+TEST(STDIO_TEST, cantwrite_EBADF) {
// If we open a file read-only...
FILE* fp = fopen("/proc/version", "r");
@@ -626,7 +672,7 @@ TEST(stdio, cantwrite_EBADF) {
// Tests that we can only have a consistent and correct fpos_t when using
// f*pos functions (i.e. fpos doesn't get inside a multi byte character).
-TEST(stdio, consistent_fpos_t) {
+TEST(STDIO_TEST, consistent_fpos_t) {
ASSERT_STREQ("C.UTF-8", setlocale(LC_CTYPE, "C.UTF-8"));
uselocale(LC_GLOBAL_LOCALE);
@@ -690,7 +736,7 @@ TEST(stdio, consistent_fpos_t) {
}
// Exercise the interaction between fpos and seek.
-TEST(stdio, fpos_t_and_seek) {
+TEST(STDIO_TEST, fpos_t_and_seek) {
ASSERT_STREQ("C.UTF-8", setlocale(LC_CTYPE, "C.UTF-8"));
uselocale(LC_GLOBAL_LOCALE);
@@ -750,7 +796,7 @@ TEST(stdio, fpos_t_and_seek) {
fclose(fp);
}
-TEST(stdio, fmemopen) {
+TEST(STDIO_TEST, fmemopen) {
char buf[16];
memset(buf, 0, sizeof(buf));
FILE* fp = fmemopen(buf, sizeof(buf), "r+");
@@ -770,7 +816,7 @@ TEST(stdio, fmemopen) {
fclose(fp);
}
-TEST(stdio, fmemopen_NULL) {
+TEST(STDIO_TEST, fmemopen_NULL) {
FILE* fp = fmemopen(nullptr, 128, "r+");
ASSERT_NE(EOF, fputs("xyz\n", fp));
@@ -784,7 +830,7 @@ TEST(stdio, fmemopen_NULL) {
fclose(fp);
}
-TEST(stdio, fmemopen_EINVAL) {
+TEST(STDIO_TEST, fmemopen_EINVAL) {
char buf[16];
// Invalid size.
@@ -798,7 +844,7 @@ TEST(stdio, fmemopen_EINVAL) {
ASSERT_EQ(EINVAL, errno);
}
-TEST(stdio, open_memstream) {
+TEST(STDIO_TEST, open_memstream) {
char* p = nullptr;
size_t size = 0;
FILE* fp = open_memstream(&p, &size);
@@ -810,7 +856,7 @@ TEST(stdio, open_memstream) {
free(p);
}
-TEST(stdio, open_memstream_EINVAL) {
+TEST(STDIO_TEST, open_memstream_EINVAL) {
#if defined(__BIONIC__)
char* p;
size_t size;
@@ -825,11 +871,11 @@ TEST(stdio, open_memstream_EINVAL) {
ASSERT_EQ(nullptr, open_memstream(&p, nullptr));
ASSERT_EQ(EINVAL, errno);
#else
- GTEST_LOG_(INFO) << "This test does nothing.\n";
+ GTEST_LOG_(INFO) << "This test does nothing on glibc.\n";
#endif
}
-TEST(stdio, fdopen_CLOEXEC) {
+TEST(STDIO_TEST, fdopen_CLOEXEC) {
int fd = open("/proc/version", O_RDONLY);
ASSERT_TRUE(fd != -1);
@@ -850,7 +896,7 @@ TEST(stdio, fdopen_CLOEXEC) {
close(fd);
}
-TEST(stdio, freopen_CLOEXEC) {
+TEST(STDIO_TEST, freopen_CLOEXEC) {
FILE* fp = fopen("/proc/version", "r");
ASSERT_TRUE(fp != NULL);
@@ -869,9 +915,17 @@ TEST(stdio, freopen_CLOEXEC) {
fclose(fp);
}
+TEST(STDIO_TEST, fopen64_freopen64) {
+ FILE* fp = fopen64("/proc/version", "r");
+ ASSERT_TRUE(fp != nullptr);
+ fp = freopen64("/proc/version", "re", fp);
+ ASSERT_TRUE(fp != nullptr);
+ fclose(fp);
+}
+
// https://code.google.com/p/android/issues/detail?id=81155
// http://b/18556607
-TEST(stdio, fread_unbuffered_pathological_performance) {
+TEST(STDIO_TEST, fread_unbuffered_pathological_performance) {
FILE* fp = fopen("/dev/zero", "r");
ASSERT_TRUE(fp != NULL);
@@ -900,7 +954,7 @@ TEST(stdio, fread_unbuffered_pathological_performance) {
}
}
-TEST(stdio, fread_EOF) {
+TEST(STDIO_TEST, fread_EOF) {
std::string digits("0123456789");
FILE* fp = fmemopen(&digits[0], digits.size(), "r");
@@ -934,11 +988,11 @@ static void test_fread_from_write_only_stream(size_t n) {
fclose(fp);
}
-TEST(stdio, fread_from_write_only_stream_slow_path) {
+TEST(STDIO_TEST, fread_from_write_only_stream_slow_path) {
test_fread_from_write_only_stream(1);
}
-TEST(stdio, fread_from_write_only_stream_fast_path) {
+TEST(STDIO_TEST, fread_from_write_only_stream_fast_path) {
test_fread_from_write_only_stream(64*1024);
}
@@ -956,7 +1010,7 @@ static void test_fwrite_after_fread(size_t n) {
// But hitting EOF doesn't prevent us from writing...
errno = 0;
- ASSERT_EQ(1U, fwrite("2", 1, 1, fp)) << errno;
+ ASSERT_EQ(1U, fwrite("2", 1, 1, fp)) << strerror(errno);
// And if we rewind, everything's there.
rewind(fp);
@@ -967,16 +1021,16 @@ static void test_fwrite_after_fread(size_t n) {
fclose(fp);
}
-TEST(stdio, fwrite_after_fread_slow_path) {
+TEST(STDIO_TEST, fwrite_after_fread_slow_path) {
test_fwrite_after_fread(16);
}
-TEST(stdio, fwrite_after_fread_fast_path) {
+TEST(STDIO_TEST, fwrite_after_fread_fast_path) {
test_fwrite_after_fread(64*1024);
}
// http://b/19172514
-TEST(stdio, fread_after_fseek) {
+TEST(STDIO_TEST, fread_after_fseek) {
TemporaryFile tf;
FILE* fp = fopen(tf.filename, "w+");
@@ -1005,10 +1059,241 @@ TEST(stdio, fread_after_fseek) {
ASSERT_EQ(memcmp(file_data+cur_location, buffer, 8192), 0);
// Small backwards seek to verify fseek does not reuse the internal buffer.
- ASSERT_EQ(0, fseek(fp, -22, SEEK_CUR));
+ ASSERT_EQ(0, fseek(fp, -22, SEEK_CUR)) << strerror(errno);
cur_location = static_cast<size_t>(ftell(fp));
ASSERT_EQ(22U, fread(buffer, 1, 22, fp));
ASSERT_EQ(memcmp(file_data+cur_location, buffer, 22), 0);
fclose(fp);
}
+
+// https://code.google.com/p/android/issues/detail?id=184847
+TEST(STDIO_TEST, fread_EOF_184847) {
+ TemporaryFile tf;
+ char buf[6] = {0};
+
+ FILE* fw = fopen(tf.filename, "w");
+ ASSERT_TRUE(fw != nullptr);
+
+ FILE* fr = fopen(tf.filename, "r");
+ ASSERT_TRUE(fr != nullptr);
+
+ fwrite("a", 1, 1, fw);
+ fflush(fw);
+ ASSERT_EQ(1U, fread(buf, 1, 1, fr));
+ ASSERT_STREQ("a", buf);
+
+ // 'fr' is now at EOF.
+ ASSERT_EQ(0U, fread(buf, 1, 1, fr));
+ ASSERT_TRUE(feof(fr));
+
+ // Write some more...
+ fwrite("z", 1, 1, fw);
+ fflush(fw);
+
+ // ...and check that we can read it back.
+ // (BSD thinks that once a stream has hit EOF, it must always return EOF. SysV disagrees.)
+ ASSERT_EQ(1U, fread(buf, 1, 1, fr));
+ ASSERT_STREQ("z", buf);
+
+ // But now we're done.
+ ASSERT_EQ(0U, fread(buf, 1, 1, fr));
+
+ fclose(fr);
+ fclose(fw);
+}
+
+TEST(STDIO_TEST, fclose_invalidates_fd) {
+ // The typical error we're trying to help people catch involves accessing
+ // memory after it's been freed. But we know that stdin/stdout/stderr are
+ // special and don't get deallocated, so this test uses stdin.
+ ASSERT_EQ(0, fclose(stdin));
+
+ // Even though using a FILE* after close is undefined behavior, I've closed
+ // this bug as "WAI" too many times. We shouldn't hand out stale fds,
+ // especially because they might actually correspond to a real stream.
+ errno = 0;
+ ASSERT_EQ(-1, fileno(stdin));
+ ASSERT_EQ(EBADF, errno);
+}
+
+TEST(STDIO_TEST, fseek_ftell_unseekable) {
+#if defined(__BIONIC__) // glibc has fopencookie instead.
+ auto read_fn = [](void*, char*, int) { return -1; };
+ FILE* fp = funopen(nullptr, read_fn, nullptr, nullptr, nullptr);
+ ASSERT_TRUE(fp != nullptr);
+
+ // Check that ftell balks on an unseekable FILE*.
+ errno = 0;
+ ASSERT_EQ(-1, ftell(fp));
+ ASSERT_EQ(ESPIPE, errno);
+
+ // SEEK_CUR is rewritten as SEEK_SET internally...
+ errno = 0;
+ ASSERT_EQ(-1, fseek(fp, 0, SEEK_CUR));
+ ASSERT_EQ(ESPIPE, errno);
+
+ // ...so it's worth testing the direct seek path too.
+ errno = 0;
+ ASSERT_EQ(-1, fseek(fp, 0, SEEK_SET));
+ ASSERT_EQ(ESPIPE, errno);
+
+ fclose(fp);
+#else
+ GTEST_LOG_(INFO) << "glibc uses fopencookie instead.\n";
+#endif
+}
+
+TEST(STDIO_TEST, funopen_EINVAL) {
+#if defined(__BIONIC__)
+ errno = 0;
+ ASSERT_EQ(nullptr, funopen(nullptr, nullptr, nullptr, nullptr, nullptr));
+ ASSERT_EQ(EINVAL, errno);
+#else
+ GTEST_LOG_(INFO) << "glibc uses fopencookie instead.\n";
+#endif
+}
+
+TEST(STDIO_TEST, funopen_seek) {
+#if defined(__BIONIC__)
+ auto read_fn = [](void*, char*, int) { return -1; };
+
+ auto seek_fn = [](void*, fpos_t, int) -> fpos_t { return 0xfedcba12; };
+ auto seek64_fn = [](void*, fpos64_t, int) -> fpos64_t { return 0xfedcba12345678; };
+
+ FILE* fp = funopen(nullptr, read_fn, nullptr, seek_fn, nullptr);
+ ASSERT_TRUE(fp != nullptr);
+ fpos_t pos;
+#if defined(__LP64__)
+ EXPECT_EQ(0, fgetpos(fp, &pos)) << strerror(errno);
+ EXPECT_EQ(0xfedcba12LL, pos);
+#else
+ EXPECT_EQ(-1, fgetpos(fp, &pos)) << strerror(errno);
+ EXPECT_EQ(EOVERFLOW, errno);
+#endif
+
+ FILE* fp64 = funopen64(nullptr, read_fn, nullptr, seek64_fn, nullptr);
+ ASSERT_TRUE(fp64 != nullptr);
+ fpos64_t pos64;
+ EXPECT_EQ(0, fgetpos64(fp64, &pos64)) << strerror(errno);
+ EXPECT_EQ(0xfedcba12345678, pos64);
+#else
+ GTEST_LOG_(INFO) << "glibc uses fopencookie instead.\n";
+#endif
+}
+
+TEST(STDIO_TEST, lots_of_concurrent_files) {
+ std::vector<TemporaryFile*> tfs;
+ std::vector<FILE*> fps;
+
+ for (size_t i = 0; i < 256; ++i) {
+ TemporaryFile* tf = new TemporaryFile;
+ tfs.push_back(tf);
+ FILE* fp = fopen(tf->filename, "w+");
+ fps.push_back(fp);
+ fprintf(fp, "hello %zu!\n", i);
+ fflush(fp);
+ }
+
+ for (size_t i = 0; i < 256; ++i) {
+ rewind(fps[i]);
+
+ char buf[BUFSIZ];
+ ASSERT_TRUE(fgets(buf, sizeof(buf), fps[i]) != nullptr);
+
+ char expected[BUFSIZ];
+ snprintf(expected, sizeof(expected), "hello %zu!\n", i);
+ ASSERT_STREQ(expected, buf);
+
+ fclose(fps[i]);
+ delete tfs[i];
+ }
+}
+
+static void AssertFileOffsetAt(FILE* fp, off64_t offset) {
+ EXPECT_EQ(offset, ftell(fp));
+ EXPECT_EQ(offset, ftello(fp));
+ EXPECT_EQ(offset, ftello64(fp));
+ fpos_t pos;
+ fpos64_t pos64;
+ EXPECT_EQ(0, fgetpos(fp, &pos));
+ EXPECT_EQ(0, fgetpos64(fp, &pos64));
+#if defined(__BIONIC__)
+ EXPECT_EQ(offset, static_cast<off64_t>(pos));
+ EXPECT_EQ(offset, static_cast<off64_t>(pos64));
+#else
+ GTEST_LOG_(INFO) << "glibc's fpos_t is opaque.\n";
+#endif
+}
+
+TEST(STDIO_TEST, seek_tell_family_smoke) {
+ TemporaryFile tf;
+ FILE* fp = fdopen(tf.fd, "w+");
+
+ // Initially we should be at 0.
+ AssertFileOffsetAt(fp, 0);
+
+ // Seek to offset 8192.
+ ASSERT_EQ(0, fseek(fp, 8192, SEEK_SET));
+ AssertFileOffsetAt(fp, 8192);
+ fpos_t eight_k_pos;
+ ASSERT_EQ(0, fgetpos(fp, &eight_k_pos));
+
+ // Seek forward another 8192...
+ ASSERT_EQ(0, fseek(fp, 8192, SEEK_CUR));
+ AssertFileOffsetAt(fp, 8192 + 8192);
+ fpos64_t sixteen_k_pos64;
+ ASSERT_EQ(0, fgetpos64(fp, &sixteen_k_pos64));
+
+ // Seek back 8192...
+ ASSERT_EQ(0, fseek(fp, -8192, SEEK_CUR));
+ AssertFileOffsetAt(fp, 8192);
+
+ // Since we haven't written anything, the end is also at 0.
+ ASSERT_EQ(0, fseek(fp, 0, SEEK_END));
+ AssertFileOffsetAt(fp, 0);
+
+ // Check that our fpos64_t from 16KiB works...
+ ASSERT_EQ(0, fsetpos64(fp, &sixteen_k_pos64));
+ AssertFileOffsetAt(fp, 8192 + 8192);
+ // ...as does our fpos_t from 8192.
+ ASSERT_EQ(0, fsetpos(fp, &eight_k_pos));
+ AssertFileOffsetAt(fp, 8192);
+
+ // Do fseeko and fseeko64 work too?
+ ASSERT_EQ(0, fseeko(fp, 1234, SEEK_SET));
+ AssertFileOffsetAt(fp, 1234);
+ ASSERT_EQ(0, fseeko64(fp, 5678, SEEK_SET));
+ AssertFileOffsetAt(fp, 5678);
+
+ fclose(fp);
+}
+
+TEST(STDIO_TEST, fseek_fseeko_EINVAL) {
+ TemporaryFile tf;
+ FILE* fp = fdopen(tf.fd, "w+");
+
+ // Bad whence.
+ errno = 0;
+ ASSERT_EQ(-1, fseek(fp, 0, 123));
+ ASSERT_EQ(EINVAL, errno);
+ errno = 0;
+ ASSERT_EQ(-1, fseeko(fp, 0, 123));
+ ASSERT_EQ(EINVAL, errno);
+ errno = 0;
+ ASSERT_EQ(-1, fseeko64(fp, 0, 123));
+ ASSERT_EQ(EINVAL, errno);
+
+ // Bad offset.
+ errno = 0;
+ ASSERT_EQ(-1, fseek(fp, -1, SEEK_SET));
+ ASSERT_EQ(EINVAL, errno);
+ errno = 0;
+ ASSERT_EQ(-1, fseeko(fp, -1, SEEK_SET));
+ ASSERT_EQ(EINVAL, errno);
+ errno = 0;
+ ASSERT_EQ(-1, fseeko64(fp, -1, SEEK_SET));
+ ASSERT_EQ(EINVAL, errno);
+
+ fclose(fp);
+}
diff --git a/tests/stdlib_test.cpp b/tests/stdlib_test.cpp
index 050f5a766..6ae6cda74 100644
--- a/tests/stdlib_test.cpp
+++ b/tests/stdlib_test.cpp
@@ -15,8 +15,10 @@
*/
#include <gtest/gtest.h>
+
#include "BionicDeathTest.h"
#include "TemporaryFile.h"
+#include "utils.h"
#include <errno.h>
#include <libgen.h>
@@ -323,10 +325,7 @@ TEST(stdlib, quick_exit) {
quick_exit(99);
}
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(99, WEXITSTATUS(status));
+ AssertChildExited(pid, 99);
}
static int quick_exit_status = 0;
@@ -355,24 +354,18 @@ TEST(stdlib, at_quick_exit) {
quick_exit(99);
}
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(99, WEXITSTATUS(status));
+ AssertChildExited(pid, 99);
}
TEST(unistd, _Exit) {
- int pid = fork();
+ pid_t pid = fork();
ASSERT_NE(-1, pid) << strerror(errno);
if (pid == 0) {
_Exit(99);
}
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(99, WEXITSTATUS(status));
+ AssertChildExited(pid, 99);
}
TEST(stdlib, pty_smoke) {
diff --git a/tests/string_nofortify_test.cpp b/tests/string_nofortify_test.cpp
new file mode 100644
index 000000000..1c0be354b
--- /dev/null
+++ b/tests/string_nofortify_test.cpp
@@ -0,0 +1,12 @@
+
+#ifdef _FORTIFY_SOURCE
+#undef _FORTIFY_SOURCE
+#endif
+
+#define NOFORTIFY
+
+#include "string_test.cpp"
+
+#if defined(_FORTIFY_SOURCE)
+#error "_FORTIFY_SOURCE has been redefined, fix the code to remove this redefinition."
+#endif
diff --git a/tests/string_test.cpp b/tests/string_test.cpp
index 1d63c7668..4b2cca247 100644
--- a/tests/string_test.cpp
+++ b/tests/string_test.cpp
@@ -22,9 +22,19 @@
#include <gtest/gtest.h>
#include <malloc.h>
#include <math.h>
+#include <stdint.h>
+
+#include <algorithm>
+#include <vector>
#include "buffer_tests.h"
+#if defined(NOFORTIFY)
+#define STRING_TEST string_nofortify
+#else
+#define STRING_TEST string
+#endif
+
#if defined(__BIONIC__)
#define STRLCPY_SUPPORTED
#define STRLCAT_SUPPORTED
@@ -44,7 +54,7 @@ static int signum(int i) {
return 0;
}
-TEST(string, strerror) {
+TEST(STRING_TEST, strerror) {
// Valid.
ASSERT_STREQ("Success", strerror(0));
ASSERT_STREQ("Operation not permitted", strerror(1));
@@ -62,7 +72,7 @@ static void* ConcurrentStrErrorFn(void*) {
#endif // __BIONIC__
// glibc's strerror isn't thread safe, only its strsignal.
-TEST(string, strerror_concurrent) {
+TEST(STRING_TEST, strerror_concurrent) {
#if defined(__BIONIC__)
const char* strerror1001 = strerror(1001);
ASSERT_STREQ("Unknown error 1001", strerror1001);
@@ -79,7 +89,7 @@ TEST(string, strerror_concurrent) {
#endif // __BIONIC__
}
-TEST(string, gnu_strerror_r) {
+TEST(STRING_TEST, gnu_strerror_r) {
char buf[256];
// Note that glibc doesn't necessarily write into the buffer.
@@ -109,7 +119,7 @@ TEST(string, gnu_strerror_r) {
ASSERT_EQ(0, errno);
}
-TEST(string, strsignal) {
+TEST(STRING_TEST, strsignal) {
// A regular signal.
ASSERT_STREQ("Hangup", strsignal(1));
@@ -129,7 +139,7 @@ static void* ConcurrentStrSignalFn(void*) {
return reinterpret_cast<void*>(equal);
}
-TEST(string, strsignal_concurrent) {
+TEST(STRING_TEST, strsignal_concurrent) {
const char* strsignal1001 = strsignal(1001);
ASSERT_STREQ("Unknown signal 1001", strsignal1001);
@@ -242,7 +252,7 @@ size_t StringTestState<Character>::alignments[] = { 24, 32, 16, 48, 0, 1, 2, 3,
template<class Character>
size_t StringTestState<Character>::alignments_size = sizeof(alignments)/sizeof(size_t);
-TEST(string, strcat) {
+TEST(STRING_TEST, strcat) {
StringTestState<char> state(SMALL);
for (size_t i = 1; i < state.n; i++) {
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -263,7 +273,7 @@ TEST(string, strcat) {
}
// one byte target with "\0" source
-TEST(string, strcpy2) {
+TEST(STRING_TEST, strcpy2) {
char buf[1];
char* orig = strdup("");
ASSERT_EQ(buf, strcpy(buf, orig));
@@ -272,7 +282,7 @@ TEST(string, strcpy2) {
}
// multibyte target where we under fill target
-TEST(string, strcpy3) {
+TEST(STRING_TEST, strcpy3) {
char buf[10];
char* orig = strdup("12345");
memset(buf, 'A', sizeof(buf));
@@ -286,7 +296,7 @@ TEST(string, strcpy3) {
}
// multibyte target where we fill target exactly
-TEST(string, strcpy4) {
+TEST(STRING_TEST, strcpy4) {
char buf[10];
char* orig = strdup("123456789");
memset(buf, 'A', sizeof(buf));
@@ -296,7 +306,7 @@ TEST(string, strcpy4) {
}
// one byte target with "\0" source
-TEST(string, stpcpy2) {
+TEST(STRING_TEST, stpcpy2) {
char buf[1];
char* orig = strdup("");
ASSERT_EQ(buf, stpcpy(buf, orig));
@@ -305,7 +315,7 @@ TEST(string, stpcpy2) {
}
// multibyte target where we under fill target
-TEST(string, stpcpy3) {
+TEST(STRING_TEST, stpcpy3) {
char buf[10];
char* orig = strdup("12345");
memset(buf, 'A', sizeof(buf));
@@ -319,7 +329,7 @@ TEST(string, stpcpy3) {
}
// multibyte target where we fill target exactly
-TEST(string, stpcpy4) {
+TEST(STRING_TEST, stpcpy4) {
char buf[10];
char* orig = strdup("123456789");
memset(buf, 'A', sizeof(buf));
@@ -328,7 +338,7 @@ TEST(string, stpcpy4) {
free(orig);
}
-TEST(string, strcat2) {
+TEST(STRING_TEST, strcat2) {
char buf[10];
memset(buf, 'A', sizeof(buf));
buf[0] = 'a';
@@ -341,7 +351,7 @@ TEST(string, strcat2) {
ASSERT_EQ('A', buf[9]);
}
-TEST(string, strcat3) {
+TEST(STRING_TEST, strcat3) {
char buf[10];
memset(buf, 'A', sizeof(buf));
buf[0] = 'a';
@@ -351,7 +361,7 @@ TEST(string, strcat3) {
ASSERT_STREQ("a01234567", buf);
}
-TEST(string, strncat2) {
+TEST(STRING_TEST, strncat2) {
char buf[10];
memset(buf, 'A', sizeof(buf));
buf[0] = 'a';
@@ -364,7 +374,7 @@ TEST(string, strncat2) {
ASSERT_EQ('A', buf[9]);
}
-TEST(string, strncat3) {
+TEST(STRING_TEST, strncat3) {
char buf[10];
memset(buf, 'A', sizeof(buf));
buf[0] = 'a';
@@ -377,7 +387,7 @@ TEST(string, strncat3) {
ASSERT_EQ('A', buf[9]);
}
-TEST(string, strncat4) {
+TEST(STRING_TEST, strncat4) {
char buf[10];
memset(buf, 'A', sizeof(buf));
buf[0] = 'a';
@@ -387,7 +397,7 @@ TEST(string, strncat4) {
ASSERT_STREQ("a01234567", buf);
}
-TEST(string, strncat5) {
+TEST(STRING_TEST, strncat5) {
char buf[10];
memset(buf, 'A', sizeof(buf));
buf[0] = 'a';
@@ -397,14 +407,14 @@ TEST(string, strncat5) {
ASSERT_STREQ("a01234567", buf);
}
-TEST(string, strchr_with_0) {
+TEST(STRING_TEST, strchr_with_0) {
char buf[10];
const char* s = "01234";
memcpy(buf, s, strlen(s) + 1);
EXPECT_TRUE(strchr(buf, '\0') == (buf + strlen(s)));
}
-TEST(string, strchr_multiple) {
+TEST(STRING_TEST, strchr_multiple) {
char str[128];
memset(str, 'a', sizeof(str) - 1);
str[sizeof(str)-1] = '\0';
@@ -422,7 +432,7 @@ TEST(string, strchr_multiple) {
}
}
-TEST(string, strchr) {
+TEST(STRING_TEST, strchr) {
int seek_char = 'R';
StringTestState<char> state(SMALL);
@@ -453,7 +463,14 @@ TEST(string, strchr) {
}
}
-TEST(string, strcmp) {
+TEST(STRING_TEST, strchrnul) {
+ const char* s = "01234222";
+ EXPECT_TRUE(strchrnul(s, '2') == &s[2]);
+ EXPECT_TRUE(strchrnul(s, '8') == (s + strlen(s)));
+ EXPECT_TRUE(strchrnul(s, '\0') == (s + strlen(s)));
+}
+
+TEST(STRING_TEST, strcmp) {
StringTestState<char> state(SMALL);
for (size_t i = 1; i < state.n; i++) {
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -488,7 +505,7 @@ TEST(string, strcmp) {
}
}
-TEST(string, stpcpy) {
+TEST(STRING_TEST, stpcpy) {
StringTestState<char> state(SMALL);
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
size_t pos = random() % state.MAX_LEN;
@@ -512,7 +529,7 @@ TEST(string, stpcpy) {
}
}
-TEST(string, strcpy) {
+TEST(STRING_TEST, strcpy) {
StringTestState<char> state(SMALL);
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
size_t pos = random() % state.MAX_LEN;
@@ -536,7 +553,7 @@ TEST(string, strcpy) {
}
}
-TEST(string, strlcat) {
+TEST(STRING_TEST, strlcat) {
#if defined(STRLCAT_SUPPORTED)
StringTestState<char> state(SMALL);
for (size_t i = 0; i < state.n; i++) {
@@ -565,7 +582,7 @@ TEST(string, strlcat) {
#endif
}
-TEST(string, strlcpy) {
+TEST(STRING_TEST, strlcpy) {
#if defined(STRLCPY_SUPPORTED)
StringTestState<char> state(SMALL);
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -597,7 +614,7 @@ TEST(string, strlcpy) {
#endif
}
-TEST(string, strncat) {
+TEST(STRING_TEST, strncat) {
StringTestState<char> state(SMALL);
for (size_t i = 1; i < state.n; i++) {
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -621,7 +638,7 @@ TEST(string, strncat) {
}
}
-TEST(string, strncmp) {
+TEST(STRING_TEST, strncmp) {
StringTestState<char> state(SMALL);
for (size_t i = 1; i < state.n; i++) {
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -656,7 +673,7 @@ TEST(string, strncmp) {
}
}
-TEST(string, stpncpy) {
+TEST(STRING_TEST, stpncpy) {
StringTestState<char> state(SMALL);
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
memset(state.ptr1, 'J', state.MAX_LEN);
@@ -691,7 +708,7 @@ TEST(string, stpncpy) {
}
}
-TEST(string, strncpy) {
+TEST(STRING_TEST, strncpy) {
StringTestState<char> state(SMALL);
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
// Choose a random value to fill the string, except \0 (string terminator),
@@ -728,7 +745,7 @@ TEST(string, strncpy) {
}
}
-TEST(string, strrchr) {
+TEST(STRING_TEST, strrchr) {
int seek_char = 'M';
StringTestState<char> state(SMALL);
for (size_t i = 1; i < state.n; i++) {
@@ -758,7 +775,7 @@ TEST(string, strrchr) {
}
}
-TEST(string, memchr) {
+TEST(STRING_TEST, memchr) {
int seek_char = 'N';
StringTestState<char> state(SMALL);
for (size_t i = 0; i < state.n; i++) {
@@ -779,7 +796,7 @@ TEST(string, memchr) {
}
}
-TEST(string, memchr_zero) {
+TEST(STRING_TEST, memchr_zero) {
uint8_t* buffer;
ASSERT_EQ(0, posix_memalign(reinterpret_cast<void**>(&buffer), 64, 64));
memset(buffer, 10, 64);
@@ -787,7 +804,7 @@ TEST(string, memchr_zero) {
ASSERT_TRUE(NULL == memchr(buffer, 10, 0));
}
-TEST(string, memrchr) {
+TEST(STRING_TEST, memrchr) {
int seek_char = 'P';
StringTestState<char> state(SMALL);
for (size_t i = 0; i < state.n; i++) {
@@ -808,7 +825,7 @@ TEST(string, memrchr) {
}
}
-TEST(string, memcmp) {
+TEST(STRING_TEST, memcmp) {
StringTestState<char> state(SMALL);
for (size_t i = 0; i < state.n; i++) {
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -828,7 +845,7 @@ TEST(string, memcmp) {
}
}
-TEST(string, wmemcmp) {
+TEST(STRING_TEST, wmemcmp) {
StringTestState<wchar_t> state(SMALL);
for (size_t i = 0; i < state.n; i++) {
@@ -850,7 +867,7 @@ TEST(string, wmemcmp) {
}
}
-TEST(string, memcpy) {
+TEST(STRING_TEST, memcpy) {
StringTestState<char> state(LARGE);
int rand = 4;
for (size_t i = 0; i < state.n - 1; i++) {
@@ -870,7 +887,7 @@ TEST(string, memcpy) {
}
}
-TEST(string, memset) {
+TEST(STRING_TEST, memset) {
StringTestState<char> state(LARGE);
char ch = 'P';
for (size_t i = 0; i < state.n - 1; i++) {
@@ -890,7 +907,7 @@ TEST(string, memset) {
}
}
-TEST(string, memmove) {
+TEST(STRING_TEST, memmove) {
StringTestState<char> state(LARGE);
for (size_t i = 0; i < state.n - 1; i++) {
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -909,7 +926,7 @@ TEST(string, memmove) {
}
}
-TEST(string, memmove_cache_size) {
+TEST(STRING_TEST, memmove_cache_size) {
size_t len = 600000;
int max_alignment = 31;
int alignments[] = {0, 5, 11, 29, 30};
@@ -947,7 +964,7 @@ static void verify_memmove(char* src_copy, char* dst, char* src, size_t size) {
#define MEMMOVE_DATA_SIZE (1024*1024*3)
-TEST(string, memmove_check) {
+TEST(STRING_TEST, memmove_check) {
char* buffer = reinterpret_cast<char*>(malloc(MEMMOVE_DATA_SIZE));
ASSERT_TRUE(buffer != NULL);
@@ -988,7 +1005,7 @@ TEST(string, memmove_check) {
}
}
-TEST(string, bcopy) {
+TEST(STRING_TEST, bcopy) {
StringTestState<char> state(LARGE);
for (size_t i = 0; i < state.n; i++) {
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
@@ -1005,7 +1022,7 @@ TEST(string, bcopy) {
}
}
-TEST(string, bzero) {
+TEST(STRING_TEST, bzero) {
StringTestState<char> state(LARGE);
for (state.BeginIterations(); state.HasNextIteration(); state.NextIteration()) {
memset(state.ptr1, 'R', state.MAX_LEN);
@@ -1031,11 +1048,11 @@ static void DoMemcpyTest(uint8_t* src, uint8_t* dst, size_t len) {
ASSERT_TRUE(memcmp(src, dst, len) == 0);
}
-TEST(string, memcpy_align) {
+TEST(STRING_TEST, memcpy_align) {
RunSrcDstBufferAlignTest(LARGE, DoMemcpyTest);
}
-TEST(string, memcpy_overread) {
+TEST(STRING_TEST, memcpy_overread) {
RunSrcDstBufferOverreadTest(DoMemcpyTest);
}
@@ -1047,11 +1064,11 @@ static void DoMemmoveTest(uint8_t* src, uint8_t* dst, size_t len) {
ASSERT_TRUE(memcmp(src, dst, len) == 0);
}
-TEST(string, memmove_align) {
+TEST(STRING_TEST, memmove_align) {
RunSrcDstBufferAlignTest(LARGE, DoMemmoveTest);
}
-TEST(string, memmove_overread) {
+TEST(STRING_TEST, memmove_overread) {
RunSrcDstBufferOverreadTest(DoMemmoveTest);
}
@@ -1066,7 +1083,7 @@ static void DoMemsetTest(uint8_t* buf, size_t len) {
}
}
-TEST(string, memset_align) {
+TEST(STRING_TEST, memset_align) {
RunSingleBufferAlignTest(LARGE, DoMemsetTest);
}
@@ -1078,11 +1095,11 @@ static void DoStrlenTest(uint8_t* buf, size_t len) {
}
}
-TEST(string, strlen_align) {
+TEST(STRING_TEST, strlen_align) {
RunSingleBufferAlignTest(LARGE, DoStrlenTest);
}
-TEST(string, strlen_overread) {
+TEST(STRING_TEST, strlen_overread) {
RunSingleBufferOverreadTest(DoStrlenTest);
}
@@ -1097,11 +1114,11 @@ static void DoStrcpyTest(uint8_t* src, uint8_t* dst, size_t len) {
}
}
-TEST(string, strcpy_align) {
+TEST(STRING_TEST, strcpy_align) {
RunSrcDstBufferAlignTest(LARGE, DoStrcpyTest);
}
-TEST(string, strcpy_overread) {
+TEST(STRING_TEST, strcpy_overread) {
RunSrcDstBufferOverreadTest(DoStrcpyTest);
}
@@ -1118,7 +1135,7 @@ static void DoStrlcpyTest(uint8_t* src, uint8_t* dst, size_t len) {
}
#endif
-TEST(string, strlcpy_align) {
+TEST(STRING_TEST, strlcpy_align) {
#if defined(STRLCPY_SUPPORTED)
RunSrcDstBufferAlignTest(LARGE, DoStrlcpyTest);
#else
@@ -1126,7 +1143,7 @@ TEST(string, strlcpy_align) {
#endif
}
-TEST(string, strlcpy_overread) {
+TEST(STRING_TEST, strlcpy_overread) {
#if defined(STRLCPY_SUPPORTED)
RunSrcDstBufferOverreadTest(DoStrlcpyTest);
#else
@@ -1146,11 +1163,11 @@ static void DoStpcpyTest(uint8_t* src, uint8_t* dst, size_t len) {
}
}
-TEST(string, stpcpy_align) {
+TEST(STRING_TEST, stpcpy_align) {
RunSrcDstBufferAlignTest(LARGE, DoStpcpyTest);
}
-TEST(string, stpcpy_overread) {
+TEST(STRING_TEST, stpcpy_overread) {
RunSrcDstBufferOverreadTest(DoStpcpyTest);
}
@@ -1166,7 +1183,7 @@ static size_t LargeSetIncrement(size_t len) {
return 1;
}
-#define STRCAT_DST_LEN 128
+#define STRCAT_DST_LEN 64
static void DoStrcatTest(uint8_t* src, uint8_t* dst, size_t len) {
if (len >= 1) {
@@ -1181,7 +1198,7 @@ static void DoStrcatTest(uint8_t* src, uint8_t* dst, size_t len) {
int value2 = 32 + (value + 2) % 96;
memset(cmp_buf, value2, sizeof(cmp_buf));
- for (size_t i = 1; i <= STRCAT_DST_LEN; i++) {
+ for (size_t i = 1; i <= STRCAT_DST_LEN;) {
memset(dst, value2, i-1);
memset(dst+i-1, 0, len-i);
src[len-i] = '\0';
@@ -1189,6 +1206,13 @@ static void DoStrcatTest(uint8_t* src, uint8_t* dst, size_t len) {
reinterpret_cast<char*>(src))));
ASSERT_TRUE(memcmp(dst, cmp_buf, i-1) == 0);
ASSERT_TRUE(memcmp(src, dst+i-1, len-i+1) == 0);
+ // This is an expensive loop, so don't loop through every value,
+ // get to a certain size and then start doubling.
+ if (i < 16) {
+ i++;
+ } else {
+ i <<= 1;
+ }
}
} else {
dst[0] = '\0';
@@ -1199,11 +1223,11 @@ static void DoStrcatTest(uint8_t* src, uint8_t* dst, size_t len) {
}
}
-TEST(string, strcat_align) {
+TEST(STRING_TEST, strcat_align) {
RunSrcDstBufferAlignTest(MEDIUM, DoStrcatTest, LargeSetIncrement);
}
-TEST(string, strcat_overread) {
+TEST(STRING_TEST, strcat_overread) {
RunSrcDstBufferOverreadTest(DoStrcatTest);
}
@@ -1221,7 +1245,7 @@ static void DoStrlcatTest(uint8_t* src, uint8_t* dst, size_t len) {
int value2 = 32 + (value + 2) % 96;
memset(cmp_buf, value2, sizeof(cmp_buf));
- for (size_t i = 1; i <= STRCAT_DST_LEN; i++) {
+ for (size_t i = 1; i <= STRCAT_DST_LEN;) {
memset(dst, value2, i-1);
memset(dst+i-1, 0, len-i);
src[len-i] = '\0';
@@ -1229,6 +1253,13 @@ static void DoStrlcatTest(uint8_t* src, uint8_t* dst, size_t len) {
reinterpret_cast<char*>(src), len));
ASSERT_TRUE(memcmp(dst, cmp_buf, i-1) == 0);
ASSERT_TRUE(memcmp(src, dst+i-1, len-i+1) == 0);
+ // This is an expensive loop, so don't loop through every value,
+ // get to a certain size and then start doubling.
+ if (i < 16) {
+ i++;
+ } else {
+ i <<= 1;
+ }
}
} else {
dst[0] = '\0';
@@ -1240,7 +1271,7 @@ static void DoStrlcatTest(uint8_t* src, uint8_t* dst, size_t len) {
}
#endif
-TEST(string, strlcat_align) {
+TEST(STRING_TEST, strlcat_align) {
#if defined(STRLCAT_SUPPORTED)
RunSrcDstBufferAlignTest(MEDIUM, DoStrlcatTest, LargeSetIncrement);
#else
@@ -1248,7 +1279,7 @@ TEST(string, strlcat_align) {
#endif
}
-TEST(string, strlcat_overread) {
+TEST(STRING_TEST, strlcat_overread) {
#if defined(STRLCAT_SUPPORTED)
RunSrcDstBufferOverreadTest(DoStrlcatTest);
#else
@@ -1301,11 +1332,11 @@ static void DoStrcmpFailTest(uint8_t* buf1, uint8_t* buf2, size_t len1, size_t l
}
}
-TEST(string, strcmp_align) {
+TEST(STRING_TEST, strcmp_align) {
RunCmpBufferAlignTest(MEDIUM, DoStrcmpTest, DoStrcmpFailTest, LargeSetIncrement);
}
-TEST(string, strcmp_overread) {
+TEST(STRING_TEST, strcmp_overread) {
RunCmpBufferOverreadTest(DoStrcmpTest, DoStrcmpFailTest);
}
@@ -1333,11 +1364,11 @@ static void DoMemcmpFailTest(uint8_t* buf1, uint8_t* buf2, size_t len1, size_t l
ASSERT_NE(0, memcmp(buf1, buf2, len));
}
-TEST(string, memcmp_align) {
+TEST(STRING_TEST, memcmp_align) {
RunCmpBufferAlignTest(MEDIUM, DoMemcmpTest, DoMemcmpFailTest, LargeSetIncrement);
}
-TEST(string, memcmp_overread) {
+TEST(STRING_TEST, memcmp_overread) {
RunCmpBufferOverreadTest(DoMemcmpTest, DoMemcmpFailTest);
}
@@ -1359,11 +1390,11 @@ static void DoStrchrTest(uint8_t* buf, size_t len) {
}
}
-TEST(string, strchr_align) {
+TEST(STRING_TEST, strchr_align) {
RunSingleBufferAlignTest(MEDIUM, DoStrchrTest);
}
-TEST(string, strchr_overread) {
+TEST(STRING_TEST, strchr_overread) {
RunSingleBufferOverreadTest(DoStrchrTest);
}
@@ -1374,7 +1405,7 @@ static void TestBasename(const char* in, const char* expected_out) {
ASSERT_EQ(0, errno) << in;
}
-TEST(string, __gnu_basename) {
+TEST(STRING_TEST, __gnu_basename) {
TestBasename("", "");
TestBasename("/usr/lib", "lib");
TestBasename("/usr/", "");
@@ -1386,7 +1417,7 @@ TEST(string, __gnu_basename) {
TestBasename("//usr//lib//", "");
}
-TEST(string, strnlen_147048) {
+TEST(STRING_TEST, strnlen_147048) {
// https://code.google.com/p/android/issues/detail?id=147048
char stack_src[64] = {0};
EXPECT_EQ(0U, strnlen(stack_src, 1024*1024*1024));
@@ -1396,7 +1427,31 @@ TEST(string, strnlen_147048) {
delete[] heap_src;
}
-TEST(string, mempcpy) {
+TEST(STRING_TEST, strnlen_74741) {
+ ASSERT_EQ(4U, strnlen("test", SIZE_MAX));
+}
+
+TEST(STRING_TEST, mempcpy) {
char dst[6];
ASSERT_EQ(&dst[4], reinterpret_cast<char*>(mempcpy(dst, "hello", 4)));
}
+
+// clang depends on the fact that a memcpy where src and dst is the same
+// still operates correctly. This test verifies that this assumption
+// holds true.
+// See https://llvm.org/bugs/show_bug.cgi?id=11763 for more information.
+static std::vector<uint8_t> g_memcpy_same_buffer;
+
+static void DoMemcpySameTest(uint8_t* buffer, size_t len) {
+ memcpy(buffer, g_memcpy_same_buffer.data(), len);
+ ASSERT_EQ(buffer, memcpy(buffer, buffer, len));
+ ASSERT_TRUE(memcmp(buffer, g_memcpy_same_buffer.data(), len) == 0);
+}
+
+TEST(STRING_TEST, memcpy_src_dst_same) {
+ g_memcpy_same_buffer.resize(MEDIUM);
+ for (size_t i = 0; i < MEDIUM; i++) {
+ g_memcpy_same_buffer[i] = i;
+ }
+ RunSingleBufferAlignTest(MEDIUM, DoMemcpySameTest);
+}
diff --git a/tests/strings_nofortify_test.cpp b/tests/strings_nofortify_test.cpp
new file mode 100644
index 000000000..36eee75f0
--- /dev/null
+++ b/tests/strings_nofortify_test.cpp
@@ -0,0 +1,12 @@
+
+#ifdef _FORTIFY_SOURCE
+#undef _FORTIFY_SOURCE
+#endif
+
+#define NOFORTIFY
+
+#include "strings_test.cpp"
+
+#if defined(_FORTIFY_SOURCE)
+#error "_FORTIFY_SOURCE has been redefined, fix the code to remove this redefinition."
+#endif
diff --git a/tests/strings_test.cpp b/tests/strings_test.cpp
index 823aa4f0f..171684362 100644
--- a/tests/strings_test.cpp
+++ b/tests/strings_test.cpp
@@ -20,7 +20,13 @@
#include <locale.h>
#include <strings.h>
-TEST(strings, ffs) {
+#if defined(NOFORTIFY)
+#define STRINGS_TEST strings_nofortify
+#else
+#define STRINGS_TEST strings
+#endif
+
+TEST(STRINGS_TEST, ffs) {
ASSERT_EQ( 0, ffs(0x00000000));
ASSERT_EQ( 1, ffs(0x00000001));
ASSERT_EQ( 6, ffs(0x00000020));
@@ -32,13 +38,13 @@ TEST(strings, ffs) {
ASSERT_EQ(32, ffs(0x80000000));
}
-TEST(strings, strcasecmp) {
+TEST(STRINGS_TEST, strcasecmp) {
ASSERT_EQ(0, strcasecmp("hello", "HELLO"));
ASSERT_LT(strcasecmp("hello1", "hello2"), 0);
ASSERT_GT(strcasecmp("hello2", "hello1"), 0);
}
-TEST(strings, strcasecmp_l) {
+TEST(STRINGS_TEST, strcasecmp_l) {
locale_t l = newlocale(LC_ALL, "C", 0);
ASSERT_EQ(0, strcasecmp_l("hello", "HELLO", l));
ASSERT_LT(strcasecmp_l("hello1", "hello2", l), 0);
@@ -46,14 +52,14 @@ TEST(strings, strcasecmp_l) {
freelocale(l);
}
-TEST(strings, strncasecmp) {
+TEST(STRINGS_TEST, strncasecmp) {
ASSERT_EQ(0, strncasecmp("hello", "HELLO", 3));
ASSERT_EQ(0, strncasecmp("abcXX", "ABCYY", 3));
ASSERT_LT(strncasecmp("hello1", "hello2", 6), 0);
ASSERT_GT(strncasecmp("hello2", "hello1", 6), 0);
}
-TEST(strings, strncasecmp_l) {
+TEST(STRINGS_TEST, strncasecmp_l) {
locale_t l = newlocale(LC_ALL, "C", 0);
ASSERT_EQ(0, strncasecmp_l("hello", "HELLO", 3, l));
ASSERT_EQ(0, strncasecmp_l("abcXX", "ABCYY", 3, l));
diff --git a/tests/stubs_test.cpp b/tests/stubs_test.cpp
index 89d67cbb8..c81ca5803 100644
--- a/tests/stubs_test.cpp
+++ b/tests/stubs_test.cpp
@@ -122,6 +122,14 @@ TEST(getpwnam, app_id_radio) {
check_get_passwd("radio", 1001, TYPE_SYSTEM);
}
+TEST(getpwnam, oem_id_0) {
+ check_get_passwd("oem_0", 5000, TYPE_SYSTEM);
+}
+
+TEST(getpwnam, oem_id_999) {
+ check_get_passwd("oem_999", 5999, TYPE_SYSTEM);
+}
+
TEST(getpwnam, app_id_nobody) {
check_get_passwd("nobody", 9999, TYPE_SYSTEM);
}
@@ -163,8 +171,6 @@ TEST(getpwnam, app_id_u1_i0) {
check_get_passwd("u1_i0", 199000, TYPE_APP);
}
-#if defined(__BIONIC__)
-
static void check_group(const group* grp, const char* group_name, gid_t gid) {
ASSERT_TRUE(grp != NULL);
ASSERT_STREQ(group_name, grp->gr_name);
@@ -174,6 +180,8 @@ static void check_group(const group* grp, const char* group_name, gid_t gid) {
ASSERT_TRUE(grp->gr_mem[1] == NULL);
}
+#if defined(__BIONIC__)
+
static void check_getgrgid(const char* group_name, gid_t gid) {
errno = 0;
group* grp = getgrgid(gid);
@@ -190,17 +198,49 @@ static void check_getgrnam(const char* group_name, gid_t gid) {
check_group(grp, group_name, gid);
}
+static void check_getgrgid_r(const char* group_name, gid_t gid) {
+ group grp_storage;
+ char buf[512];
+ group* grp;
+
+ errno = 0;
+ int result = getgrgid_r(gid, &grp_storage, buf, sizeof(buf), &grp);
+ ASSERT_EQ(0, result);
+ ASSERT_EQ(0, errno);
+ SCOPED_TRACE("getgrgid_r");
+ check_group(grp, group_name, gid);
+}
+
+static void check_getgrnam_r(const char* group_name, gid_t gid) {
+ group grp_storage;
+ char buf[512];
+ group* grp;
+
+ errno = 0;
+ int result = getgrnam_r(group_name, &grp_storage, buf, sizeof(buf), &grp);
+ ASSERT_EQ(0, result);
+ ASSERT_EQ(0, errno);
+ SCOPED_TRACE("getgrnam_r");
+ check_group(grp, group_name, gid);
+}
+
static void check_get_group(const char* group_name, gid_t gid) {
check_getgrgid(group_name, gid);
check_getgrnam(group_name, gid);
+ check_getgrgid_r(group_name, gid);
+ check_getgrnam_r(group_name, gid);
}
#else // !defined(__BIONIC__)
-static void check_get_group(const char* /* group_name */, gid_t /* gid */) {
+static void print_no_getgrnam_test_info() {
GTEST_LOG_(INFO) << "This test is about gid/group_name translation for Android, which does nothing on libc other than bionic.\n";
}
+static void check_get_group(const char*, gid_t) {
+ print_no_getgrnam_test_info();
+}
+
#endif
TEST(getgrnam, system_id_root) {
@@ -215,6 +255,14 @@ TEST(getgrnam, app_id_radio) {
check_get_group("radio", 1001);
}
+TEST(getgrnam, oem_id_0) {
+ check_get_group("oem_0", 5000);
+}
+
+TEST(getgrnam, oem_id_999) {
+ check_get_group("oem_999", 5999);
+}
+
TEST(getgrnam, app_id_nobody) {
check_get_group("nobody", 9999);
}
@@ -259,3 +307,53 @@ TEST(getgrnam, app_id_u1_a40000) {
TEST(getgrnam, app_id_u1_i0) {
check_get_group("u1_i0", 199000);
}
+
+TEST(getgrnam_r, reentrancy) {
+#if defined(__BIONIC__)
+ group grp_storage[2];
+ char buf[2][512];
+ group* grp[3];
+ int result = getgrnam_r("root", &grp_storage[0], buf[0], sizeof(buf[0]), &grp[0]);
+ ASSERT_EQ(0, result);
+ check_group(grp[0], "root", 0);
+ grp[1] = getgrnam("system");
+ check_group(grp[1], "system", 1000);
+ result = getgrnam_r("radio", &grp_storage[1], buf[1], sizeof(buf[1]), &grp[2]);
+ ASSERT_EQ(0, result);
+ check_group(grp[2], "radio", 1001);
+ check_group(grp[0], "root", 0);
+ check_group(grp[1], "system", 1000);
+#else
+ print_no_getgrnam_test_info();
+#endif
+}
+
+TEST(getgrgid_r, reentrancy) {
+#if defined(__BIONIC__)
+ group grp_storage[2];
+ char buf[2][512];
+ group* grp[3];
+ int result = getgrgid_r(0, &grp_storage[0], buf[0], sizeof(buf[0]), &grp[0]);
+ ASSERT_EQ(0, result);
+ check_group(grp[0], "root", 0);
+ grp[1] = getgrgid(1000);
+ check_group(grp[1], "system", 1000);
+ result = getgrgid_r(1001, &grp_storage[1], buf[1], sizeof(buf[1]), &grp[2]);
+ ASSERT_EQ(0, result);
+ check_group(grp[2], "radio", 1001);
+ check_group(grp[0], "root", 0);
+ check_group(grp[1], "system", 1000);
+#else
+ print_no_getgrnam_test_info();
+#endif
+}
+
+TEST(getgrnam_r, large_enough_suggested_buffer_size) {
+ long size = sysconf(_SC_GETGR_R_SIZE_MAX);
+ ASSERT_GT(size, 0);
+ char buf[size];
+ group grp_storage;
+ group* grp;
+ ASSERT_EQ(0, getgrnam_r("root", &grp_storage, buf, size, &grp));
+ check_group(grp, "root", 0);
+}
diff --git a/tests/sys_mman_test.cpp b/tests/sys_mman_test.cpp
index b0e40fdd6..ddb6c77a5 100644
--- a/tests/sys_mman_test.cpp
+++ b/tests/sys_mman_test.cpp
@@ -17,6 +17,7 @@
#include <gtest/gtest.h>
#include <sys/mman.h>
+#include <sys/user.h>
#include <sys/types.h>
#include <unistd.h>
@@ -215,3 +216,19 @@ TEST(sys_mman, posix_madvise_POSIX_MADV_DONTNEED) {
ASSERT_EQ(0, munmap(map, pagesize));
}
+
+TEST(sys_mman, mremap) {
+ ASSERT_EQ(MAP_FAILED, mremap(nullptr, 0, 0, 0));
+}
+
+const size_t huge = size_t(PTRDIFF_MAX) + 1;
+
+TEST(sys_mman, mmap_PTRDIFF_MAX) {
+ ASSERT_EQ(MAP_FAILED, mmap(nullptr, huge, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
+}
+
+TEST(sys_mman, mremap_PTRDIFF_MAX) {
+ void* map = mmap(nullptr, PAGE_SIZE, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_NE(MAP_FAILED, map);
+ ASSERT_EQ(MAP_FAILED, mremap(map, PAGE_SIZE, huge, MREMAP_MAYMOVE));
+}
diff --git a/tests/sys_personality_test.cpp b/tests/sys_personality_test.cpp
index 2dfaa658c..6bd00efd9 100644
--- a/tests/sys_personality_test.cpp
+++ b/tests/sys_personality_test.cpp
@@ -21,7 +21,9 @@
TEST(sys_personality, current_persona) {
int persona = personality(0xffffffff) & PER_MASK;
#if defined(__BIONIC__)
-#if defined(__LP64__)
+// When personality syscall is executed on mips64, for a 32bit process
+// sys_32_personality() is called, which converts PER_LINUX32 -> PER_LINUX
+#if defined(__LP64__) || (__mips==32 && __mips_isa_rev>2)
ASSERT_EQ(PER_LINUX, persona);
#else
ASSERT_EQ(PER_LINUX32, persona);
diff --git a/tests/sys_prctl_test.cpp b/tests/sys_prctl_test.cpp
new file mode 100644
index 000000000..5a563c1de
--- /dev/null
+++ b/tests/sys_prctl_test.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <sys/mman.h>
+#include <sys/prctl.h>
+#include <unistd.h>
+#include "private/bionic_prctl.h"
+
+// http://b/20017123.
+TEST(sys_prctl, bug_20017123) {
+#if defined(__ANDROID__)
+ size_t page_size = static_cast<size_t>(sysconf(_SC_PAGESIZE));
+ void* p = mmap(NULL, page_size * 3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_NE(MAP_FAILED, p);
+ ASSERT_EQ(0, mprotect(p, page_size, PROT_NONE));
+ ASSERT_NE(-1, prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, p, page_size * 3, "anonymous map space"));
+ volatile char* vp = reinterpret_cast<volatile char*>(p);
+ // Below memory access causes SEGV if the memory map is screwed up.
+ *(vp + page_size) = 0;
+ ASSERT_EQ(0, munmap(p, page_size * 3));
+#else
+ GTEST_LOG_(INFO) << "This test does nothing as it tests an Android specific kernel feature.";
+#endif
+}
diff --git a/tests/sys_resource_test.cpp b/tests/sys_resource_test.cpp
index 8cefc652d..0b6b6ef6b 100644
--- a/tests/sys_resource_test.cpp
+++ b/tests/sys_resource_test.cpp
@@ -33,7 +33,8 @@ class SysResourceTest : public ::testing::Test {
virtual void SetUp() {
ASSERT_EQ(0, getrlimit(RLIMIT_CORE, &l32_));
ASSERT_EQ(0, getrlimit64(RLIMIT_CORE, &l64_));
- ASSERT_EQ(0, prlimit64(0, RLIMIT_CORE, NULL, &pr_l64_));
+ ASSERT_EQ(0, prlimit(0, RLIMIT_CORE, nullptr, &pr_l32_));
+ ASSERT_EQ(0, prlimit64(0, RLIMIT_CORE, nullptr, &pr_l64_));
}
void CheckResourceLimits();
@@ -41,21 +42,28 @@ class SysResourceTest : public ::testing::Test {
protected:
rlimit l32_;
rlimit64 l64_;
+ rlimit pr_l32_;
rlimit64 pr_l64_;
};
void SysResourceTest::CheckResourceLimits() {
ASSERT_EQ(0, getrlimit(RLIMIT_CORE, &l32_));
ASSERT_EQ(0, getrlimit64(RLIMIT_CORE, &l64_));
- ASSERT_EQ(0, prlimit64(0, RLIMIT_CORE, NULL, &pr_l64_));
+ ASSERT_EQ(0, prlimit(0, RLIMIT_CORE, nullptr, &pr_l32_));
+ ASSERT_EQ(0, prlimit64(0, RLIMIT_CORE, nullptr, &pr_l64_));
+
+ ASSERT_EQ(l32_.rlim_cur, pr_l32_.rlim_cur);
ASSERT_EQ(l64_.rlim_cur, pr_l64_.rlim_cur);
+
if (l64_.rlim_cur == RLIM64_INFINITY) {
ASSERT_EQ(RLIM_INFINITY, l32_.rlim_cur);
} else {
ASSERT_EQ(l64_.rlim_cur, l32_.rlim_cur);
}
+ ASSERT_EQ(l32_.rlim_max, pr_l32_.rlim_max);
ASSERT_EQ(l64_.rlim_max, pr_l64_.rlim_max);
+
if (l64_.rlim_max == RLIM64_INFINITY) {
ASSERT_EQ(RLIM_INFINITY, l32_.rlim_max);
} else {
@@ -88,13 +96,16 @@ TEST_F(SysResourceTest, setrlimit64) {
ASSERT_EQ(456U, l64_.rlim_cur);
}
+TEST_F(SysResourceTest, prlimit) {
+ pr_l32_.rlim_cur = pr_l32_.rlim_max;
+ ASSERT_EQ(0, prlimit(0, RLIMIT_CORE, &pr_l32_, nullptr));
+ CheckResourceLimits();
+ ASSERT_EQ(pr_l32_.rlim_max, pr_l32_.rlim_cur);
+}
+
TEST_F(SysResourceTest, prlimit64) {
pr_l64_.rlim_cur = pr_l64_.rlim_max;
- ASSERT_EQ(0, prlimit64(0, RLIMIT_CORE, &pr_l64_, NULL));
+ ASSERT_EQ(0, prlimit64(0, RLIMIT_CORE, &pr_l64_, nullptr));
CheckResourceLimits();
ASSERT_EQ(pr_l64_.rlim_max, pr_l64_.rlim_cur);
}
-
-TEST_F(SysResourceTest, prlimit) {
- // prlimit is prlimit64 on LP64 and unimplemented on 32-bit. So we only test prlimit64.
-}
diff --git a/tests/sys_select_test.cpp b/tests/sys_select_test.cpp
index c1732ee29..4ad77f087 100644
--- a/tests/sys_select_test.cpp
+++ b/tests/sys_select_test.cpp
@@ -23,6 +23,8 @@
#include <sys/types.h>
#include <sys/wait.h>
+#include "utils.h"
+
TEST(sys_select, fd_set_smoke) {
fd_set fds;
FD_ZERO(&fds);
@@ -68,7 +70,8 @@ static void DelayedWriteCleanup(int pid, int fd) {
char buf[sizeof(DELAY_MSG)];
ASSERT_EQ(static_cast<ssize_t>(sizeof(DELAY_MSG)), read(fd, buf, sizeof(DELAY_MSG)));
ASSERT_STREQ(DELAY_MSG, buf);
- ASSERT_EQ(pid, waitpid(pid, NULL, 0));
+
+ AssertChildExited(pid, 0);
}
TEST(sys_select, select_smoke) {
@@ -89,7 +92,16 @@ TEST(sys_select, select_smoke) {
ASSERT_EQ(-1, select(-1, &r, &w, &e, NULL));
ASSERT_EQ(EINVAL, errno);
- ASSERT_EQ(2, select(max, &r, &w, &e, NULL));
+ int num_fds = select(max, &r, &w, &e, NULL);
+ // If there is data to be read on STDIN, then the number of
+ // fds ready will be 3 instead of 2. Allow this case, but verify
+ // every fd that is set.
+ ASSERT_TRUE(num_fds == 2 || num_fds == 3) << "Num fds returned " << num_fds;
+ ASSERT_TRUE(FD_ISSET(STDOUT_FILENO, &w));
+ ASSERT_TRUE(FD_ISSET(STDERR_FILENO, &w));
+ if (num_fds == 3) {
+ ASSERT_TRUE(FD_ISSET(STDIN_FILENO, &r));
+ }
// Invalid timeout.
timeval tv;
@@ -135,7 +147,16 @@ TEST(sys_select, pselect_smoke) {
ASSERT_EQ(-1, pselect(-1, &r, &w, &e, NULL, &ss));
ASSERT_EQ(EINVAL, errno);
- ASSERT_EQ(2, pselect(max, &r, &w, &e, NULL, &ss));
+ // If there is data to be read on STDIN, then the number of
+ // fds ready will be 3 instead of 2. Allow this case, but verify
+ // every fd that is set.
+ int num_fds = pselect(max, &r, &w, &e, NULL, &ss);
+ ASSERT_TRUE(num_fds == 2 || num_fds == 3) << "Num fds returned " << num_fds;
+ ASSERT_TRUE(FD_ISSET(STDOUT_FILENO, &w));
+ ASSERT_TRUE(FD_ISSET(STDERR_FILENO, &w));
+ if (num_fds == 3) {
+ ASSERT_TRUE(FD_ISSET(STDIN_FILENO, &r));
+ }
// Invalid timeout.
timespec tv;
diff --git a/tests/sys_sysmacros_test.cpp b/tests/sys_sysmacros_test.cpp
new file mode 100644
index 000000000..f17fac53c
--- /dev/null
+++ b/tests/sys_sysmacros_test.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/sysmacros.h>
+
+#include <gtest/gtest.h>
+
+TEST(sys_sysmacros, makedev) {
+ ASSERT_EQ(0x12345aabbcc678ddULL, makedev(0x12345678, 0xaabbccdd));
+}
+
+TEST(sys_sysmacros, major) {
+ ASSERT_EQ(0x12345678UL, major(0x12345aabbcc678dd));
+}
+
+TEST(sys_sysmacros, minor) {
+ ASSERT_EQ(0xaabbccddUL, minor(0x12345aabbcc678dd));
+}
diff --git a/tests/sys_time_test.cpp b/tests/sys_time_test.cpp
index bb142bc5f..18fbe105e 100644
--- a/tests/sys_time_test.cpp
+++ b/tests/sys_time_test.cpp
@@ -63,7 +63,7 @@ TEST(sys_time, gettimeofday) {
tv2.tv_usec += 1000000;
}
- // Should be less than (a very generous, to try to avoid flakiness) 1000us.
+ // Should be less than (a very generous, to try to avoid flakiness) 2ms (2000us).
ASSERT_EQ(0, tv2.tv_sec);
- ASSERT_LT(tv2.tv_usec, 1000);
+ ASSERT_LT(tv2.tv_usec, 2000);
}
diff --git a/tests/sys_timex_test.cpp b/tests/sys_timex_test.cpp
new file mode 100644
index 000000000..1340ea42d
--- /dev/null
+++ b/tests/sys_timex_test.cpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/timex.h>
+
+#include <errno.h>
+
+#include <gtest/gtest.h>
+
+TEST(sys_timex, adjtimex_smoke) {
+ timex t;
+ memset(&t, 0, sizeof(t));
+ // adjtimex/clock_adjtime return the clock state on success, -1 on failure.
+ ASSERT_NE(-1, adjtimex(&t));
+}
+
+TEST(sys_timex, adjtimex_EFAULT) {
+ errno = 0;
+ ASSERT_EQ(-1, adjtimex(nullptr));
+ ASSERT_EQ(EFAULT, errno);
+}
+
+TEST(sys_timex, clock_adjtime_smoke) {
+ timex t;
+ memset(&t, 0, sizeof(t));
+ // adjtimex/clock_adjtime return the clock state on success, -1 on failure.
+ ASSERT_NE(-1, clock_adjtime(CLOCK_REALTIME, &t));
+}
+
+TEST(sys_timex, clock_adjtime_EFAULT) {
+ errno = 0;
+ ASSERT_EQ(-1, clock_adjtime(CLOCK_REALTIME, nullptr));
+ ASSERT_EQ(EFAULT, errno);
+}
diff --git a/tests/sys_uio_test.cpp b/tests/sys_uio_test.cpp
index c7af8a77c..569d4fbad 100644
--- a/tests/sys_uio_test.cpp
+++ b/tests/sys_uio_test.cpp
@@ -18,10 +18,60 @@
#include <sys/uio.h>
-TEST(sys_uio, process_vm_readv_ESRCH) {
+#include "TemporaryFile.h"
+
+TEST(sys_uio, readv_writev) {
+ TemporaryFile tf;
+
+ char buf1[] = "hello";
+ char buf2[] = "world";
+ iovec ios[] = { { buf1, 5 }, { buf2, 5 } };
+
+ ASSERT_EQ(10, writev(tf.fd, ios, 2));
+
+ ASSERT_EQ(0, lseek(tf.fd, 0, SEEK_SET));
+
+ memset(buf1, '1', sizeof(buf1));
+ memset(buf2, '2', sizeof(buf2));
+
+ ASSERT_EQ(10, readv(tf.fd, ios, 2));
+ buf1[5] = buf2[5] = '\0';
+ ASSERT_STREQ("hello", buf1);
+ ASSERT_STREQ("world", buf2);
+}
+
+template <typename ReadFn, typename WriteFn>
+void TestPreadVPwriteV(ReadFn read_fn, WriteFn write_fn) {
+ TemporaryFile tf;
+
+ char buf[] = "world";
+ iovec ios[] = { { buf, 5 } };
+
+ ASSERT_EQ(5, write_fn(tf.fd, ios, 1, 5));
+ ASSERT_EQ(0, lseek(tf.fd, 0, SEEK_CUR));
+
+ strcpy(buf, "hello");
+ ASSERT_EQ(5, write_fn(tf.fd, ios, 1, 0));
+ ASSERT_EQ(0, lseek(tf.fd, 0, SEEK_CUR));
+
+ ASSERT_EQ(5, read_fn(tf.fd, ios, 1, 5));
+ ASSERT_STREQ("world", buf);
+ ASSERT_EQ(5, read_fn(tf.fd, ios, 1, 0));
+ ASSERT_STREQ("hello", buf);
+}
+
+TEST(sys_uio, preadv_pwritev) {
+ TestPreadVPwriteV(preadv, pwritev);
+}
+
+TEST(sys_uio, preadv64_pwritev64) {
+ TestPreadVPwriteV(preadv64, pwritev64);
+}
+
+TEST(sys_uio, process_vm_readv) {
ASSERT_EQ(0, process_vm_readv(0, nullptr, 0, nullptr, 0, 0));
}
-TEST(sys_uio, process_vm_writev_ESRCH) {
+TEST(sys_uio, process_vm_writev) {
ASSERT_EQ(0, process_vm_writev(0, nullptr, 0, nullptr, 0, 0));
}
diff --git a/tests/sys_xattr_test.cpp b/tests/sys_xattr_test.cpp
index 184268220..113ec267c 100644
--- a/tests/sys_xattr_test.cpp
+++ b/tests/sys_xattr_test.cpp
@@ -80,6 +80,7 @@ TEST(sys_xattr, fsetxattr_with_opath) {
ASSERT_EQ(-1, res);
ASSERT_EQ(EBADF, errno);
#endif
+ close(fd);
}
TEST(sys_xattr, fsetxattr_with_opath_toosmall) {
@@ -97,4 +98,32 @@ TEST(sys_xattr, fsetxattr_with_opath_toosmall) {
ASSERT_EQ(-1, res);
ASSERT_EQ(EBADF, errno);
#endif
+ close(fd);
+}
+
+TEST(sys_xattr, flistattr) {
+ TemporaryFile tf;
+ char buf[65536]; // 64kB is max possible xattr list size. See "man 7 xattr".
+ ASSERT_EQ(0, fsetxattr(tf.fd, "user.foo", "bar", 4, 0));
+ ssize_t result = flistxattr(tf.fd, buf, sizeof(buf));
+ ASSERT_TRUE(result >= 9);
+ ASSERT_TRUE(memmem(buf, sizeof(buf), "user.foo", 9) != NULL);
+}
+
+TEST(sys_xattr, flistattr_opath) {
+ TemporaryFile tf;
+ char buf[65536]; // 64kB is max possible xattr list size. See "man 7 xattr".
+ ASSERT_EQ(0, fsetxattr(tf.fd, "user.foo", "bar", 4, 0));
+ int fd = open(tf.filename, O_PATH);
+ ASSERT_NE(-1, fd);
+ ssize_t res = flistxattr(fd, buf, sizeof(buf));
+#if defined(__BIONIC__)
+ ASSERT_TRUE(res >= 9);
+ ASSERT_TRUE(static_cast<size_t>(res) <= sizeof(buf));
+ ASSERT_TRUE(memmem(buf, res, "user.foo", 9) != NULL);
+#else
+ ASSERT_EQ(-1, res);
+ ASSERT_EQ(EBADF, errno);
+#endif
+ close(fd);
}
diff --git a/tests/system_properties_test.cpp b/tests/system_properties_test.cpp
index c7bfee65a..09eac3fbe 100644
--- a/tests/system_properties_test.cpp
+++ b/tests/system_properties_test.cpp
@@ -41,9 +41,6 @@ struct LocalPropertyTestState {
return;
}
- old_pa = __system_property_area__;
- __system_property_area__ = NULL;
-
pa_dirname = dirname;
pa_filename = pa_dirname + "/__properties__";
@@ -57,9 +54,8 @@ struct LocalPropertyTestState {
return;
}
- __system_property_area__ = old_pa;
-
__system_property_set_filename(PROP_FILENAME);
+ __system_properties_init();
unlink(pa_filename.c_str());
rmdir(pa_dirname.c_str());
}
@@ -68,7 +64,6 @@ public:
private:
std::string pa_dirname;
std::string pa_filename;
- void *old_pa;
};
static void foreach_test_callback(const prop_info *pi, void* cookie) {
diff --git a/tests/thread_local_test.cpp b/tests/thread_local_test.cpp
new file mode 100644
index 000000000..1422ed2f0
--- /dev/null
+++ b/tests/thread_local_test.cpp
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+#include <stdint.h>
+#include <string.h>
+
+#if defined(__GNUC__) && !defined(__clang__) && \
+ (defined(__arm__) || defined(__aarch64__))
+// Gcc has a bug with -O -fdata-section for the arm target: http://b/22772147.
+// Until that bug is fixed, disable optimization since
+// it is not essential for this test.
+#pragma GCC optimize("-O0")
+#endif
+
+__thread int local_var = 100;
+int shared_var = 200;
+
+static void reset_vars() {
+ local_var = 1000;
+ shared_var = 2000;
+ // local_var should be reset by threads
+}
+
+typedef void* (*MyThread)(void*);
+
+static void* inc_shared_var(void* p) {
+ int *data = reinterpret_cast<int*>(p);
+ shared_var++;
+ *data = shared_var;
+ return nullptr;
+}
+
+static void* inc_local_var(void* p) {
+ int *data = reinterpret_cast<int*>(p);
+ local_var++;
+ *data = local_var;
+ return nullptr;
+}
+
+static int run_one_thread(MyThread foo) {
+ pthread_t t;
+ int data;
+ int error = pthread_create(&t, nullptr, foo, &data);
+ if (!error)
+ error = pthread_join(t, nullptr);
+ return error ? error : data;
+}
+
+TEST(thread_local_storage, shared) {
+ reset_vars();
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2000);
+
+ // Update shared_var, local_var remains 1000.
+ ASSERT_EQ(run_one_thread(inc_shared_var), 2001);
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2001);
+
+ ASSERT_EQ(run_one_thread(inc_shared_var), 2002);
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2002);
+
+ ASSERT_EQ(run_one_thread(inc_shared_var), 2003);
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2003);
+}
+
+TEST(thread_local_storage, local) {
+ reset_vars();
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2000);
+
+ // When a child thread updates its own TLS variable,
+ // this thread's local_var and shared_var are not changed.
+ // TLS local_var is initialized to 100 in a thread.
+ ASSERT_EQ(run_one_thread(inc_local_var), 101);
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2000);
+
+ ASSERT_EQ(run_one_thread(inc_local_var), 101);
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2000);
+
+ ASSERT_EQ(run_one_thread(inc_local_var), 101);
+ ASSERT_EQ(local_var, 1000);
+ ASSERT_EQ(shared_var, 2000);
+}
+
+// Test TLS initialization of more complicated type, array of struct.
+struct Point {
+ int x, y;
+};
+
+typedef Point Triangle[3];
+
+__thread Triangle local_triangle = {{10,10}, {20,20}, {30,30}};
+Triangle shared_triangle = {{1,1}, {2,2}, {3,3}};
+
+static void reset_triangle() {
+ static const Triangle t1 = {{3,3}, {4,4}, {5,5}};
+ static const Triangle t2 = {{2,2}, {3,3}, {4,4}};
+ memcpy(local_triangle, t1, sizeof(local_triangle));
+ memcpy(shared_triangle, t2, sizeof(shared_triangle));
+}
+
+static void* move_shared_triangle(void* p) {
+ int *data = reinterpret_cast<int*>(p);
+ shared_triangle[1].y++;
+ *data = shared_triangle[1].y;
+ return nullptr;
+}
+
+static void* move_local_triangle(void* p) {
+ int *data = reinterpret_cast<int*>(p);
+ local_triangle[1].y++;
+ *data = local_triangle[1].y;
+ return nullptr;
+}
+
+TEST(thread_local_storage, shared_triangle) {
+ reset_triangle();
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 3);
+
+ // Update shared_triangle, local_triangle remains 1000.
+ ASSERT_EQ(run_one_thread(move_shared_triangle), 4);
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 4);
+
+ ASSERT_EQ(run_one_thread(move_shared_triangle), 5);
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 5);
+
+ ASSERT_EQ(run_one_thread(move_shared_triangle), 6);
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 6);
+}
+
+TEST(thread_local_storage, local_triangle) {
+ reset_triangle();
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 3);
+
+ // Update local_triangle, parent thread's
+ // shared_triangle and local_triangle are unchanged.
+ ASSERT_EQ(run_one_thread(move_local_triangle), 21);
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 3);
+
+ ASSERT_EQ(run_one_thread(move_local_triangle), 21);
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 3);
+
+ ASSERT_EQ(run_one_thread(move_local_triangle), 21);
+ ASSERT_EQ(local_triangle[1].y, 4);
+ ASSERT_EQ(shared_triangle[1].y, 3);
+}
+
+// Test emutls runtime data structures and __emutls_get_address function.
+typedef unsigned int gcc_word __attribute__((mode(word)));
+typedef unsigned int gcc_pointer __attribute__((mode(pointer)));
+struct gcc_emutls_object { // for libgcc
+ gcc_word size;
+ gcc_word align;
+ union {
+ gcc_pointer offset;
+ void* ptr;
+ } loc;
+ void* templ;
+};
+
+typedef struct __emutls_control { // for clang/llvm
+ size_t size;
+ size_t align;
+ union {
+ uintptr_t index;
+ void* address;
+ } object;
+ void* value;
+} __emutls_control;
+
+TEST(thread_local_storage, type_size) {
+ static_assert(sizeof(size_t) == sizeof(gcc_word),
+ "size_t != gcc_word");
+ static_assert(sizeof(uintptr_t) == sizeof(gcc_pointer),
+ "uintptr_t != gcc_pointer");
+ static_assert(sizeof(uintptr_t) == sizeof(void*),
+ "sizoeof(uintptr_t) != sizeof(void*)");
+ static_assert(sizeof(__emutls_control) == sizeof(struct gcc_emutls_object),
+ "sizeof(__emutls_control) != sizeof(struct gcc_emutls_object)");
+}
+
+extern "C" void* __emutls_get_address(__emutls_control*);
+
+TEST(thread_local_storage, init_value) {
+ char tls_value1[] = "123456789";
+ char tls_value2[] = "abcdefghi";
+ constexpr size_t num_saved_values = 10;
+ __emutls_control tls_var[num_saved_values];
+ size_t prev_index = 0;
+ void* saved_gap[num_saved_values];
+ void* saved_p[num_saved_values];
+ ASSERT_TRUE(strlen(tls_value2) <= strlen(tls_value1));
+ __emutls_control c =
+ {strlen(tls_value1) + 1, 1, {0}, tls_value1};
+ for (size_t n = 0; n < num_saved_values; n++) {
+ memcpy(&tls_var[n], &c, sizeof(c));
+ tls_var[n].align = (1 << n);
+ }
+ for (size_t n = 0; n < num_saved_values; n++) {
+ // Try to mess up malloc space so that the next malloc will not have the
+ // required alignment, but __emutls_get_address should still return an
+ // aligned address.
+ saved_gap[n] = malloc(1);
+ void* p = __emutls_get_address(&tls_var[n]);
+ saved_p[n] = p;
+ ASSERT_TRUE(p != nullptr);
+ ASSERT_TRUE(tls_var[n].object.index != 0);
+ // check if p is a new object.
+ if (n > 0) {
+ // In single-thread environment, object.address == p.
+ // In multi-threads environment, object.index is increased.
+ ASSERT_TRUE(prev_index + 1 == tls_var[n].object.index ||
+ p == tls_var[n].object.address);
+ ASSERT_TRUE(p != saved_p[n - 1]);
+ }
+ prev_index = tls_var[n].object.index;
+ // check if p is aligned
+ uintptr_t align = (1 << n);
+ uintptr_t address= reinterpret_cast<uintptr_t>(p);
+ ASSERT_EQ((address & ~(align - 1)), address);
+ // check if *p is initialized
+ ASSERT_STREQ(tls_value1, static_cast<char*>(p));
+ // change value in *p
+ memcpy(p, tls_value2, strlen(tls_value2) + 1);
+ }
+ for (size_t n = 0; n < num_saved_values; n++) {
+ free(saved_gap[n]);
+ }
+ for (size_t n = 0; n < num_saved_values; n++) {
+ void* p = __emutls_get_address(&tls_var[n]);
+ ASSERT_EQ(p, saved_p[n]);
+ // check if *p has the new value
+ ASSERT_STREQ(tls_value2, static_cast<char*>(p));
+ }
+}
diff --git a/tests/time_test.cpp b/tests/time_test.cpp
index 0ea90a86b..6cdabd219 100644
--- a/tests/time_test.cpp
+++ b/tests/time_test.cpp
@@ -27,6 +27,7 @@
#include <atomic>
#include "ScopedSignalHandler.h"
+#include "utils.h"
#include "private/bionic_constants.h"
@@ -58,19 +59,13 @@ TEST(time, gmtime_no_stack_overflow_14313703) {
// Is it safe to call tzload on a thread with a small stack?
// http://b/14313703
// https://code.google.com/p/android/issues/detail?id=61130
- pthread_attr_t attributes;
- ASSERT_EQ(0, pthread_attr_init(&attributes));
-#if defined(__BIONIC__)
- ASSERT_EQ(0, pthread_attr_setstacksize(&attributes, PTHREAD_STACK_MIN));
-#else
- // PTHREAD_STACK_MIN not currently in the host GCC sysroot.
- ASSERT_EQ(0, pthread_attr_setstacksize(&attributes, 4 * getpagesize()));
-#endif
+ pthread_attr_t a;
+ ASSERT_EQ(0, pthread_attr_init(&a));
+ ASSERT_EQ(0, pthread_attr_setstacksize(&a, PTHREAD_STACK_MIN));
pthread_t t;
- ASSERT_EQ(0, pthread_create(&t, &attributes, gmtime_no_stack_overflow_14313703_fn, NULL));
- void* result;
- ASSERT_EQ(0, pthread_join(t, &result));
+ ASSERT_EQ(0, pthread_create(&t, &a, gmtime_no_stack_overflow_14313703_fn, NULL));
+ ASSERT_EQ(0, pthread_join(t, nullptr));
}
TEST(time, mktime_empty_TZ) {
@@ -143,6 +138,44 @@ TEST(time, strftime) {
EXPECT_STREQ("Sun Mar 10 00:00:00 2100", buf);
}
+TEST(time, strftime_null_tm_zone) {
+ // Netflix on Nexus Player wouldn't start (http://b/25170306).
+ struct tm t;
+ memset(&t, 0, sizeof(tm));
+
+ char buf[64];
+
+ setenv("TZ", "America/Los_Angeles", 1);
+ tzset();
+
+ t.tm_isdst = 0; // "0 if Daylight Savings Time is not in effect".
+ EXPECT_EQ(5U, strftime(buf, sizeof(buf), "<%Z>", &t));
+ EXPECT_STREQ("<PST>", buf);
+
+#if defined(__BIONIC__) // glibc 2.19 only copes with tm_isdst being 0 and 1.
+ t.tm_isdst = 2; // "positive if Daylight Savings Time is in effect"
+ EXPECT_EQ(5U, strftime(buf, sizeof(buf), "<%Z>", &t));
+ EXPECT_STREQ("<PDT>", buf);
+
+ t.tm_isdst = -123; // "and negative if the information is not available".
+ EXPECT_EQ(2U, strftime(buf, sizeof(buf), "<%Z>", &t));
+ EXPECT_STREQ("<>", buf);
+#endif
+
+ setenv("TZ", "UTC", 1);
+ tzset();
+
+ t.tm_isdst = 0;
+ EXPECT_EQ(5U, strftime(buf, sizeof(buf), "<%Z>", &t));
+ EXPECT_STREQ("<UTC>", buf);
+
+#if defined(__BIONIC__) // glibc 2.19 thinks UTC DST is "UTC".
+ t.tm_isdst = 1; // UTC has no DST.
+ EXPECT_EQ(2U, strftime(buf, sizeof(buf), "<%Z>", &t));
+ EXPECT_STREQ("<>", buf);
+#endif
+}
+
TEST(time, strptime) {
setenv("TZ", "UTC", 1);
@@ -180,7 +213,7 @@ TEST(time, timer_create) {
timer_t timer_id;
ASSERT_EQ(0, timer_create(CLOCK_MONOTONIC, &se, &timer_id));
- int pid = fork();
+ pid_t pid = fork();
ASSERT_NE(-1, pid) << strerror(errno);
if (pid == 0) {
@@ -190,10 +223,7 @@ TEST(time, timer_create) {
_exit(0);
}
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(0, WEXITSTATUS(status));
+ AssertChildExited(pid, 0);
ASSERT_EQ(0, timer_delete(timer_id));
}
@@ -223,7 +253,7 @@ TEST(time, timer_create_SIGEV_SIGNAL) {
ts.it_value.tv_nsec = 1;
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 0;
- ASSERT_EQ(0, timer_settime(timer_id, TIMER_ABSTIME, &ts, NULL));
+ ASSERT_EQ(0, timer_settime(timer_id, 0, &ts, NULL));
usleep(500000);
ASSERT_EQ(1, timer_create_SIGEV_SIGNAL_signal_handler_invocation_count);
diff --git a/tests/unistd_nofortify_test.cpp b/tests/unistd_nofortify_test.cpp
new file mode 100644
index 000000000..29966e93b
--- /dev/null
+++ b/tests/unistd_nofortify_test.cpp
@@ -0,0 +1,12 @@
+
+#ifdef _FORTIFY_SOURCE
+#undef _FORTIFY_SOURCE
+#endif
+
+#define NOFORTIFY
+
+#include "unistd_test.cpp"
+
+#if defined(_FORTIFY_SOURCE)
+#error "_FORTIFY_SOURCE has been redefined, fix the code to remove this redefinition."
+#endif
diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp
index 75b3edc4c..ccf4dcca2 100644
--- a/tests/unistd_test.cpp
+++ b/tests/unistd_test.cpp
@@ -15,9 +15,11 @@
*/
#include <gtest/gtest.h>
+
#include "BionicDeathTest.h"
#include "ScopedSignalHandler.h"
#include "TemporaryFile.h"
+#include "utils.h"
#include <errno.h>
#include <fcntl.h>
@@ -30,6 +32,19 @@
#include <sys/wait.h>
#include <unistd.h>
+#include <android-base/file.h>
+#include <android-base/strings.h>
+
+#include "private/get_cpu_count_from_string.h"
+
+#if defined(NOFORTIFY)
+#define UNISTD_TEST unistd_nofortify
+#define UNISTD_DEATHTEST unistd_nofortify_DeathTest
+#else
+#define UNISTD_TEST unistd
+#define UNISTD_DEATHTEST unistd_DeathTest
+#endif
+
static void* get_brk() {
return sbrk(0);
}
@@ -39,7 +54,7 @@ static void* page_align(uintptr_t addr) {
return reinterpret_cast<void*>((addr + mask) & ~mask);
}
-TEST(unistd, brk) {
+TEST(UNISTD_TEST, brk) {
void* initial_break = get_brk();
// The kernel aligns the break to a page.
@@ -52,7 +67,7 @@ TEST(unistd, brk) {
ASSERT_EQ(get_brk(), new_break);
}
-TEST(unistd, brk_ENOMEM) {
+TEST(UNISTD_TEST, brk_ENOMEM) {
ASSERT_EQ(-1, brk(reinterpret_cast<void*>(-1)));
ASSERT_EQ(ENOMEM, errno);
}
@@ -65,7 +80,7 @@ TEST(unistd, brk_ENOMEM) {
#define SBRK_MAX PTRDIFF_MAX
#endif
-TEST(unistd, sbrk_ENOMEM) {
+TEST(UNISTD_TEST, sbrk_ENOMEM) {
#if defined(__BIONIC__) && !defined(__LP64__)
// There is no way to guarantee that all overflow conditions can be tested
// without manipulating the underlying values of the current break.
@@ -136,7 +151,7 @@ TEST(unistd, sbrk_ENOMEM) {
#endif
}
-TEST(unistd, truncate) {
+TEST(UNISTD_TEST, truncate) {
TemporaryFile tf;
ASSERT_EQ(0, close(tf.fd));
ASSERT_EQ(0, truncate(tf.filename, 123));
@@ -146,7 +161,7 @@ TEST(unistd, truncate) {
ASSERT_EQ(123, sb.st_size);
}
-TEST(unistd, truncate64) {
+TEST(UNISTD_TEST, truncate64) {
TemporaryFile tf;
ASSERT_EQ(0, close(tf.fd));
ASSERT_EQ(0, truncate64(tf.filename, 123));
@@ -156,7 +171,7 @@ TEST(unistd, truncate64) {
ASSERT_EQ(123, sb.st_size);
}
-TEST(unistd, ftruncate) {
+TEST(UNISTD_TEST, ftruncate) {
TemporaryFile tf;
ASSERT_EQ(0, ftruncate(tf.fd, 123));
ASSERT_EQ(0, close(tf.fd));
@@ -166,7 +181,7 @@ TEST(unistd, ftruncate) {
ASSERT_EQ(123, sb.st_size);
}
-TEST(unistd, ftruncate64) {
+TEST(UNISTD_TEST, ftruncate64) {
TemporaryFile tf;
ASSERT_EQ(0, ftruncate64(tf.fd, 123));
ASSERT_EQ(0, close(tf.fd));
@@ -176,7 +191,7 @@ TEST(unistd, ftruncate64) {
ASSERT_EQ(123, sb.st_size);
}
-TEST(unistd, ftruncate_negative) {
+TEST(UNISTD_TEST, ftruncate_negative) {
TemporaryFile tf;
errno = 0;
ASSERT_EQ(-1, ftruncate(tf.fd, -123));
@@ -188,7 +203,7 @@ static void PauseTestSignalHandler(int) {
g_pause_test_flag = true;
}
-TEST(unistd, pause) {
+TEST(UNISTD_TEST, pause) {
ScopedSignalHandler handler(SIGALRM, PauseTestSignalHandler);
alarm(1);
@@ -197,7 +212,7 @@ TEST(unistd, pause) {
ASSERT_TRUE(g_pause_test_flag);
}
-TEST(unistd, read) {
+TEST(UNISTD_TEST, read) {
int fd = open("/proc/version", O_RDONLY);
ASSERT_TRUE(fd != -1);
@@ -211,7 +226,7 @@ TEST(unistd, read) {
close(fd);
}
-TEST(unistd, read_EBADF) {
+TEST(UNISTD_TEST, read_EBADF) {
// read returns ssize_t which is 64-bits on LP64, so it's worth explicitly checking that
// our syscall stubs correctly return a 64-bit -1.
char buf[1];
@@ -219,7 +234,7 @@ TEST(unistd, read_EBADF) {
ASSERT_EQ(EBADF, errno);
}
-TEST(unistd, syscall_long) {
+TEST(UNISTD_TEST, syscall_long) {
// Check that syscall(3) correctly returns long results.
// https://code.google.com/p/android/issues/detail?id=73952
// We assume that the break is > 4GiB, but this is potentially flaky.
@@ -227,39 +242,36 @@ TEST(unistd, syscall_long) {
ASSERT_EQ(p, static_cast<uintptr_t>(syscall(__NR_brk, 0)));
}
-TEST(unistd, alarm) {
+TEST(UNISTD_TEST, alarm) {
ASSERT_EQ(0U, alarm(0));
}
-TEST(unistd, _exit) {
- int pid = fork();
+TEST(UNISTD_TEST, _exit) {
+ pid_t pid = fork();
ASSERT_NE(-1, pid) << strerror(errno);
if (pid == 0) {
_exit(99);
}
- int status;
- ASSERT_EQ(pid, waitpid(pid, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(99, WEXITSTATUS(status));
+ AssertChildExited(pid, 99);
}
-TEST(unistd, getenv_unsetenv) {
+TEST(UNISTD_TEST, getenv_unsetenv) {
ASSERT_EQ(0, setenv("test-variable", "hello", 1));
ASSERT_STREQ("hello", getenv("test-variable"));
ASSERT_EQ(0, unsetenv("test-variable"));
ASSERT_TRUE(getenv("test-variable") == NULL);
}
-TEST(unistd, unsetenv_EINVAL) {
+TEST(UNISTD_TEST, unsetenv_EINVAL) {
EXPECT_EQ(-1, unsetenv(""));
EXPECT_EQ(EINVAL, errno);
EXPECT_EQ(-1, unsetenv("a=b"));
EXPECT_EQ(EINVAL, errno);
}
-TEST(unistd, setenv_EINVAL) {
+TEST(UNISTD_TEST, setenv_EINVAL) {
EXPECT_EQ(-1, setenv(NULL, "value", 0));
EXPECT_EQ(EINVAL, errno);
EXPECT_EQ(-1, setenv(NULL, "value", 1));
@@ -274,7 +286,7 @@ TEST(unistd, setenv_EINVAL) {
EXPECT_EQ(EINVAL, errno);
}
-TEST(unistd, setenv) {
+TEST(UNISTD_TEST, setenv) {
ASSERT_EQ(0, unsetenv("test-variable"));
char a[] = "a";
@@ -300,7 +312,7 @@ TEST(unistd, setenv) {
ASSERT_EQ(0, unsetenv("test-variable"));
}
-TEST(unistd, putenv) {
+TEST(UNISTD_TEST, putenv) {
ASSERT_EQ(0, unsetenv("a"));
char* s1 = strdup("a=b");
@@ -321,7 +333,7 @@ TEST(unistd, putenv) {
free(s2);
}
-TEST(unistd, clearenv) {
+TEST(UNISTD_TEST, clearenv) {
extern char** environ;
// Guarantee that environ is not initially empty...
@@ -374,7 +386,7 @@ static void TestFsyncFunction(int (*fn)(int)) {
close(fd);
// The fd can even be a directory.
- ASSERT_NE(-1, fd = open("/data", O_RDONLY));
+ ASSERT_NE(-1, fd = open("/data/local/tmp", O_RDONLY));
EXPECT_EQ(0, fn(fd));
close(fd);
@@ -386,11 +398,11 @@ static void TestFsyncFunction(int (*fn)(int)) {
close(fd);
}
-TEST(unistd, fdatasync) {
+TEST(UNISTD_TEST, fdatasync) {
TestFsyncFunction(fdatasync);
}
-TEST(unistd, fsync) {
+TEST(UNISTD_TEST, fsync) {
TestFsyncFunction(fsync);
}
@@ -402,11 +414,11 @@ static void AssertGetPidCorrect() {
}
}
-TEST(unistd, getpid_caching_and_fork) {
+static void TestGetPidCachingWithFork(int (*fork_fn)()) {
pid_t parent_pid = getpid();
ASSERT_EQ(syscall(__NR_getpid), parent_pid);
- pid_t fork_result = fork();
+ pid_t fork_result = fork_fn();
ASSERT_NE(fork_result, -1);
if (fork_result == 0) {
// We're the child.
@@ -416,20 +428,24 @@ TEST(unistd, getpid_caching_and_fork) {
} else {
// We're the parent.
ASSERT_EQ(parent_pid, getpid());
-
- int status;
- ASSERT_EQ(fork_result, waitpid(fork_result, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(123, WEXITSTATUS(status));
+ AssertChildExited(fork_result, 123);
}
}
+TEST(UNISTD_TEST, getpid_caching_and_fork) {
+ TestGetPidCachingWithFork(fork);
+}
+
+TEST(UNISTD_TEST, getpid_caching_and_vfork) {
+ TestGetPidCachingWithFork(vfork);
+}
+
static int GetPidCachingCloneStartRoutine(void*) {
AssertGetPidCorrect();
return 123;
}
-TEST(unistd, getpid_caching_and_clone) {
+TEST(UNISTD_TEST, getpid_caching_and_clone) {
pid_t parent_pid = getpid();
ASSERT_EQ(syscall(__NR_getpid), parent_pid);
@@ -443,10 +459,7 @@ TEST(unistd, getpid_caching_and_clone) {
ASSERT_EQ(parent_pid, getpid());
- int status;
- ASSERT_EQ(clone_result, waitpid(clone_result, &status, 0));
- ASSERT_TRUE(WIFEXITED(status));
- ASSERT_EQ(123, WEXITSTATUS(status));
+ AssertChildExited(clone_result, 123);
}
static void* GetPidCachingPthreadStartRoutine(void*) {
@@ -454,7 +467,7 @@ static void* GetPidCachingPthreadStartRoutine(void*) {
return NULL;
}
-TEST(unistd, getpid_caching_and_pthread_create) {
+TEST(UNISTD_TEST, getpid_caching_and_pthread_create) {
pid_t parent_pid = getpid();
pthread_t t;
@@ -467,13 +480,13 @@ TEST(unistd, getpid_caching_and_pthread_create) {
ASSERT_EQ(NULL, result);
}
-class unistd_DeathTest : public BionicDeathTest {};
+class UNISTD_DEATHTEST : public BionicDeathTest {};
-TEST_F(unistd_DeathTest, abort) {
+TEST_F(UNISTD_DEATHTEST, abort) {
ASSERT_EXIT(abort(), testing::KilledBySignal(SIGABRT), "");
}
-TEST(unistd, sethostname) {
+TEST(UNISTD_TEST, sethostname) {
// The permissions check happens before the argument check, so this will
// fail for a different reason if you're running as root than if you're
// not, but it'll fail either way. Checking that we have the symbol is about
@@ -481,7 +494,7 @@ TEST(unistd, sethostname) {
ASSERT_EQ(-1, sethostname("", -1));
}
-TEST(unistd, gethostname) {
+TEST(UNISTD_TEST, gethostname) {
char hostname[HOST_NAME_MAX + 1];
memset(hostname, 0, sizeof(hostname));
@@ -504,7 +517,7 @@ TEST(unistd, gethostname) {
ASSERT_EQ(ENAMETOOLONG, errno);
}
-TEST(unistd, pathconf_fpathconf) {
+TEST(UNISTD_TEST, pathconf_fpathconf) {
TemporaryFile tf;
long rc = 0L;
// As a file system's block size is always power of 2, the configure values
@@ -525,7 +538,7 @@ TEST(unistd, pathconf_fpathconf) {
}
-TEST(unistd, _POSIX_macros_smoke) {
+TEST(UNISTD_TEST, _POSIX_macros_smoke) {
// Make a tight verification of _POSIX_* / _POSIX2_* / _XOPEN_* macros, to prevent change by mistake.
// Verify according to POSIX.1-2008.
EXPECT_EQ(200809L, _POSIX_VERSION);
@@ -664,7 +677,7 @@ static void VerifySysconf(int option, const char *option_name, bool (*verify)(lo
<< ret <<", Error Message: " << strerror(errno);
}
-TEST(unistd, sysconf) {
+TEST(UNISTD_TEST, sysconf) {
VERIFY_SYSCONF_POSIX_VERSION(_SC_ADVISORY_INFO);
VERIFY_SYSCONF_POSITIVE(_SC_ARG_MAX);
VERIFY_SYSCONF_POSITIVE(_SC_BC_BASE_MAX);
@@ -694,6 +707,8 @@ TEST(unistd, sysconf) {
VERIFY_SYSCONF_POSITIVE(_SC_IOV_MAX);
VERIFY_SYSCONF_POSITIVE(_SC_PAGESIZE);
VERIFY_SYSCONF_POSITIVE(_SC_PAGE_SIZE);
+ VerifySysconf(_SC_PAGE_SIZE, "_SC_PAGE_SIZE",
+ [](long v){return v == sysconf(_SC_PAGESIZE) && v == getpagesize();});
VERIFY_SYSCONF_POSITIVE(_SC_XOPEN_UNIX);
VERIFY_SYSCONF_POSITIVE(_SC_AIO_LISTIO_MAX);
VERIFY_SYSCONF_POSITIVE(_SC_AIO_MAX);
@@ -809,7 +824,29 @@ TEST(unistd, sysconf) {
#endif // defined(__BIONIC__)
}
-TEST(unistd, dup2_same) {
+TEST(UNISTD_TEST, get_cpu_count_from_string) {
+ ASSERT_EQ(0, GetCpuCountFromString(" "));
+ ASSERT_EQ(1, GetCpuCountFromString("0"));
+ ASSERT_EQ(40, GetCpuCountFromString("0-39"));
+ ASSERT_EQ(4, GetCpuCountFromString("0, 1-2, 4\n"));
+}
+
+TEST(UNISTD_TEST, sysconf_SC_NPROCESSORS_ONLN) {
+ std::string line;
+ ASSERT_TRUE(android::base::ReadFileToString("/sys/devices/system/cpu/online", &line));
+ long online_cpus = 0;
+ for (const std::string& s : android::base::Split(line, ",")) {
+ std::vector<std::string> numbers = android::base::Split(s, "-");
+ if (numbers.size() == 1u) {
+ online_cpus++;
+ } else {
+ online_cpus += atoi(numbers[1].c_str()) - atoi(numbers[0].c_str()) + 1;
+ }
+ }
+ ASSERT_EQ(online_cpus, sysconf(_SC_NPROCESSORS_ONLN));
+}
+
+TEST(UNISTD_TEST, dup2_same) {
// POSIX says of dup2:
// If fildes2 is already a valid open file descriptor ...
// [and] fildes is equal to fildes2 ... dup2() shall return
@@ -827,3 +864,125 @@ TEST(unistd, dup2_same) {
ASSERT_EQ(-1, dup2(fd, fd));
ASSERT_EQ(EBADF, errno);
}
+
+TEST(UNISTD_TEST, lockf_smoke) {
+ constexpr off64_t file_size = 32*1024LL;
+
+ TemporaryFile tf;
+ ASSERT_EQ(0, ftruncate(tf.fd, file_size));
+
+ // Lock everything.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_LOCK, file_size));
+
+ // Try-lock everything, this should succeed too.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_TLOCK, file_size));
+
+ // Check status.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_TEST, file_size));
+
+ // Unlock file.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_ULOCK, file_size));
+}
+
+TEST(UNISTD_TEST, lockf_zero) {
+ constexpr off64_t file_size = 32*1024LL;
+
+ TemporaryFile tf;
+ ASSERT_EQ(0, ftruncate(tf.fd, file_size));
+
+ // Lock everything by specifying a size of 0 (meaning "to the end, even if it changes").
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_LOCK, 0));
+
+ // Check that it's locked.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_TEST, file_size));
+
+ // Move the end.
+ ASSERT_EQ(0, ftruncate(tf.fd, 2*file_size));
+
+ // Check that the new section is locked too.
+ ASSERT_EQ(file_size, lseek64(tf.fd, file_size, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_TEST, 2*file_size));
+}
+
+TEST(UNISTD_TEST, lockf_negative) {
+ constexpr off64_t file_size = 32*1024LL;
+
+ TemporaryFile tf;
+ ASSERT_EQ(0, ftruncate(tf.fd, file_size));
+
+ // Lock everything, but specifying the range in reverse.
+ ASSERT_EQ(file_size, lseek64(tf.fd, file_size, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_LOCK, -file_size));
+
+ // Check that it's locked.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_TEST, file_size));
+}
+
+TEST(UNISTD_TEST, lockf_with_child) {
+ constexpr off64_t file_size = 32*1024LL;
+
+ TemporaryFile tf;
+ ASSERT_EQ(0, ftruncate(tf.fd, file_size));
+
+ // Lock everything.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_LOCK, file_size));
+
+ // Fork a child process
+ pid_t pid = fork();
+ ASSERT_NE(-1, pid);
+ if (pid == 0) {
+ // Check that the child cannot lock the file.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(-1, lockf64(tf.fd, F_TLOCK, file_size));
+ ASSERT_EQ(EAGAIN, errno);
+ // Check also that it reports itself as locked.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(-1, lockf64(tf.fd, F_TEST, file_size));
+ ASSERT_EQ(EACCES, errno);
+ _exit(0);
+ }
+ AssertChildExited(pid, 0);
+}
+
+TEST(UNISTD_TEST, lockf_partial_with_child) {
+ constexpr off64_t file_size = 32*1024LL;
+
+ TemporaryFile tf;
+ ASSERT_EQ(0, ftruncate(tf.fd, file_size));
+
+ // Lock the first half of the file.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_LOCK, file_size/2));
+
+ // Fork a child process.
+ pid_t pid = fork();
+ ASSERT_NE(-1, pid);
+ if (pid == 0) {
+ // Check that the child can lock the other half.
+ ASSERT_EQ(file_size/2, lseek64(tf.fd, file_size/2, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_TLOCK, file_size/2));
+ // Check that the child cannot lock the first half.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(-1, lockf64(tf.fd, F_TEST, file_size/2));
+ ASSERT_EQ(EACCES, errno);
+ // Check also that it reports itself as locked.
+ ASSERT_EQ(0, lseek64(tf.fd, 0, SEEK_SET));
+ ASSERT_EQ(-1, lockf64(tf.fd, F_TEST, file_size/2));
+ ASSERT_EQ(EACCES, errno);
+ _exit(0);
+ }
+ AssertChildExited(pid, 0);
+
+ // The second half was locked by the child, but the lock disappeared
+ // when the process exited, so check it can be locked now.
+ ASSERT_EQ(file_size/2, lseek64(tf.fd, file_size/2, SEEK_SET));
+ ASSERT_EQ(0, lockf64(tf.fd, F_TLOCK, file_size/2));
+}
diff --git a/tests/utils.h b/tests/utils.h
index fd012a345..f8e003922 100644
--- a/tests/utils.h
+++ b/tests/utils.h
@@ -16,8 +16,19 @@
#ifndef __TEST_UTILS_H
#define __TEST_UTILS_H
+
#include <inttypes.h>
#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <atomic>
+#include <string>
+#include <regex>
+
+#include <android-base/file.h>
+#include <android-base/stringprintf.h>
#include "private/ScopeGuard.h"
@@ -38,9 +49,7 @@ struct map_record {
class Maps {
public:
static bool parse_maps(std::vector<map_record>* maps) {
- char path[64];
- snprintf(path, sizeof(path), "/proc/self/task/%d/maps", getpid());
- FILE* fp = fopen(path, "re");
+ FILE* fp = fopen("/proc/self/maps", "re");
if (fp == nullptr) {
return false;
}
@@ -53,11 +62,11 @@ class Maps {
while (fgets(line, sizeof(line), fp) != nullptr) {
map_record record;
uint32_t dev_major, dev_minor;
- char pathstr[BUFSIZ];
+ int path_offset;
char prot[5]; // sizeof("rwxp")
- if (sscanf(line, "%" SCNxPTR "-%" SCNxPTR " %4s %" SCNxPTR " %x:%x %lu %s",
+ if (sscanf(line, "%" SCNxPTR "-%" SCNxPTR " %4s %" SCNxPTR " %x:%x %lu %n",
&record.addr_start, &record.addr_end, prot, &record.offset,
- &dev_major, &dev_minor, &record.inode, pathstr) == 8) {
+ &dev_major, &dev_minor, &record.inode, &path_offset) == 7) {
record.perms = 0;
if (prot[0] == 'r') {
record.perms |= PROT_READ;
@@ -72,7 +81,10 @@ class Maps {
// TODO: parse shared/private?
record.device = makedev(dev_major, dev_minor);
- record.pathname = pathstr;
+ record.pathname = line + path_offset;
+ if (!record.pathname.empty() && record.pathname.back() == '\n') {
+ record.pathname.pop_back();
+ }
maps->push_back(record);
}
}
@@ -81,4 +93,33 @@ class Maps {
}
};
+extern "C" pid_t gettid();
+
+static inline void WaitUntilThreadSleep(std::atomic<pid_t>& tid) {
+ while (tid == 0) {
+ usleep(1000);
+ }
+ std::string filename = android::base::StringPrintf("/proc/%d/stat", tid.load());
+ std::regex regex {R"(\s+S\s+)"};
+
+ while (true) {
+ std::string content;
+ ASSERT_TRUE(android::base::ReadFileToString(filename, &content));
+ if (std::regex_search(content, regex)) {
+ break;
+ }
+ usleep(1000);
+ }
+}
+
+static inline void AssertChildExited(int pid, int expected_exit_status) {
+ int status;
+ ASSERT_EQ(pid, waitpid(pid, &status, 0));
+ ASSERT_TRUE(WIFEXITED(status));
+ ASSERT_EQ(expected_exit_status, WEXITSTATUS(status));
+}
+
+// The absolute path to the executable
+const std::string& get_executable_path();
+
#endif
diff --git a/tests/utmp_test.cpp b/tests/utmp_test.cpp
index b61110d68..0fa55c74b 100644
--- a/tests/utmp_test.cpp
+++ b/tests/utmp_test.cpp
@@ -23,3 +23,9 @@ TEST(utmp, login_tty) {
// This test just checks that we're exporting the symbol independently.
ASSERT_EQ(-1, login_tty(-1));
}
+
+TEST(utmp, setutent_getutent_endutent) {
+ setutent();
+ getutent();
+ endutent();
+}
diff --git a/tools/bionicbb/presubmit.py b/tools/bionicbb/presubmit.py
index cc6f3ccd8..3e6ebfa0a 100644
--- a/tools/bionicbb/presubmit.py
+++ b/tools/bionicbb/presubmit.py
@@ -73,8 +73,10 @@ def clean_project(dry_run):
build = 'clean-bionic-presubmit'
if build in jenkins:
if not dry_run:
- job = jenkins[build].invoke()
- url = job.get_build().baseurl
+ _ = jenkins[build].invoke()
+ # https://issues.jenkins-ci.org/browse/JENKINS-27256
+ # url = job.get_build().baseurl
+ url = 'URL UNAVAILABLE'
else:
url = 'DRY_RUN_URL'
logging.info('Cleaning: %s %s', build, url)
diff --git a/tools/relocation_packer/Android.mk b/tools/relocation_packer/Android.mk
index 4e2fd97b3..2bf77b9c2 100644
--- a/tools/relocation_packer/Android.mk
+++ b/tools/relocation_packer/Android.mk
@@ -30,7 +30,7 @@ LOCAL_SRC_FILES := \
src/packer.cc \
src/sleb128.cc \
-LOCAL_STATIC_LIBRARIES := libelf
+LOCAL_STATIC_LIBRARIES := libelf libz
LOCAL_C_INCLUDES := external/elfutils/src/libelf
LOCAL_MODULE := lib_relocation_packer
@@ -45,7 +45,7 @@ include $(CLEAR_VARS)
LOCAL_CPP_EXTENSION := .cc
LOCAL_SRC_FILES := src/main.cc
-LOCAL_STATIC_LIBRARIES := lib_relocation_packer libelf
+LOCAL_STATIC_LIBRARIES := lib_relocation_packer libelf libz
# Statically linking libc++ to make it work from prebuilts
LOCAL_CXX_STL := libc++_static
@@ -70,7 +70,7 @@ LOCAL_SRC_FILES := \
src/sleb128_unittest.cc \
src/packer_unittest.cc \
-LOCAL_STATIC_LIBRARIES := lib_relocation_packer libelf
+LOCAL_STATIC_LIBRARIES := lib_relocation_packer libelf libz
LOCAL_C_INCLUDES := external/elfutils/src/libelf
LOCAL_CPPFLAGS := $(common_cppflags)
@@ -96,5 +96,11 @@ $(eval $(call copy-test-library,elf_file_unittest_relocs_arm32.so))
$(eval $(call copy-test-library,elf_file_unittest_relocs_arm32_packed.so))
$(eval $(call copy-test-library,elf_file_unittest_relocs_arm64.so))
$(eval $(call copy-test-library,elf_file_unittest_relocs_arm64_packed.so))
+$(eval $(call copy-test-library,elf_file_unittest_relocs_ia32.so))
+$(eval $(call copy-test-library,elf_file_unittest_relocs_ia32_packed.so))
+$(eval $(call copy-test-library,elf_file_unittest_relocs_x64.so))
+$(eval $(call copy-test-library,elf_file_unittest_relocs_x64_packed.so))
+$(eval $(call copy-test-library,elf_file_unittest_relocs_mips32.so))
+$(eval $(call copy-test-library,elf_file_unittest_relocs_mips32_packed.so))
endif
diff --git a/tools/relocation_packer/src/elf_file.cc b/tools/relocation_packer/src/elf_file.cc
index 102d61423..014883d3b 100644
--- a/tools/relocation_packer/src/elf_file.cc
+++ b/tools/relocation_packer/src/elf_file.cc
@@ -302,13 +302,75 @@ static void AdjustSectionHeadersForHole(Elf* elf,
}
}
-// Helper for ResizeSection(). Adjust the offsets of any program headers
-// that have offsets currently beyond the hole start.
+// Helpers for ResizeSection(). On packing, reduce p_align for LOAD segments
+// to 4kb if larger. On unpacking, restore p_align for LOAD segments if
+// packing reduced it to 4kb. Return true if p_align was changed.
template <typename ELF>
-static void AdjustProgramHeaderOffsets(typename ELF::Phdr* program_headers,
+static bool ClampLoadSegmentAlignment(typename ELF::Phdr* program_header) {
+ CHECK(program_header->p_type == PT_LOAD);
+
+ // If large, reduce p_align for a LOAD segment to page size on packing.
+ if (program_header->p_align > kPageSize) {
+ program_header->p_align = kPageSize;
+ return true;
+ }
+ return false;
+}
+
+template <typename ELF>
+static bool RestoreLoadSegmentAlignment(typename ELF::Phdr* program_headers,
+ size_t count,
+ typename ELF::Phdr* program_header) {
+ CHECK(program_header->p_type == PT_LOAD);
+
+ // If p_align was reduced on packing, restore it to its previous value
+ // on unpacking. We do this by searching for a different LOAD segment
+ // and setting p_align to that of the other LOAD segment found.
+ //
+ // Relies on the following observations:
+ // - a packable ELF executable has more than one LOAD segment;
+ // - before packing all LOAD segments have the same p_align;
+ // - on packing we reduce only one LOAD segment's p_align.
+ if (program_header->p_align == kPageSize) {
+ for (size_t i = 0; i < count; ++i) {
+ typename ELF::Phdr* other_header = &program_headers[i];
+ if (other_header->p_type == PT_LOAD && other_header != program_header) {
+ program_header->p_align = other_header->p_align;
+ return true;
+ }
+ }
+ LOG(WARNING) << "Cannot find a LOAD segment from which to restore p_align";
+ }
+ return false;
+}
+
+template <typename ELF>
+static bool AdjustLoadSegmentAlignment(typename ELF::Phdr* program_headers,
size_t count,
- typename ELF::Off hole_start,
+ typename ELF::Phdr* program_header,
ssize_t hole_size) {
+ CHECK(program_header->p_type == PT_LOAD);
+
+ bool status = false;
+ if (hole_size < 0) {
+ status = ClampLoadSegmentAlignment<ELF>(program_header);
+ } else if (hole_size > 0) {
+ status = RestoreLoadSegmentAlignment<ELF>(program_headers,
+ count,
+ program_header);
+ }
+ return status;
+}
+
+// Helper for ResizeSection(). Adjust the offsets of any program headers
+// that have offsets currently beyond the hole start, and adjust the
+// virtual and physical addrs (and perhaps alignment) of the others.
+template <typename ELF>
+static void AdjustProgramHeaderFields(typename ELF::Phdr* program_headers,
+ size_t count,
+ typename ELF::Off hole_start,
+ ssize_t hole_size) {
+ int alignment_changes = 0;
for (size_t i = 0; i < count; ++i) {
typename ELF::Phdr* program_header = &program_headers[i];
@@ -327,9 +389,20 @@ static void AdjustProgramHeaderOffsets(typename ELF::Phdr* program_headers,
} else {
program_header->p_vaddr -= hole_size;
program_header->p_paddr -= hole_size;
- if (program_header->p_align > kPageSize) {
- program_header->p_align = kPageSize;
+
+ // If packing, clamp LOAD segment alignment to 4kb to prevent strip
+ // from adjusting it unnecessarily if run on a packed file. If
+ // unpacking, attempt to restore a reduced alignment to its previous
+ // value. Ensure that we do this on at most one LOAD segment.
+ if (program_header->p_type == PT_LOAD) {
+ alignment_changes += AdjustLoadSegmentAlignment<ELF>(program_headers,
+ count,
+ program_header,
+ hole_size);
+ LOG_IF(FATAL, alignment_changes > 1)
+ << "Changed p_align on more than one LOAD segment";
}
+
VLOG(1) << "phdr[" << i
<< "] p_vaddr adjusted to "<< program_header->p_vaddr
<< "; p_paddr adjusted to "<< program_header->p_paddr
@@ -383,10 +456,10 @@ static void RewriteProgramHeadersForHole(Elf* elf,
target_load_header->p_memsz += hole_size;
// Adjust the offsets and p_vaddrs
- AdjustProgramHeaderOffsets<ELF>(elf_program_header,
- program_header_count,
- hole_start,
- hole_size);
+ AdjustProgramHeaderFields<ELF>(elf_program_header,
+ program_header_count,
+ hole_start,
+ hole_size);
}
// Helper for ResizeSection(). Locate and return the dynamic section.
@@ -666,7 +739,7 @@ bool ElfFile<ELF>::PackTypedRelocations(std::vector<typename ELF::Rela>* relocat
VLOG(1) << "Packed (no padding): " << packed_bytes_estimate << " bytes";
if (packed.empty()) {
- LOG(INFO) << "Too few relocations to pack";
+ VLOG(1) << "Too few relocations to pack";
return true;
}
@@ -679,16 +752,16 @@ bool ElfFile<ELF>::PackTypedRelocations(std::vector<typename ELF::Rela>* relocat
// hole_size needs to be page_aligned.
hole_size -= hole_size % kPreserveAlignment;
- LOG(INFO) << "Compaction : " << hole_size << " bytes";
+ VLOG(1) << "Compaction : " << hole_size << " bytes";
// Adjusting for alignment may have removed any packing benefit.
if (hole_size == 0) {
- LOG(INFO) << "Too few relocations to pack after alignment";
+ VLOG(1) << "Too few relocations to pack after alignment";
return true;
}
if (hole_size <= 0) {
- LOG(INFO) << "Packing relocations saves no space";
+ VLOG(1) << "Packing relocations saves no space";
return true;
}
diff --git a/tools/relocation_packer/src/elf_file_unittest.cc b/tools/relocation_packer/src/elf_file_unittest.cc
index 32f79683f..d5c891890 100644
--- a/tools/relocation_packer/src/elf_file_unittest.cc
+++ b/tools/relocation_packer/src/elf_file_unittest.cc
@@ -183,6 +183,18 @@ TEST(ElfFile, PackRelocationsArm64) {
RunPackRelocationsTestFor("arm64");
}
+TEST(ElfFile, PackRelocationsMips32) {
+ RunPackRelocationsTestFor("mips32");
+}
+
+TEST(ElfFile, PackRelocationsIa32) {
+ RunPackRelocationsTestFor("ia32");
+}
+
+TEST(ElfFile, PackRelocationsX64) {
+ RunPackRelocationsTestFor("x64");
+}
+
TEST(ElfFile, UnpackRelocationsArm32) {
RunUnpackRelocationsTestFor("arm32");
}
@@ -191,4 +203,16 @@ TEST(ElfFile, UnpackRelocationsArm64) {
RunUnpackRelocationsTestFor("arm64");
}
+TEST(ElfFile, UnpackRelocationsMips32) {
+ RunUnpackRelocationsTestFor("mips32");
+}
+
+TEST(ElfFile, UnpackRelocationsIa32) {
+ RunUnpackRelocationsTestFor("ia32");
+}
+
+TEST(ElfFile, UnpackRelocationsX64) {
+ RunUnpackRelocationsTestFor("x64");
+}
+
} // namespace relocation_packer
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32.so
index 6ce6d0cd2..5e339ae4b 100755
--- a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32.so
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32_packed.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32_packed.so
index 6ac2eef05..253dd97c1 100755
--- a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32_packed.so
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm32_packed.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64.so
index 945b450e3..d3d0194da 100755
--- a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64.so
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64_packed.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64_packed.so
index ed85ce1e7..269b97554 100755
--- a/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64_packed.so
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_arm64_packed.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_ia32.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_ia32.so
new file mode 100755
index 000000000..42db62c24
--- /dev/null
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_ia32.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_ia32_packed.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_ia32_packed.so
new file mode 100755
index 000000000..27817cc38
--- /dev/null
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_ia32_packed.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_mips32.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_mips32.so
new file mode 100755
index 000000000..6da324bb7
--- /dev/null
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_mips32.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_mips32_packed.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_mips32_packed.so
new file mode 100755
index 000000000..b11ca4883
--- /dev/null
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_mips32_packed.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_x64.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_x64.so
new file mode 100755
index 000000000..6cb689ec5
--- /dev/null
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_x64.so
Binary files differ
diff --git a/tools/relocation_packer/test_data/elf_file_unittest_relocs_x64_packed.so b/tools/relocation_packer/test_data/elf_file_unittest_relocs_x64_packed.so
new file mode 100755
index 000000000..60b9ad179
--- /dev/null
+++ b/tools/relocation_packer/test_data/elf_file_unittest_relocs_x64_packed.so
Binary files differ