93f2b0
From: Petr Machata <pmachata@redhat.com>
93f2b0
Date: Thu, 23 Jan 2014 23:50:06 +0000 (+0100)
93f2b0
Subject: Implement aarch64 support
93f2b0
X-Git-Url: http://anonscm.debian.org/gitweb/?p=collab-maint%2Fltrace.git;a=commitdiff_plain;h=912a0f75b3521803fa724a55f0e883c134c7b4e9;hp=0b5457a9e59978bcd2eb5240f54838910365a93c
93f2b0
93f2b0
Implement aarch64 support
93f2b0
93f2b0
- IFUNC support is not implemented, the rest works well.  The only
93f2b0
  other failure is in wide char functions, and that occurs on x86_64
93f2b0
  as well.
93f2b0
---
93f2b0
93f2b0
diff --git a/configure.ac b/configure.ac
93f2b0
index c6e6bf0..0e9a124 100644
93f2b0
--- a/configure.ac
93f2b0
+++ b/configure.ac
93f2b0
@@ -1,6 +1,6 @@
93f2b0
 # -*- Autoconf -*-
93f2b0
 # This file is part of ltrace.
93f2b0
-# Copyright (C) 2010,2012,2013 Petr Machata, Red Hat Inc.
93f2b0
+# Copyright (C) 2010,2012,2013,2014 Petr Machata, Red Hat Inc.
93f2b0
 # Copyright (C) 2010,2011 Joe Damato
93f2b0
 # Copyright (C) 2010 Marc Kleine-Budde
93f2b0
 # Copyright (C) 2010 Zachary T Welch
