From nobody Tue Feb 10 05:27:15 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=quarantine dis=none) header.from=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1635780066; cv=none; d=zohomail.com; s=zohoarc; b=TZFiDCbZ3iJv6xo5yEx/2vAW2x4ttZExKZVFmKDJ0VBWcQyYbOvJfZ5moW2JufH5Q/9lsL5cVkBWqdvoU4r9z+n2cIzgM/JKpzxMt7EOmVIRlJ79obcJNd0t4EvA74AiSf2hK7vdV3jX2J3WSGtI+DZhZqXcVI74fNeOV+pX1HA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1635780066; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=A500M7/kbnWFZXR2FmfgKykvm8ssxpt2b8E0D411uF4=; b=dmZz5imzHS2zS2SKNAqKtOZOOz3wpNwKXf6D2JNquAyRxkMxPQpZNYEkOKq1jzxenlEJwJnsMXOPU46uuOb2aXVny98fj9zAkvAExAahR9qlLswgAIDnVEcGu3t6Cg4z24JRgW8IxCaJk5fBLwpQ1f5MewIQ6kktbJX94i4S+TU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1635780066011801.537168089493; Mon, 1 Nov 2021 08:21:06 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.219255.380068 (Exim 4.92) (envelope-from ) id 1mhZ7F-0004i0-GR; Mon, 01 Nov 2021 15:20:53 +0000 Received: by outflank-mailman (output) from mailman id 219255.380068; Mon, 01 Nov 2021 15:20:53 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mhZ7F-0004gZ-C2; Mon, 01 Nov 2021 15:20:53 +0000 Received: by outflank-mailman (input) for mailman id 219255; Mon, 01 Nov 2021 15:20:51 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1mhZ7D-0008DA-M5 for xen-devel@lists.xenproject.org; Mon, 01 Nov 2021 15:20:51 +0000 Received: from smtp-out2.suse.de (unknown [195.135.220.29]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 37c88e92-965f-4522-82e5-57e16ad5a4b0; Mon, 01 Nov 2021 15:20:24 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 96B5E1FD79; Mon, 1 Nov 2021 15:20:22 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 6CEAB13A4A; Mon, 1 Nov 2021 15:20:22 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id yJJUGbYFgGFzNwAAMHmgww (envelope-from ); Mon, 01 Nov 2021 15:20:22 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 37c88e92-965f-4522-82e5-57e16ad5a4b0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1635780022; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=A500M7/kbnWFZXR2FmfgKykvm8ssxpt2b8E0D411uF4=; b=eCWdxCK3727M8kwYM5o6Zl6+EuoS9Rx9JoN1EXtvLxq8YpHEirQjbW1jf3AJAcTv8KCSuf pzlB2R3AQwIJ5JC49OBHw4W9WXPECJxhS4jwqxmMXO5o8Poe+qAxQ1JZatwvOkS6EN4Vxi 0jg+FNFfiASDWQ5p9MCtKHO79tNmaWg= From: Juergen Gross To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Stefano Stabellini , Julien Grall , Volodymyr Babchuk Subject: [PATCH v2 12/15] xen/arm: call hypercall handlers via generated macro Date: Mon, 1 Nov 2021 16:20:12 +0100 Message-Id: <20211101152015.28488-13-jgross@suse.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20211101152015.28488-1-jgross@suse.com> References: <20211101152015.28488-1-jgross@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @suse.com) X-ZM-MESSAGEID: 1635780066657100007 Content-Type: text/plain; charset="utf-8" Instead of using a function table use the generated macros for calling the appropriate hypercall handlers. This makes the calls of the handlers type safe. For deprecated hypercalls define stub functions. Signed-off-by: Juergen Gross --- V2: - make hypercall_args[] const (Jan Beulich) --- xen/arch/arm/traps.c | 119 ++++++++++--------------------------------- 1 file changed, 26 insertions(+), 93 deletions(-) diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 7abc28848e..00af76cf14 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1337,62 +1337,20 @@ static register_t do_deprecated_hypercall(void) return -ENOSYS; } =20 -typedef register_t (*arm_hypercall_fn_t)( - register_t, register_t, register_t, register_t, register_t); - -typedef struct { - arm_hypercall_fn_t fn; - int nr_args; -} arm_hypercall_t; - -#define HYPERCALL(_name, _nr_args) \ - [ __HYPERVISOR_ ## _name ] =3D { \ - .fn =3D (arm_hypercall_fn_t) &do_ ## _name, \ - .nr_args =3D _nr_args, \ - } +long dep_sched_op_compat(int cmd, unsigned long arg) +{ + return do_deprecated_hypercall(); +} =20 -/* - * Only use this for hypercalls which were deprecated (i.e. replaced - * by something else) before Xen on ARM was created, i.e. *not* for - * hypercalls which are simply not yet used on ARM. - */ -#define HYPERCALL_DEPRECATED(_name, _nr_args) \ - [ __HYPERVISOR_##_name ] =3D { \ - .fn =3D (arm_hypercall_fn_t) &do_deprecated_hypercall, \ - .nr_args =3D _nr_args, \ - } +long dep_event_channel_op_compat(XEN_GUEST_HANDLE_PARAM(evtchn_op_t) uop) +{ + return do_deprecated_hypercall(); +} =20 -static arm_hypercall_t arm_hypercall_table[] =3D { - HYPERCALL(memory_op, 2), - HYPERCALL(domctl, 1), - HYPERCALL(sched_op, 2), - HYPERCALL_DEPRECATED(sched_op_compat, 2), - HYPERCALL(console_io, 3), - HYPERCALL(xen_version, 2), - HYPERCALL(xsm_op, 1), - HYPERCALL(event_channel_op, 2), - HYPERCALL_DEPRECATED(event_channel_op_compat, 1), - HYPERCALL(physdev_op, 2), - HYPERCALL_DEPRECATED(physdev_op_compat, 1), - HYPERCALL(sysctl, 2), - HYPERCALL(hvm_op, 2), -#ifdef CONFIG_GRANT_TABLE - HYPERCALL(grant_table_op, 3), -#endif - HYPERCALL(multicall, 2), - HYPERCALL(platform_op, 1), - HYPERCALL(vcpu_op, 3), - HYPERCALL(vm_assist, 2), -#ifdef CONFIG_ARGO - HYPERCALL(argo_op, 5), -#endif -#ifdef CONFIG_HYPFS - HYPERCALL(hypfs_op, 5), -#endif -#ifdef CONFIG_IOREQ_SERVER - HYPERCALL(dm_op, 3), -#endif -}; +long dep_physdev_op_compat(XEN_GUEST_HANDLE_PARAM(physdev_op_t) uop) +{ + return do_deprecated_hypercall(); +} =20 #ifndef NDEBUG static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code) @@ -1431,7 +1389,6 @@ static void do_debug_trap(struct cpu_user_regs *regs,= unsigned int code) #define HYPERCALL_ARG3(r) (r)->x2 #define HYPERCALL_ARG4(r) (r)->x3 #define HYPERCALL_ARG5(r) (r)->x4 -#define HYPERCALL_ARGS(r) (r)->x0, (r)->x1, (r)->x2, (r)->x3, (r)->x4 #else #define HYPERCALL_RESULT_REG(r) (r)->r0 #define HYPERCALL_ARG1(r) (r)->r0 @@ -1439,52 +1396,40 @@ static void do_debug_trap(struct cpu_user_regs *reg= s, unsigned int code) #define HYPERCALL_ARG3(r) (r)->r2 #define HYPERCALL_ARG4(r) (r)->r3 #define HYPERCALL_ARG5(r) (r)->r4 -#define HYPERCALL_ARGS(r) (r)->r0, (r)->r1, (r)->r2, (r)->r3, (r)->r4 #endif =20 +static const unsigned char hypercall_args[] =3D hypercall_args_arm; + static void do_trap_hypercall(struct cpu_user_regs *regs, register_t *nr, const union hsr hsr) { - arm_hypercall_fn_t call =3D NULL; struct vcpu *curr =3D current; =20 - BUILD_BUG_ON(NR_hypercalls < ARRAY_SIZE(arm_hypercall_table) ); - if ( hsr.iss !=3D XEN_HYPERCALL_TAG ) { gprintk(XENLOG_WARNING, "Invalid HVC imm 0x%x\n", hsr.iss); return inject_undef_exception(regs, hsr); } =20 - if ( *nr >=3D ARRAY_SIZE(arm_hypercall_table) ) - { - perfc_incr(invalid_hypercalls); - HYPERCALL_RESULT_REG(regs) =3D -ENOSYS; - return; - } - curr->hcall_preempted =3D false; =20 perfc_incra(hypercalls, *nr); - call =3D arm_hypercall_table[*nr].fn; - if ( call =3D=3D NULL ) - { - HYPERCALL_RESULT_REG(regs) =3D -ENOSYS; - return; - } =20 - HYPERCALL_RESULT_REG(regs) =3D call(HYPERCALL_ARGS(regs)); + call_handlers_arm(*nr, HYPERCALL_RESULT_REG(regs), HYPERCALL_ARG1(regs= ), + HYPERCALL_ARG2(regs), HYPERCALL_ARG3(regs), + HYPERCALL_ARG4(regs), HYPERCALL_ARG5(regs)); =20 #ifndef NDEBUG - if ( !curr->hcall_preempted ) + if ( !curr->hcall_preempted && HYPERCALL_RESULT_REG(regs) !=3D -ENOSYS= ) { /* Deliberately corrupt parameter regs used by this hypercall. */ - switch ( arm_hypercall_table[*nr].nr_args ) { + switch ( hypercall_args[*nr] ) { case 5: HYPERCALL_ARG5(regs) =3D 0xDEADBEEF; case 4: HYPERCALL_ARG4(regs) =3D 0xDEADBEEF; case 3: HYPERCALL_ARG3(regs) =3D 0xDEADBEEF; case 2: HYPERCALL_ARG2(regs) =3D 0xDEADBEEF; case 1: /* Don't clobber x0/r0 -- it's the return value */ + case 0: /* -ENOSYS case */ break; default: BUG(); } @@ -1521,7 +1466,10 @@ static bool check_multicall_32bit_clean(struct multi= call_entry *multi) { int i; =20 - for ( i =3D 0; i < arm_hypercall_table[multi->op].nr_args; i++ ) + if ( multi->op >=3D ARRAY_SIZE(hypercall_args) ) + return true; + + for ( i =3D 0; i < hypercall_args[multi->op]; i++ ) { if ( unlikely(multi->args[i] & 0xffffffff00000000ULL) ) { @@ -1538,28 +1486,13 @@ static bool check_multicall_32bit_clean(struct mult= icall_entry *multi) enum mc_disposition arch_do_multicall_call(struct mc_state *state) { struct multicall_entry *multi =3D &state->call; - arm_hypercall_fn_t call =3D NULL; - - if ( multi->op >=3D ARRAY_SIZE(arm_hypercall_table) ) - { - multi->result =3D -ENOSYS; - return mc_continue; - } - - call =3D arm_hypercall_table[multi->op].fn; - if ( call =3D=3D NULL ) - { - multi->result =3D -ENOSYS; - return mc_continue; - } =20 if ( is_32bit_domain(current->domain) && !check_multicall_32bit_clean(multi) ) return mc_continue; =20 - multi->result =3D call(multi->args[0], multi->args[1], - multi->args[2], multi->args[3], - multi->args[4]); + call_handlers_arm(multi->op, multi->result, multi->args[0], multi->arg= s[1], + multi->args[2], multi->args[3], multi->args[4]); =20 return likely(!psr_mode_is_user(guest_cpu_user_regs())) ? mc_continue : mc_preempt; --=20 2.26.2