From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753881AbcKPRiP (ORCPT ); Wed, 16 Nov 2016 12:38:15 -0500 Received: from omzsmtpe01.verizonbusiness.com ([199.249.25.210]:38282 "EHLO omzsmtpe01.verizonbusiness.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752219AbcKPRiN (ORCPT ); Wed, 16 Nov 2016 12:38:13 -0500 X-IronPort-Anti-Spam-Filtered: false X-IronPort-AV: E=Sophos;i="5.31,500,1473120000"; d="scan'208";a="1317194201" From: alexander.levin@verizon.com Cc: "tglx@linutronix.de" , "scientist@fb.com" , "glider@google.com" , "andreyknvl@google.com" , "rostedt@goodmis.org" , "arnd@arndb.de" , "mathieu.desnoyers@efficios.com" , "daniel.vetter@ffwll.ch" , "linux-kernel@vger.kernel.org" , alexander.levin@verizon.com X-Host: viking.odc.vzwcorp.com To: "dvyukov@google.com" Subject: [RFC 1/3] abi_spec: basic definitions of constraints, args and syscalls Thread-Topic: [RFC 1/3] abi_spec: basic definitions of constraints, args and syscalls Thread-Index: AQHSQDAJ3zRNkcNuqUKJ7WlWQPYPQg== Date: Wed, 16 Nov 2016 17:37:00 +0000 Message-ID: <1479317803-17220-2-git-send-email-alexander.levin@verizon.com> References: <1479317803-17220-1-git-send-email-alexander.levin@verizon.com> In-Reply-To: <1479317803-17220-1-git-send-email-alexander.levin@verizon.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [10.144.60.250] Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by mail.home.local id uAGHcPNv004608 This is a very simple definition of the syscall ABI we can build on. The idea is to have a generic description of syscalls, their arguments and return values we can use to audit the kernel's implementation vs the specs. Signed-off-by: Sasha Levin --- include/uapi/linux/abi_spec.h | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 include/uapi/linux/abi_spec.h diff --git a/include/uapi/linux/abi_spec.h b/include/uapi/linux/abi_spec.h new file mode 100644 index 0000000..ad1a992 --- /dev/null +++ b/include/uapi/linux/abi_spec.h @@ -0,0 +1,58 @@ +#ifndef ABI_SPEC_H_ +#define ABI_SPEC_H_ + +#include +#include +#define MAX_CONSTRAINTS 10 +#define MAX_ARGS 10 + +#define TYPE_FD 1 +#define TYPE_INT 2 +#define TYPE_PTR 3 +#define TYPE_STRING 4 +/* ... */ + +#define CONSTRAINT_NON_NULL (1<<0) +#define CONSTRAINT_RANGE (1<<1) +#define CONSTRAINT_ADDRESS_TYPE (1<<2) +#define CONSTRAINT_FD_TYPE (1<<3) +#define CONSTRAINT_ERRNO (1<<4) +#define CONSTRAINT_BITMASK (1<<5) +#define CONSTRAINT_PATH (1<<6) +/* ... */ +/* A generic constraint on an argument or a return value */ +struct constraint { + unsigned int flags; /* bitmask of applied constraints */ + union { + struct { /* int range */ + int int_min; + int int_max; + }; + unsigned long bitmask; /* allowed flags bitmask */ + unsigned long address_flags; /* Type of allowed addr */ + unsigned long fd_flags; /* Type of allowed fd */ + }; +}; + +/* A generic argument (or return value) */ +struct argument { + const char *name; + int type; /* should be a nicer way to do this */ + + unsigned int nconstraints; /* can there be more than 1-2? */ + struct constraint constraints[MAX_CONSTRAINTS]; +}; + +/* A generic syscall */ +struct syscall_spec { + const char *name; + struct argument retval; + + unsigned int nargs; + struct argument args[MAX_ARGS]; +}; + +void abispec_check_pre(const struct syscall_spec *s, ...); +void abispec_check_post(const struct syscall_spec *s, long retval, ...); + +#endif -- 2.7.4