From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47F14C433E0 for ; Mon, 25 May 2020 10:55:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1F4562078B for ; Mon, 25 May 2020 10:55:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1590404138; bh=tijjKaQGw1GCkKwwvpL3QGBA9oFShZay8rBCAWS2hlI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:List-ID:From; b=Ix/S7XFS9I25v/Mz6YZdvv3FiMI5k6M3G/ypJ2T00FftkfV19BQCrP2GuweN82X8f rpmsDKOUKWQQ1n4pGBjYjKQ0cxMhKhQqFXpn49pJWeLEhvcTJW6RjIyytznHuCCx54 IKQDcG0A+j6gxV2NoIAHp9FecsYu02gvriPQK7ys= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390005AbgEYKzh (ORCPT ); Mon, 25 May 2020 06:55:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:36978 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389897AbgEYKzg (ORCPT ); Mon, 25 May 2020 06:55:36 -0400 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id DBA942073B; Mon, 25 May 2020 10:55:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1590404136; bh=tijjKaQGw1GCkKwwvpL3QGBA9oFShZay8rBCAWS2hlI=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=fSLDSNxRP5ppZlNQU3AtSn7fwMWkuL+my77sSo9NOVls+WS1zcFOQYIODUeotZfBA SEKZwcENx/mcWHy+46fT320nXCEYHVw/BIfdrvJqcJdFbF/ySxGDKKz++3D5HHbq2R azIOIQ7slcmjfjac92eW+lJDoJImSmaBqr4/lIJ8= Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=wait-a-minute.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jdAla-00F8XK-85; Mon, 25 May 2020 11:55:34 +0100 Date: Mon, 25 May 2020 11:55:33 +0100 Message-ID: <87tv04z3kq.wl-maz@kernel.org> From: Marc Zyngier To: Oscar Carter Cc: Kees Cook , Thomas Gleixner , Jason Cooper , kernel-hardening@lists.openwall.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] drivers/irqchip: Remove function callback casts In-Reply-To: <20200524162220.10186-1-oscar.carter@gmx.com> References: <20200524162220.10186-1-oscar.carter@gmx.com> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL/10.8 EasyPG/1.0.0 Emacs/26 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=US-ASCII X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: oscar.carter@gmx.com, keescook@chromium.org, tglx@linutronix.de, jason@lakedaemon.net, kernel-hardening@lists.openwall.com, linux-kernel@vger.kernel.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, 24 May 2020 17:22:20 +0100, Oscar Carter wrote: > > In an effort to enable -Wcast-function-type in the top-level Makefile to > support Control Flow Integrity builds, remove all the function callback > casts. > > To do this, create a new macro called ACPI_DECLARE_SUBTABLE_PROBE_ENTRY > to initialize the acpi_probe_entry struct using the probe_subtbl field > instead of the probe_table field. Then, modify the IRQCHIP_ACPI_DECLARE > macro to use this new defined macro. > > Even though these two commented fields are part of a union, this is > necessary to avoid function cast mismatches. That is, due to the > IRQCHIP_ACPI_DECLARE invocations use as last parameter a function with > the protoype "int (*func)(struct acpi_subtable_header *, const unsigned > long)" it's necessary that this macro initialize the probe_subtbl field > of the acpi_probe_entry struct and not the probe_table field. > > Signed-off-by: Oscar Carter > --- > Changelog v1->v2 > - Add more details in the commit changelog to clarify the changes (Marc > Zyngier) > - Declare a new macro called ACPI_DECLARE_SUBTABLE_PROBE_ENTRY (Marc > Zyngier) > - In the IRQCHIP_ACPI_DECLARE use the new defined macro (Marc Zyngier) > > include/linux/acpi.h | 11 +++++++++++ You now need to Cc the ACPI maintainers. > include/linux/irqchip.h | 5 +++-- > 2 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > index d661cd0ee64d..fed49b276a90 100644 > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -1154,6 +1154,17 @@ struct acpi_probe_entry { > .driver_data = data, \ > } > > +#define ACPI_DECLARE_SUBTABLE_PROBE_ENTRY(table, name, table_id, \ > + subtable, valid, data, fn) \ > + static const struct acpi_probe_entry __acpi_probe_##name \ > + __used __section(__##table##_acpi_probe_table) = { \ > + .id = table_id, \ > + .type = subtable, \ > + .subtable_valid = valid, \ > + .probe_subtbl = (acpi_tbl_entry_handler)fn, \ It strikes me that under the guise of removing function casts, you are actually adding one! And this cast is actually hiding all sorts of sins (remove it, and see things exploding). I've fixed it with the patch below (ACPI is such a mess of data structure case...). diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index d7006ef18a0d..3870e9d4d3a8 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -2117,7 +2117,7 @@ static void __init gic_acpi_setup_kvm_info(void) } static int __init -gic_acpi_init(struct acpi_subtable_header *header, const unsigned long end) +gic_acpi_init(union acpi_subtable_headers *header, const unsigned long end) { struct acpi_madt_generic_distributor *dist; struct fwnode_handle *domain_handle; diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 30ab623343d3..fc431857ce90 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c @@ -1593,7 +1593,7 @@ static void __init gic_acpi_setup_kvm_info(void) gic_set_kvm_info(&gic_v2_kvm_info); } -static int __init gic_v2_acpi_init(struct acpi_subtable_header *header, +static int __init gic_v2_acpi_init(union acpi_subtable_headers *header, const unsigned long end) { struct acpi_madt_generic_distributor *dist; diff --git a/include/linux/acpi.h b/include/linux/acpi.h index fed49b276a90..4f4ddbfce3d3 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1150,7 +1150,7 @@ struct acpi_probe_entry { .id = table_id, \ .type = subtable, \ .subtable_valid = valid, \ - .probe_table = (acpi_tbl_table_handler)fn, \ + .probe_table = fn, \ .driver_data = data, \ } @@ -1161,7 +1161,7 @@ struct acpi_probe_entry { .id = table_id, \ .type = subtable, \ .subtable_valid = valid, \ - .probe_subtbl = (acpi_tbl_entry_handler)fn, \ + .probe_subtbl = fn, \ .driver_data = data, \ } Thanks, M. -- Without deviation from the norm, progress is not possible.