From patchwork Wed Sep 21 18:00:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 15852 Received: (qmail 63203 invoked by alias); 21 Sep 2016 18:00:32 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 63185 invoked by uid 89); 21 Sep 2016 18:00:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=no version=3.3.2 spammy=2440, INTERNAL, INLINE, INTERNALINLINE, internal, inline X-HELO: mail-yw0-f177.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=E0NeAvMngykOOQvUo1dLL5HZEf8lizpBEwHqr24NLqU=; b=ioxdR5TvD/51gghlyyg2i0T64t/moFOayeNARlYXI0jUef7r5P2AUveQVQrlS5Qed9 XaM/sAzwFcahLQT87kaT4sv6r8nln9YGrbfntWp4eiPV1QDMji2Cls5eYA+uFx1ihh3y zKCQ6iMibnYj6MCOa1Jf7Sp4u4oyIivrVFy0N9TogjCifkiDLC9o4qLJQprstzEtmrNv ndNLmElak72jw3g/9IqZMzznM9YhVYE+H9WX6OboBWv399PBLa9Y0AE6XfC7xLuR360K BcSGZGV3ktzSSFdmGCJapYYN/9mNvIMn5NqxWKwt0XltZA2WoZhKhVe+/J4RgLfEOwyt RgpQ== X-Gm-Message-State: AE9vXwNo3nLKmzKmFaJrxGi2i0qbToTOque/7ollNocs3fwmbhNqJmLpdimyUqdZqYJp1bFp X-Received: by 10.129.169.193 with SMTP id g184mr35167123ywh.92.1474480819799; Wed, 21 Sep 2016 11:00:19 -0700 (PDT) Subject: Re: [PATCH 1/4] Add INTERNAL_SYSCALL_CALL To: Florian Weimer References: <1474383714-15187-1-git-send-email-adhemerval.zanella@linaro.org> <1474383714-15187-2-git-send-email-adhemerval.zanella@linaro.org> <87h99amey7.fsf@mid.deneb.enyo.de> Cc: libc-alpha@sourceware.org From: Adhemerval Zanella Message-ID: <89560945-9ba0-395a-3829-bb0eae62affb@linaro.org> Date: Wed, 21 Sep 2016 15:00:16 -0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <87h99amey7.fsf@mid.deneb.enyo.de> On 20/09/2016 18:36, Florian Weimer wrote: > * Adhemerval Zanella: > >> +#define __INTERNAL_SYSCALL0(name, err) \ >> + INTERNAL_SYSCALL (name, err, 0) >> +#define __INTERNAL_SYSCALL1(name, err, a1) \ >> + INTERNAL_SYSCALL (name, err, 1, a1) >> +#define __INTERNAL_SYSCALL2(name, err, a1, a2) \ >> + INTERNAL_SYSCALL (name, err, 2, a1, a2) >> +#define __INTERNAL_SYSCALL3(name, err, a1, a2, a3) \ >> + INTERNAL_SYSCALL (name, err, 3, a1, a2, a3) >> +#define __INTERNAL_SYSCALL4(name, err, a1, a2, a3, a4) \ >> + INTERNAL_SYSCALL (name, err, 4, a1, a2, a3, a4) >> +#define __INTERNAL_SYSCALL5(name, err, a1, a2, a3, a4, a5) \ >> + INTERNAL_SYSCALL (name, err, 5, a1, a2, a3, a4, a5) >> +#define __INTERNAL_SYSCALL6(name, err, a1, a2, a3, a4, a5, a6) \ >> + INTERNAL_SYSCALL (name, err, 6, a1, a2, a3, a4, a5, a6) >> +#define __INTERNAL_SYSCALL7(name, err, a1, a2, a3, a4, a5, a6, a7) \ >> + INTERNAL_SYSCALL (name, err, 7, a1, a2, a3, a4, a5, a6, a7) > > It's not immediately obvious why these definitions are needed. I agree this is not obvious, but it follows the SYSCALL_CANCEL macro logic where __INTERNAL_SYSCALL_DISP will select the correct __INTERNAL_SYSCALL (based on number of arguments). > >> +#define __INTERNAL_SYSCALL_NARGS_X(a, b, c, d, e, f, g, h, n, ...) n >> +#define __INTERNAL_SYSCALL_NARGS(...) \ >> + __INTERNAL_SYSCALL_NARGS_X (__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0, ) >> +#define __INTERNAL_SYSCALL_CONCAT_X(a, b) a##b >> +#define __INTERNAL_SYSCALL_CONCAT(a, b) __SYSCALL_CONCAT_X (a, b) > > I think you can reuse the macros from sysdeps/unix/sysdep.h here. Indeed this is just a duplicate macro logic with different name. I think it is safe to remove. > >> +/* Issue a syscall defined by syscall number plus any other argument required. > > These comment lines are rather long. Fixed. > >> + Any error will be handled using arch defined macros and errno will be se >> + accordingly. > > “will be set” > Fixed. I think patch below simplify the macro code and address your comments: diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h index 94a2ce0..7816b6a 100644 --- a/sysdeps/unix/sysdep.h +++ b/sysdeps/unix/sysdep.h @@ -24,6 +24,40 @@ #define SYSCALL__(name, args) PSEUDO (__##name, name, args) #define SYSCALL(name, args) PSEUDO (name, name, args) +/* Glue macros to select the correct {INTERNAL,INLINE}_SYSCALL variant based + on number of arguments used. */ +#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n +#define __SYSCALL_NARGS(...) \ + __SYSCALL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,) +#define __SYSCALL_CONCAT_X(a,b) a##b +#define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X (a, b) +#define __SYSCALL_DISP(b,...) \ + __SYSCALL_CONCAT (b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__) + + +#define __INTERNAL_SYSCALL0(name, err) \ + INTERNAL_SYSCALL (name, err, 0) +#define __INTERNAL_SYSCALL1(name, err, a1) \ + INTERNAL_SYSCALL (name, err, 1, a1) +#define __INTERNAL_SYSCALL2(name, err, a1, a2) \ + INTERNAL_SYSCALL (name, err, 2, a1, a2) +#define __INTERNAL_SYSCALL3(name, err, a1, a2, a3) \ + INTERNAL_SYSCALL (name, err, 3, a1, a2, a3) +#define __INTERNAL_SYSCALL4(name, err, a1, a2, a3, a4) \ + INTERNAL_SYSCALL (name, err, 4, a1, a2, a3, a4) +#define __INTERNAL_SYSCALL5(name, err, a1, a2, a3, a4, a5) \ + INTERNAL_SYSCALL (name, err, 5, a1, a2, a3, a4, a5) +#define __INTERNAL_SYSCALL6(name, err, a1, a2, a3, a4, a5, a6) \ + INTERNAL_SYSCALL (name, err, 6, a1, a2, a3, a4, a5, a6) +#define __INTERNAL_SYSCALL7(name, err, a1, a2, a3, a4, a5, a6, a7) \ + INTERNAL_SYSCALL (name, err, 7, a1, a2, a3, a4, a5, a6, a7) + +/* Issue a syscall defined by syscall number plus any other argument required. + It is similar to INTERNAL_SYSCALL macro, but without the need to pass the + expected argument number as second parameter. */ +#define INTERNAL_SYSCALL_CALL(nr, err, ...) \ + __SYSCALL_DISP (__INTERNAL_SYSCALL, nr, err, __VA_ARGS__) + #define __SYSCALL0(name) \ INLINE_SYSCALL (name, 0) #define __SYSCALL1(name, a1) \ @@ -41,25 +75,22 @@ #define __SYSCALL7(name, a1, a2, a3, a4, a5, a6, a7) \ INLINE_SYSCALL (name, 7, a1, a2, a3, a4, a5, a6, a7) -#define __SYSCALL_NARGS_X(a,b,c,d,e,f,g,h,n,...) n -#define __SYSCALL_NARGS(...) \ - __SYSCALL_NARGS_X (__VA_ARGS__,7,6,5,4,3,2,1,0,) -#define __SYSCALL_CONCAT_X(a,b) a##b -#define __SYSCALL_CONCAT(a,b) __SYSCALL_CONCAT_X (a, b) -#define __SYSCALL_DISP(b,...) \ - __SYSCALL_CONCAT (b,__SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__) - -#define __SYSCALL_CALL(...) __SYSCALL_DISP (__SYSCALL, __VA_ARGS__) +/* Issue a syscall defined by syscall number plus any other argument + required. Any error will be handled using arch defined macros and errno + will be set accordingly. + It is similar to INLINE_SYSCALL macro, but without the need to pass the + expected argument number as second parameter. */ +#define INLINE_SYSCALL_CALL(...) __SYSCALL_DISP (__SYSCALL, __VA_ARGS__) #define SYSCALL_CANCEL(...) \ ({ \ long int sc_ret; \ if (SINGLE_THREAD_P) \ - sc_ret = __SYSCALL_CALL (__VA_ARGS__); \ + sc_ret = INLINE_SYSCALL_CALL (__VA_ARGS__); \ else \ { \ int sc_cancel_oldtype = LIBC_CANCEL_ASYNC (); \ - sc_ret = __SYSCALL_CALL (__VA_ARGS__); \ + sc_ret = INLINE_SYSCALL_CALL (__VA_ARGS__); \ LIBC_CANCEL_RESET (sc_cancel_oldtype); \ } \ sc_ret; \