From patchwork Fri Apr 8 20:31:51 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 8786291 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id AEF939F36E for ; Fri, 8 Apr 2016 21:01:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id AD8A220222 for ; Fri, 8 Apr 2016 21:01:51 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AA984201CD for ; Fri, 8 Apr 2016 21:01:50 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1aodUW-0002QM-8J; Fri, 08 Apr 2016 20:58:56 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1aodUU-0002OF-Bz for xen-devel@lists.xen.org; Fri, 08 Apr 2016 20:58:54 +0000 Received: from [85.158.143.35] by server-1.bemta-6.messagelabs.com id ED/54-18833-E8B18075; Fri, 08 Apr 2016 20:58:54 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprAIsWRWlGSWpSXmKPExsXitHRDpG6vNEe 4waSTshZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8a9BXsYCx4oV6zd95W1gXGhbBcjJ4eEgL/E 0kdvmUBsNgF9id0vPoHZIgLqEqc7LrJ2MXJxMAtsZJQ4+vMsG0hCWCBU4krjVjCbRUBFYs7vm ewgNq+Al8TLpXdZIYbKSZw//pMZxOYEip/ZdgYsLiTgKXF55nwWCFtN4lr/JaheQYmTM5+AxZ kFJCQOvngB1MsBNIdb4m+3/QRGvllIqmYhqVrAyLSKUb04tagstUjXWC+pKDM9oyQ3MTNH19D ATC83tbg4MT01JzGpWC85P3cTIzCkGIBgB2PHP6dDjJIcTEqivNsesocL8SXlp1RmJBZnxBeV 5qQWH2KU4eBQkuCdKsURLiRYlJqeWpGWmQMMbpi0BAePkghvOUiat7ggMbc4Mx0idYpRUUqct xokIQCSyCjNg2uDRdQlRlkpYV5GoEOEeApSi3IzS1DlXzGKczAqCfMWgkzhycwrgZv+CmgxE9 DiC/xsIItLEhFSUg2M2/VbNz26s7oiaXexXE5T+Kb/nB0Xt/v235rMpvnv217Ffq/LM2U3fVm j2FhpPXF10NpL04NOOVzdKqyts+AUT5XbBVa/3Wc15x/Mnr78QVOJcrOlkY/E9Fhnz+bbmocT PJg2xH9R7daeHtPy0oM5026fWnfey4kfmq6d+f3P8dtp1wCrc+f9lViKMxINtZiLihMBnJr7z 6MCAAA= X-Env-Sender: prvs=8997c7931=Andrew.Cooper3@citrix.com X-Msg-Ref: server-5.tower-21.messagelabs.com!1460149123!8343370!5 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 8.28; banners=-,-,- X-VirusChecked: Checked Received: (qmail 61458 invoked from network); 8 Apr 2016 20:58:53 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP; 8 Apr 2016 20:58:53 -0000 X-IronPort-AV: E=Sophos;i="5.24,454,1454976000"; d="scan'208";a="345898949" From: Andrew Cooper To: Xen-devel Date: Fri, 8 Apr 2016 21:31:51 +0100 Message-ID: <1460147517-11706-16-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1460147517-11706-1-git-send-email-andrew.cooper3@citrix.com> References: <1460147517-11706-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 X-DLP: MIA1 Cc: Andrew Cooper , Julien Grall , Ian Jackson , Stefano Stabellini Subject: [Xen-devel] [PATCH v6 15/21] tools/libxc: Modify bitmap operations to take void pointers X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The type of the pointer to a bitmap is not interesting; it does not affect the representation of the block of bits being pointed to. Make the libxc functions consistent with those in Xen, so they can work just as well with 'unsigned int *' based bitmaps. As part of doing so, change the implementation to be in terms of char rather than unsigned long. This fixes alignment concerns with ARM. Signed-off-by: Andrew Cooper Acked-by: Wei Liu Reviewed-by: Konrad Rzeszutek Wilk --- CC: Ian Jackson CC: Stefano Stabellini CC: Julien Grall v2: * New v3: * Implement in terms of char rather than unsigned long to fix alignment issues for ARM. v4: * Fix erronious calculation in bitmap_size() --- tools/libxc/xc_bitops.h | 37 ++++++++++++++++++++----------------- tools/libxc/xc_misc.c | 3 +++ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/tools/libxc/xc_bitops.h b/tools/libxc/xc_bitops.h index cd749f4..3e7a544 100644 --- a/tools/libxc/xc_bitops.h +++ b/tools/libxc/xc_bitops.h @@ -6,70 +6,73 @@ #include #include +/* Needed by several includees, but no longer used for bitops. */ #define BITS_PER_LONG (sizeof(unsigned long) * 8) #define ORDER_LONG (sizeof(unsigned long) == 4 ? 5 : 6) -#define BITMAP_ENTRY(_nr,_bmap) ((_bmap))[(_nr)/BITS_PER_LONG] -#define BITMAP_SHIFT(_nr) ((_nr) % BITS_PER_LONG) +#define BITMAP_ENTRY(_nr,_bmap) ((_bmap))[(_nr) / 8] +#define BITMAP_SHIFT(_nr) ((_nr) % 8) /* calculate required space for number of longs needed to hold nr_bits */ static inline int bitmap_size(int nr_bits) { - int nr_long, nr_bytes; - nr_long = (nr_bits + BITS_PER_LONG - 1) >> ORDER_LONG; - nr_bytes = nr_long * sizeof(unsigned long); - return nr_bytes; + return (nr_bits + 7) / 8; } -static inline unsigned long *bitmap_alloc(int nr_bits) +static inline void *bitmap_alloc(int nr_bits) { return calloc(1, bitmap_size(nr_bits)); } -static inline void bitmap_set(unsigned long *addr, int nr_bits) +static inline void bitmap_set(void *addr, int nr_bits) { memset(addr, 0xff, bitmap_size(nr_bits)); } -static inline void bitmap_clear(unsigned long *addr, int nr_bits) +static inline void bitmap_clear(void *addr, int nr_bits) { memset(addr, 0, bitmap_size(nr_bits)); } -static inline int test_bit(int nr, unsigned long *addr) +static inline int test_bit(int nr, const void *_addr) { + const char *addr = _addr; return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1; } -static inline void clear_bit(int nr, unsigned long *addr) +static inline void clear_bit(int nr, void *_addr) { + char *addr = _addr; BITMAP_ENTRY(nr, addr) &= ~(1UL << BITMAP_SHIFT(nr)); } -static inline void set_bit(int nr, unsigned long *addr) +static inline void set_bit(int nr, void *_addr) { + char *addr = _addr; BITMAP_ENTRY(nr, addr) |= (1UL << BITMAP_SHIFT(nr)); } -static inline int test_and_clear_bit(int nr, unsigned long *addr) +static inline int test_and_clear_bit(int nr, void *addr) { int oldbit = test_bit(nr, addr); clear_bit(nr, addr); return oldbit; } -static inline int test_and_set_bit(int nr, unsigned long *addr) +static inline int test_and_set_bit(int nr, void *addr) { int oldbit = test_bit(nr, addr); set_bit(nr, addr); return oldbit; } -static inline void bitmap_or(unsigned long *dst, const unsigned long *other, +static inline void bitmap_or(void *_dst, const void *_other, int nr_bits) { - int i, nr_longs = (bitmap_size(nr_bits) / sizeof(unsigned long)); - for ( i = 0; i < nr_longs; ++i ) + char *dst = _dst; + const char *other = _other; + int i; + for ( i = 0; i < bitmap_size(nr_bits); ++i ) dst[i] |= other[i]; } diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c index 124537b..7d997d9 100644 --- a/tools/libxc/xc_misc.c +++ b/tools/libxc/xc_misc.c @@ -99,6 +99,9 @@ xc_cpumap_t xc_cpumap_alloc(xc_interface *xch) * byte aligned and so we need byte versions for architectures which do * not support misaligned accesses (which is basically everyone * but x86, although even on x86 it can be inefficient). + * + * NOTE: The xc_bitops macros now use byte alignment. + * TODO: Clean up the users of this interface. */ #define BITS_PER_CPUMAP(map) (sizeof(*map) * 8) #define CPUMAP_ENTRY(cpu, map) ((map))[(cpu) / BITS_PER_CPUMAP(map)]