93f2b0
@@ -399,6 +399,7 @@ AC_CONFIG_FILES([
93f2b0
 	Makefile
93f2b0
 	sysdeps/Makefile
93f2b0
 	sysdeps/linux-gnu/Makefile
93f2b0
+	sysdeps/linux-gnu/aarch64/Makefile
93f2b0
 	sysdeps/linux-gnu/alpha/Makefile
93f2b0
 	sysdeps/linux-gnu/arm/Makefile
93f2b0
 	sysdeps/linux-gnu/cris/Makefile
93f2b0
diff --git a/sysdeps/linux-gnu/Makefile.am b/sysdeps/linux-gnu/Makefile.am
93f2b0
index ecee577..ec26162 100644
93f2b0
--- a/sysdeps/linux-gnu/Makefile.am
93f2b0
+++ b/sysdeps/linux-gnu/Makefile.am
93f2b0
@@ -1,4 +1,5 @@
93f2b0
 # This file is part of ltrace.
93f2b0
+# Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
 # Copyright (C) 2010,2012 Marc Kleine-Budde, Pengutronix
93f2b0
 #
93f2b0
 # This program is free software; you can redistribute it and/or
93f2b0
@@ -16,7 +17,8 @@
93f2b0
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
 # 02110-1301 USA
93f2b0
 
93f2b0
-DIST_SUBDIRS = alpha arm cris ia64 m68k metag mips ppc s390 sparc x86
93f2b0
+DIST_SUBDIRS = aarch64 alpha arm cris ia64 m68k metag mips ppc s390	\
93f2b0
+	       sparc x86
93f2b0
 
93f2b0
 SUBDIRS = \
93f2b0
 	$(HOST_CPU)
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/Makefile.am b/sysdeps/linux-gnu/aarch64/Makefile.am
93f2b0
new file mode 100644
93f2b0
index 0000000..0af4e6e
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/Makefile.am
93f2b0
@@ -0,0 +1,25 @@
93f2b0
+# This file is part of ltrace.
93f2b0
+# Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+#
93f2b0
+# This program is free software; you can redistribute it and/or
93f2b0
+# modify it under the terms of the GNU General Public License as
93f2b0
+# published by the Free Software Foundation; either version 2 of the
93f2b0
+# License, or (at your option) any later version.
93f2b0
+#
93f2b0
+# This program is distributed in the hope that it will be useful, but
93f2b0
+# WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+# General Public License for more details.
93f2b0
+#
93f2b0
+# You should have received a copy of the GNU General Public License
93f2b0
+# along with this program; if not, write to the Free Software
93f2b0
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+# 02110-1301 USA
93f2b0
+
93f2b0
+noinst_LTLIBRARIES = ../libcpu.la
93f2b0
+
93f2b0
+___libcpu_la_SOURCES = fetch.c plt.c regs.c trace.c
93f2b0
+
93f2b0
+noinst_HEADERS = arch.h ptrace.h signalent.h syscallent.h
93f2b0
+
93f2b0
+MAINTAINERCLEANFILES = Makefile.in
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/arch.h b/sysdeps/linux-gnu/aarch64/arch.h
93f2b0
new file mode 100644
93f2b0
index 0000000..4137613
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/arch.h
93f2b0
@@ -0,0 +1,37 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+#ifndef LTRACE_AARCH64_ARCH_H
93f2b0
+#define LTRACE_AARCH64_ARCH_H
93f2b0
+
93f2b0
+/* | 31                 21 | 20       5 | 4       0 | *
93f2b0
+ * | 1 1 0 1 0 1 0 0 0 0 1 |    imm16   | 0 0 0 0 0 | */
93f2b0
+#define BREAKPOINT_VALUE { 0xd4, 0x20, 0, 0 }
93f2b0
+#define BREAKPOINT_LENGTH 4
93f2b0
+#define DECR_PC_AFTER_BREAK 0
93f2b0
+
93f2b0
+#define LT_ELFCLASS	ELFCLASS64
93f2b0
+#define LT_ELF_MACHINE	EM_AARCH64
93f2b0
+
93f2b0
+#define ARCH_HAVE_FETCH_ARG
93f2b0
+#define ARCH_ENDIAN_BIG
93f2b0
+#define ARCH_HAVE_SIZEOF
93f2b0
+#define ARCH_HAVE_ALIGNOF
93f2b0
+
93f2b0
+#endif /* LTRACE_AARCH64_ARCH_H */
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/fetch.c b/sysdeps/linux-gnu/aarch64/fetch.c
93f2b0
new file mode 100644
93f2b0
index 0000000..8779f03
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/fetch.c
93f2b0
@@ -0,0 +1,365 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+
93f2b0
+#include <sys/ptrace.h>
93f2b0
+#include <asm/ptrace.h>
93f2b0
+#include <stdlib.h>
93f2b0
+#include <string.h>
93f2b0
+
93f2b0
+#include "fetch.h"
93f2b0
+#include "proc.h"
93f2b0
+#include "type.h"
93f2b0
+#include "value.h"
93f2b0
+
93f2b0
+int aarch64_read_gregs(struct process *proc, struct user_pt_regs *regs);
93f2b0
+int aarch64_read_fregs(struct process *proc, struct user_fpsimd_state *regs);
93f2b0
+
93f2b0
+
93f2b0
+struct fetch_context
93f2b0
+{
93f2b0
+	struct user_pt_regs gregs;
93f2b0
+	struct user_fpsimd_state fpregs;
93f2b0
+	arch_addr_t nsaa;
93f2b0
+	unsigned ngrn;
93f2b0
+	unsigned nsrn;
93f2b0
+	arch_addr_t x8;
93f2b0
+};
93f2b0
+
93f2b0
+static int
93f2b0
+context_init(struct fetch_context *context, struct process *proc)
93f2b0
+{
93f2b0
+	if (aarch64_read_gregs(proc, &context->gregs) < 0
93f2b0
+	    || aarch64_read_fregs(proc, &context->fpregs) < 0)
93f2b0
+		return -1;
93f2b0
+
93f2b0
+	context->ngrn = 0;
93f2b0
+	context->nsrn = 0;
93f2b0
+	/* XXX double cast */
93f2b0
+	context->nsaa = (arch_addr_t) (uintptr_t) context->gregs.sp;
93f2b0
+	context->x8 = 0;
93f2b0
+
93f2b0
+	return 0;
93f2b0
+}
93f2b0
+
93f2b0
+struct fetch_context *
93f2b0
+arch_fetch_arg_clone(struct process *proc, struct fetch_context *context)
93f2b0
+{
93f2b0
+	struct fetch_context *ret = malloc(sizeof(*ret));
93f2b0
+	if (ret == NULL)
93f2b0
+		return NULL;
93f2b0
+	return memcpy(ret, context, sizeof(*ret));
93f2b0
+}
93f2b0
+
93f2b0
+static void
93f2b0
+fetch_next_gpr(struct fetch_context *context, unsigned char *buf)
93f2b0
+{
93f2b0
+	uint64_t u = context->gregs.regs[context->ngrn++];
93f2b0
+	memcpy(buf, &u, 8);
93f2b0
+}
93f2b0
+
93f2b0
+static int
93f2b0
+fetch_gpr(struct fetch_context *context, struct value *value, size_t sz)
93f2b0
+{
93f2b0
+	if (sz < 8)
93f2b0
+		sz = 8;
93f2b0
+
93f2b0
+	unsigned char *buf = value_reserve(value, sz);
93f2b0
+	if (buf == NULL)
93f2b0
+		return -1;
93f2b0
+
93f2b0
+	size_t i;
93f2b0
+	for (i = 0; i < sz; i += 8)
93f2b0
+		fetch_next_gpr(context, buf + i);
93f2b0
+
93f2b0
+	return 0;
93f2b0
+}
93f2b0
+
93f2b0
+static void
93f2b0
+fetch_next_sse(struct fetch_context *context, unsigned char *buf, size_t sz)
93f2b0
+{
93f2b0
+	__int128 u = context->fpregs.vregs[context->nsrn++];
93f2b0
+	memcpy(buf, &u, sz);
93f2b0
+}
93f2b0
+
93f2b0
+static int
93f2b0
+fetch_sse(struct fetch_context *context, struct value *value, size_t sz)
93f2b0
+{
93f2b0
+	unsigned char *buf = value_reserve(value, sz);
93f2b0
+	if (buf == NULL)
93f2b0
+		return -1;
93f2b0
+
93f2b0
+	fetch_next_sse(context, buf, sz);
93f2b0
+	return 0;
93f2b0
+}
93f2b0
+
93f2b0
+static int
93f2b0
+fetch_hfa(struct fetch_context *context,
93f2b0
+	  struct value *value, struct arg_type_info *hfa_t, size_t count)
93f2b0
+{
93f2b0
+	size_t sz = type_sizeof(value->inferior, hfa_t);
93f2b0
+	unsigned char *buf = value_reserve(value, sz * count);
93f2b0
+	if (buf == NULL)
93f2b0
+		return -1;
93f2b0
+
93f2b0
+	size_t i;
93f2b0
+	for (i = 0; i < count; ++i) {
93f2b0
+		fetch_next_sse(context, buf, sz);
93f2b0
+		buf += sz;
93f2b0
+	}
93f2b0
+	return 0;
93f2b0
+}
93f2b0
+
93f2b0
+static int
93f2b0
+fetch_stack(struct fetch_context *context, struct value *value,
93f2b0
+	    size_t align, size_t sz)
93f2b0
+{
93f2b0
+	if (align < 8)
93f2b0
+		align = 8;
93f2b0
+	size_t amount = ((sz + align - 1) / align) * align;
93f2b0
+
93f2b0
+	/* XXX double casts */
93f2b0
+	uintptr_t sp = (uintptr_t) context->nsaa;
93f2b0
+	sp = ((sp + align - 1) / align) * align;
93f2b0
+
93f2b0
+	value_in_inferior(value, (arch_addr_t) sp);
93f2b0
+
93f2b0
+	sp += amount;
93f2b0
+	context->nsaa = (arch_addr_t) sp;
93f2b0
+
93f2b0
+	return 0;
93f2b0
+}
93f2b0
+
93f2b0
+enum convert_method {
93f2b0
+	CVT_ERR = -1,
93f2b0
+	CVT_NOP = 0,
93f2b0
+	CVT_BYREF,
93f2b0
+};
93f2b0
+
93f2b0
+enum fetch_method {
93f2b0
+	FETCH_NOP,
93f2b0
+	FETCH_STACK,
93f2b0
+	FETCH_GPR,
93f2b0
+	FETCH_SSE,
93f2b0
+	FETCH_HFA,
93f2b0
+};
93f2b0
+
93f2b0
+struct fetch_script {
93f2b0
+	enum convert_method c;
93f2b0
+	enum fetch_method f;
93f2b0
+	size_t sz;
93f2b0
+	struct arg_type_info *hfa_t;
93f2b0
+	size_t count;
93f2b0
+};
93f2b0
+
93f2b0
+static struct fetch_script
93f2b0
+pass_arg(struct fetch_context const *context,
93f2b0
+	 struct process *proc, struct arg_type_info *info)
93f2b0
+{
93f2b0
+	enum fetch_method cvt = CVT_NOP;
93f2b0
+
93f2b0
+	size_t sz = type_sizeof(proc, info);
93f2b0
+	if (sz == (size_t) -1)
93f2b0
+		return (struct fetch_script) { CVT_ERR, FETCH_NOP, sz };
93f2b0
+
93f2b0
+	switch (info->type) {
93f2b0
+	case ARGTYPE_VOID:
93f2b0
+		return (struct fetch_script) { cvt, FETCH_NOP, sz };
93f2b0
+
93f2b0
+	case ARGTYPE_STRUCT:
93f2b0
+	case ARGTYPE_ARRAY:;
93f2b0
+		size_t count;
93f2b0
+		struct arg_type_info *hfa_t = type_get_hfa_type(info, &count);
93f2b0
+		if (hfa_t != NULL && count <= 4) {
93f2b0
+			if (context->nsrn + count <= 8)
93f2b0
+				return (struct fetch_script)
93f2b0
+					{ cvt, FETCH_HFA, sz, hfa_t, count };
93f2b0
+			return (struct fetch_script)
93f2b0
+				{ cvt, FETCH_STACK, sz, hfa_t, count };
93f2b0
+		}
93f2b0
+
93f2b0
+		if (sz <= 16) {
93f2b0
+			size_t count = sz / 8;
93f2b0
+			if (context->ngrn + count <= 8)
93f2b0
+				return (struct fetch_script)
93f2b0
+					{ cvt, FETCH_GPR, sz };
93f2b0
+		}
93f2b0
+
93f2b0
+		cvt = CVT_BYREF;
93f2b0
+		sz = 8;
93f2b0
+		/* Fall through.  */
93f2b0
+
93f2b0
+	case ARGTYPE_POINTER:
93f2b0
+	case ARGTYPE_INT:
93f2b0
+	case ARGTYPE_UINT:
93f2b0
+	case ARGTYPE_LONG:
93f2b0
+	case ARGTYPE_ULONG:
93f2b0
+	case ARGTYPE_CHAR:
93f2b0
+	case ARGTYPE_SHORT:
93f2b0
+	case ARGTYPE_USHORT:
93f2b0
+		if (context->ngrn < 8 && sz <= 8)
93f2b0
+			return (struct fetch_script) { cvt, FETCH_GPR, sz };
93f2b0
+		/* We don't support types wider than 8 bytes as of
93f2b0
+		 * now.  */
93f2b0
+		assert(sz <= 8);
93f2b0
+
93f2b0
+		return (struct fetch_script) { cvt, FETCH_STACK, sz };
93f2b0
+
93f2b0
+	case ARGTYPE_FLOAT:
93f2b0
+	case ARGTYPE_DOUBLE:
93f2b0
+		if (context->nsrn < 8) {
93f2b0
+			/* ltrace doesn't support float128.  */
93f2b0
+			assert(sz <= 8);
93f2b0
+			return (struct fetch_script) { cvt, FETCH_SSE, sz };
93f2b0
+		}
93f2b0
+
93f2b0
+		return (struct fetch_script) { cvt, FETCH_STACK, sz };
93f2b0
+	}
93f2b0
+
93f2b0
+	assert(! "Failed to allocate argument.");
93f2b0
+	abort();
93f2b0
+}
93f2b0
+
93f2b0
+static int
93f2b0
+convert_arg(struct value *value, struct fetch_script how)
93f2b0
+{
93f2b0
+	switch (how.c) {
93f2b0
+	case CVT_NOP:
93f2b0
+		return 0;
93f2b0
+	case CVT_BYREF:
93f2b0
+		return value_pass_by_reference(value);
93f2b0
+	case CVT_ERR:
93f2b0
+		return -1;
93f2b0
+	}
93f2b0
+
93f2b0
+	assert(! "Don't know how to convert argument.");
93f2b0
+	abort();
93f2b0
+}
93f2b0
+
93f2b0
+static int
93f2b0
+fetch_arg(struct fetch_context *context,
93f2b0
+	  struct process *proc, struct arg_type_info *info,
93f2b0
+	  struct value *value, struct fetch_script how)
93f2b0
+{
93f2b0
+	if (convert_arg(value, how) < 0)
93f2b0
+		return -1;
93f2b0
+
93f2b0
+	switch (how.f) {
93f2b0
+	case FETCH_NOP:
93f2b0
+		return 0;
93f2b0
+
93f2b0
+	case FETCH_STACK:
93f2b0
+		if (how.hfa_t != NULL && how.count != 0 && how.count <= 8)
93f2b0
+			context->nsrn = 8;
93f2b0
+		return fetch_stack(context, value,
93f2b0
+				   type_alignof(proc, info), how.sz);
93f2b0
+
93f2b0
+	case FETCH_GPR:
93f2b0
+		return fetch_gpr(context, value, how.sz);
93f2b0
+
93f2b0
+	case FETCH_SSE:
93f2b0
+		return fetch_sse(context, value, how.sz);
93f2b0
+
93f2b0
+	case FETCH_HFA:
93f2b0
+		return fetch_hfa(context, value, how.hfa_t, how.count);
93f2b0
+	}
93f2b0
+
93f2b0
+	assert(! "Don't know how to fetch argument.");
93f2b0
+	abort();
93f2b0
+}
93f2b0
+
93f2b0
+struct fetch_context *
93f2b0
+arch_fetch_arg_init(enum tof type, struct process *proc,
93f2b0
+		    struct arg_type_info *ret_info)
93f2b0
+{
93f2b0
+	struct fetch_context *context = malloc(sizeof *context);
93f2b0
+	if (context == NULL || context_init(context, proc) < 0) {
93f2b0
+	fail:
93f2b0
+		free(context);
93f2b0
+		return NULL;
93f2b0
+	}
93f2b0
+
93f2b0
+	/* There's a provision in ARMv8 parameter passing convention
93f2b0
+	 * for returning types that, if passed as first argument to a
93f2b0
+	 * function, would be passed on stack.  For those types, x8
93f2b0
+	 * contains an address where the return argument should be
93f2b0
+	 * placed.  The callee doesn't need to preserve the value of
93f2b0
+	 * x8, so we need to fetch it now.
93f2b0
+	 *
93f2b0
+	 * To my knowledge, there are currently no types where this
93f2b0
+	 * holds, but the code is here, utterly untested.  */
93f2b0
+
93f2b0
+	struct fetch_script how = pass_arg(context, proc, ret_info);
93f2b0
+	if (how.c == CVT_ERR)
93f2b0
+		goto fail;
93f2b0
+	if (how.c == CVT_NOP && how.f == FETCH_STACK) {
93f2b0
+		/* XXX double cast.  */
93f2b0
+		context->x8 = (arch_addr_t) (uintptr_t) context->gregs.regs[8];
93f2b0
+		/* See the comment above about the assert.  */
93f2b0
+		assert(! "Unexpected: first argument passed on stack.");
93f2b0
+		abort();
93f2b0
+	}
93f2b0
+
93f2b0
+	return context;
93f2b0
+}
93f2b0
+
93f2b0
+int
93f2b0
+arch_fetch_arg_next(struct fetch_context *context, enum tof type,
93f2b0
+		    struct process *proc, struct arg_type_info *info,
93f2b0
+		    struct value *value)
93f2b0
+{
93f2b0
+	return fetch_arg(context, proc, info, value,
93f2b0
+			 pass_arg(context, proc, info));
93f2b0
+}
93f2b0
+
93f2b0
+int
93f2b0
+arch_fetch_retval(struct fetch_context *context, enum tof type,
93f2b0
+		  struct process *proc, struct arg_type_info *info,
93f2b0
+		  struct value *value)
93f2b0
+{
93f2b0
+	if (context->x8 != 0) {
93f2b0
+		value_in_inferior(value, context->x8);
93f2b0
+		return 0;
93f2b0
+	}
93f2b0
+
93f2b0
+	if (context_init(context, proc) < 0)
93f2b0
+		return -1;
93f2b0
+
93f2b0
+	return fetch_arg(context, proc, info, value,
93f2b0
+			 pass_arg(context, proc, info));
93f2b0
+}
93f2b0
+
93f2b0
+void
93f2b0
+arch_fetch_arg_done(struct fetch_context *context)
93f2b0
+{
93f2b0
+	if (context != NULL)
93f2b0
+		free(context);
93f2b0
+}
93f2b0
+
93f2b0
+size_t
93f2b0
+arch_type_sizeof(struct process *proc, struct arg_type_info *arg)
93f2b0
+{
93f2b0
+	return (size_t) -2;
93f2b0
+}
93f2b0
+
93f2b0
+size_t
93f2b0
+arch_type_alignof(struct process *proc, struct arg_type_info *arg)
93f2b0
+{
93f2b0
+	return (size_t) -2;
93f2b0
+}
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/plt.c b/sysdeps/linux-gnu/aarch64/plt.c
93f2b0
new file mode 100644
93f2b0
index 0000000..29dc4c9
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/plt.c
93f2b0
@@ -0,0 +1,38 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+
93f2b0
+#include <gelf.h>
93f2b0
+
93f2b0
+#include "backend.h"
93f2b0
+#include "proc.h"
93f2b0
+#include "library.h"
93f2b0
+#include "ltrace-elf.h"
93f2b0
+
93f2b0
+arch_addr_t
93f2b0
+sym2addr(struct process *proc, struct library_symbol *sym)
93f2b0
+{
93f2b0
+	return sym->enter_addr;
93f2b0
+}
93f2b0
+
93f2b0
+GElf_Addr
93f2b0
+arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela *rela)
93f2b0
+{
93f2b0
+	return lte->plt_addr + 32 + ndx * 16;
93f2b0
+}
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/ptrace.h b/sysdeps/linux-gnu/aarch64/ptrace.h
93f2b0
new file mode 100644
93f2b0
index 0000000..283c314
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/ptrace.h
93f2b0
@@ -0,0 +1,22 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+
93f2b0
+#include <sys/ptrace.h>
93f2b0
+#include <asm/ptrace.h>
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/regs.c b/sysdeps/linux-gnu/aarch64/regs.c
93f2b0
new file mode 100644
93f2b0
index 0000000..06eb72b
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/regs.c
93f2b0
@@ -0,0 +1,130 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+
93f2b0
+#include <sys/ptrace.h>
93f2b0
+#include <asm/ptrace.h>
93f2b0
+#include <linux/uio.h>
93f2b0
+#include <assert.h>
93f2b0
+#include <stdlib.h>
93f2b0
+
93f2b0
+#include "backend.h"
93f2b0
+#include "proc.h"
93f2b0
+
93f2b0
+#define PC_OFF (32 * 4)
93f2b0
+
93f2b0
+int
93f2b0
+aarch64_read_gregs(struct process *proc, struct user_pt_regs *regs)
93f2b0
+{
93f2b0
+	*regs = (struct user_pt_regs) {};
93f2b0
+	struct iovec iovec;
93f2b0
+	iovec.iov_base = regs;
93f2b0
+	iovec.iov_len = sizeof *regs;
93f2b0
+	return ptrace(PTRACE_GETREGSET, proc->pid, NT_PRSTATUS, &iovec) < 0
93f2b0
+		? -1 : 0;
93f2b0
+}
93f2b0
+
93f2b0
+int
93f2b0
+aarch64_write_gregs(struct process *proc, struct user_pt_regs *regs)
93f2b0
+{
93f2b0
+	struct iovec iovec;
93f2b0
+	iovec.iov_base = regs;
93f2b0
+	iovec.iov_len = sizeof *regs;
93f2b0
+	return ptrace(PTRACE_SETREGSET, proc->pid, NT_PRSTATUS, &iovec) < 0
93f2b0
+		? -1 : 0;
93f2b0
+}
93f2b0
+
93f2b0
+int
93f2b0
+aarch64_read_fregs(struct process *proc, struct user_fpsimd_state *regs)
93f2b0
+{
93f2b0
+	*regs = (struct user_fpsimd_state) {};
93f2b0
+	struct iovec iovec;
93f2b0
+	iovec.iov_base = regs;
93f2b0
+	iovec.iov_len = sizeof *regs;
93f2b0
+	return ptrace(PTRACE_GETREGSET, proc->pid, NT_FPREGSET, &iovec) < 0
93f2b0
+		? -1 : 0;
93f2b0
+}
93f2b0
+
93f2b0
+arch_addr_t
93f2b0
+get_instruction_pointer(struct process *proc)
93f2b0
+{
93f2b0
+	struct user_pt_regs regs;
93f2b0
+	if (aarch64_read_gregs(proc, &regs) < 0) {
93f2b0
+		fprintf(stderr, "get_instruction_pointer: "
93f2b0
+			"Couldn't read registers of %d.\n", proc->pid);
93f2b0
+		return 0;
93f2b0
+	}
93f2b0
+
93f2b0
+	/* 
93f2b0
+	char buf[128];
93f2b0
+	sprintf(buf, "cat /proc/%d/maps", proc->pid);
93f2b0
+	system(buf);
93f2b0
+	*/
93f2b0
+
93f2b0
+	/* XXX double cast */
93f2b0
+	return (arch_addr_t) (uintptr_t) regs.pc;
93f2b0
+}
93f2b0
+
93f2b0
+void
93f2b0
+set_instruction_pointer(struct process *proc, arch_addr_t addr)
93f2b0
+{
93f2b0
+	struct user_pt_regs regs;
93f2b0
+	if (aarch64_read_gregs(proc, &regs) < 0) {
93f2b0
+		fprintf(stderr, "get_instruction_pointer: "
93f2b0
+			"Couldn't read registers of %d.\n", proc->pid);
93f2b0
+		return;
93f2b0
+	}
93f2b0
+
93f2b0
+	/* XXX double cast */
93f2b0
+	regs.pc = (uint64_t) (uintptr_t) addr;
93f2b0
+
93f2b0
+	if (aarch64_write_gregs(proc, &regs) < 0) {
93f2b0
+		fprintf(stderr, "get_instruction_pointer: "
93f2b0
+			"Couldn't write registers of %d.\n", proc->pid);
93f2b0
+		return;
93f2b0
+	}
93f2b0
+}
93f2b0
+
93f2b0
+arch_addr_t
93f2b0
+get_stack_pointer(struct process *proc)
93f2b0
+{
93f2b0
+	struct user_pt_regs regs;
93f2b0
+	if (aarch64_read_gregs(proc, &regs) < 0) {
93f2b0
+		fprintf(stderr, "get_stack_pointer: "
93f2b0
+			"Couldn't read registers of %d.\n", proc->pid);
93f2b0
+		return 0;
93f2b0
+	}
93f2b0
+
93f2b0
+	/* XXX double cast */
93f2b0
+	return (arch_addr_t) (uintptr_t) regs.sp;
93f2b0
+}
93f2b0
+
93f2b0
+arch_addr_t
93f2b0
+get_return_addr(struct process *proc, arch_addr_t stack_pointer)
93f2b0
+{
93f2b0
+	struct user_pt_regs regs;
93f2b0
+	if (aarch64_read_gregs(proc, &regs) < 0) {
93f2b0
+		fprintf(stderr, "get_return_addr: "
93f2b0
+			"Couldn't read registers of %d.\n", proc->pid);
93f2b0
+		return 0;
93f2b0
+	}
93f2b0
+
93f2b0
+	/* XXX double cast */
93f2b0
+	return (arch_addr_t) (uintptr_t) regs.regs[30];
93f2b0
+}
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/signalent.h b/sysdeps/linux-gnu/aarch64/signalent.h
93f2b0
new file mode 100644
93f2b0
index 0000000..bf56ebc
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/signalent.h
93f2b0
@@ -0,0 +1,52 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2006 Ian Wienand
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+
93f2b0
+	"SIG_0",			/* 0 */
93f2b0
+	"SIGHUP",			/* 1 */
93f2b0
+	"SIGINT",			/* 2 */
93f2b0
+	"SIGQUIT",			/* 3 */
93f2b0
+	"SIGILL",			/* 4 */
93f2b0
+	"SIGTRAP",			/* 5 */
93f2b0
+	"SIGABRT",			/* 6 */
93f2b0
+	"SIGBUS",			/* 7 */
93f2b0
+	"SIGFPE",			/* 8 */
93f2b0
+	"SIGKILL",			/* 9 */
93f2b0
+	"SIGUSR1",			/* 10 */
93f2b0
+	"SIGSEGV",			/* 11 */
93f2b0
+	"SIGUSR2",			/* 12 */
93f2b0
+	"SIGPIPE",			/* 13 */
93f2b0
+	"SIGALRM",			/* 14 */
93f2b0
+	"SIGTERM",			/* 15 */
93f2b0
+	"SIGSTKFLT",			/* 16 */
93f2b0
+	"SIGCHLD",			/* 17 */
93f2b0
+	"SIGCONT",			/* 18 */
93f2b0
+	"SIGSTOP",			/* 19 */
93f2b0
+	"SIGTSTP",			/* 20 */
93f2b0
+	"SIGTTIN",			/* 21 */
93f2b0
+	"SIGTTOU",			/* 22 */
93f2b0
+	"SIGURG",			/* 23 */
93f2b0
+	"SIGXCPU",			/* 24 */
93f2b0
+	"SIGXFSZ",			/* 25 */
93f2b0
+	"SIGVTALRM",			/* 26 */
93f2b0
+	"SIGPROF",			/* 27 */
93f2b0
+	"SIGWINCH",			/* 28 */
93f2b0
+	"SIGIO",			/* 29 */
93f2b0
+	"SIGPWR",			/* 30 */
93f2b0
+	"SIGSYS",			/* 31 */
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/syscallent.h b/sysdeps/linux-gnu/aarch64/syscallent.h
93f2b0
new file mode 100644
93f2b0
index 0000000..aca8191
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/syscallent.h
93f2b0
@@ -0,0 +1,1100 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+
93f2b0
+	"io_setup",                        /* 0 */
93f2b0
+	"io_destroy",                      /* 1 */
93f2b0
+	"io_submit",                       /* 2 */
93f2b0
+	"io_cancel",                       /* 3 */
93f2b0
+	"io_getevents",                    /* 4 */
93f2b0
+	"setxattr",                        /* 5 */
93f2b0
+	"lsetxattr",                       /* 6 */
93f2b0
+	"fsetxattr",                       /* 7 */
93f2b0
+	"getxattr",                        /* 8 */
93f2b0
+	"lgetxattr",                       /* 9 */
93f2b0
+	"fgetxattr",                       /* 10 */
93f2b0
+	"listxattr",                       /* 11 */
93f2b0
+	"llistxattr",                      /* 12 */
93f2b0
+	"flistxattr",                      /* 13 */
93f2b0
+	"removexattr",                     /* 14 */
93f2b0
+	"lremovexattr",                    /* 15 */
93f2b0
+	"fremovexattr",                    /* 16 */
93f2b0
+	"getcwd",                          /* 17 */
93f2b0
+	"lookup_dcookie",                  /* 18 */
93f2b0
+	"eventfd2",                        /* 19 */
93f2b0
+	"epoll_create1",                   /* 20 */
93f2b0
+	"epoll_ctl",                       /* 21 */
93f2b0
+	"epoll_pwait",                     /* 22 */
93f2b0
+	"dup",                             /* 23 */
93f2b0
+	"dup3",                            /* 24 */
93f2b0
+	"fcntl",                           /* 25 */
93f2b0
+	"inotify_init1",                   /* 26 */
93f2b0
+	"inotify_add_watch",               /* 27 */
93f2b0
+	"inotify_rm_watch",                /* 28 */
93f2b0
+	"ioctl",                           /* 29 */
93f2b0
+	"ioprio_set",                      /* 30 */
93f2b0
+	"ioprio_get",                      /* 31 */
93f2b0
+	"flock",                           /* 32 */
93f2b0
+	"mknodat",                         /* 33 */
93f2b0
+	"mkdirat",                         /* 34 */
93f2b0
+	"unlinkat",                        /* 35 */
93f2b0
+	"symlinkat",                       /* 36 */
93f2b0
+	"linkat",                          /* 37 */
93f2b0
+	"renameat",                        /* 38 */
93f2b0
+	"umount2",                         /* 39 */
93f2b0
+	"mount",                           /* 40 */
93f2b0
+	"pivot_root",                      /* 41 */
93f2b0
+	"nfsservctl",                      /* 42 */
93f2b0
+	"statfs",                          /* 43 */
93f2b0
+	"fstatfs",                         /* 44 */
93f2b0
+	"truncate",                        /* 45 */
93f2b0
+	"ftruncate",                       /* 46 */
93f2b0
+	"fallocate",                       /* 47 */
93f2b0
+	"faccessat",                       /* 48 */
93f2b0
+	"chdir",                           /* 49 */
93f2b0
+	"fchdir",                          /* 50 */
93f2b0
+	"chroot",                          /* 51 */
93f2b0
+	"fchmod",                          /* 52 */
93f2b0
+	"fchmodat",                        /* 53 */
93f2b0
+	"fchownat",                        /* 54 */
93f2b0
+	"fchown",                          /* 55 */
93f2b0
+	"openat",                          /* 56 */
93f2b0
+	"close",                           /* 57 */
93f2b0
+	"vhangup",                         /* 58 */
93f2b0
+	"pipe2",                           /* 59 */
93f2b0
+	"quotactl",                        /* 60 */
93f2b0
+	"getdents64",                      /* 61 */
93f2b0
+	"lseek",                           /* 62 */
93f2b0
+	"read",                            /* 63 */
93f2b0
+	"write",                           /* 64 */
93f2b0
+	"readv",                           /* 65 */
93f2b0
+	"writev",                          /* 66 */
93f2b0
+	"pread64",                         /* 67 */
93f2b0
+	"pwrite64",                        /* 68 */
93f2b0
+	"preadv",                          /* 69 */
93f2b0
+	"pwritev",                         /* 70 */
93f2b0
+	"sendfile",                        /* 71 */
93f2b0
+	"pselect6",                        /* 72 */
93f2b0
+	"ppoll",                           /* 73 */
93f2b0
+	"signalfd4",                       /* 74 */
93f2b0
+	"vmsplice",                        /* 75 */
93f2b0
+	"splice",                          /* 76 */
93f2b0
+	"tee",                             /* 77 */
93f2b0
+	"readlinkat",                      /* 78 */
93f2b0
+	"fstatat",                         /* 79 */
93f2b0
+	"fstat",                           /* 80 */
93f2b0
+	"sync",                            /* 81 */
93f2b0
+	"fsync",                           /* 82 */
93f2b0
+	"fdatasync",                       /* 83 */
93f2b0
+	"sync_file_range",                 /* 84 */
93f2b0
+	"timerfd_create",                  /* 85 */
93f2b0
+	"timerfd_settime",                 /* 86 */
93f2b0
+	"timerfd_gettime",                 /* 87 */
93f2b0
+	"utimensat",                       /* 88 */
93f2b0
+	"acct",                            /* 89 */
93f2b0
+	"capget",                          /* 90 */
93f2b0
+	"capset",                          /* 91 */
93f2b0
+	"personality",                     /* 92 */
93f2b0
+	"exit",                            /* 93 */
93f2b0
+	"exit_group",                      /* 94 */
93f2b0
+	"waitid",                          /* 95 */
93f2b0
+	"set_tid_address",                 /* 96 */
93f2b0
+	"unshare",                         /* 97 */
93f2b0
+	"futex",                           /* 98 */
93f2b0
+	"set_robust_list",                 /* 99 */
93f2b0
+	"get_robust_list",                 /* 100 */
93f2b0
+	"nanosleep",                       /* 101 */
93f2b0
+	"getitimer",                       /* 102 */
93f2b0
+	"setitimer",                       /* 103 */
93f2b0
+	"kexec_load",                      /* 104 */
93f2b0
+	"init_module",                     /* 105 */
93f2b0
+	"delete_module",                   /* 106 */
93f2b0
+	"timer_create",                    /* 107 */
93f2b0
+	"timer_gettime",                   /* 108 */
93f2b0
+	"timer_getoverrun",                /* 109 */
93f2b0
+	"timer_settime",                   /* 110 */
93f2b0
+	"timer_delete",                    /* 111 */
93f2b0
+	"clock_settime",                   /* 112 */
93f2b0
+	"clock_gettime",                   /* 113 */
93f2b0
+	"clock_getres",                    /* 114 */
93f2b0
+	"clock_nanosleep",                 /* 115 */
93f2b0
+	"syslog",                          /* 116 */
93f2b0
+	"ptrace",                          /* 117 */
93f2b0
+	"sched_setparam",                  /* 118 */
93f2b0
+	"sched_setscheduler",              /* 119 */
93f2b0
+	"sched_getscheduler",              /* 120 */
93f2b0
+	"sched_getparam",                  /* 121 */
93f2b0
+	"sched_setaffinity",               /* 122 */
93f2b0
+	"sched_getaffinity",               /* 123 */
93f2b0
+	"sched_yield",                     /* 124 */
93f2b0
+	"sched_get_priority_max",          /* 125 */
93f2b0
+	"sched_get_priority_min",          /* 126 */
93f2b0
+	"sched_rr_get_interval",           /* 127 */
93f2b0
+	"restart_syscall",                 /* 128 */
93f2b0
+	"kill",                            /* 129 */
93f2b0
+	"tkill",                           /* 130 */
93f2b0
+	"tgkill",                          /* 131 */
93f2b0
+	"sigaltstack",                     /* 132 */
93f2b0
+	"rt_sigsuspend",                   /* 133 */
93f2b0
+	"rt_sigaction",                    /* 134 */
93f2b0
+	"rt_sigprocmask",                  /* 135 */
93f2b0
+	"rt_sigpending",                   /* 136 */
93f2b0
+	"rt_sigtimedwait",                 /* 137 */
93f2b0
+	"rt_sigqueueinfo",                 /* 138 */
93f2b0
+	"rt_sigreturn",                    /* 139 */
93f2b0
+	"setpriority",                     /* 140 */
93f2b0
+	"getpriority",                     /* 141 */
93f2b0
+	"reboot",                          /* 142 */
93f2b0
+	"setregid",                        /* 143 */
93f2b0
+	"setgid",                          /* 144 */
93f2b0
+	"setreuid",                        /* 145 */
93f2b0
+	"setuid",                          /* 146 */
93f2b0
+	"setresuid",                       /* 147 */
93f2b0
+	"getresuid",                       /* 148 */
93f2b0
+	"setresgid",                       /* 149 */
93f2b0
+	"getresgid",                       /* 150 */
93f2b0
+	"setfsuid",                        /* 151 */
93f2b0
+	"setfsgid",                        /* 152 */
93f2b0
+	"times",                           /* 153 */
93f2b0
+	"setpgid",                         /* 154 */
93f2b0
+	"getpgid",                         /* 155 */
93f2b0
+	"getsid",                          /* 156 */
93f2b0
+	"setsid",                          /* 157 */
93f2b0
+	"getgroups",                       /* 158 */
93f2b0
+	"setgroups",                       /* 159 */
93f2b0
+	"uname",                           /* 160 */
93f2b0
+	"sethostname",                     /* 161 */
93f2b0
+	"setdomainname",                   /* 162 */
93f2b0
+	"getrlimit",                       /* 163 */
93f2b0
+	"setrlimit",                       /* 164 */
93f2b0
+	"getrusage",                       /* 165 */
93f2b0
+	"umask",                           /* 166 */
93f2b0
+	"prctl",                           /* 167 */
93f2b0
+	"getcpu",                          /* 168 */
93f2b0
+	"gettimeofday",                    /* 169 */
93f2b0
+	"settimeofday",                    /* 170 */
93f2b0
+	"adjtimex",                        /* 171 */
93f2b0
+	"getpid",                          /* 172 */
93f2b0
+	"getppid",                         /* 173 */
93f2b0
+	"getuid",                          /* 174 */
93f2b0
+	"geteuid",                         /* 175 */
93f2b0
+	"getgid",                          /* 176 */
93f2b0
+	"getegid",                         /* 177 */
93f2b0
+	"gettid",                          /* 178 */
93f2b0
+	"sysinfo",                         /* 179 */
93f2b0
+	"mq_open",                         /* 180 */
93f2b0
+	"mq_unlink",                       /* 181 */
93f2b0
+	"mq_timedsend",                    /* 182 */
93f2b0
+	"mq_timedreceive",                 /* 183 */
93f2b0
+	"mq_notify",                       /* 184 */
93f2b0
+	"mq_getsetattr",                   /* 185 */
93f2b0
+	"msgget",                          /* 186 */
93f2b0
+	"msgctl",                          /* 187 */
93f2b0
+	"msgrcv",                          /* 188 */
93f2b0
+	"msgsnd",                          /* 189 */
93f2b0
+	"semget",                          /* 190 */
93f2b0
+	"semctl",                          /* 191 */
93f2b0
+	"semtimedop",                      /* 192 */
93f2b0
+	"semop",                           /* 193 */
93f2b0
+	"shmget",                          /* 194 */
93f2b0
+	"shmctl",                          /* 195 */
93f2b0
+	"shmat",                           /* 196 */
93f2b0
+	"shmdt",                           /* 197 */
93f2b0
+	"socket",                          /* 198 */
93f2b0
+	"socketpair",                      /* 199 */
93f2b0
+	"bind",                            /* 200 */
93f2b0
+	"listen",                          /* 201 */
93f2b0
+	"accept",                          /* 202 */
93f2b0
+	"connect",                         /* 203 */
93f2b0
+	"getsockname",                     /* 204 */
93f2b0
+	"getpeername",                     /* 205 */
93f2b0
+	"sendto",                          /* 206 */
93f2b0
+	"recvfrom",                        /* 207 */
93f2b0
+	"setsockopt",                      /* 208 */
93f2b0
+	"getsockopt",                      /* 209 */
93f2b0
+	"shutdown",                        /* 210 */
93f2b0
+	"sendmsg",                         /* 211 */
93f2b0
+	"recvmsg",                         /* 212 */
93f2b0
+	"readahead",                       /* 213 */
93f2b0
+	"brk",                             /* 214 */
93f2b0
+	"munmap",                          /* 215 */
93f2b0
+	"mremap",                          /* 216 */
93f2b0
+	"add_key",                         /* 217 */
93f2b0
+	"request_key",                     /* 218 */
93f2b0
+	"keyctl",                          /* 219 */
93f2b0
+	"clone",                           /* 220 */
93f2b0
+	"execve",                          /* 221 */
93f2b0
+	"mmap",                            /* 222 */
93f2b0
+	"fadvise64",                       /* 223 */
93f2b0
+	"swapon",                          /* 224 */
93f2b0
+	"swapoff",                         /* 225 */
93f2b0
+	"mprotect",                        /* 226 */
93f2b0
+	"msync",                           /* 227 */
93f2b0
+	"mlock",                           /* 228 */
93f2b0
+	"munlock",                         /* 229 */
93f2b0
+	"mlockall",                        /* 230 */
93f2b0
+	"munlockall",                      /* 231 */
93f2b0
+	"mincore",                         /* 232 */
93f2b0
+	"madvise",                         /* 233 */
93f2b0
+	"remap_file_pages",                /* 234 */
93f2b0
+	"mbind",                           /* 235 */
93f2b0
+	"get_mempolicy",                   /* 236 */
93f2b0
+	"set_mempolicy",                   /* 237 */
93f2b0
+	"migrate_pages",                   /* 238 */
93f2b0
+	"move_pages",                      /* 239 */
93f2b0
+	"rt_tgsigqueueinfo",               /* 240 */
93f2b0
+	"perf_event_open",                 /* 241 */
93f2b0
+	"accept4",                         /* 242 */
93f2b0
+	"recvmmsg",                        /* 243 */
93f2b0
+	"arch_specific_syscall",           /* 244 */
93f2b0
+	"245",                             /* 245 */
93f2b0
+	"246",                             /* 246 */
93f2b0
+	"247",                             /* 247 */
93f2b0
+	"248",                             /* 248 */
93f2b0
+	"249",                             /* 249 */
93f2b0
+	"250",                             /* 250 */
93f2b0
+	"251",                             /* 251 */
93f2b0
+	"252",                             /* 252 */
93f2b0
+	"253",                             /* 253 */
93f2b0
+	"254",                             /* 254 */
93f2b0
+	"255",                             /* 255 */
93f2b0
+	"256",                             /* 256 */
93f2b0
+	"257",                             /* 257 */
93f2b0
+	"258",                             /* 258 */
93f2b0
+	"259",                             /* 259 */
93f2b0
+	"wait4",                           /* 260 */
93f2b0
+	"prlimit64",                       /* 261 */
93f2b0
+	"fanotify_init",                   /* 262 */
93f2b0
+	"fanotify_mark",                   /* 263 */
93f2b0
+	"name_to_handle_at",               /* 264 */
93f2b0
+	"open_by_handle_at",               /* 265 */
93f2b0
+	"clock_adjtime",                   /* 266 */
93f2b0
+	"syncfs",                          /* 267 */
93f2b0
+	"setns",                           /* 268 */
93f2b0
+	"sendmmsg",                        /* 269 */
93f2b0
+	"process_vm_readv",                /* 270 */
93f2b0
+	"process_vm_writev",               /* 271 */
93f2b0
+	"kcmp",                            /* 272 */
93f2b0
+	"finit_module",                    /* 273 */
93f2b0
+	"syscalls",                        /* 274 */
93f2b0
+	"275",                             /* 275 */
93f2b0
+	"276",                             /* 276 */
93f2b0
+	"277",                             /* 277 */
93f2b0
+	"278",                             /* 278 */
93f2b0
+	"279",                             /* 279 */
93f2b0
+	"280",                             /* 280 */
93f2b0
+	"281",                             /* 281 */
93f2b0
+	"282",                             /* 282 */
93f2b0
+	"283",                             /* 283 */
93f2b0
+	"284",                             /* 284 */
93f2b0
+	"285",                             /* 285 */
93f2b0
+	"286",                             /* 286 */
93f2b0
+	"287",                             /* 287 */
93f2b0
+	"288",                             /* 288 */
93f2b0
+	"289",                             /* 289 */
93f2b0
+	"290",                             /* 290 */
93f2b0
+	"291",                             /* 291 */
93f2b0
+	"292",                             /* 292 */
93f2b0
+	"293",                             /* 293 */
93f2b0
+	"294",                             /* 294 */
93f2b0
+	"295",                             /* 295 */
93f2b0
+	"296",                             /* 296 */
93f2b0
+	"297",                             /* 297 */
93f2b0
+	"298",                             /* 298 */
93f2b0
+	"299",                             /* 299 */
93f2b0
+	"300",                             /* 300 */
93f2b0
+	"301",                             /* 301 */
93f2b0
+	"302",                             /* 302 */
93f2b0
+	"303",                             /* 303 */
93f2b0
+	"304",                             /* 304 */
93f2b0
+	"305",                             /* 305 */
93f2b0
+	"306",                             /* 306 */
93f2b0
+	"307",                             /* 307 */
93f2b0
+	"308",                             /* 308 */
93f2b0
+	"309",                             /* 309 */
93f2b0
+	"310",                             /* 310 */
93f2b0
+	"311",                             /* 311 */
93f2b0
+	"312",                             /* 312 */
93f2b0
+	"313",                             /* 313 */
93f2b0
+	"314",                             /* 314 */
93f2b0
+	"315",                             /* 315 */
93f2b0
+	"316",                             /* 316 */
93f2b0
+	"317",                             /* 317 */
93f2b0
+	"318",                             /* 318 */
93f2b0
+	"319",                             /* 319 */
93f2b0
+	"320",                             /* 320 */
93f2b0
+	"321",                             /* 321 */
93f2b0
+	"322",                             /* 322 */
93f2b0
+	"323",                             /* 323 */
93f2b0
+	"324",                             /* 324 */
93f2b0
+	"325",                             /* 325 */
93f2b0
+	"326",                             /* 326 */
93f2b0
+	"327",                             /* 327 */
93f2b0
+	"328",                             /* 328 */
93f2b0
+	"329",                             /* 329 */
93f2b0
+	"330",                             /* 330 */
93f2b0
+	"331",                             /* 331 */
93f2b0
+	"332",                             /* 332 */
93f2b0
+	"333",                             /* 333 */
93f2b0
+	"334",                             /* 334 */
93f2b0
+	"335",                             /* 335 */
93f2b0
+	"336",                             /* 336 */
93f2b0
+	"337",                             /* 337 */
93f2b0
+	"338",                             /* 338 */
93f2b0
+	"339",                             /* 339 */
93f2b0
+	"340",                             /* 340 */
93f2b0
+	"341",                             /* 341 */
93f2b0
+	"342",                             /* 342 */
93f2b0
+	"343",                             /* 343 */
93f2b0
+	"344",                             /* 344 */
93f2b0
+	"345",                             /* 345 */
93f2b0
+	"346",                             /* 346 */
93f2b0
+	"347",                             /* 347 */
93f2b0
+	"348",                             /* 348 */
93f2b0
+	"349",                             /* 349 */
93f2b0
+	"350",                             /* 350 */
93f2b0
+	"351",                             /* 351 */
93f2b0
+	"352",                             /* 352 */
93f2b0
+	"353",                             /* 353 */
93f2b0
+	"354",                             /* 354 */
93f2b0
+	"355",                             /* 355 */
93f2b0
+	"356",                             /* 356 */
93f2b0
+	"357",                             /* 357 */
93f2b0
+	"358",                             /* 358 */
93f2b0
+	"359",                             /* 359 */
93f2b0
+	"360",                             /* 360 */
93f2b0
+	"361",                             /* 361 */
93f2b0
+	"362",                             /* 362 */
93f2b0
+	"363",                             /* 363 */
93f2b0
+	"364",                             /* 364 */
93f2b0
+	"365",                             /* 365 */
93f2b0
+	"366",                             /* 366 */
93f2b0
+	"367",                             /* 367 */
93f2b0
+	"368",                             /* 368 */
93f2b0
+	"369",                             /* 369 */
93f2b0
+	"370",                             /* 370 */
93f2b0
+	"371",                             /* 371 */
93f2b0
+	"372",                             /* 372 */
93f2b0
+	"373",                             /* 373 */
93f2b0
+	"374",                             /* 374 */
93f2b0
+	"375",                             /* 375 */
93f2b0
+	"376",                             /* 376 */
93f2b0
+	"377",                             /* 377 */
93f2b0
+	"378",                             /* 378 */
93f2b0
+	"379",                             /* 379 */
93f2b0
+	"380",                             /* 380 */
93f2b0
+	"381",                             /* 381 */
93f2b0
+	"382",                             /* 382 */
93f2b0
+	"383",                             /* 383 */
93f2b0
+	"384",                             /* 384 */
93f2b0
+	"385",                             /* 385 */
93f2b0
+	"386",                             /* 386 */
93f2b0
+	"387",                             /* 387 */
93f2b0
+	"388",                             /* 388 */
93f2b0
+	"389",                             /* 389 */
93f2b0
+	"390",                             /* 390 */
93f2b0
+	"391",                             /* 391 */
93f2b0
+	"392",                             /* 392 */
93f2b0
+	"393",                             /* 393 */
93f2b0
+	"394",                             /* 394 */
93f2b0
+	"395",                             /* 395 */
93f2b0
+	"396",                             /* 396 */
93f2b0
+	"397",                             /* 397 */
93f2b0
+	"398",                             /* 398 */
93f2b0
+	"399",                             /* 399 */
93f2b0
+	"400",                             /* 400 */
93f2b0
+	"401",                             /* 401 */
93f2b0
+	"402",                             /* 402 */
93f2b0
+	"403",                             /* 403 */
93f2b0
+	"404",                             /* 404 */
93f2b0
+	"405",                             /* 405 */
93f2b0
+	"406",                             /* 406 */
93f2b0
+	"407",                             /* 407 */
93f2b0
+	"408",                             /* 408 */
93f2b0
+	"409",                             /* 409 */
93f2b0
+	"410",                             /* 410 */
93f2b0
+	"411",                             /* 411 */
93f2b0
+	"412",                             /* 412 */
93f2b0
+	"413",                             /* 413 */
93f2b0
+	"414",                             /* 414 */
93f2b0
+	"415",                             /* 415 */
93f2b0
+	"416",                             /* 416 */
93f2b0
+	"417",                             /* 417 */
93f2b0
+	"418",                             /* 418 */
93f2b0
+	"419",                             /* 419 */
93f2b0
+	"420",                             /* 420 */
93f2b0
+	"421",                             /* 421 */
93f2b0
+	"422",                             /* 422 */
93f2b0
+	"423",                             /* 423 */
93f2b0
+	"424",                             /* 424 */
93f2b0
+	"425",                             /* 425 */
93f2b0
+	"426",                             /* 426 */
93f2b0
+	"427",                             /* 427 */
93f2b0
+	"428",                             /* 428 */
93f2b0
+	"429",                             /* 429 */
93f2b0
+	"430",                             /* 430 */
93f2b0
+	"431",                             /* 431 */
93f2b0
+	"432",                             /* 432 */
93f2b0
+	"433",                             /* 433 */
93f2b0
+	"434",                             /* 434 */
93f2b0
+	"435",                             /* 435 */
93f2b0
+	"436",                             /* 436 */
93f2b0
+	"437",                             /* 437 */
93f2b0
+	"438",                             /* 438 */
93f2b0
+	"439",                             /* 439 */
93f2b0
+	"440",                             /* 440 */
93f2b0
+	"441",                             /* 441 */
93f2b0
+	"442",                             /* 442 */
93f2b0
+	"443",                             /* 443 */
93f2b0
+	"444",                             /* 444 */
93f2b0
+	"445",                             /* 445 */
93f2b0
+	"446",                             /* 446 */
93f2b0
+	"447",                             /* 447 */
93f2b0
+	"448",                             /* 448 */
93f2b0
+	"449",                             /* 449 */
93f2b0
+	"450",                             /* 450 */
93f2b0
+	"451",                             /* 451 */
93f2b0
+	"452",                             /* 452 */
93f2b0
+	"453",                             /* 453 */
93f2b0
+	"454",                             /* 454 */
93f2b0
+	"455",                             /* 455 */
93f2b0
+	"456",                             /* 456 */
93f2b0
+	"457",                             /* 457 */
93f2b0
+	"458",                             /* 458 */
93f2b0
+	"459",                             /* 459 */
93f2b0
+	"460",                             /* 460 */
93f2b0
+	"461",                             /* 461 */
93f2b0
+	"462",                             /* 462 */
93f2b0
+	"463",                             /* 463 */
93f2b0
+	"464",                             /* 464 */
93f2b0
+	"465",                             /* 465 */
93f2b0
+	"466",                             /* 466 */
93f2b0
+	"467",                             /* 467 */
93f2b0
+	"468",                             /* 468 */
93f2b0
+	"469",                             /* 469 */
93f2b0
+	"470",                             /* 470 */
93f2b0
+	"471",                             /* 471 */
93f2b0
+	"472",                             /* 472 */
93f2b0
+	"473",                             /* 473 */
93f2b0
+	"474",                             /* 474 */
93f2b0
+	"475",                             /* 475 */
93f2b0
+	"476",                             /* 476 */
93f2b0
+	"477",                             /* 477 */
93f2b0
+	"478",                             /* 478 */
93f2b0
+	"479",                             /* 479 */
93f2b0
+	"480",                             /* 480 */
93f2b0
+	"481",                             /* 481 */
93f2b0
+	"482",                             /* 482 */
93f2b0
+	"483",                             /* 483 */
93f2b0
+	"484",                             /* 484 */
93f2b0
+	"485",                             /* 485 */
93f2b0
+	"486",                             /* 486 */
93f2b0
+	"487",                             /* 487 */
93f2b0
+	"488",                             /* 488 */
93f2b0
+	"489",                             /* 489 */
93f2b0
+	"490",                             /* 490 */
93f2b0
+	"491",                             /* 491 */
93f2b0
+	"492",                             /* 492 */
93f2b0
+	"493",                             /* 493 */
93f2b0
+	"494",                             /* 494 */
93f2b0
+	"495",                             /* 495 */
93f2b0
+	"496",                             /* 496 */
93f2b0
+	"497",                             /* 497 */
93f2b0
+	"498",                             /* 498 */
93f2b0
+	"499",                             /* 499 */
93f2b0
+	"500",                             /* 500 */
93f2b0
+	"501",                             /* 501 */
93f2b0
+	"502",                             /* 502 */
93f2b0
+	"503",                             /* 503 */
93f2b0
+	"504",                             /* 504 */
93f2b0
+	"505",                             /* 505 */
93f2b0
+	"506",                             /* 506 */
93f2b0
+	"507",                             /* 507 */
93f2b0
+	"508",                             /* 508 */
93f2b0
+	"509",                             /* 509 */
93f2b0
+	"510",                             /* 510 */
93f2b0
+	"511",                             /* 511 */
93f2b0
+	"512",                             /* 512 */
93f2b0
+	"513",                             /* 513 */
93f2b0
+	"514",                             /* 514 */
93f2b0
+	"515",                             /* 515 */
93f2b0
+	"516",                             /* 516 */
93f2b0
+	"517",                             /* 517 */
93f2b0
+	"518",                             /* 518 */
93f2b0
+	"519",                             /* 519 */
93f2b0
+	"520",                             /* 520 */
93f2b0
+	"521",                             /* 521 */
93f2b0
+	"522",                             /* 522 */
93f2b0
+	"523",                             /* 523 */
93f2b0
+	"524",                             /* 524 */
93f2b0
+	"525",                             /* 525 */
93f2b0
+	"526",                             /* 526 */
93f2b0
+	"527",                             /* 527 */
93f2b0
+	"528",                             /* 528 */
93f2b0
+	"529",                             /* 529 */
93f2b0
+	"530",                             /* 530 */
93f2b0
+	"531",                             /* 531 */
93f2b0
+	"532",                             /* 532 */
93f2b0
+	"533",                             /* 533 */
93f2b0
+	"534",                             /* 534 */
93f2b0
+	"535",                             /* 535 */
93f2b0
+	"536",                             /* 536 */
93f2b0
+	"537",                             /* 537 */
93f2b0
+	"538",                             /* 538 */
93f2b0
+	"539",                             /* 539 */
93f2b0
+	"540",                             /* 540 */
93f2b0
+	"541",                             /* 541 */
93f2b0
+	"542",                             /* 542 */
93f2b0
+	"543",                             /* 543 */
93f2b0
+	"544",                             /* 544 */
93f2b0
+	"545",                             /* 545 */
93f2b0
+	"546",                             /* 546 */
93f2b0
+	"547",                             /* 547 */
93f2b0
+	"548",                             /* 548 */
93f2b0
+	"549",                             /* 549 */
93f2b0
+	"550",                             /* 550 */
93f2b0
+	"551",                             /* 551 */
93f2b0
+	"552",                             /* 552 */
93f2b0
+	"553",                             /* 553 */
93f2b0
+	"554",                             /* 554 */
93f2b0
+	"555",                             /* 555 */
93f2b0
+	"556",                             /* 556 */
93f2b0
+	"557",                             /* 557 */
93f2b0
+	"558",                             /* 558 */
93f2b0
+	"559",                             /* 559 */
93f2b0
+	"560",                             /* 560 */
93f2b0
+	"561",                             /* 561 */
93f2b0
+	"562",                             /* 562 */
93f2b0
+	"563",                             /* 563 */
93f2b0
+	"564",                             /* 564 */
93f2b0
+	"565",                             /* 565 */
93f2b0
+	"566",                             /* 566 */
93f2b0
+	"567",                             /* 567 */
93f2b0
+	"568",                             /* 568 */
93f2b0
+	"569",                             /* 569 */
93f2b0
+	"570",                             /* 570 */
93f2b0
+	"571",                             /* 571 */
93f2b0
+	"572",                             /* 572 */
93f2b0
+	"573",                             /* 573 */
93f2b0
+	"574",                             /* 574 */
93f2b0
+	"575",                             /* 575 */
93f2b0
+	"576",                             /* 576 */
93f2b0
+	"577",                             /* 577 */
93f2b0
+	"578",                             /* 578 */
93f2b0
+	"579",                             /* 579 */
93f2b0
+	"580",                             /* 580 */
93f2b0
+	"581",                             /* 581 */
93f2b0
+	"582",                             /* 582 */
93f2b0
+	"583",                             /* 583 */
93f2b0
+	"584",                             /* 584 */
93f2b0
+	"585",                             /* 585 */
93f2b0
+	"586",                             /* 586 */
93f2b0
+	"587",                             /* 587 */
93f2b0
+	"588",                             /* 588 */
93f2b0
+	"589",                             /* 589 */
93f2b0
+	"590",                             /* 590 */
93f2b0
+	"591",                             /* 591 */
93f2b0
+	"592",                             /* 592 */
93f2b0
+	"593",                             /* 593 */
93f2b0
+	"594",                             /* 594 */
93f2b0
+	"595",                             /* 595 */
93f2b0
+	"596",                             /* 596 */
93f2b0
+	"597",                             /* 597 */
93f2b0
+	"598",                             /* 598 */
93f2b0
+	"599",                             /* 599 */
93f2b0
+	"600",                             /* 600 */
93f2b0
+	"601",                             /* 601 */
93f2b0
+	"602",                             /* 602 */
93f2b0
+	"603",                             /* 603 */
93f2b0
+	"604",                             /* 604 */
93f2b0
+	"605",                             /* 605 */
93f2b0
+	"606",                             /* 606 */
93f2b0
+	"607",                             /* 607 */
93f2b0
+	"608",                             /* 608 */
93f2b0
+	"609",                             /* 609 */
93f2b0
+	"610",                             /* 610 */
93f2b0
+	"611",                             /* 611 */
93f2b0
+	"612",                             /* 612 */
93f2b0
+	"613",                             /* 613 */
93f2b0
+	"614",                             /* 614 */
93f2b0
+	"615",                             /* 615 */
93f2b0
+	"616",                             /* 616 */
93f2b0
+	"617",                             /* 617 */
93f2b0
+	"618",                             /* 618 */
93f2b0
+	"619",                             /* 619 */
93f2b0
+	"620",                             /* 620 */
93f2b0
+	"621",                             /* 621 */
93f2b0
+	"622",                             /* 622 */
93f2b0
+	"623",                             /* 623 */
93f2b0
+	"624",                             /* 624 */
93f2b0
+	"625",                             /* 625 */
93f2b0
+	"626",                             /* 626 */
93f2b0
+	"627",                             /* 627 */
93f2b0
+	"628",                             /* 628 */
93f2b0
+	"629",                             /* 629 */
93f2b0
+	"630",                             /* 630 */
93f2b0
+	"631",                             /* 631 */
93f2b0
+	"632",                             /* 632 */
93f2b0
+	"633",                             /* 633 */
93f2b0
+	"634",                             /* 634 */
93f2b0
+	"635",                             /* 635 */
93f2b0
+	"636",                             /* 636 */
93f2b0
+	"637",                             /* 637 */
93f2b0
+	"638",                             /* 638 */
93f2b0
+	"639",                             /* 639 */
93f2b0
+	"640",                             /* 640 */
93f2b0
+	"641",                             /* 641 */
93f2b0
+	"642",                             /* 642 */
93f2b0
+	"643",                             /* 643 */
93f2b0
+	"644",                             /* 644 */
93f2b0
+	"645",                             /* 645 */
93f2b0
+	"646",                             /* 646 */
93f2b0
+	"647",                             /* 647 */
93f2b0
+	"648",                             /* 648 */
93f2b0
+	"649",                             /* 649 */
93f2b0
+	"650",                             /* 650 */
93f2b0
+	"651",                             /* 651 */
93f2b0
+	"652",                             /* 652 */
93f2b0
+	"653",                             /* 653 */
93f2b0
+	"654",                             /* 654 */
93f2b0
+	"655",                             /* 655 */
93f2b0
+	"656",                             /* 656 */
93f2b0
+	"657",                             /* 657 */
93f2b0
+	"658",                             /* 658 */
93f2b0
+	"659",                             /* 659 */
93f2b0
+	"660",                             /* 660 */
93f2b0
+	"661",                             /* 661 */
93f2b0
+	"662",                             /* 662 */
93f2b0
+	"663",                             /* 663 */
93f2b0
+	"664",                             /* 664 */
93f2b0
+	"665",                             /* 665 */
93f2b0
+	"666",                             /* 666 */
93f2b0
+	"667",                             /* 667 */
93f2b0
+	"668",                             /* 668 */
93f2b0
+	"669",                             /* 669 */
93f2b0
+	"670",                             /* 670 */
93f2b0
+	"671",                             /* 671 */
93f2b0
+	"672",                             /* 672 */
93f2b0
+	"673",                             /* 673 */
93f2b0
+	"674",                             /* 674 */
93f2b0
+	"675",                             /* 675 */
93f2b0
+	"676",                             /* 676 */
93f2b0
+	"677",                             /* 677 */
93f2b0
+	"678",                             /* 678 */
93f2b0
+	"679",                             /* 679 */
93f2b0
+	"680",                             /* 680 */
93f2b0
+	"681",                             /* 681 */
93f2b0
+	"682",                             /* 682 */
93f2b0
+	"683",                             /* 683 */
93f2b0
+	"684",                             /* 684 */
93f2b0
+	"685",                             /* 685 */
93f2b0
+	"686",                             /* 686 */
93f2b0
+	"687",                             /* 687 */
93f2b0
+	"688",                             /* 688 */
93f2b0
+	"689",                             /* 689 */
93f2b0
+	"690",                             /* 690 */
93f2b0
+	"691",                             /* 691 */
93f2b0
+	"692",                             /* 692 */
93f2b0
+	"693",                             /* 693 */
93f2b0
+	"694",                             /* 694 */
93f2b0
+	"695",                             /* 695 */
93f2b0
+	"696",                             /* 696 */
93f2b0
+	"697",                             /* 697 */
93f2b0
+	"698",                             /* 698 */
93f2b0
+	"699",                             /* 699 */
93f2b0
+	"700",                             /* 700 */
93f2b0
+	"701",                             /* 701 */
93f2b0
+	"702",                             /* 702 */
93f2b0
+	"703",                             /* 703 */
93f2b0
+	"704",                             /* 704 */
93f2b0
+	"705",                             /* 705 */
93f2b0
+	"706",                             /* 706 */
93f2b0
+	"707",                             /* 707 */
93f2b0
+	"708",                             /* 708 */
93f2b0
+	"709",                             /* 709 */
93f2b0
+	"710",                             /* 710 */
93f2b0
+	"711",                             /* 711 */
93f2b0
+	"712",                             /* 712 */
93f2b0
+	"713",                             /* 713 */
93f2b0
+	"714",                             /* 714 */
93f2b0
+	"715",                             /* 715 */
93f2b0
+	"716",                             /* 716 */
93f2b0
+	"717",                             /* 717 */
93f2b0
+	"718",                             /* 718 */
93f2b0
+	"719",                             /* 719 */
93f2b0
+	"720",                             /* 720 */
93f2b0
+	"721",                             /* 721 */
93f2b0
+	"722",                             /* 722 */
93f2b0
+	"723",                             /* 723 */
93f2b0
+	"724",                             /* 724 */
93f2b0
+	"725",                             /* 725 */
93f2b0
+	"726",                             /* 726 */
93f2b0
+	"727",                             /* 727 */
93f2b0
+	"728",                             /* 728 */
93f2b0
+	"729",                             /* 729 */
93f2b0
+	"730",                             /* 730 */
93f2b0
+	"731",                             /* 731 */
93f2b0
+	"732",                             /* 732 */
93f2b0
+	"733",                             /* 733 */
93f2b0
+	"734",                             /* 734 */
93f2b0
+	"735",                             /* 735 */
93f2b0
+	"736",                             /* 736 */
93f2b0
+	"737",                             /* 737 */
93f2b0
+	"738",                             /* 738 */
93f2b0
+	"739",                             /* 739 */
93f2b0
+	"740",                             /* 740 */
93f2b0
+	"741",                             /* 741 */
93f2b0
+	"742",                             /* 742 */
93f2b0
+	"743",                             /* 743 */
93f2b0
+	"744",                             /* 744 */
93f2b0
+	"745",                             /* 745 */
93f2b0
+	"746",                             /* 746 */
93f2b0
+	"747",                             /* 747 */
93f2b0
+	"748",                             /* 748 */
93f2b0
+	"749",                             /* 749 */
93f2b0
+	"750",                             /* 750 */
93f2b0
+	"751",                             /* 751 */
93f2b0
+	"752",                             /* 752 */
93f2b0
+	"753",                             /* 753 */
93f2b0
+	"754",                             /* 754 */
93f2b0
+	"755",                             /* 755 */
93f2b0
+	"756",                             /* 756 */
93f2b0
+	"757",                             /* 757 */
93f2b0
+	"758",                             /* 758 */
93f2b0
+	"759",                             /* 759 */
93f2b0
+	"760",                             /* 760 */
93f2b0
+	"761",                             /* 761 */
93f2b0
+	"762",                             /* 762 */
93f2b0
+	"763",                             /* 763 */
93f2b0
+	"764",                             /* 764 */
93f2b0
+	"765",                             /* 765 */
93f2b0
+	"766",                             /* 766 */
93f2b0
+	"767",                             /* 767 */
93f2b0
+	"768",                             /* 768 */
93f2b0
+	"769",                             /* 769 */
93f2b0
+	"770",                             /* 770 */
93f2b0
+	"771",                             /* 771 */
93f2b0
+	"772",                             /* 772 */
93f2b0
+	"773",                             /* 773 */
93f2b0
+	"774",                             /* 774 */
93f2b0
+	"775",                             /* 775 */
93f2b0
+	"776",                             /* 776 */
93f2b0
+	"777",                             /* 777 */
93f2b0
+	"778",                             /* 778 */
93f2b0
+	"779",                             /* 779 */
93f2b0
+	"780",                             /* 780 */
93f2b0
+	"781",                             /* 781 */
93f2b0
+	"782",                             /* 782 */
93f2b0
+	"783",                             /* 783 */
93f2b0
+	"784",                             /* 784 */
93f2b0
+	"785",                             /* 785 */
93f2b0
+	"786",                             /* 786 */
93f2b0
+	"787",                             /* 787 */
93f2b0
+	"788",                             /* 788 */
93f2b0
+	"789",                             /* 789 */
93f2b0
+	"790",                             /* 790 */
93f2b0
+	"791",                             /* 791 */
93f2b0
+	"792",                             /* 792 */
93f2b0
+	"793",                             /* 793 */
93f2b0
+	"794",                             /* 794 */
93f2b0
+	"795",                             /* 795 */
93f2b0
+	"796",                             /* 796 */
93f2b0
+	"797",                             /* 797 */
93f2b0
+	"798",                             /* 798 */
93f2b0
+	"799",                             /* 799 */
93f2b0
+	"800",                             /* 800 */
93f2b0
+	"801",                             /* 801 */
93f2b0
+	"802",                             /* 802 */
93f2b0
+	"803",                             /* 803 */
93f2b0
+	"804",                             /* 804 */
93f2b0
+	"805",                             /* 805 */
93f2b0
+	"806",                             /* 806 */
93f2b0
+	"807",                             /* 807 */
93f2b0
+	"808",                             /* 808 */
93f2b0
+	"809",                             /* 809 */
93f2b0
+	"810",                             /* 810 */
93f2b0
+	"811",                             /* 811 */
93f2b0
+	"812",                             /* 812 */
93f2b0
+	"813",                             /* 813 */
93f2b0
+	"814",                             /* 814 */
93f2b0
+	"815",                             /* 815 */
93f2b0
+	"816",                             /* 816 */
93f2b0
+	"817",                             /* 817 */
93f2b0
+	"818",                             /* 818 */
93f2b0
+	"819",                             /* 819 */
93f2b0
+	"820",                             /* 820 */
93f2b0
+	"821",                             /* 821 */
93f2b0
+	"822",                             /* 822 */
93f2b0
+	"823",                             /* 823 */
93f2b0
+	"824",                             /* 824 */
93f2b0
+	"825",                             /* 825 */
93f2b0
+	"826",                             /* 826 */
93f2b0
+	"827",                             /* 827 */
93f2b0
+	"828",                             /* 828 */
93f2b0
+	"829",                             /* 829 */
93f2b0
+	"830",                             /* 830 */
93f2b0
+	"831",                             /* 831 */
93f2b0
+	"832",                             /* 832 */
93f2b0
+	"833",                             /* 833 */
93f2b0
+	"834",                             /* 834 */
93f2b0
+	"835",                             /* 835 */
93f2b0
+	"836",                             /* 836 */
93f2b0
+	"837",                             /* 837 */
93f2b0
+	"838",                             /* 838 */
93f2b0
+	"839",                             /* 839 */
93f2b0
+	"840",                             /* 840 */
93f2b0
+	"841",                             /* 841 */
93f2b0
+	"842",                             /* 842 */
93f2b0
+	"843",                             /* 843 */
93f2b0
+	"844",                             /* 844 */
93f2b0
+	"845",                             /* 845 */
93f2b0
+	"846",                             /* 846 */
93f2b0
+	"847",                             /* 847 */
93f2b0
+	"848",                             /* 848 */
93f2b0
+	"849",                             /* 849 */
93f2b0
+	"850",                             /* 850 */
93f2b0
+	"851",                             /* 851 */
93f2b0
+	"852",                             /* 852 */
93f2b0
+	"853",                             /* 853 */
93f2b0
+	"854",                             /* 854 */
93f2b0
+	"855",                             /* 855 */
93f2b0
+	"856",                             /* 856 */
93f2b0
+	"857",                             /* 857 */
93f2b0
+	"858",                             /* 858 */
93f2b0
+	"859",                             /* 859 */
93f2b0
+	"860",                             /* 860 */
93f2b0
+	"861",                             /* 861 */
93f2b0
+	"862",                             /* 862 */
93f2b0
+	"863",                             /* 863 */
93f2b0
+	"864",                             /* 864 */
93f2b0
+	"865",                             /* 865 */
93f2b0
+	"866",                             /* 866 */
93f2b0
+	"867",                             /* 867 */
93f2b0
+	"868",                             /* 868 */
93f2b0
+	"869",                             /* 869 */
93f2b0
+	"870",                             /* 870 */
93f2b0
+	"871",                             /* 871 */
93f2b0
+	"872",                             /* 872 */
93f2b0
+	"873",                             /* 873 */
93f2b0
+	"874",                             /* 874 */
93f2b0
+	"875",                             /* 875 */
93f2b0
+	"876",                             /* 876 */
93f2b0
+	"877",                             /* 877 */
93f2b0
+	"878",                             /* 878 */
93f2b0
+	"879",                             /* 879 */
93f2b0
+	"880",                             /* 880 */
93f2b0
+	"881",                             /* 881 */
93f2b0
+	"882",                             /* 882 */
93f2b0
+	"883",                             /* 883 */
93f2b0
+	"884",                             /* 884 */
93f2b0
+	"885",                             /* 885 */
93f2b0
+	"886",                             /* 886 */
93f2b0
+	"887",                             /* 887 */
93f2b0
+	"888",                             /* 888 */
93f2b0
+	"889",                             /* 889 */
93f2b0
+	"890",                             /* 890 */
93f2b0
+	"891",                             /* 891 */
93f2b0
+	"892",                             /* 892 */
93f2b0
+	"893",                             /* 893 */
93f2b0
+	"894",                             /* 894 */
93f2b0
+	"895",                             /* 895 */
93f2b0
+	"896",                             /* 896 */
93f2b0
+	"897",                             /* 897 */
93f2b0
+	"898",                             /* 898 */
93f2b0
+	"899",                             /* 899 */
93f2b0
+	"900",                             /* 900 */
93f2b0
+	"901",                             /* 901 */
93f2b0
+	"902",                             /* 902 */
93f2b0
+	"903",                             /* 903 */
93f2b0
+	"904",                             /* 904 */
93f2b0
+	"905",                             /* 905 */
93f2b0
+	"906",                             /* 906 */
93f2b0
+	"907",                             /* 907 */
93f2b0
+	"908",                             /* 908 */
93f2b0
+	"909",                             /* 909 */
93f2b0
+	"910",                             /* 910 */
93f2b0
+	"911",                             /* 911 */
93f2b0
+	"912",                             /* 912 */
93f2b0
+	"913",                             /* 913 */
93f2b0
+	"914",                             /* 914 */
93f2b0
+	"915",                             /* 915 */
93f2b0
+	"916",                             /* 916 */
93f2b0
+	"917",                             /* 917 */
93f2b0
+	"918",                             /* 918 */
93f2b0
+	"919",                             /* 919 */
93f2b0
+	"920",                             /* 920 */
93f2b0
+	"921",                             /* 921 */
93f2b0
+	"922",                             /* 922 */
93f2b0
+	"923",                             /* 923 */
93f2b0
+	"924",                             /* 924 */
93f2b0
+	"925",                             /* 925 */
93f2b0
+	"926",                             /* 926 */
93f2b0
+	"927",                             /* 927 */
93f2b0
+	"928",                             /* 928 */
93f2b0
+	"929",                             /* 929 */
93f2b0
+	"930",                             /* 930 */
93f2b0
+	"931",                             /* 931 */
93f2b0
+	"932",                             /* 932 */
93f2b0
+	"933",                             /* 933 */
93f2b0
+	"934",                             /* 934 */
93f2b0
+	"935",                             /* 935 */
93f2b0
+	"936",                             /* 936 */
93f2b0
+	"937",                             /* 937 */
93f2b0
+	"938",                             /* 938 */
93f2b0
+	"939",                             /* 939 */
93f2b0
+	"940",                             /* 940 */
93f2b0
+	"941",                             /* 941 */
93f2b0
+	"942",                             /* 942 */
93f2b0
+	"943",                             /* 943 */
93f2b0
+	"944",                             /* 944 */
93f2b0
+	"945",                             /* 945 */
93f2b0
+	"946",                             /* 946 */
93f2b0
+	"947",                             /* 947 */
93f2b0
+	"948",                             /* 948 */
93f2b0
+	"949",                             /* 949 */
93f2b0
+	"950",                             /* 950 */
93f2b0
+	"951",                             /* 951 */
93f2b0
+	"952",                             /* 952 */
93f2b0
+	"953",                             /* 953 */
93f2b0
+	"954",                             /* 954 */
93f2b0
+	"955",                             /* 955 */
93f2b0
+	"956",                             /* 956 */
93f2b0
+	"957",                             /* 957 */
93f2b0
+	"958",                             /* 958 */
93f2b0
+	"959",                             /* 959 */
93f2b0
+	"960",                             /* 960 */
93f2b0
+	"961",                             /* 961 */
93f2b0
+	"962",                             /* 962 */
93f2b0
+	"963",                             /* 963 */
93f2b0
+	"964",                             /* 964 */
93f2b0
+	"965",                             /* 965 */
93f2b0
+	"966",                             /* 966 */
93f2b0
+	"967",                             /* 967 */
93f2b0
+	"968",                             /* 968 */
93f2b0
+	"969",                             /* 969 */
93f2b0
+	"970",                             /* 970 */
93f2b0
+	"971",                             /* 971 */
93f2b0
+	"972",                             /* 972 */
93f2b0
+	"973",                             /* 973 */
93f2b0
+	"974",                             /* 974 */
93f2b0
+	"975",                             /* 975 */
93f2b0
+	"976",                             /* 976 */
93f2b0
+	"977",                             /* 977 */
93f2b0
+	"978",                             /* 978 */
93f2b0
+	"979",                             /* 979 */
93f2b0
+	"980",                             /* 980 */
93f2b0
+	"981",                             /* 981 */
93f2b0
+	"982",                             /* 982 */
93f2b0
+	"983",                             /* 983 */
93f2b0
+	"984",                             /* 984 */
93f2b0
+	"985",                             /* 985 */
93f2b0
+	"986",                             /* 986 */
93f2b0
+	"987",                             /* 987 */
93f2b0
+	"988",                             /* 988 */
93f2b0
+	"989",                             /* 989 */
93f2b0
+	"990",                             /* 990 */
93f2b0
+	"991",                             /* 991 */
93f2b0
+	"992",                             /* 992 */
93f2b0
+	"993",                             /* 993 */
93f2b0
+	"994",                             /* 994 */
93f2b0
+	"995",                             /* 995 */
93f2b0
+	"996",                             /* 996 */
93f2b0
+	"997",                             /* 997 */
93f2b0
+	"998",                             /* 998 */
93f2b0
+	"999",                             /* 999 */
93f2b0
+	"1000",                            /* 1000 */
93f2b0
+	"1001",                            /* 1001 */
93f2b0
+	"1002",                            /* 1002 */
93f2b0
+	"1003",                            /* 1003 */
93f2b0
+	"1004",                            /* 1004 */
93f2b0
+	"1005",                            /* 1005 */
93f2b0
+	"1006",                            /* 1006 */
93f2b0
+	"1007",                            /* 1007 */
93f2b0
+	"1008",                            /* 1008 */
93f2b0
+	"1009",                            /* 1009 */
93f2b0
+	"1010",                            /* 1010 */
93f2b0
+	"1011",                            /* 1011 */
93f2b0
+	"1012",                            /* 1012 */
93f2b0
+	"1013",                            /* 1013 */
93f2b0
+	"1014",                            /* 1014 */
93f2b0
+	"1015",                            /* 1015 */
93f2b0
+	"1016",                            /* 1016 */
93f2b0
+	"1017",                            /* 1017 */
93f2b0
+	"1018",                            /* 1018 */
93f2b0
+	"1019",                            /* 1019 */
93f2b0
+	"1020",                            /* 1020 */
93f2b0
+	"1021",                            /* 1021 */
93f2b0
+	"1022",                            /* 1022 */
93f2b0
+	"1023",                            /* 1023 */
93f2b0
+	"open",                            /* 1024 */
93f2b0
+	"link",                            /* 1025 */
93f2b0
+	"unlink",                          /* 1026 */
93f2b0
+	"mknod",                           /* 1027 */
93f2b0
+	"chmod",                           /* 1028 */
93f2b0
+	"chown",                           /* 1029 */
93f2b0
+	"mkdir",                           /* 1030 */
93f2b0
+	"rmdir",                           /* 1031 */
93f2b0
+	"lchown",                          /* 1032 */
93f2b0
+	"access",                          /* 1033 */
93f2b0
+	"rename",                          /* 1034 */
93f2b0
+	"readlink",                        /* 1035 */
93f2b0
+	"symlink",                         /* 1036 */
93f2b0
+	"utimes",                          /* 1037 */
93f2b0
+	"stat",                            /* 1038 */
93f2b0
+	"lstat",                           /* 1039 */
93f2b0
+	"pipe",                            /* 1040 */
93f2b0
+	"dup2",                            /* 1041 */
93f2b0
+	"epoll_create",                    /* 1042 */
93f2b0
+	"inotify_init",                    /* 1043 */
93f2b0
+	"eventfd",                         /* 1044 */
93f2b0
+	"signalfd",                        /* 1045 */
93f2b0
+	"sendfile",                        /* 1046 */
93f2b0
+	"ftruncate",                       /* 1047 */
93f2b0
+	"truncate",                        /* 1048 */
93f2b0
+	"stat",                            /* 1049 */
93f2b0
+	"lstat",                           /* 1050 */
93f2b0
+	"fstat",                           /* 1051 */
93f2b0
+	"fcntl",                           /* 1052 */
93f2b0
+	"fadvise64",                       /* 1053 */
93f2b0
+	"newfstatat",                      /* 1054 */
93f2b0
+	"fstatfs",                         /* 1055 */
93f2b0
+	"statfs",                          /* 1056 */
93f2b0
+	"lseek",                           /* 1057 */
93f2b0
+	"mmap",                            /* 1058 */
93f2b0
+	"alarm",                           /* 1059 */
93f2b0
+	"getpgrp",                         /* 1060 */
93f2b0
+	"pause",                           /* 1061 */
93f2b0
+	"time",                            /* 1062 */
93f2b0
+	"utime",                           /* 1063 */
93f2b0
+	"creat",                           /* 1064 */
93f2b0
+	"getdents",                        /* 1065 */
93f2b0
+	"futimesat",                       /* 1066 */
93f2b0
+	"select",                          /* 1067 */
93f2b0
+	"poll",                            /* 1068 */
93f2b0
+	"epoll_wait",                      /* 1069 */
93f2b0
+	"ustat",                           /* 1070 */
93f2b0
+	"vfork",                           /* 1071 */
93f2b0
+	"oldwait4",                        /* 1072 */
93f2b0
+	"recv",                            /* 1073 */
93f2b0
+	"send",                            /* 1074 */
93f2b0
+	"bdflush",                         /* 1075 */
93f2b0
+	"umount",                          /* 1076 */
93f2b0
+	"uselib",                          /* 1077 */
93f2b0
+	"_sysctl",                         /* 1078 */
93f2b0
+	"fork",                            /* 1079 */
93f2b0
diff --git a/sysdeps/linux-gnu/aarch64/trace.c b/sysdeps/linux-gnu/aarch64/trace.c
93f2b0
new file mode 100644
93f2b0
index 0000000..5544b51
93f2b0
--- /dev/null
93f2b0
+++ b/sysdeps/linux-gnu/aarch64/trace.c
93f2b0
@@ -0,0 +1,83 @@
93f2b0
+/*
93f2b0
+ * This file is part of ltrace.
93f2b0
+ * Copyright (C) 2014 Petr Machata, Red Hat, Inc.
93f2b0
+ *
93f2b0
+ * This program is free software; you can redistribute it and/or
93f2b0
+ * modify it under the terms of the GNU General Public License as
93f2b0
+ * published by the Free Software Foundation; either version 2 of the
93f2b0
+ * License, or (at your option) any later version.
93f2b0
+ *
93f2b0
+ * This program is distributed in the hope that it will be useful, but
93f2b0
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
93f2b0
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
93f2b0
+ * General Public License for more details.
93f2b0
+ *
93f2b0
+ * You should have received a copy of the GNU General Public License
93f2b0
+ * along with this program; if not, write to the Free Software
93f2b0
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
93f2b0
+ * 02110-1301 USA
93f2b0
+ */
93f2b0
+
93f2b0
+#include <sys/ptrace.h>
93f2b0
+#include <sys/types.h>
93f2b0
+#include <sys/wait.h>
93f2b0
+#include <asm/ptrace.h>
93f2b0
+#include <string.h>
93f2b0
+#include <errno.h>
93f2b0
+
93f2b0
+#include "backend.h"
93f2b0
+#include "proc.h"
93f2b0
+
93f2b0
+void
93f2b0
+get_arch_dep(struct process *proc)
93f2b0
+{
93f2b0
+}
93f2b0
+
93f2b0
+int aarch64_read_gregs(struct process *proc, struct user_pt_regs *regs);
93f2b0
+
93f2b0
+/* The syscall instruction is:
93f2b0
+ * | 31                   21 | 20    5 | 4       0 |
93f2b0
+ * | 1 1 0 1 0 1 0 0 | 0 0 0 |  imm16  | 0 0 0 0 1 | */
93f2b0
+#define SVC_MASK  0xffe0001f
93f2b0
+#define SVC_VALUE 0xd4000001
93f2b0
+
93f2b0
+int
93f2b0
+syscall_p(struct process *proc, int status, int *sysnum)
93f2b0
+{
93f2b0
+	if (WIFSTOPPED(status)
93f2b0
+	    && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
93f2b0
+
93f2b0
+		struct user_pt_regs regs;
93f2b0
+		if (aarch64_read_gregs(proc, &regs) < 0) {
93f2b0
+			fprintf(stderr, "syscall_p: "
93f2b0
+				"Couldn't read registers of %d.\n", proc->pid);
93f2b0
+			return -1;
93f2b0
+		}
93f2b0
+
93f2b0
+		errno = 0;
93f2b0
+		unsigned long insn = (unsigned long) ptrace(PTRACE_PEEKTEXT,
93f2b0
+							    proc->pid,
93f2b0
+							    regs.pc - 4, 0);
93f2b0
+		if (insn == -1UL && errno != 0) {
93f2b0
+			fprintf(stderr, "syscall_p: "
93f2b0
+				"Couldn't peek into %d: %s\n", proc->pid,
93f2b0
+				strerror(errno));
93f2b0
+			return -1;
93f2b0
+		}
93f2b0
+
93f2b0
+		insn &= 0xffffffffUL;
93f2b0
+		if ((insn & SVC_MASK) == SVC_VALUE) {
93f2b0
+			*sysnum = regs.regs[8];
93f2b0
+
93f2b0
+			size_t d1 = proc->callstack_depth - 1;
93f2b0
+			if (proc->callstack_depth > 0
93f2b0
+			    && proc->callstack[d1].is_syscall
93f2b0
+			    && proc->callstack[d1].c_un.syscall == *sysnum)
93f2b0
+				return 2;
93f2b0
+
93f2b0
+			return 1;
93f2b0
+		}
93f2b0
+	}
93f2b0
+
93f2b0
+	return 0;
93f2b0
+}