From patchwork Tue Feb 6 20:30:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870077 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="Zi8zDe62"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbbmZ1Rd1z9s8J for ; Wed, 7 Feb 2018 07:34:54 +1100 (AEDT) Received: from localhost ([::1]:59027 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9x6-0004Ab-7v for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:34:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44545) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tY-0000Q5-De for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tV-0002xj-FY for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:12 -0500 Received: from mail-eopbgr00138.outbound.protection.outlook.com ([40.107.0.138]:58112 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tV-0002u4-8P for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:09 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=9E2NpJyY2+IsT/41PofkY+zSYZNnWyZKsGRkqMm66v4=; b=Zi8zDe62wPASg0C92fuWzW9SnAkj21X8WKxju/BrlxdxPyA7GyYX1AfyDadOJFzP3RDXNoczXcBEuWyZ1pnuOEh+VEkcPszeSkRSFK0QSNScW7Jj8CngA0QIyQCDXSUEqLWBc2zhSO0eDs85/7DNQkpXZuHt8RXKStaXXC+RS10= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:04 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:15 +0300 Message-Id: <20180206203048.11096-2-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 7419507c-c43b-4678-8024-08d56da08c60 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:9hvmJsMNFhWIWFTTqtGV+aDbpTH4KPePtEljs01b4hN2LxM7VNevT20FhTWOj5G5D3t8mN2vuq2LupiebNTG+QFmztlCjvDDjs6CBeNrZl2cQUlC3LMriju5wgegh/PHkmtn/xIWpMGUo7TND4YlzveCHmnkgHgkZ5OdoJ8qZ2XDmYm3TJiaHnf6CXQKnMcCc1HBmYPJCm6NruTaALrBzxfm3Z/tWg9bArgQGWZ/htee83CfJhf4q/KhrSiSSF6M; 25:w5jlOqkzvBNW+3en5KaIFnR+whyY+RXX5GX1WT3yPlxC/k5VYTNM3qnnoNXHcXfts/ZjrvrcvwXgHAISEkSTFhgPxdN57FojcWJ2j5mGdZDUuKNCPsHTKR6JeYszxfPYq3R43ayLyo5ihyQiumgB91pPEmppoCjE5NB5/Dg6505KXMEW1DFeN2r1i2TxTKiVtKFUAcltDh7s6Mrx0hCnnsYd6HMOq7kAIgcsUjLqRp7S6qYLYFQMf+oz9RcDEXTq+nmK075GAS5+MnXJjNvHca6pbjxKXDgOxqOAllPWaXmFVoFTavVzH8/DdPx4DGiCUajeSXxG2uP2siOIRBjBOA==; 31:bMx8JzvFXx8vtuAqUsdNHCy8kh2GUES7i4v88oIo5mlApFsfjE11GhB7nupyLDRpHO/o/kLjxcKvMSV/yb7CHK/qxapS0gaIvTdTYrlILtipByVVDgUMxs0Z9JmQQ3Sqx8o7zh46XWXIaefImiZLcF+iKBw/ku9phoL0mOBHmaZ/+GjF2vpmVgQSBMwdekC9TN4PJIIowUvwXalMxENp8l/WHvxm3ee6X8UA5uVvIXA= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:RoqokXIfi1PE7wqhBUUSltDonEiiVQAl/pILrgB6KAiXe4Db142yPrz3/oycfEQFssG4PAySdL2PaJEWERjBR7jCeId1m8OVOUY6Gg77cbDv0eFc8CLWiN6On5SPIgGmScd5tOWeUBUvqZFRXWjEbkcnIvZCmmQbvPulW7wr6f2ILQQrPHfakPl8Kd6o4rg0YI5uaJejRxg3js3MDRr61VtNnQdsIHVMwIcsqwnsTXpTxo5cdkJ4bNYNyc8qQrqHbqk6M1Ai/MUrGYQh62hX0+axViJAynNxALBdLGVD2LZbc+MQF/JObP+MN1lue+Cv+9UmJJe4kkq+vb/qlR8ffm4EOgbhxG1Vbx+Wk5b4LGmkd2DUpcBwK6zcJQT9ASZcn7i2KiUdpFWM2oTEZNpPEqU8CQI9Wou2DHsFY2NzpqA=; 4:TNVILboUwoJeqAanRvA7gTx+rgKITG4wL71eQioM6WSAX5FMdCZ+5Yu6coLEiGESSqXRgbYb7DRKVll7FBrI1RnrSHhvGoA5SNaxstKzHELWpd10Z63zR7AxyxqHmw/cAkBtbyocjdW++Xr53W7W+qH8RWAcJKhMgre7b08mG2SVzcQnrR0GwJ93pfrsRqwoVXQ1pgUL63uBCUszsskv7mWstLzJXxM0SaR1enhJJDewOzM30mgXQxtGPhIy3QaYZXfeYZOZxUOnniPkpQQF5w== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:XZwgMCxnuGqhR5oiVc9CpXShMR4/xMIBKqL4fWY?= v1c6e42hKBDD0QSTNwatq41nqoZOKqXbM0HYrNrVJKnG4pRzbqgBmDlSBkUbWW0GRCT/AxFaHbWEURd1rMLduQWoG2aqZj4aMs8thmAxUeQV5VZr3rUZQW7dWhIsZqY6B0JI+HGT3sJQkf/6dbjVIWt+OoRhxrRSTpsrRjJi3ZXbM1SaiGX3GRLTjoh1ylKmGLrgl39XlPR98lVh5YOL7P6mfEchUkrocnimFzfokhmUgvKE7SnYioULTp09S3ks/AwuujPtm4om61CsldV8q+FSVqejKVFij1svhoWJgV01aK5VvGy77wT4+ajs4hAfW8BYyYNsxrkTRAcaT8yZ/H4YNj4pROLqE1UMe4HEPV3vsna5lugRN1PHagViaPLT/QVzgG5wSz3B9B8BBy7X2dUkseng68pgiUgUlqXKdiUcCZS3n3h7uIgXn6uczKZoFz/IMcUwcZ+Aprj63213FhEiCRRuW5c8ZX2NRP/JLPYkyYIkp+Syk0wGg3Y3UFThf9wCquWbgOoHk4szIYzM+EkC0+oQPBWkqJ0lmhvm/yizpm5XU7GVEwyAOtFbc9sv0GG528jL/4f+ORCI3ui9a6t9B4acBnLAzSWwQumbrprJrL9zSI3iHTvh7QAERKjfrdZTGSuN6SYeTWO+jabA+hlqJCfyDTwCUBG1PRyQgbPbeGj0udAt9R0ppDUNcOmR1qJNkIOZ/OXkGYFTTWWA3oW0DXbq+TCxvxUIfeNSUdAKZd9S4g4rrHMzY5YREEzHfci19U23jPSc6MiSQZpC+x7d5Dhdl82XMqXYnzcYB3XNy7rD8HErnZTQhg6n/X+BsbhRlKLbPNoz79TqDbDmrppZ5hACvKP8+30wA1Vi8vyOnzX367TtrVWtG1DJ1QGvEYje3/z0Ou6gLaHmeVZlCDlRqYoU7QFYcVxrSChEtFzviNCtMS14qlGVYPON/D2HMAkSj4y+9HpElfgyxeUD2qVg0BBlf1tLWtRdTWG8zT12izGzr1t+C4pnmp6xY9d4HTK41BaAWgLyAdxQ1hfsJec63S+eHbCZpG1IWob5XCnHxOJKswnIBrQfCaRTCOyRqXZiUf/EQ02FjG0c3+w2XXO7PpFwfmyeps3EH4jtPlPm4yRaiMMmdSdLtIR8eAfaOdbYqj2RnL4P+P/ysjQtE20CflveGtpM3CEa2euH7oQRhY1KQgS6uxk9XGky5UoJ8VXeCG4f/BMS5i60v2bCd7KvhGckNWxYc2bLidN/FvbZRAFCb57oLktvpXwTKlQYJbfM= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:vaTa4woykgjyOeyThpZdsAvzqBdfUWVIt0w/9EvMQw+xTeDVa+06TADdKT4ur9emeb3dQ+XL3dM3GqcQ7YOV/SyMN8LokP+EwUqv2N99IIPvmlb+Po1nVKd1vyaMIZrVcCSueWUuOoVpPLJYqope5/DMjcxvmFfEFfUI7myMdJRNJsSzdl59WzKD/zfRGewnlEJkzgXuZrMmF4Omu/qsepf/tqkIAW8ZW7uIeA+tstnSdCqzn1euY/fx1AxvZj2GgUK2lOdd0ddmav1VbihBW9z4nVq3ykJ6Nm/YqLVoJUe/ERZSgOIrA7xzwITJnqeg+FzYV56SkWDjcDoNh49vLVVCYIAcXeVVIW3hRxVy8lA=; 5:nSYjeGHVHNmCa+Varp8CXoKpFxJkyydmDPGgixojcKBf06qgpQX2n35aOkXiHjtUNuvORN/u0eTQ2lRpyTOMySj9l3IDcZI3rUJ+OLSMKfZgv6cvQhVp+UOZEmFz5YWWccWRhLG+JOp2FqTs9rdEiLlakuMZjXeUeT7GdduqEw0=; 24:iNAIGCAnukfqMrPFP7f29OX4HTqH6lLQKC7JJuqyYKPgzjRC/9AXR9M+Snj8WTwrSN3XSxJkKcM0msW/1wFgxhuX64x6ahU30aR1NH56T3I=; 7:rM8Df1P9F4vHtVwxy3yDcGP3fPzW4mLZylppit2gR1CVi7vMZQUrKzyC9UClUcHzqrmTu6meK7ttdah23blMYZ8L5t8+cMWqmxR1yFykN9myOYADfH0iUd4Bk3VP8V66C4+Ax3sY+eUrd+2GUf7NtllFeNMtPpjMqkXaMGrJXRNmWUL0moL+36jZ+BPYXfab/4I/46vacCR0NSErdB+q57FSeqpVHW0nzHV1J+tO65quRI1fJNoA3MRlVQCgUGoM SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:hzBUZGIV3KYvMhxz96rqKxpua8D+mrfNWE4YGHNKxA6cu6obmGxxvgedkmOWhZ+Rux8ZCgTzjDPXhSMt7vkED5+bmh9HVzb+o0/Zn7Ryn5ACqRM1XJEdhkCTx/ef14050C7vpT3I7Ju9Cz24S0cN87BFMAdDZPveIf0B/r0BdUQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:04.7778 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 7419507c-c43b-4678-8024-08d56da08c60 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.138 Subject: [Qemu-devel] [RFC PATCH 01/34] hyperv: ensure VP index equal to QEMU cpu_index X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Hyper-V identifies vCPUs by Virtual Processor (VP) index which can be queried by the guest via HV_X64_MSR_VP_INDEX msr. It is defined by the spec as a sequential number which can't exceed the maximum number of vCPUs per VM. It has to be owned by QEMU in order to preserve it across migration. However, the initial implementation in KVM didn't allow to set this msr, and KVM used its own notion of VP index. Fortunately, the way vCPUs are created in QEMU/KVM makes it likely that the KVM value is equal to QEMU cpu_index. So choose cpu_index as the value for vp_index, and push that to KVM on kernels that support setting the msr. On older ones that don't, query the kernel value and assert that it's in sync with QEMU. Besides, since handling errors from vCPU init at hotplug time is impossible, disable vCPU hotplug. This patch also introduces accessor functions to wrap the mapping between a vCPU and its vp_index. Besides, a few variables are renamed to avoid confusion of vp_index with vcpu_id (== apic_id). Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 5 ++++- target/i386/hyperv.c | 16 +++++++++++++--- target/i386/kvm.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index 0c3b562018..82f4757975 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -32,11 +32,14 @@ struct HvSintRoute { int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit); -HvSintRoute *kvm_hv_sint_route_create(uint32_t vcpu_id, uint32_t sint, +HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, HvSintAckClb sint_ack_clb); void kvm_hv_sint_route_destroy(HvSintRoute *sint_route); int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route); +uint32_t hyperv_vp_index(X86CPU *cpu); +X86CPU *hyperv_find_vcpu(uint32_t vp_index); + #endif diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index a050c9d2d1..c9a4bb539d 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -16,6 +16,16 @@ #include "hyperv.h" #include "hyperv-proto.h" +uint32_t hyperv_vp_index(X86CPU *cpu) +{ + return CPU(cpu)->cpu_index; +} + +X86CPU *hyperv_find_vcpu(uint32_t vp_index) +{ + return X86_CPU(qemu_get_cpu(vp_index)); +} + int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) { CPUX86State *env = &cpu->env; @@ -72,7 +82,7 @@ static void kvm_hv_sint_ack_handler(EventNotifier *notifier) } } -HvSintRoute *kvm_hv_sint_route_create(uint32_t vcpu_id, uint32_t sint, +HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, HvSintAckClb sint_ack_clb) { HvSintRoute *sint_route; @@ -92,7 +102,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vcpu_id, uint32_t sint, event_notifier_set_handler(&sint_route->sint_ack_notifier, kvm_hv_sint_ack_handler); - gsi = kvm_irqchip_add_hv_sint_route(kvm_state, vcpu_id, sint); + gsi = kvm_irqchip_add_hv_sint_route(kvm_state, vp_index, sint); if (gsi < 0) { goto err_gsi; } @@ -105,7 +115,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vcpu_id, uint32_t sint, } sint_route->gsi = gsi; sint_route->sint_ack_clb = sint_ack_clb; - sint_route->vcpu_id = vcpu_id; + sint_route->vcpu_id = vp_index; sint_route->sint = sint; return sint_route; diff --git a/target/i386/kvm.c b/target/i386/kvm.c index ad4b159b28..dfce60e5cf 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -86,6 +86,7 @@ static bool has_msr_hv_hypercall; static bool has_msr_hv_crash; static bool has_msr_hv_reset; static bool has_msr_hv_vpindex; +static bool is_hv_vpindex_settable; static bool has_msr_hv_runtime; static bool has_msr_hv_synic; static bool has_msr_hv_stimer; @@ -682,6 +683,43 @@ static int hyperv_handle_properties(CPUState *cs) return 0; } +static int hyperv_init_vcpu(X86CPU *cpu) +{ + if (cpu->hyperv_vpindex && !is_hv_vpindex_settable) { + /* + * the kernel doesn't support setting vp_index; assert that its value + * is in sync + */ + int ret; + struct { + struct kvm_msrs info; + struct kvm_msr_entry entries[1]; + } msr_data = { + .info.nmsrs = 1, + .entries[0].index = HV_X64_MSR_VP_INDEX, + }; + + /* + * handling errors from vcpu init at hotplug time is impossible, so + * disallow cpu hotplug + */ + MACHINE_GET_CLASS(current_machine)->hot_add_cpu = NULL; + + ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_MSRS, &msr_data); + if (ret < 0) { + return ret; + } + assert(ret == 1); + + if (msr_data.entries[0].data != hyperv_vp_index(cpu)) { + fprintf(stderr, "kernel's vp_index != QEMU's vp_index\n"); + return -ENXIO; + } + } + + return 0; +} + static Error *invtsc_mig_blocker; #define KVM_MAX_CPUID_ENTRIES 100 @@ -1038,6 +1076,13 @@ int kvm_arch_init_vcpu(CPUState *cs) has_msr_tsc_aux = false; } + if (hyperv_enabled(cpu)) { + r = hyperv_init_vcpu(cpu); + if (r) { + goto fail; + } + } + return 0; fail: @@ -1220,6 +1265,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s) has_pit_state2 = kvm_check_extension(s, KVM_CAP_PIT_STATE2); #endif + is_hv_vpindex_settable = kvm_check_extension(s, KVM_CAP_HYPERV_VP_INDEX); + ret = kvm_get_supported_msrs(s); if (ret < 0) { return ret; @@ -1731,6 +1778,10 @@ static int kvm_put_msrs(X86CPU *cpu, int level) if (has_msr_hv_runtime) { kvm_msr_entry_add(cpu, HV_X64_MSR_VP_RUNTIME, env->msr_hv_runtime); } + if (cpu->hyperv_vpindex && has_msr_hv_vpindex && + is_hv_vpindex_settable) { + kvm_msr_entry_add(cpu, HV_X64_MSR_VP_INDEX, hyperv_vp_index(cpu)); + } if (cpu->hyperv_synic) { int j; From patchwork Tue Feb 6 20:30:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870076 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="Yqo4lASz"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbbmW0QHqz9t0m for ; Wed, 7 Feb 2018 07:34:51 +1100 (AEDT) Received: from localhost ([::1]:59023 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9x3-00043G-44 for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:34:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44591) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tb-0000TQ-B8 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:16 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tX-000302-Rz for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:15 -0500 Received: from mail-db5eur01on0133.outbound.protection.outlook.com ([104.47.2.133]:39312 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tX-0002z3-H1 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=TkySDg6eRzaOYNWvNFRZgkozAMJx1cvIWRPz06iWAXo=; b=Yqo4lASzRhLo6PKRjqBnOBQHm3Pj5njSwLnilcmFr6T0rsAWOrlCLSmAzfoaOdsdf7FHZjJPddik3yGZhj2IqXdHLjVut/t58xok4bqrKeqejnEAvoesjKjphxdaSRdgjErga+uSEobQOHqSwRvpE1OtCHLxqvgIL4zkkzB39lE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:06 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:16 +0300 Message-Id: <20180206203048.11096-3-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 11bf7b0e-abf8-4e96-453a-08d56da08e2a X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:4WynuUZdI02ss4Jmq56Zm6tQiZqHuYHUGFjr85sByS28/wzkxv5PYeOefNZXo/C68U8Qjs1EI4FRBCn3KHSC/IWz+/b/cnTpYqqTS0hFRugPLn7cUzA/W1yLcvNktxBNw42q+s2RmDDftCBZYJv7C+faq8/jMyuoPbVCXt5pyDShFqAI+Rh5P4SxXD5jSrY4rsNnslD3os53haOBX/Fu02Zfj4atGeHfzxlqhou8xzr1SpWNf4Nz0AKonv8J64lG; 25:6uMAY1QfwyZMIMgRMgMUw+i3BOmTnmgf7AY8dsdqSZha/5lVbsNEM/OGC7NA980OI7LJ25hpA31mFKxdJ6/qFOB8f9nZVW8zpo6bxZSL4xnuVDVW7ibk/RXpvndi2LGHmYC9SemajOg8+M3v9051JeMcGYQlRvm2b+0HhzUjwb6y1UXQUR6qS06kjclC9EwTHA/oi2K4IwvLLOCpZsDVQtLbtHKlfnR4DCaVgBebUjVZ89dIYHlE6sqMXBmQaMOu2VlXmlYCvo+XjE4my2pjfmdU/9a74yI0/geY81bIJYprEJeU/KkUNci81NQnHrV5lQnobgOKqDVJJISJ6/ROIA==; 31:DKUCnSbzBZtqOfTrsYimW0ZGFh90GMaeaVFMB0MiTZ96R2h7uurp2ljKyKhRI5yRRAfrlEQJDxNDB/itQFKElZlyNyNbA8Y2kjQkdZKwL0ccEPsGiUSThLSYYKYHbt88r2QusTLBMSV43HypHW40M0Mw0r3NbtHRlaChL1VJv14Gdew0raCHmGQDsJEivFpYwK6UKAiLl0oikW6M1UUgxBNjWq9NSwVx76B6EWUYAsw= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:m14akM4HEjX58sfDjuk/O1CEg/SKA2DtNTLAOyPxT+YRgz41PoJ8RRSR7soojw5ScoF6v5V8o3dinb/d2dVW/LAnMiyHL0jirl8dUVCnApefyp0MEmyNcBX7ByXa+UqpXB+rqTCZa1cgARJmrDhUoOc88jFTcBfuohfBcEggmwEdAiC2T6SaElEDrnkQ9rfRzxKrgLVgza2+wN4awJcKk3US/lktvECgWKAIBtYAwXvVHvJQBHIbTnUxnAIyA2wgi1FLujmHgbxq2hdsbuZcFeQnhLirfAXmDOBFJtZlKlPCGUDJfjJW4+bkyER48w3rJ6ZguBQ1GwtyCbkc4IKprGqLVykOxjetYeGCylTYlfEhTiD/OsTsx72/LhBq4icCFnj29n73kM6jW9pE8uSgW0B1GG4aUYXenxcn+vXZ0yc=; 4:mX7Oaok9ZS4Qa81pBW1ifyzx5M/0ERjwxaanyLbmZcyFpN1ayAzqIL4VRPdP0OIflYTSiQ4gIO7WplVLRugHdP6tc6P9k9dsnVClLxJ9WwIzNdLYrFoUb6h9wfgt0105wqJndOlU/quzgIJJmhM4zQsykByb2qNKIp5ttIypbR1ck9oJdYyfDot9LPZ7R5rWLmUkj8tPBOKHzvNwBp/9FFM95t2qmq3GP9clxE+7rj0NMjPuYcaM5pb32f6TGTa+/QlKpBXZjpXnwklgwuiplw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:edeTE4ZWULOUoy1EaI58WKqHK4ok/MdabAf3m2V?= TIH182U5mm8nsEAZcbDmoLQ3JgGCGfwMWm56Rdj0v6eyXCyBTJFHS2ud+x2YduU5/1m55Vw3fo3HjFBXJ2HXXwDToRwiqdiocx3c5PHkV0XlbTQVMK2cKCJft1/+nSj86+zclcnycXPSz2TNGPRMg9aX8WtyRJ15wf3On0L9fppiMD0FxJKFxaYux/UgY7ouSdVmFzM6MilvVKyacwCnjg/j0vCDoD+pjkqDQRtpW4gW0LCvRRqLtNR72EsdvPPD6x37SJXe9uzCPHihEMdet3KXDcLijziY0mN2IojxD36hNURsl1p8Qz1fx1m9V/PWwMgIn7ON1i6ZwCablbUIT3GJl6YgTEBDEBUqtykv1/gEl/Zcc5Ua1XnB9FCKS68A0EkWwJT6Ogs0MhiG69W7hXne6fhgtvnxym1p+y4XALj9AO2dQNDql+GY8+kBPTgYGZOqikTfbVEyL+ynoVQfLq2leYisa1yWmpHbduxAgPyf7rTJa2OoE7a7De3ML2jbJQzRHJUuDY8KezFXZY511aqlUFx2ZNBwAZ22iSjBW9wPypqC+tQz4sdI60hoogqbuGicKFsz0hnvaN2c8+lFM7ES9F4g+o1E+GwQxAKcZilKhHeJcs2Am3yGMAf03fLLYnnPpiAjz/ilMIZEevLRmn2YeptY18eGxSh+1fFBSMWvuMzzjh1OaacHLdzmLhSs1KNBF8d/z8LPDD3kwLAwyIKjx0m68ULbCzxJfa/NkCXJDJ3RnceefPxx95Zc+U2ST04Bjv//Bmcg1YjX/9MLVFfIEq/HTWMgTSRr6LdSftqErkEDLhLiVdyDWnNdpWzuoIF8ypqkeHebf8JIR/CV+SHAtlPMId7/zry+hvigb1egFNIRZ1PAZGwJ98IiuRZVa8aUotq+sBf/OHq5/53/Oy76cVHDoxEfDaNZgY/t66dLh9RuNaa30E+5yV4C3zDMLLrITr+Vxh+txqziuFvuqF0sh3hEw/ozmdFLv41p0monNJepEkgMBcJH/Rtjou/r2o5lJ+5ICb7v0BIpWRDj2pxwoJXxDryFeRO17X269+ssb5emIPneIqpaEkns5xVFBSS8ZHJqPNqEu3f3u6pD4QEQLdvoSHWXFstF+VHhvu2OVOfIID9b352c0NgeoMczlCcjbmSzRELu5xXKk0P+nozmD7CC2zjB9idredIZ9wq7w+NRTuCOxJUUXPJXxL7q2x8MWYL2s+X4m4hJTKNPP7WS5ZRRVItRse/9wDoIa3pYKTw== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:RxPSM4tF5ajLmwnrC0iearfL1ShtzJC7R9YYJ7B2AXibL542tqpjSGhIfExIRENOFjait4Z/f5pftMXfkccp07jyP3I1N+S8JgJz5nlh6+GthnzptNIsS049LVvfByOLsX6GkAGcCQ4GBjGn3XxqoOBVwOF76hMbUJfrZYN1XwJdYP/++8kkEEuCd+Zbh4DniHpWOnmBq3xt+6XVYsuNoLRDbgjWK0viYHwNLIOj/Z0PeEeEGObCWtzvZrLlG6s1iLiu1g65Um25bNDvPlWax8LpHGEYC99tIUVj4Rlcl/5i1n26NIk1eIdDWUkW7s71DFQ4anKg9+yWpRmCN/NQ4lf92CFKMtMRIkw/kC2QFQE=; 5:gpCMw8f0E9bektocu8oezK2z0m118Cey/MdJcNuXKW9ABNBNL8I16Yk+8DCGQeRm7iOpQi3JXUwClkEP4lnnJZVZgkgASHAuWf5d3Ssnjwsgi1Y7IPahTLXLehYBkNqFNgJJ4wBN/20miE91HtlfwYvfcK7oJgdhoCgztulg188=; 24:t8dGDjUd0gTcRl0w39ZksEcJ/yzx2dM/kTXNyON1gwCw4v66YDgcSpvkINSQCHyQlzXJk/EppTXHxEcSoA79WhH38a7bTB6JoZDTVgIm0JQ=; 7:o+vyk3ejdAiL+2oMY6YqfdNv6TxNxjWlDUuQqzPAnFSPfN84Tbb6u0RILbCU3D5IAiePz9KDXdfGH9HeMtD353PFyBPBd7clJrnB/clr7mvy0I/z2aLQxkf95r6FL7ajBgjzKR6/8XjKHnUDZLjBH7QiV1A27Q4fYVBAZZytdXUO74iD/d2ZYfHfu7GcWFZDvxX3jQttSZ+Z+3zI1OIQvVbUx7cYFo1SmDFYzdGQ6/ECEslDAiqoZx9I07kvgV9h SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:mN7ihd/yEnU11x7VEl3z3ZxydvTxo25nVU6+UX+4FPsT/XhqurKg9hDXjPTNnxskAaKqCu2NvacKGw02Hmb2S8asA6cyqsvBglYPOgNb1TB1pfQUziLZnKuhoSfPXk6SO+vHOjwB5iDiV23PJDfiP+PB1Ywd01BhXPo0QGLx6WM= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:06.9029 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 11bf7b0e-abf8-4e96-453a-08d56da08e2a X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.133 Subject: [Qemu-devel] [RFC PATCH 02/34] hyperv_testdev: refactor for readability X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Make hyperv_testdev slightly easier to follow and enhance in future. For that, put the hyperv sint routes (wrapped in a helper structure) on a linked list rather than a fixed-size array. Signed-off-by: Roman Kagan --- hw/misc/hyperv_testdev.c | 114 ++++++++++++++++++++++------------------------- 1 file changed, 53 insertions(+), 61 deletions(-) diff --git a/hw/misc/hyperv_testdev.c b/hw/misc/hyperv_testdev.c index dbd7cdda07..b47af477cb 100644 --- a/hw/misc/hyperv_testdev.c +++ b/hw/misc/hyperv_testdev.c @@ -12,6 +12,7 @@ */ #include "qemu/osdep.h" +#include "qemu/queue.h" #include #include "hw/hw.h" #include "hw/qdev.h" @@ -20,12 +21,17 @@ #include "target/i386/hyperv.h" #include "kvm_i386.h" -#define HV_TEST_DEV_MAX_SINT_ROUTES 64 +typedef struct TestSintRoute { + QLIST_ENTRY(TestSintRoute) le; + uint8_t vpidx; + uint8_t sint; + HvSintRoute *sint_route; +} TestSintRoute; struct HypervTestDev { ISADevice parent_obj; MemoryRegion sint_control; - HvSintRoute *sint_route[HV_TEST_DEV_MAX_SINT_ROUTES]; + QLIST_HEAD(, TestSintRoute) sint_routes; }; typedef struct HypervTestDev HypervTestDev; @@ -39,88 +45,74 @@ enum { HV_TEST_DEV_SINT_ROUTE_SET_SINT }; -static int alloc_sint_route_index(HypervTestDev *dev) +static void sint_route_create(HypervTestDev *dev, uint8_t vpidx, uint8_t sint) { - int i; + TestSintRoute *sint_route; - for (i = 0; i < ARRAY_SIZE(dev->sint_route); i++) { - if (dev->sint_route[i] == NULL) { - return i; - } - } - return -1; -} + sint_route = g_new0(TestSintRoute, 1); + assert(sint_route); -static void free_sint_route_index(HypervTestDev *dev, int i) -{ - assert(i >= 0 && i < ARRAY_SIZE(dev->sint_route)); - dev->sint_route[i] = NULL; + sint_route->vpidx = vpidx; + sint_route->sint = sint; + + sint_route->sint_route = kvm_hv_sint_route_create(vpidx, sint, NULL); + assert(sint_route->sint_route); + + QLIST_INSERT_HEAD(&dev->sint_routes, sint_route, le); } -static int find_sint_route_index(HypervTestDev *dev, uint32_t vcpu_id, - uint32_t sint) +static TestSintRoute *sint_route_find(HypervTestDev *dev, + uint8_t vpidx, uint8_t sint) { - HvSintRoute *sint_route; - int i; + TestSintRoute *sint_route; - for (i = 0; i < ARRAY_SIZE(dev->sint_route); i++) { - sint_route = dev->sint_route[i]; - if (sint_route && sint_route->vcpu_id == vcpu_id && - sint_route->sint == sint) { - return i; + QLIST_FOREACH(sint_route, &dev->sint_routes, le) { + if (sint_route->vpidx == vpidx && sint_route->sint == sint) { + return sint_route; } } - return -1; + assert(false); + return NULL; } -static void hv_synic_test_dev_control(HypervTestDev *dev, uint32_t ctl, - uint32_t vcpu_id, uint32_t sint) +static void sint_route_destroy(HypervTestDev *dev, uint8_t vpidx, uint8_t sint) { - int i; - HvSintRoute *sint_route; + TestSintRoute *sint_route; - switch (ctl) { - case HV_TEST_DEV_SINT_ROUTE_CREATE: - i = alloc_sint_route_index(dev); - assert(i >= 0); - sint_route = kvm_hv_sint_route_create(vcpu_id, sint, NULL); - assert(sint_route); - dev->sint_route[i] = sint_route; - break; - case HV_TEST_DEV_SINT_ROUTE_DESTROY: - i = find_sint_route_index(dev, vcpu_id, sint); - assert(i >= 0); - sint_route = dev->sint_route[i]; - kvm_hv_sint_route_destroy(sint_route); - free_sint_route_index(dev, i); - break; - case HV_TEST_DEV_SINT_ROUTE_SET_SINT: - i = find_sint_route_index(dev, vcpu_id, sint); - assert(i >= 0); - sint_route = dev->sint_route[i]; - kvm_hv_sint_route_set_sint(sint_route); - break; - default: - break; - } + sint_route = sint_route_find(dev, vpidx, sint); + QLIST_REMOVE(sint_route, le); + kvm_hv_sint_route_destroy(sint_route->sint_route); + g_free(sint_route); +} + +static void sint_route_set_sint(HypervTestDev *dev, + uint8_t vpidx, uint8_t sint) +{ + TestSintRoute *sint_route; + + sint_route = sint_route_find(dev, vpidx, sint); + + kvm_hv_sint_route_set_sint(sint_route->sint_route); } static void hv_test_dev_control(void *opaque, hwaddr addr, uint64_t data, uint32_t len) { HypervTestDev *dev = HYPERV_TEST_DEV(opaque); - uint8_t ctl; + uint8_t sint = data & 0xFF; + uint8_t vpidx = (data >> 8ULL) & 0xFF; + uint8_t ctl = (data >> 16ULL) & 0xFF; - ctl = (data >> 16ULL) & 0xFF; switch (ctl) { case HV_TEST_DEV_SINT_ROUTE_CREATE: + sint_route_create(dev, vpidx, sint); + break; case HV_TEST_DEV_SINT_ROUTE_DESTROY: - case HV_TEST_DEV_SINT_ROUTE_SET_SINT: { - uint8_t sint = data & 0xFF; - uint8_t vcpu_id = (data >> 8ULL) & 0xFF; - hv_synic_test_dev_control(dev, ctl, vcpu_id, sint); + sint_route_destroy(dev, vpidx, sint); + break; + case HV_TEST_DEV_SINT_ROUTE_SET_SINT: + sint_route_set_sint(dev, vpidx, sint); break; - } default: break; } @@ -139,7 +131,7 @@ static void hv_test_dev_realizefn(DeviceState *d, Error **errp) HypervTestDev *dev = HYPERV_TEST_DEV(d); MemoryRegion *io = isa_address_space_io(isa); - memset(dev->sint_route, 0, sizeof(dev->sint_route)); + QLIST_INIT(&dev->sint_routes); memory_region_init_io(&dev->sint_control, OBJECT(dev), &synic_test_sint_ops, dev, "hyperv-testdev-ctl", 4); From patchwork Tue Feb 6 20:30:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870084 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="Nx64zAVg"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbbs72f1Sz9s8J for ; Wed, 7 Feb 2018 07:38:51 +1100 (AEDT) Received: from localhost ([::1]:59064 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejA0v-0007uD-Ea for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:38:49 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44608) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9td-0000W9-56 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:18 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tZ-00031R-R6 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:17 -0500 Received: from mail-eopbgr00130.outbound.protection.outlook.com ([40.107.0.130]:53824 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tZ-00030f-HR for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=aLx+U59ntRyRV0XhhqHRqgaX/ILDQ2Ki3r/uqkd5oPs=; b=Nx64zAVgI2F7SvGI3sIFQOXzZa74JBFcUvfLoHXt71gV712CKCPMePPmX0iSH2I8aahk6SHeiFyAFm7A+kpD5hebNgOI+h8U0UDHclsFg5rxZSCBw014CugVuQWMU4monLYoEMdbMAz8TW/LGcYGv9wcvFGf7Pm23cPdz5NLEfc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:09 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:17 +0300 Message-Id: <20180206203048.11096-4-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4c81bfc5-fb9a-4849-e896-08d56da08f70 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:WdQfYLzC8eCp50u+341haLBiK3RFCJ33rkjmzMD46aNssghf0bosQN9ubR5+FpYLxGTAh3UV+IQ9Fok5JCMcyTMNPal5J4TwARifWPG+slWV+liVRJx/tG1H9OJ4vrPHy0DP0RllGYsFpoFp3DNEfjRtxAsuV0JhdYk8QVhfqHrULHcItkcW0b8I+FIyxZhET6vC+q/pUelG+QK7GzwydH8LdDeQ1Ez7jda3/uKvpsZSuE8yTg6VaodPflOtIxgE; 25:EIECHJR4Q3rohvCye9HcOXj1dF/6bAO4cSh/z6/Z7dThuK6tj/5d2G4kQxi385MMXD2ZRm+uYdWFBsxsXUKqVQlTaZDmpI4vGcKFYE4KFcJetrJIbPEFR80bAu4uMdYIGZhSeU2XFEOtZ9JviksR3sDYINXwHGMlS3Guj8CqkRZGkU/C0LON+zdzH5+xXNoh3JMfQ2a0lXDaaH/ySNdnpoLby2lmmW3FWrWO3zCECt6nG6V0AhvK12y/tTFI8D0z/MdxYRJ5yILlgecpgJz3zhn0ncHI0byIJ1cHGJHM5Nsoip5QWqMJ35uK7SYHrXi4eLOJBLFJTulpjnLdDBqH8A==; 31:utmSS95rUqcwER8mLhWFuV8N3kohh0KkL3Ig9RWmA8p7zbXUN+jFRfDn1p17Qf+ywDls+nf7Ub5QZESJUrggEm5JSpdq25dEqZU90J8BlNCTWdTjyX8JlAGIcbywo4k99fsVRS58wlkfhvpyQS5btizaSP1cbpbRAciAIpU/LSFs/n8u+NQAnJ+leM2OZ4Sueysggp4E63xWd+dTJg6GZ3t1hpMZlbxQ6QaaACEVx64= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:sS97QvBJwP2JDrwfj0+e+mwV1ggwnJhkhiFHJpR/E074seTKC9UIa6iY/c0c99T7ftmH+cs2dmgb/Dyib5zFc7RzqEABAp4tITs9SM4urs76BIjIFcQ6UOjr2YOayt3oXAPlwetJSsGMeABAjHbd8YLrWVupBWivYYx9IDpvyKCLRVgdwi24EREm17LpvsA3W+w+xc5qSJ0e6SY6YguujQ/GNyqeIjKtdYjBHxy6Qghvu4EtLXLPrhld3WJ4vF+PuAV+nwEPhFzLY+TTwxI1CtyQPdFEkATs5k5YTtsDbWHd7Ok/eUNhEooDu8sdP/5nLoDL21eHxiCBh5MCQFw5keptbFXij2Dd2I3am+eiFiip+KIE6CBE6xtbRHZteM613Ga9QZoNla4VsuP7qHYB1gE3DbMQhujzczhnABPz9WA=; 4:2rJtSXnMDThozYlZvmajwOrhHqaAj6bMWJ/VkWHUHcHscC1WgbbF+YgzR1KBJBNLOkAnbJTdHNFyQM4Gwq8NT7yLGHAy3OpmjytZn20gYo6wsgYP2y1gSc1wT4vlf78DJloYPsSL1UMxPvKCUsliifvL7lEMNSeIAhF3s8ygi18/TDVFK06Fyjp3+GeYrHRx0rry4QzXeFak8RLVvaMoZku3ys+oBI9jgrH3hMDJ4AHgsLxMRbtyLVugzF0HXLwM22iAPeyxioqDhxla/uF9TQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:xYgQ/EW8YNlK467DuiSP7i7U/BR9r3vL6EN2wej?= e5hbxNoPr3vJSg8YJx17zQXW8xnyQYmtEAj3YkdVv/IKjcE0gGSfMvabevpO3d8BcLgElrU6tvtvB6iW0YHqygn9C9/5qzLa4EooD/zgdIX+f3Qzb+gPurGTn+OKuFs6W57+pxafCpgRBazmbb9m5kubtxVQOwRdR3CFKjdAMOmewQA9YSjYvC/aR/wxfW62B/dCPdpHVBhBHQum/rSWO2Apm5Oh+FkJeQnqHM4dI+8m5VvFIdaMhIfMwJsXydMbr/755m2Fc2rQ2RbLRdBj8N8Bm9C9xKVtGdJtVZZmvi1IOkv09OqtiK4nJOvOd4tlH269ZvORMlbEhxaStJcy/JO12Giljbtbt4pxBSVVmtw9b16oS5B8fxyvP+zbvveCkf0sJC22nMCyb5l01HWCQX9E6LDLEfylQlEGWyfsd21UTxy1t+4DFpv+wxsHoTuMRx20xm+JM/cSKew+4iE9OSQV9XKMiDuIxYp6tBaSVdGKgK3630vwjhPpE9e/T7+kTfUc25WUGzNED1AUVeNmkE5zu+krHINbuoSQT5ozn1DXIIgMeg3FqMh0U+u2D9a8e03xFYV04gU1ai5qc5WnTy1rm9qe0YDPtRbortzsp21TUpcOmcRboV4Z9oOHgY4oiDEzdGMiS0Utk+ENZtg7SIp+tp1G6VSMYSc/BhskwQZy3XQuFHE707wie741hjWkfdGXQxHmCgLkju6Ko5IOSdVDNVHU9gXuSU873GO+HSR2jnNXnbjsZsKfMa2DaOvUQz7U1u4c37i750mMjXfR+aankijXbiA4D9BIF/E7sBERwH6W/bn7Q6cNLPqAJrH5qZ6hQo4THlguFkuR6Zc92CzTCsga5527Z/+iw0l7ORYt/Tz2Ys15dtQWV4vJFry14niksB7x9Z8C8yZoHj3vHfyChChI5xQ2YKIAeoOVH0uRFPrde8vw3cVt/zVLU0O//fW4ICU2AcUWjCvF6qiPv5UVRx/CuGDaCp0KCLjNAz9WblfAr0TjwEnQt7GSzz6Ac1ocmqsXzKtRpVgBtoL5hVD4PlDT9tET+xKJiTqSqMqS7UBd6KcqvRVPuW1W1rShE7nqMK/LN2VLMVvmS5yDKeHXakcmNS4q0aLEIMiObOj8Z4xGWeRdoJGy0ZIfJYD17a/bkRVD3Okpicv8aFQ517SeRXBI/PXMVVL3b4p4oXhNbR/Mp5h/bcB1vV7TfoV/uQlk9H/aHI6WoqrUmzloM2Xvxj14LhV1RMCT6g8JvdB8KHvue0WueqQv1OUbH6/ULxo0= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:tVNUQCxucAFD90ZwPLaAUYGTu9Rlq6M/BsE2f0kIQuAk/LvdXRAQTC/5eIQ9kAUiBityULGyuMZ5iNq2Vwp4xqhaLgz/ODK2IOvYoHc6M18yS6sBPouyvDYV3Hg7LfdTR033K8qeIvODRtnKeB8w3vj6YBqXw665oBVjN7FpSPxpTG7aYZAykHBBGWjwxBfLtRk32AS+PVBI/tfS744jmiBpSbJPO2YnpPqXsxeg+7NfljO7glgh9xxlUBtW54ImO/fWtv7JS/6rtXOfxz89cQBVDQu9GFkIqTyV6RwkqriPpjma2W5Yv+2yxx+3MsgZItL9MNXYZqRhMt6Fza2YQAIGxgcEJH+y93OvjTHSKQQ=; 5:IfA3WIUkxezgfeE886ITZ5ZXN5817XkyY953yFJtJ1XFsgwnSUSAujtmk31LuDsVC8WQ8gB6dAx9CJFcY9HqSLSJSuVPHDkYj6SYzX13Wg2g08d3RH/WRk6adP+AifmjMmeERh91dbwMqwnj29f3tQAGBB36+Gi4UoXOMObstag=; 24:GmqKbUGbNHQaOc1IRv1/eiIxYWH1tedJZJoKRvkbSzc6tIOqPiWwH93BrVg+q/w3ZUWXL9/VQbviu584EcdfLAGYmtEFI5YBPVPxl+5BaEg=; 7:y6ZPSNsj8aIVToNbjdx1KCqN7nj443RMzBr7N+2lfWyXalsKLAuPyEWlbwOzHpd2GS4gCmq7ea8JmngKAA4GH4J1kX456skDL2+GbA8QBR/0S+PfcK0cmvwKVeynIPL2qHvxs/OiLaTe+A1h1/J8+AobIcIN1aGqUxzVqZ7LV7TFnyHbLxMr1hz7y9OqdCAF016ngawkKbr4fY/RHbN8iPYvuDPiuy+f3YuSD9vzgxatV7PU32bvumVAwbrdpoxo SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:o3l8RpIFFuU+/MOskZgQPgRq2iEJnsmAcxPqWjiKlOy1k/iQneE9FgM6bYY1cmIPRI3XfHoQ67S8KoVSLqn85GivH1bJl0ZJifMctax85DkOXk3G7CGOPSwoyb1aXhC6qoU4CuTd1DYTqR3ngGWlt8n0FkAGOWkfkeCky0X+Ze0= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:09.3560 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4c81bfc5-fb9a-4849-e896-08d56da08f70 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.130 Subject: [Qemu-devel] [RFC PATCH 03/34] hyperv: cosmetic: g_malloc -> g_new X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Roman Kagan --- target/i386/hyperv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index c9a4bb539d..e762eac79f 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -88,7 +88,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, HvSintRoute *sint_route; int r, gsi; - sint_route = g_malloc0(sizeof(*sint_route)); + sint_route = g_new0(HvSintRoute, 1); r = event_notifier_init(&sint_route->sint_set_notifier, false); if (r) { goto err; From patchwork Tue Feb 6 20:30:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870107 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="UdRRV6Wg"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcSB6Wf7z9s7F for ; Wed, 7 Feb 2018 08:05:46 +1100 (AEDT) Received: from localhost ([::1]:33890 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAQy-0000fl-Hu for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:05:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44622) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9te-0000XH-F0 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tb-000320-5R for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:18 -0500 Received: from mail-eopbgr00114.outbound.protection.outlook.com ([40.107.0.114]:60650 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9ta-00031Z-Rk for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:15 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Fq3vrlUtNeYgTh4laUdwUp3nmT2GagoKmWPZ14J+ZJ0=; b=UdRRV6WglaWfjosYOwF0uysjUnMcCkbhZixvBeYiazXLHBY5eHm2vt0McWUGscOp6v7ti1SRytG7t8uwQOhQcR7bytgNQ6pYCzr9yQxnwV7GPZnvY924SO9rxsBQt03RBzau3fQ+ww+0MK6N1DbBWNdJrJTmU7DF/3zGVmpQdkw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:11 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:18 +0300 Message-Id: <20180206203048.11096-5-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1fe59ac4-b8e4-491d-9129-08d56da0903b X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:cIOx4atKamtL/xOLEZbfyDc8s3GkIUj31Qx+9jgmOQtFHbwqTlOsJ8RghaZSSunng2WSKZ4qlNRdvgtBKv9sIdfjik6lP8PhEkrjbnFHMTFgz3a3v9EjThRO6zjTQJyWUlljLlTGVCOjOzq2cLxZ0up0oipdb+w6koPWIiBaUAaAJBogivlojCGYFjNKNhzJZgmRJOUvVhozId+6ZYS/+q/pXfkLy/EhXHu6/ue9gLUuUpZrP7X1FbhdwlYSfqH3; 25:ExePoYvMnLwY9IcVUiV62u4eh2aXAwnN9Pv/7kZHNAPZ18/fQi4P24NJphaGmSNpqSWBDWHCGxEBxBbn+AcKXYohgZ3YaKYwpFpqFcWWPXd7AcZvLslTzc6eBtoFs5SfFHMpWYw9QB1uNwxDvEvwOmDsSs/8zCCnquob0LB8VOTtPZ+uAF7CYs/ljU/QMytQpHc8S8tgawajCBaVBKGGM8KU3eX785/Xu5cmNowCADqkNufysHpALxRZI9yjwXTNrvSQvFo3xfrm3THAvGVL5Ymd1RJ7KpzTelO//LXQZ3jqhWVbCAfPmRPEhWZuJ2x1CRbJcQivLEHH+TgFKlVZiw==; 31:X/+hhgs7lgnop+9V8edwFwTVWHWsJ9tQc2pF9WnGeLWWGNQnbhuw85XLL4kdb0l6/fsCyE+p8RX6trLEzV0NpnJM+a7ERp2PdluF7nfABst1+CaB7NmwX2mRZ0im7TU+56Svf89mq3IMNQ/HHR90dgzGNIS5kCdkaLXMjUD524Q6Yw5EqgJDRqSz2bM5QIXgSwOJrpJdChkq8rYW1Xc2Ze62vmUqCBRFBzrNeI3NBWY= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:3t9jgR+pXH2JJq5Ui7YsPbKRFKKrkBOJWGVOZ6kYebjaX99W4/qQEoHygrHgXU+oJzub72LCnPqdXJe8yUu2liMtAl21dux8TsdI/qW2gAABUc1BJcs1ywLXXcmA1DDIgNQ/k8DoaplprOLHu3gTxlEVkdzWqptL2j4NCAt0J5PK+Nzc1+PaKt48QYLeqIg3J2YHESFCVrBF2GqjykA1Fo6txdV1JAkiviG9ReGrhdQYvbPHVgujzEWQECSvTqGfR/vrpthNqJqNmfxqnAamn+K5pt5sTxcIePHwBmsvIXap1mLGMx8mWufq/j0UHd4wiNtIPenTRAOA74gdBwqj7RenrE7V5BbWh1uswYDGgooHk4BiOYR5mn4Q8H5CVrrVX2Ir1ypvzWXZ4gJ7fHwBxyInBWYCOmEjY28Ag8nv6Xk=; 4:JFxLzRjNW4N2pvSns7keHQFGWyS9B5AEM/Qb8utguMp0BjRaqCNea7rPKBG0wdSlyD7qROkGxQ3ohHLcZnOzx7xReNQzImdGcPr/kphOyjCs05WMPBgQEBUTx5xUa44snbx6pc+P4JzV4RUI+hLQrdmqaxtNb/JRWR5tC4oLIpjGh21axDsAnJztCXL4opuVzmJy9fikgxGM3DOd92OJgThlZTBu3dZkjlcBIJ4lBX2kJrixdMlMBtni3ORlH3XesyTgWIXwdgS+WNSQaPDHSw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:QF2VQrAfz7jCZvieYREqwmp9l1Nsjj3KXtsgF5p?= jD3jUZwepcNaQMJY2mLsetSPiwdUbxCrGrLWyOv42Q9DFzh+jHPXsDxvWGKbBAQwio6V6dWza6ToAftxUXLomVl8f9Oo1pFxl3J24VUqYrUgsQ7z9W9PXv7u6N/n7UU2Aen5W2S4zle9htkKfGz6bsNE/sadZ3gU/URkg85Rgn/sNPM5Udq6b722AjdCAqY6bD6UEalnNvEW+mbCmyKScU+X4dHGlsYBnA1UW8NG0o4im5+KcpMZwr6O14HFf8r5dZJeRgaYxNLHiOgCxqy2ObUJsqAUGnyRS2P1mm3zOIl/ZQ27+GKzePHHUbxDqZup4rFTLJxMODAQDcMCwMPlsef6HtVrA8h1SER8PhFsciDazQ7Vmt7r0rW0s6VljcE7VYFLoCMCw4Zs3HLPnBHVj/vKvyrjNMkFASFaq7kwS08JKuo0T+GrgRG6NUMN4OaHr++wT+Y5QFIBkiAvW+CTBOugpNmGbYxLjYtiMSVPtTCvA7vvDo9UkAlrE/p434yV8DeutEiNKSKiDEM2gSOzS1C/4ogkBu2eJNiKlZpWeVlqd5HhkbZPu13jRPnn8OfmjHSgoqmpUeCs/AjgI3cYDfzW951KzqdNqfVCwIOh5cnXVhT/YSVK5+TYHsG/jNc30OPMJUA05DRqC93My01OPbCUUxtp+3xi7JrBafAefsYYv22Uq7DNtPC8ZX3PlEVQW7BxqUwCqd/XmWcBnAw2EyTKv8PNPIez/4Q95afl2q69CkcTjBc0M9W8LKO6Rj56d3hR8m5Usv7K/Dnd/jeZbX1cNlAy5gnfPpED80U9fT04mPVWFeMwBvBy7NV5ojIrTcR2DkUodwESBGvoKZeR/1kKhPvFucdaZFjf/URiGwzbwT6frFQe7yWnrGXL6/uSvz7Nk/GcwYnYovhQrHEBWFSeNe3uc32ja1YfxnbTjVQY67H1RyGxVHUT98GUDe/pBAuGc1OUFi8PbpRPGcYGF0bRTdexCB/iChcAVuwSwfv23o2qcAPwK5ic7eYm76uYvWCNFDDgMFpRkEyo794CfKSfaVLcmNkskaDkm1+3WEqtRrecKUWZ9wXcCargh1y2GDTKmdC9vp6sMEmiBAZWgVGe85+Qr8iFRyBZkzXVM+MczpzarLDN+JhdVpkqawWcRiq4qLuIqZkiE72pZOJke5OYRsEppu8jxGIZ8/4nJRPcEXUAkTjFsCIzrgYW24GdxEHOwpIXcOyRDNHOloM+GD5ww X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:l7yuHDOXX+TpMj3zplLmCHqcyGLhWEYkmkAAQi5OkotSHy4NHTwWwQkpZMRzGK9evuP2EPcVLesftk3mAxwkieJ8hDRmenT2lfznObAYEyPsJjMuIleugWmygrCADcfxJ+Ws9nCGUBwr86e8ox79zMvsL/kQYc53essC+Eu1n5QxS7qWzWVaAMPyK12yXlsye6HhjRyYcMXJ6fqM1uSVPkZjeuXmjIvw84qwAQofw9I1UjEr8JpBXNi/0jO1YZ2L95/XdnhodUfK6tdxVtQFhK7wzb7VpbHbCXO6xx+u0un9S49xQ17D7nLfnAUpCCWKW/kd4+B1JtMr3tJ507W9I4K40uoziX+QGnXEEisa4PU=; 5:/eHdy5MkkmkREf2CnzfqBpM6Z2wAySpYeF2bjyBrPa2gF/gZdt8KckQgQsgEpJYzIf5+S4yHmy/rds2jnVfXcIeO5cYpTF7ieghT+LGafN3J1B7QI8o09bKTvuBX3uS8qpqAiEe4CPgAimadkPn+XWK5jyt0TRelrRiygO3Xqx8=; 24:oY9mtGlc+CFYVwAHocOPkN5XwbAK458kXRGVr8d+0NQzWEEpB0j7GBZavb5zH5akB4AMkm4UmJA4iHg2q25j1SSL/0bWhVBcEeIsqyDadSM=; 7:gf29wUTkz4VHC2R5gLrAI2qctJY9s4lpQV85LcXnOfboetyPxSClu3CN0adn3vub2n8YbcdDTD7XxcDjlIPShnjjyM7naxHk6ZOOm56KdpacRBMSfZV1/fVnJDKUNPjCVMzB7fA/QufU0JXXv1kQe6NV/TRbe4L8Rdwx0340ZB1xZ1J3Uja5Gw3tRZsJgJGHAXPFYNNxJ7j+UNjl1Vhq0fbze1uND/s2Vpz3FbaaXYdaILSkxRmQnbO7PXUVVWBi SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:8C2pbGAi0+38bSuuAkvQRuIoUB86Mki3X0atRjcNhFoF2mZcR45vlzoaeXpX3XGrcPofC1y3yYh40Kr/Eo/R+7Z/gXBbJ9EgtVteqMQw9mc63Sh4IFn1Dlt4WlTaL9Nr8R+sO9cMuu/VvyW7yoDiCt4HdtiWZhKnRRoJIiU0f6w= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:11.5435 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1fe59ac4-b8e4-491d-9129-08d56da0903b X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.114 Subject: [Qemu-devel] [RFC PATCH 04/34] hyperv: synic: only setup ack notifier if there's a callback X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" There's no point setting up an sint ack notifier if no callback is specified. Signed-off-by: Roman Kagan --- target/i386/hyperv.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index e762eac79f..f3ffafa4e9 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -77,15 +77,14 @@ static void kvm_hv_sint_ack_handler(EventNotifier *notifier) HvSintRoute *sint_route = container_of(notifier, HvSintRoute, sint_ack_notifier); event_notifier_test_and_clear(notifier); - if (sint_route->sint_ack_clb) { - sint_route->sint_ack_clb(sint_route); - } + sint_route->sint_ack_clb(sint_route); } HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, HvSintAckClb sint_ack_clb) { HvSintRoute *sint_route; + EventNotifier *ack_notifier; int r, gsi; sint_route = g_new0(HvSintRoute, 1); @@ -94,13 +93,15 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, goto err; } - r = event_notifier_init(&sint_route->sint_ack_notifier, false); - if (r) { - goto err_sint_set_notifier; - } + ack_notifier = sint_ack_clb ? &sint_route->sint_ack_notifier : NULL; + if (ack_notifier) { + r = event_notifier_init(ack_notifier, false); + if (r) { + goto err_sint_set_notifier; + } - event_notifier_set_handler(&sint_route->sint_ack_notifier, - kvm_hv_sint_ack_handler); + event_notifier_set_handler(ack_notifier, kvm_hv_sint_ack_handler); + } gsi = kvm_irqchip_add_hv_sint_route(kvm_state, vp_index, sint); if (gsi < 0) { @@ -109,7 +110,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, r = kvm_irqchip_add_irqfd_notifier_gsi(kvm_state, &sint_route->sint_set_notifier, - &sint_route->sint_ack_notifier, gsi); + ack_notifier, gsi); if (r) { goto err_irqfd; } @@ -123,8 +124,10 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, err_irqfd: kvm_irqchip_release_virq(kvm_state, gsi); err_gsi: - event_notifier_set_handler(&sint_route->sint_ack_notifier, NULL); - event_notifier_cleanup(&sint_route->sint_ack_notifier); + if (ack_notifier) { + event_notifier_set_handler(ack_notifier, NULL); + event_notifier_cleanup(ack_notifier); + } err_sint_set_notifier: event_notifier_cleanup(&sint_route->sint_set_notifier); err: @@ -139,8 +142,10 @@ void kvm_hv_sint_route_destroy(HvSintRoute *sint_route) &sint_route->sint_set_notifier, sint_route->gsi); kvm_irqchip_release_virq(kvm_state, sint_route->gsi); - event_notifier_set_handler(&sint_route->sint_ack_notifier, NULL); - event_notifier_cleanup(&sint_route->sint_ack_notifier); + if (sint_route->sint_ack_clb) { + event_notifier_set_handler(&sint_route->sint_ack_notifier, NULL); + event_notifier_cleanup(&sint_route->sint_ack_notifier); + } event_notifier_cleanup(&sint_route->sint_set_notifier); g_free(sint_route); } From patchwork Tue Feb 6 20:30:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870103 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="J+W+NzbO"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcNP1d7Rz9s7F for ; Wed, 7 Feb 2018 08:02:29 +1100 (AEDT) Received: from localhost ([::1]:33616 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejANm-00060N-Tm for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:02:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44621) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9te-0000XG-F3 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tb-00032G-Mk for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:18 -0500 Received: from mail-eopbgr00114.outbound.protection.outlook.com ([40.107.0.114]:60650 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tb-00031Z-C7 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:15 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=1DsAFYpDFSn/e2wJWNLoahv0S81zvouErA7sJqKMOF0=; b=J+W+NzbO018X63ZmEb9YPB4IZBdXcZgbuLsMgA28jXvHkWc/AqBkcAd5jh8KfoDMAql82WqknoQpD1TwMay5eSSHumZMZAWmIMnGPxF35uBqUfsGbzBnd2l/pssnO4vdB0EwrI8KD7ZByl6yleNwVjQtODnF6hCurpBwQ37TTg0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:12 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:19 +0300 Message-Id: <20180206203048.11096-6-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8d7b253a-6e6e-4484-b04c-08d56da090fc X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:UMXwCY7p4SL02CKkKR4xs6Hd4c4dkubAyiJ92LLX65X6nTp+9/s7S3n8oa/3DIY1h4rorr3cM931/ZTF4fygaZH+JmSzyNyHJ4Rn80b4Qe8+Es6L65ocTu3ya53r2Qfk5YJ5PGY2xB9QWO9HxhqyExeJf7XLYDFpJZ+IX7W/wUw+zRT8n5HR8GD9Peqlr7Nf8PGg6PkrIZGy+g2e1OAwRj9S+OawX9uh+hlQuN4hp86nZDxpWZalNDwLMUeHBBWf; 25:+CEGCE84AeFgRZxMt4f/6YpV64c0FhGd2fshqxpVQLdumW9vPKuO34bEpcD8QG1V+nzSqbKopz1bboP0+jUae7zq8i3xFVih/10uVZSjE8eAFQ4dNoRkpl3yEU3lOrn0IfIlWpmlLDHP1IlcYDyowIz4RZLg2yU4M/kovgMuAfn0uIgIZgBG7wTHlsO0nJp6cCQFQnCMad1EpHX4j4mXm45M6iXexZ2mG/99CLHcO8ZWZ5X4E+sn4fMu9I4tahaMtCAUHNM+TjZ3ZSSZcOYWFumk8O0ZbdvbRQcld46iGxfw5kiN78qyMs5vMx7M5/JR0bUSWZqSCWYBTGxrFsKYuQ==; 31:9b0bMqwzebgCDDPMLpGuSyMO7Hi0AnNBcZmRnq2dAGMSpVvm42Gllb/wN01W3gmAJB7IHvSRJshPaJsOG+uhu22kqm54q8lPdT/34VV/Nlq1k4O2JMfOZVDC0zI9/axXcNc+AKgTfIybNGipwvGJv4ip3ACunEBiPO9e/q6mrnpe/Yhdj8h84EQAwiMQBlsaNY0y4198oJ4LH81zeHpOMvml7Q3+CCXKgmVbqoNJS1k= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:50Ns3Yci2SZVIWSZ8lHP9y4OJVNf9+6KlZHwFBTm+GUE8ZL0p9HTAxQgoV5uTkDionzVryJE2ed1iqx9tb9HWXuEXcnfe0B0TCkKr6kASuTpn/YgF709aupn3tfRmba0D5byweBRd1c+g5NulyRKq1oCkvDEV+YE7uryhA4dMRBBeTpSEjfB7mZeondn1CaiDwV1ZOYp69ebGRAyfe7DWOK+yE5hdGF2ZUhn2NpZhynzebtElpCNN2us1Qn5cvTMtPD1yWXhUcsI6bQ/lTeWefGwgEpUfYWPwjutCj5sKlvGlQlUzNxORsDLBncuo8//2RVjWb5aBjODdhDP6Iay9blEDO+8oa38z96A1xU8mtMNnj7QLVhZWH/panKhwcLV4U9OVchyEDoUKNk4KW+Mytkro2DK5HWK+bXlT55OPyk=; 4:ynWhCZR3OSZ9XGtt4bVcft/zw0kZip+9In/df8yVs1eldNaYlL5ZN0po6CndD0sJ09Ya1nkHkEX8ukGSG9U41cV/uDOftyxcZbSnLyBrL2mFQbAF6X/804JM2rMVKHug4E+yB0rhxeZWroVClUytiCuj40L9qN8RF6aCQC4O+cmfHrJk1SqR7Kl7u1GzgwYb7A6n+NSmC8w9J7qdeeqGutT6paF/7qvkUhaS0Vt7w87q5oeDoxwOnbqTWsbeAZKb4kf+rGMNXQ4gl0sINlygyw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:WbUKxv64I5oLm215mDxQ6kZqkh0bYV2lYgnF/vU?= 08LBTmA+grkFwZdd+tN9+4QBfJtwrih0ldMe/khEmx2/v7lZMNjAUkYgRdB4DxqWZzsqATzWrBueuKn1XsEU+VthEcwwzR802v8kqzi6KaxpJ6xKZacx1ngPvSUp6pJ/4XYtS162gpin3BYQHt0VHkNsxFY9MlROHZf+vokgYY+dRrI72IMYUSJIHiBIrry++lQpWQWQIjX5YTMEuo4ZXVHWRE5gvJ3l4zUmnHJVFTUNHV90WeXHV8BGtypws7lmK4dvL8m96ARPV/PUSW4jal85nx5LwSf6hMQ3FJwg5kszPfpAmZCI/VtDKO+wIS55qOBsfGjcEzmNVXhc4e5/H83qNrXNegh9tIzZZY3OkEXF15ACmnGLd2o+ldn8UtX+NAPJUkzknmBbvRV8NsEa1ST8DaWokCeGT45OHoZrTvhVZmuSy0MwJY9h/gqTJLtirkZD74IiOj0z1OUvqCX+CwDw3F88e3ffR49Qe/bxNL8+GIUYijyLJU3AMZuKv2RKnn/lbvJ5JeAraCdKjdoj+8SLip/TOksnsenw1GOjGZcomyOnAFQ4tCQ/QwgMPpgmJek9gUbQOeNiXf3LYKjc9BQjLogLYE8/zJiYR/1uVGLZo/DyS0+nlReT2/bIH2AS7Jhhv9fpCqNQIgASJisB89jIjC8L30AGZaq+HyiBkA9ooh93kxaPwt2Pk1CIYLs4oDbbZVLX6/U44xPiNFsSaSjmdk5Ufd7LgrJAW72igVNHHGKXbCA/BV/6gdiK/RDiE1xedcTKm/PWnQ1yqhg7ROaXfzsaoBuebLcqWlp1bEJTBaYUbzTEyEiGr2SKn0Ev5UYvsHhQvmxyf800tpbsX8EgtJEbpkOT7ilRS19lEIQlvyodYKtXDL671R7QgHoU3WQBCzlRBlZFGoqBfU0KGZrAcRxys45LsRCeFVyW3GAa3vIbA92khX4D9ay5nw9iuIX9/e0O0MTn0HzpckKccr6OE9i5ZwsE2YuVS3WdmYxOX3fBBGyf0kv+4waWtZxqRiU3ciQajcMOSRAKWcoK6DQ/gG5pK8hYGsecLrXTraeKsb0mk3eOB75vfegGsYIwfOrXcCjUSpRoqVJRSWxd85tPL7ew6iOEBdgY1cOIWz/wmsm9EdzsdI6QmyGllRp9dF1nyFGvwxuaaM/Zd/cPy0KYFku+4jigrVRE9C+Bg09Ff+Xe6QUTz3i+Y4nQIEf8Ys0Qa36e5wWpw1sCfXvGjyZev X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:o6+sthlDafcOMieLxPcRcthdzu1RGIJheqDDtrRxDHaYfMVUbWtccW0j2c580tU4Kih3X623CkpJfXRATSzPs8CTTkH745o7HfJsYje1H4fY7l7H/d2cd6adqX1PO/EGWcXedENCBxNnPC6Ge+733ew5Q51oN0ioN/zLeHBVr67C22IKugwlrmjX0giZzVB223rIHzoM7eGHKPkIktxC6Ap5MsLLn9XAAIVFnf9LnLcUHYmMVHz4qgIpV5g7YsN89JF5AmaWXI5qFngSizPktWbOkcU0q9TbV/XO0HBdu3I+o117tPImVI1E2hWbf6E2325A+kkBFo8OoaglxXr4u6yVq0UfwcbzbuI5ScDXE5k=; 5:wyMLgoqXGQiXzAEWLCe+FpqNVRVUxDVlz/0xyjrPwIbrgzHeEmAH6pqmXJw2AtppfYBv3sdEcykH0oOZgualRqUEcjnT5A5mHFhvrv7iUnKA53dWa7HExBTaw29D09zGU5uvCUuOEQsmwhZ/6C8ig5/LMvxCb4wGt701ll+nW2U=; 24:DuyOVWzdExrk8o42JhMw6nDv+epjBxNUXdvw9en7MLQpNyQktsiykd1z3T5NXpsvm3fhFUScRUDUhvsexb5gpidSah+DhIin+PB6bSsYcmg=; 7:rsPG1OQDxQuVKW5jMGRqDEKVj06dfTUI2imwRnJBifsAyU9LvmZsWqdwtB6oEWWqIBMpDcz0fShtUy4xO480UV5ViXkTA5pbGdM/3nnevAqjN2NbnYDCCghWlhw8yvM63ljZ5EmWBz0OYzOYmolRwns0Yp60dunDiTXChRfiAJRZR/8+WmukulcKl1ld/n3RR0QAVxysLausGw7zHEOfVjGfi3i3Sfi04ULhpso+zo2aJU3EXGnRcDwZRJwsiZYP SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:BMdXeRqBk5SxJVVi8I3hYRTfDEbCOMr3yDXg9PAS+iOoCdp5lCNRHo1Uf7DqNVl+r92lYso6NShOnpUPgDBZkarhTorTIPiuov9lbAZ1si+CSzrweWX6tKcL+Nf5T0IhsJoJCCsLIZUJ5M0VqmLQxYcVCbvs0STXbJl7atcP99w= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:12.8092 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8d7b253a-6e6e-4484-b04c-08d56da090fc X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.114 Subject: [Qemu-devel] [RFC PATCH 05/34] hyperv: allow passing arbitrary data to sint ack callback X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Make sint ack callback accept an opaque pointer, that is stored on sint_route at creation time. This allows for more convenient interaction with the callback. Besides, nothing outside hyperv.c should need to know the layout of HvSintRoute fields any more so its declaration can be removed from the header. Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 14 +++----------- hw/misc/hyperv_testdev.c | 2 +- target/i386/hyperv.c | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index 82f4757975..93f7300dd6 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -19,21 +19,13 @@ #include "qemu/event_notifier.h" typedef struct HvSintRoute HvSintRoute; -typedef void (*HvSintAckClb)(HvSintRoute *sint_route); - -struct HvSintRoute { - uint32_t sint; - uint32_t vcpu_id; - int gsi; - EventNotifier sint_set_notifier; - EventNotifier sint_ack_notifier; - HvSintAckClb sint_ack_clb; -}; +typedef void (*HvSintAckClb)(void *data); int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit); HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, - HvSintAckClb sint_ack_clb); + HvSintAckClb sint_ack_clb, + void *sint_ack_clb_data); void kvm_hv_sint_route_destroy(HvSintRoute *sint_route); diff --git a/hw/misc/hyperv_testdev.c b/hw/misc/hyperv_testdev.c index b47af477cb..827a8b1d82 100644 --- a/hw/misc/hyperv_testdev.c +++ b/hw/misc/hyperv_testdev.c @@ -55,7 +55,7 @@ static void sint_route_create(HypervTestDev *dev, uint8_t vpidx, uint8_t sint) sint_route->vpidx = vpidx; sint_route->sint = sint; - sint_route->sint_route = kvm_hv_sint_route_create(vpidx, sint, NULL); + sint_route->sint_route = kvm_hv_sint_route_create(vpidx, sint, NULL, NULL); assert(sint_route->sint_route); QLIST_INSERT_HEAD(&dev->sint_routes, sint_route, le); diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index f3ffafa4e9..b2416f9a5b 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -16,6 +16,16 @@ #include "hyperv.h" #include "hyperv-proto.h" +struct HvSintRoute { + uint32_t sint; + uint32_t vcpu_id; + int gsi; + EventNotifier sint_set_notifier; + EventNotifier sint_ack_notifier; + HvSintAckClb sint_ack_clb; + void *sint_ack_clb_data; +}; + uint32_t hyperv_vp_index(X86CPU *cpu) { return CPU(cpu)->cpu_index; @@ -77,11 +87,12 @@ static void kvm_hv_sint_ack_handler(EventNotifier *notifier) HvSintRoute *sint_route = container_of(notifier, HvSintRoute, sint_ack_notifier); event_notifier_test_and_clear(notifier); - sint_route->sint_ack_clb(sint_route); + sint_route->sint_ack_clb(sint_route->sint_ack_clb_data); } HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, - HvSintAckClb sint_ack_clb) + HvSintAckClb sint_ack_clb, + void *sint_ack_clb_data) { HvSintRoute *sint_route; EventNotifier *ack_notifier; @@ -116,6 +127,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, } sint_route->gsi = gsi; sint_route->sint_ack_clb = sint_ack_clb; + sint_route->sint_ack_clb_data = sint_ack_clb_data; sint_route->vcpu_id = vp_index; sint_route->sint = sint; From patchwork Tue Feb 6 20:30:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870110 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="TP2K8acc"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcWW4Z7Gz9s7F for ; Wed, 7 Feb 2018 08:08:39 +1100 (AEDT) Received: from localhost ([::1]:34127 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejATl-0003eJ-21 for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:08:37 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44647) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9th-0000b1-HI for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9te-00033A-6Z for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:21 -0500 Received: from mail-eopbgr00136.outbound.protection.outlook.com ([40.107.0.136]:40807 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9td-00032o-T8 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=NzhsG7MN3ePGLKcSpvCA4QMldWvUPM0+dydn/OC+3Zc=; b=TP2K8accYM3yeM4MCY09PpjeL6tfKixhQMe88WIomHBsm2XtcsktVEDtUS3yFXfdZbBbcdWMwrbq8bnZKcQ6OeCCgF+KkGYq2LnkCjDnZ3TEWl4aX3vDMAG6LP6UPWOZDss51UJXfQftWCHBUMuepYIUy64Y3r1mLkl/he/qC6M= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:14 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:20 +0300 Message-Id: <20180206203048.11096-7-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b123aa83-82be-4d69-06bf-08d56da09216 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:4CfqeOKUyg6J10GscD2MYQxtXMMWeMb2hNiTZZRfZWh0BrDBVwU9f8s/dtkjMi0xWT+q6NDC7AmGQXE5AuVaWJ2Wy8TMQwK8APvl4+gIy0Lzel3P2HKB8JxJZBvV2K5iDNhIFQPl8ZjSm8/sd19vzaAHCmNYZ9ACu6QdLitzBApis+/1HyXAwCK2G7eyQSD7hrn56DBayd+e5nSp2IOBcBFu74CHAxmMC3P3HtEJrYs2G8g8XWe7pUwCnOFpJDSr; 25:dYACetXwDLUOjuZAUzF9Bdz2vVHXLO0p9FFkCBUMlTp/4+UZ/YKQwHrzL6nAqWGlu3k4DkyVjbL2/8AK+lJ77iEN3FEF2pi/5KeW7XPnKEOxEVqq3us6+Yeav0uz0xPNiq1enuPqJwyaAM2/yrTmHpV4MdZQVONS2ICfIbfuz+JzY8y5GhX1mA7MQU3XyAp1zeFliEtMU+7FSZ3i2UIfSXGIfNMAjheEcLImBooohbPnPILk6MOkXIQPFyoO1NELj8wOJ+nQ9r0Iz/c8uuxC2GvuWTGmbP4Ckcm6QXwOtldbEnLDAng1WTT7GzdqaxPrRM3SgYRognHDE67gOYanVg==; 31:rXg5/3cHI8ezZhBBYmAU1A2okNrjUzo+4Lhh7S3Tdt2wXVTyvVGcBqWcUwHM9uPvzsuNUmW5HJDo7dUWIxNCswFQ5RlYdR1jqw+zHiUfehzg6yjzQL7/XxTBS7nHjrRAJg9Bq+5UV3ND5XroUU+1wtUD+L+U5eLNNnMt6wfCyZrz70z1YYwqkek1DCdA6FWpAlLKSgLSyHM8zq5JUeNEQDv7OHBfEXXSjhDRKQ2EJdQ= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:s0+pB0nwaTgTcksWPGGx6uybxK6JMSBu1Pe7OzoUTD1HWwUpR+NHaLfnYmwyBQdt3Okl1f6kBAQEMxS0J5txNXnx/gSupe8oe8zML2uhkwF1fwr25DiJhf6ywuUjpnJzSGNE7x4n2cgv6s7KkU2RgqkxS1kzKL2aotWZzwJkRq8p3LcCZPqMxuj82gfw9YPNI9eNlDRYq/g2hWAOWOLIEFq1LD3+uShwtj28NhlpHNW6F5Ld5X2HDm78JPY7loOaxL1M+MMgSFyc1RRxYULg/E0mdxyGZpU4PGvJYzsAUqpAnXF7T3C7+XJ4qUeHJIF2mThCF4D80Lm5DDKz1e7IjZFIqTNNC5WPpsAYru5pkHfmC2pOa8KrECC+ULgQ4UBZeDLZkk0qF4wiFGo2r/Jb/jcpMv5C0jtBRb3ZmzSdt54=; 4:luGhtjoGH3HPe6MLc3Dm55N4gndXHAV9/KIZpg7WzV3/FkmV4qH7ZSZ1jZAKmmyENGseaBu00uowxxk/1JVZxmOg3/hL+Ys0NTu8JaBg+pOdU4VSCICptZjeqLZnkX+q3hCrZUxuH2zgecHSUIDCFnE65RKGf/nwtiMBx8xlOjp5hFR51UpDr3LJMXKSCMKerfnUFY/HH/AxZ90tG+n0SbHzVcX+cYAMFJppzmh3WYjQ/u1WTgBVhy/wqx+WxBeWHFBErKW9Y4I5/ZwVwkjXzg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6029001)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:tyZB4UgL+LbY/YpO8Rg6wgsHrN8djQM32T7JQGZ?= h3C92BFLU9E/fMr3ha0I2aZSfJ0/x7aAyIAOUBXvAQN52ZnY7X3eWhoR542ECsEOJ1izE5VZg9FyV99vAwsr3NkOLWzDFga7N6uqLOqIdC72oItIsBTRBu0+hVdhS2g+P2U8NyM+hweXLwao9xvQUs/AiH/S/XSbUtltP37QEmmKfrkR49D6XG6ea3mG5lxt8YVZWd5gMXPvEdfgdcInbJvnRbAOSSgZwwN1JN28MYG73BwDLNgUpm05WUeEfJ/03zhNpAxlcElbR2/Mi2Yg6PlMgiyORx0OigUhcozNQBFjbrzlVeNkMdY7S1vCG2tpsrBFBzxUYUWDGPSnJql3xPhMSueegeSBSYHtQlpwP9pDHT8ZCy2LKV0pTalCpAZIyTV77afD2BMv8A60UhFXJeZkoQDokuB7xFXnyegTWFpXeYvSjvXsNppkEwmqe/FbHu2HywCsTIzu34iy+giOuHFjZaAGqMJ/lmHs+n11wSLQRH/ff5ySyeeZKasRpBjWerXH2vua7wVBP/f50DndEJR7bfbj24ArmZZ56wHHiJgUwZyASayZo+JVq2bW6DeJ8PfzF1+PaMl37mYcIkj9oiDsZ9B0B7sGWFAeBdC6rok77euJjfumUqEugODT3bwlpgcezCISLTKmw3N4mxurAIg6xeN7j+eqDjampK5F+jC5AXSMiADJ7pKveWtFYeYfX/pka69KMU1sBGJTDbY25kk8C12pdq+ggOic7MIPfisVwKeYWmG0zhmUo4rm87n9iZuDWkuycZhnuaDLL4BIWn+EABb8FgYypcjS371N8fi/HU9kSQatjcgvTb+3A0FYY8sHpv9jwKz7XwnNDrpswIrbYdPSU8qjYkCfbIRL+iL2Dx3t20M7AYrUkaSKTwFtmKX9WMW3PP7uY7U3NwrCZWR+P/u7nfTCQIkjoxoaD3sG1gkSllQsFFuUtAtzauPwgDWoPUOzqAika4yJtb4oqwPiUsb1IYYxiplWx8K1JYZpwnEDmxhecsFPGzH67+HrN4wYhG/Fwd1ItHelLfU2opnC6FVMeLhrXk7FuSQKQSwR4dOoZUTOiDZlPqa3VOVWM3ELdf377jkHFPbT219vNdsYDgAltRb6oc24iXqbBNe9ReMZC6B4gelb84FWf+tjhqccEdx9C/e9mSwcBvTiVjgWlHtXGhjzlOeVGA6gpmyFg4WuwV2/Ytv6h87pGQY1f7mC2tUUieP6wHb9uo4cjn5NZBHjUbSjSG6DzI9HJfK8g8w== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:TandASMd9EcvH/6SnnU6J0f6OE1rXB31sNOHzHxzwrw9kzY17f5NxaG+hwvEh0hZIHY8SZdwku+wn/yOkH0bGe4tSdDy031Gh7hDrP3F0/5pniUV7e9jnbcfCMdB58uNdoPInHGb1oFqoTve34ouggVSChqRpA13E1lv8xpqJ9lDBuSyiLCtO5wVkVIoal6tOcrOK/nMQoz3ouB/MecDcHXxFFczR/QDsGXT3oju25aeGhPpoJglFqn9b1WKyQaOdEhw0Pg0ZU6+ugUGGK19jBnZxZSPOKPhjCXgRB0B8zN130lLcbj3ArSkAJq3Ou39Jdg0efl1giwRn8na5b/taFyhM3YezfTsmoFSDLfaRU4=; 5:MpGE5dcG4BHO9dMWGfJek3VuNeSUPpC56mAzaLaCqkhvpsSXAxP0bRRALiT7DV8W35cx55HmDbBmM8A/Fzmfx0TvX6RUzUkpGMgccgOJDjffPVCioUihfS4G4DnjiiDWBWL1rAsOjCn94+lOoyqHJgcSl+a3SzzOw75KWASAznk=; 24:XG8mirRy3UlDYMQJuYd5xo7I6A9hJk9IASC4+xP1NvZkoE5SKxr5XNEsORGjmuLZ4nubwjVuKsFqWtmK1oEBeSL9H9cJ7zUnkEGiVVmKbfU=; 7:hUXmcCos6V1BvupXhhW5EsiROgp4bwBEaAjmpy2naI/g/PP0x6UtyeEMHgVFhKjuV7n3eTzYmxB1TaLF+gjo3OdoLkglc+Ii0Joz34TaHxcaIEuxF0rNdtgTejJWerw/qcl/nkS3p3jsds7/ik8W6kKvnZ4DMjMWTFAeC5kQgysj7PY6DrL+0769gShEa2xpTcs1jfBfw6yEYgvpp4Jmry+zhDDgb70DeiSb6Q5kh7IylzTJ5Ns69eEzVNj3Ym63 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:Y06PACS3a4fg1yYoeTrGGEAV310nB2bo0Xeb15BM8q27+OJuhsLrVJcFWcAbMvXvdX57Bms21vWw6INITNFkYgLHIr6uTRN9iaIh3heSTFAtzH4s9svy0N7IqQAkTTrwEDbG+7i5SZ2DMN2XfdYqydzdKMp2bXVrRSr5SFsdq2I= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:14.0905 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b123aa83-82be-4d69-06bf-08d56da09216 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.136 Subject: [Qemu-devel] [RFC PATCH 06/34] hyperv: address HvSintRoute by X86CPU pointer X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Use X86CPU pointer to refer to the respective HvSintRoute instead of vp_index. This is more convenient and also paves the way for future enhancements. Signed-off-by: Roman Kagan --- target/i386/hyperv.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index b2416f9a5b..0ce8a7aa2f 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -18,7 +18,7 @@ struct HvSintRoute { uint32_t sint; - uint32_t vcpu_id; + X86CPU *cpu; int gsi; EventNotifier sint_set_notifier; EventNotifier sint_ack_notifier; @@ -97,6 +97,12 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, HvSintRoute *sint_route; EventNotifier *ack_notifier; int r, gsi; + X86CPU *cpu; + + cpu = hyperv_find_vcpu(vp_index); + if (!cpu) { + return NULL; + } sint_route = g_new0(HvSintRoute, 1); r = event_notifier_init(&sint_route->sint_set_notifier, false); @@ -128,7 +134,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, sint_route->gsi = gsi; sint_route->sint_ack_clb = sint_ack_clb; sint_route->sint_ack_clb_data = sint_ack_clb_data; - sint_route->vcpu_id = vp_index; + sint_route->cpu = cpu; sint_route->sint = sint; return sint_route; From patchwork Tue Feb 6 20:30:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870088 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="Qjn2yL5r"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbbwg4rBdz9s7F for ; Wed, 7 Feb 2018 07:41:55 +1100 (AEDT) Received: from localhost ([::1]:59146 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejA3t-0002HZ-NV for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:41:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44655) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9ti-0000cr-Tg for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:24 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tf-00033n-IA for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:22 -0500 Received: from mail-eopbgr00132.outbound.protection.outlook.com ([40.107.0.132]:64154 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tf-00033F-8w for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:19 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=cidwh1PfMnxxC5x/lghrBpla90b3BAL8GHRo/8cJ7rE=; b=Qjn2yL5rVq1aYHU3N9TekCGnJBbHPqE566xaoogLmDzlQ+gBMfFtvTdWIRGAnbFa//RzeTn5mGscZW3ERonwhj5lCjpDUxbNV5Ogy0vWYwMQgWk8RhGK603E9D5DmWd4c7WcCUuBK5bpFoXc4mOI1shazI5WwqmumkJcNpv6ICU= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:15 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:21 +0300 Message-Id: <20180206203048.11096-8-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 6177f66e-e7a0-4166-25e6-08d56da092d7 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:leS1lEryHrDX1d5Tmx38JS1B+NIxOrXlS82tdHpBzwzKga/WEXDMyDVQMn/9rZNp+sPNcNFFm5zbh1Kg/v/9WGJcKhiXOCq4PlTjmEaDURite70bGHVgLYy6CwRFU7eCALWkyGel8LZhkG16ZxjB1muq225Ig9LdqTn2uipqq+18VLCLml8AyHBwU7UZMbYn42r6HMAS128HCFVLuXmX6PjIZSLROX7TT6OHI0Ft/EyUEKhk0uTMsqlnFTsnKa08; 25:wIWmOpz0AdMAjSfr0pk9AKZNDfrmCW2MvAbl1ZJIMij2no/NA2OZRZI9HqB4kYlVAeoDXB2oGG6ykx8RxvpKS21oiwoWKj1qMGbUDUV1KPxkU7qzQixhHdyvFEBjADLklf6ssOVeF7BTYgRmPTDzf32/EYJFHuoZXef+Xg/S0OJk0RU4CD91B8fJc61sigiuKrfPNNSnA5KECFKeYg2E4kvgaF5bAonsiWVvz0WV5tWkcF5Un7G8cW1owXD3jEt3Fya7B/wyMamPqmpoTEFHMgGgaPFxVPYw3HxRIzBMEsJefvKh2fTOmpHKejs9WQNbcoiQT2XWRLUwdKe8q3NYbQ==; 31:gHOzUEwnylYABMWds7/fSdnxXFYhH5McmmGcGcgQq3NOYfh7kEyJikXhLcJJcyVV5PekrLGDN/XyYtpv8iFdzTw4YStpmhGoIsYPHj1NAPtMz6/N7i3nn/LhKBqwMcZqZJ5IrUmD6dTFP9UpRGLwYiPevIEvuBupTEo9vaBHwrzcqmLzM27eLfW5MSzNTCE1Jg7hHPruv+iK8EsAEnmICLelFBiy4R9a4RiRSriigak= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:G74+txRC8K5IoAs1+i7msoQg76bDGaILAMUxCVmmUwkNLYHw49pEahr5Q4P/Wz+Dti9+pORYJ2ELKGNQmRuoj/D83buKduztiPq5mBHCipKYabrIQ5K2caNxhgzvYyikkuSVxaQycccMpxRGPb4R8/u63hD0xmZgNcn9tFf7LXC9DVfKqhzaeSXXEqhpUvqhmoHakZDO0ZjFp69hrzIMXoJHNUs5DzCjKG5NT/OMABVk7UMx42eUFIimrTJ4p0yWCla4VTRpLzTsnJEbjz3zom3NWRvsb08lXPSmtnFm/MgbdriBixX15uDm2vCQ1+2VdTgB3ODfy6R/XvbcslzYa2Zc/L8tP/Xl5riTpo0N7cGpYXADM+7wD3hVhDZXP9ps7Sr6NJ4alVk0A+8I0XFov7cVjfQEiWeHd+s/ZgEXIjc=; 4:ND4rSrRb/At7euXVjBm9IOaPXkoe/bX66Idn4i6zbNH6SMgL0L9AkdTejO/0CXrWfNoRrsTwf+P0yxLI0WNLzb/KS9QKJf7d2mJLGAHbIW6cB2Hcb+JwxTUG/PzGVKgDqHmJUtPSDQfvkMSgOZqePeVG/j5DYYpqTIoMbYIqTkSliQrN2HofAAGNrpDAnUXSBJzXj66Y9bW2LITNvwkOPEFakOCiM7K2GTLtaA9DJjw7Y9QOH6SEFrkDY8V6zzVF6I1aToP7OAItg3pnVSht0RD66iq6/HkzMTBtm3uWKN6fLUmHznUVjgOW7S9tUtWj X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(60795455431006); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6029001)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:5nRL9kPuwfDmRV2tqWQGA0+p57n1OHKIi9vO5Jp?= cZ9ApXVV7lzkEng/fK/KSYva0yMXoJH7FztcvEMCZhNzF0xfQJa34O2EFu8qdC3BiNhVipKrFYw/M0CESiknS5ia6WeDYScDyoJ35LbaUqMxf0PhPX61bq/vtoNP09TOX4CORlE6gIZfGgw5xQQlvrI5A5Uk/kvcq9Mt4jn/T6Via04OYB4sr6Hr7v9oUwdsj4sZoQxhx9vn+O+I2qFZmXU64puYRgJTjPXNGUIzxkrbRskld/eFdRYLAJNk43mzVFS2UaMUHcU6q1P4oVvX3wTi/IV6wa6Af+9SyNx5T5IIWBsjV7cKPdSHcREDTQR89Si8jRYZBv/uAe1RaVDwyGlqp9qYqic7c4wxOtN0QMgkmKRo6NQ/a6ytYDc96rsWOzGQsKA1ri+WaX3W31IIOxEbSLL13nJh4F9pSWUeKZ2u6v1T2+1NQurgqgBDQRdmDl/zi57cMJrWjvw/sqLIxVO+AwP4HMVhZLosdltrWnadeqlx3+k9BmPKTCVGsB/bppzlSWSIPe1OxF1D9cIax/1D1n2nhX6mQpZuZazex9DRDGA+TpySyBSR073xG/mTqLK4mvw+aZ0o6P4sCYbC5YHYzLSIcswJwsZf+fQF934PLKTGlshhzAjMaWCzl8n+pWOBBt19dK+9yCm/pcLsCqMqEURah0WalYni3cXYWF6x710ZdA9T2UnpfrPLAICTxqQpK+dL2lYhaib9KFZ47Uv2l/GTI82P/UuuWyehQ2Bb0WI/xJgk7PYx/0hXz6Bsy4pydrKTXkLcGjwWgbVajI8ZwSdJDQBcXToQh99rDk9Gio8ps/naI2WUtVy2qlb0eUyhNOe/jLp2Ff78uxPNxDqJMI3t3lsVVGWNNK3dovtXyVKpI+mvpqq5dv5Kro8reh0pOSTlI27FdjUIFVNeMKack1URMD7e4YmiPHJnIonZSAo6Rk/yUXUOSsME5yuo3QP9XRA994p6a4D3Ca+CeHdJ38byGmk0WhibrROx7on9mp31dmALuFGOQ/tgDi+qU4e6hG7TdMeYvaXYiR7lg0OkGYBLeiUwJJ0J0HThgO75Fa2nVp04UmksqFgSRQu0z5hci95nQCKC8VKQz3Oq+YDrCkyupsKo3r/iCac/J1wBC6glQDrl7xiNeCpP20w2DcFo+5mHxw//1Dja7tvrPrxbGIDwM8je0FatCOuAT1ABwMDfQEWwZgUTb0LIfIBBhBjj4vrUXiaTPIooMsQQ2JPjNO+KogBRPJjWbhmuhxX8Oeg== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:hUvTcepOqtTp9SSrUUtq3r6DK+NM61L1t96wmZSGsJEsvEyoal+S7lkCA8x+o6BC4qhmOKRwQBq+y1fX6Tovlvn9GGuTpjAMQfyvIxgzXyOOg8sYmy3QIppsqQKa0dh+HZrv26J34VxU6YzdzJN7o77B+6N8widX5wswTMiKZddD1ZSFIzxtGoAgwKkgP18+GdFAhCIP0KXXsjhVPNbiTURQVR5yuFIcgj2+ZEWk05HNHup3ng28bV5TeJPgudy95ooqXVkKqrau0mfnzE4oqhNfPGkqatiUV+3lfvHwUQw7wBJv9r7yNEy0Sq8Zgho6yrUO1u8S+xzfWafax2r/HUOML+NnKXmPiGWh1xlvBjA=; 5:anirqnXjKAaR9MrptXchvIRBBFULnJhnT3UW0RiVe6oMG0tGXE3Qz9+Un3GYhGTm1OY7H9a/vE4sm7EreVtOFxEGDpvpiczk5TbKPZ9q0z8VMaYTWJqm4P8r5Ka8k4mzBBeTe/Lvhu051YwJ/nW9EXBJUPWu6pLCnN9IyJTEzOw=; 24:tv49Mmw//Nng25pGgjjwIZnH1SO87lNvISAK6EyNv58SlN5W7sYggeZ14FvM/U/sFTClDhLLMVQprNPZ/JIZvdMYkDn4ka/6K55p3WaLbm4=; 7:DZEwvUh1qW2l0jifO4XYt3//OhqztZAsWG4c+MY+ODIKS/Dnh1+ghP5n/KSfLfaXPk5zerzdvxsr5ZR++KsdT/o1xGbJdngxP+mxIWKzjAsMduwYoCrhMZWF5qEpgvy3DJaUZqxi6hOa4FypScc4Jh7s8Ss32IKzmisUXnEI+NgPgi89q4bh2+4XFKgJGt2MJHvE5gVQVy6Faw3EYCSrBIICaZgEl2BKG70IVyebPJ0ihfPzjtS6d1KIPrtHFNvB SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:gjAD8czXawk+zv5iDf8THk1h8hYGanThf8U0Ls6eHBkv+KyzXvAqwVKkZOnO1zMFtiJomnb5+WllaxD3bgcJ4cySkQ/ABJgtebPCT/9VLKOBxtC1l6MbLGCs5CWJzR1TlMOQOSNj60NzFn3HQ272zvAdB6MccGWqPQBLa5O+2ko= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:15.9186 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6177f66e-e7a0-4166-25e6-08d56da092d7 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.132 Subject: [Qemu-devel] [RFC PATCH 07/34] hyperv: make HvSintRoute reference-counted X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Multiple entities (e.g. VMBus devices) can use the same SINT route. To make their lives easier in maintaining SINT route ownership, make it reference-counted. Adjust the respective API names accordingly. Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 10 +++++----- hw/misc/hyperv_testdev.c | 4 ++-- target/i386/hyperv.c | 25 +++++++++++++++++++++---- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index 93f7300dd6..af5fc05ea4 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -23,11 +23,11 @@ typedef void (*HvSintAckClb)(void *data); int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit); -HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, - HvSintAckClb sint_ack_clb, - void *sint_ack_clb_data); - -void kvm_hv_sint_route_destroy(HvSintRoute *sint_route); +HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, + HvSintAckClb sint_ack_clb, + void *sint_ack_clb_data); +void hyperv_sint_route_ref(HvSintRoute *sint_route); +void hyperv_sint_route_unref(HvSintRoute *sint_route); int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route); diff --git a/hw/misc/hyperv_testdev.c b/hw/misc/hyperv_testdev.c index 827a8b1d82..fa435abbbf 100644 --- a/hw/misc/hyperv_testdev.c +++ b/hw/misc/hyperv_testdev.c @@ -55,7 +55,7 @@ static void sint_route_create(HypervTestDev *dev, uint8_t vpidx, uint8_t sint) sint_route->vpidx = vpidx; sint_route->sint = sint; - sint_route->sint_route = kvm_hv_sint_route_create(vpidx, sint, NULL, NULL); + sint_route->sint_route = hyperv_sint_route_new(vpidx, sint, NULL, NULL); assert(sint_route->sint_route); QLIST_INSERT_HEAD(&dev->sint_routes, sint_route, le); @@ -81,7 +81,7 @@ static void sint_route_destroy(HypervTestDev *dev, uint8_t vpidx, uint8_t sint) sint_route = sint_route_find(dev, vpidx, sint); QLIST_REMOVE(sint_route, le); - kvm_hv_sint_route_destroy(sint_route->sint_route); + hyperv_sint_route_unref(sint_route->sint_route); g_free(sint_route); } diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index 0ce8a7aa2f..4d8ef6f2da 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -24,6 +24,7 @@ struct HvSintRoute { EventNotifier sint_ack_notifier; HvSintAckClb sint_ack_clb; void *sint_ack_clb_data; + unsigned refcount; }; uint32_t hyperv_vp_index(X86CPU *cpu) @@ -90,9 +91,9 @@ static void kvm_hv_sint_ack_handler(EventNotifier *notifier) sint_route->sint_ack_clb(sint_route->sint_ack_clb_data); } -HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, - HvSintAckClb sint_ack_clb, - void *sint_ack_clb_data) +HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, + HvSintAckClb sint_ack_clb, + void *sint_ack_clb_data) { HvSintRoute *sint_route; EventNotifier *ack_notifier; @@ -136,6 +137,7 @@ HvSintRoute *kvm_hv_sint_route_create(uint32_t vp_index, uint32_t sint, sint_route->sint_ack_clb_data = sint_ack_clb_data; sint_route->cpu = cpu; sint_route->sint = sint; + sint_route->refcount = 1; return sint_route; @@ -154,8 +156,23 @@ err: return NULL; } -void kvm_hv_sint_route_destroy(HvSintRoute *sint_route) +void hyperv_sint_route_ref(HvSintRoute *sint_route) { + sint_route->refcount++; +} + +void hyperv_sint_route_unref(HvSintRoute *sint_route) +{ + if (!sint_route) { + return; + } + + assert(sint_route->refcount > 0); + + if (--sint_route->refcount) { + return; + } + kvm_irqchip_remove_irqfd_notifier_gsi(kvm_state, &sint_route->sint_set_notifier, sint_route->gsi); From patchwork Tue Feb 6 20:30:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870098 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="R4/MQhCz"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcG55FpWz9s7F for ; Wed, 7 Feb 2018 07:57:01 +1100 (AEDT) Received: from localhost ([::1]:32981 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAIV-0000xA-P1 for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:56:59 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44681) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tm-0000hB-9Z for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9ti-000355-Sx for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:26 -0500 Received: from mail-db5eur01on0117.outbound.protection.outlook.com ([104.47.2.117]:9120 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9ti-00034X-EB for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:22 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Iubieyzf+yvFEMw6IHwaWTU0oKVPkp8e9779DXMvWFQ=; b=R4/MQhCz7U8kvFqcYLwa9U08Nc1HMK8nlxIL5tNMoXU9EMuoYyxG+pXFb169oI/DtzDpzXj9xu0gU9XpTrWHW9cl/Bh1+SD66r3/xB35l7SIbreUY2fxie/3Upi4gta59l43ew2KP2ZiTHEHEuAarK/AnTorckwSdo8QxQ07ONo= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:17 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:22 +0300 Message-Id: <20180206203048.11096-9-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4ffb6a8c-ef60-4b99-eb05-08d56da094a0 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:mCwb0gzN6L1A4WVMatyaBaJlubs1zU1DjiufG1G8SbQJVCZljwsuHSpjnXshzseMhkgy0FgRcRNOn3d7aOXexV6Pfgo6aWwYVoiK6T1ZxoBBn45PqxsClP72mUjxZIF7LaGpXFeU90vL7q9rJcChaadU71d15z8nutugqXdDpCb1DjJ0eTsyVrEmXXakUy4i5dBlaHCM5+AQtcJiFjgEihfrWYJ+P9CUJ2p9HpVv6pXuAXcM6GRNwzrOcXjVGg/1; 25:gddUmyGGFVQ17xO1Kce4JgMoDu/W24GaADNZjfvvHSusjuaaJ6zYWbsY6TARnDG9e1WfMlFrCYSG1ryeowRtBHk4J8wyxn44JIvLVwsl7qYU9oS6lIvFIxyG8NdE8K8pzRhozgIOh3yYvT0OlGK0ssuK2lq6aYHKbr+KZfL0UTzzzbyexQRodxnSKvnTVx8nvjvq52B6P/RdAccXdA6XY+c45pIja5ilHpklZ5881jX3z1d7T8xs8szbxj2UIyZuj1aJQvrAZMD67tLnVEi47VULN05VKZ8h1epGFoOD/fGK7alpFhOFGBSROSDbPse19cagstFpwTh/Nf/6879tQg==; 31:dDG8O+A3f3HFkGWJkG82EOwN4ScmUHM3gCK6Rjcinab7Dg9Vn8nSmviOrpI9z4oglZ5GaunqtlgQlz/MHimQWIYfCwp2v51WhWcNVDM6YrTrkWZ8a1c00GEqdd7sqrlbeda6vNgzzkLrofQpqSZtg0WT9p8yCAOICzVBjHDJuoTQN5P25uVP5cW8S/jt6BCtlndgfw6f86laKdjO3SHrFVFpwhiYBovW36PIOIqPu3c= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:g+KvSGYIb56hNj4RSnPzP7hppxNwwXXbSu2QrAfKBYnAJto6wUhPSIPfE9M/RpUdxq/6V7TzAetk+uvhXV9kw0ggF05ouj1/QSGzDfQ3mplLAs83HqawJU4SIOOrYQ33E2KFCjBXAlW9roIDA/dhSEqYUwF7etaeZoOZM+obkqlqviOfgnYEUc/IeHJZl0IIieLlvYBWPYSeKubx8tPovv9kQu2ZVSFDKqZWS7SiYEn8H0F+oE0e/2OrLQmSLqb+9mHAGjEeWjhdoBWcA3ttOZ3ZgOYYlg/AhCoNVrfvnhTjUHNMw5FQ46PBTJ7FjXDbMIFFGhs4zfAQ1NWUs3x8pGx0pO3jsGe+huYiB37+vuP6gYuf+oHKxKtZ6fomBlZ7xYmx6ZafjrMzxa/GVv7kye0TxJNiVRKZhQNWGOUORzA=; 4:TmrUAnnzSf8jLI4/zCPoYapgOU16gNCawKeJLcAoUg/og0BZfdPGO8dubyjAWRJYycTmwA8JH0IQpXduUuEp6W7paVV65bJKSrSN0o4EHVr2fgnUSwQ02NSs3QK6wsVMqPidcpTYk4pG2XB/22xWKlaP7ytwtYt97BhONr8XxKywzaiIplUWZwcpMX5KLu1Y7aZmHeYjRhfZd3vl7yY4dAZHCJ7xG+YoSxjoXaD8tlJfyB4GupoDIalqtMgc7NhTASVuBg8N7KZI8y5q3TfESg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(5890100001)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:G9+++HZ34oTGUOly/+wlF0O1EhHfDAXNEPKfaKy?= AaIHdThq/EzGAGkJ7KvEt5eeHmX0hRf6/80KNbHDIYW5R9cWnuaq3EJKApe+qUmNvSZNfLpGTMjC7E4huqL+SLqfBsDEdmfiAXkBOm1f/LJwyt/5F/+Xf8rHiNEPCS4JLcnZ6GmwC1LxzzkN4dWIUx4EGaQeo/uUzknWqBksgwxoAjjbkKr3QhdEfwFira0TyA0z8wu/SMGrBaLPFIMDR3PacOVWElS6wubi9dmpayjhf2fldomGbqWlJVl4Nzy7Y5fP7nEcDqdNR88gNOyXUGuIEYHqtJ3EmpF62ftB2HFhZecgVvD1k2huTUmxKN7ZpvoVEAKfH33d0GcYlmJPwxruPFRbbYbgoAt5YJBUSbxxWw0QgO8QFiqsjbcR9H66gmNtUUpI0mKIfjUskLmVZzbr7uJ17/KdzT7+Q8TWPUA00oSsTtfVmt38Y/4lnn2xKv8cjtlbxeGaqdDqQPPJt0cy7k2v1T+05d9TpAiaCLKHSt2uctXg3UsNy4gqnAeNavT44gizm3KN/rcZaM9EbgIf30C1W6TNxIqYxsAHpmX6NgHJkQWBJ36GCs3c6qtAH4TV7wePfNv+w712W7Rtf/RyrEN08tTEkG3a6bgMSNJQOiAd2lI5AtqdEe8K0dSiLmOzcseYaJl5MoL4gxh4+I5DkXI0UnIlPIt1XS3nRY9CSfp0opfu+ULDK5xr01IlsIwP/c5AI3PD6QolQNZUtc5QI8qfT8KaOFo7xMHHIZkDO5M4ZOQrrux0xCh1btyuWibn6IJLQGQ7icvAS6/GxaKtJ/goMjCs3eUmv4fBqQM+azYPBkC+HhbvWKNjGVcnVitvc1nnf1zp393jWe8kXu5dmkl/OEPtcpS/9rT1qg89gNmJFuZs0gRj3ScHBBQn/vrcxEWZZ9o3W1ssZ0HbrubpJM+sAWlvLjzUa+75r4z+QP4pw+1/qojtkZ4aIWbQPzqleK89iMFP44a9z0kGhe6jqnb3kW4aSpPsUkv43/DJz2Jzkzds00LidgjTL6GP9I1hcvibGjw+lIoUZGL2qCzavmSpAdj3I7o9/jNAUbNsmkVHi3Sd14o0CJ3zraQwJKLLzNN9bVtip9paZ7T7ygLPWmXhOko7jqrab5AfB8CHjsyD2mDqL/CDRcBGm28xiYArOBw6LQWC8vENXfuVuephIygMBFIemx5Z4nPBwjWfnhv5ME8MEfxTYwAY1ROrDhbXeppuaWReVtFiX4DmvIaIaCb2diG3SLBb9KIOn12duYQKkD/sWlpSxFqYMCjjw1wYB6/+16lIdWcj7atpR51DL X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:kbPexzHrBg/fdN3A767FbQREhjgDl3oTc3r1Zhz4gX3i6HmzR1V8hYAB4u/v40mFW3UjSNbadvUmL4J2XOQFz1qEwIsvSgGEZzdms5wihBYKMo65Fd5l0QSDQ9Pt/gtt/Li5eERP0qnazmHz4zRj1wjic47OeU/HntulT95zoY5iCGGQoV0sJ4mbbnOXGwjg6srl6CkR4IwjOPnmVLhmeK7m1fGtRfObOPW+/AqPXEKTxprpyU9K4dl8+FLxAnpssQUWE7BBF9kzPNUy4GCL+gb6ESymljNoSBjqlqtb20xg6IGsSHcukNwAtri1rMhvDcyrWmrCuOh2DSpCho+p8FnwczrP6shg+dD2tQsUUjQ=; 5:cmumNAf+ufJ5hhx2WjlOYWiU+ORJQCEwnzYmrho27G7wT6oZlg39WDovLtecGDnxjoM72TKYz79fQJY6Vtei8mwyBAKq4AKEa9nt3dsa93Iv3OeT2rdZG1eI07ON6L777Vyfap3A/cUY7pdKlQBvBzNJysd9ouims7j+OUyiec0=; 24:5B90ZiyFlyuIRSeVoEh+MpdpJEgBL4hkEGzKg0V3BVDgTYWHI3zvXu2mgTl6003rPY1yUKd115JouH2nJ2416tuQ5EzzTiWE64+3J/uibdc=; 7:l0kenCyDU48nX+dw9N3iwMT012Cnl2+Lh3lQFIVnr5PR22OVCOfYD7Q5hdkuDxYoLaftF3C9UMnzzhck3qHdLOKYXQ/JIgLyHtoH8GlVUPBLKOIeYtdcDglYjjo1Wt2ISheEDaRug5gHRca3s/RpLO2FJPdoofawIU9GcwuuwD3fSN+U0q+GGNjFPJjFtOpDFTgsi5Rhzfx64aOsdMfvA2g3qoOXz8C7jWau/ljyrRy9FOdmCq/G/bP+jtoVtH32 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:MehhxFYsZLczYN/DGuOTpWpjZvT6nLs3fWia5erRADnkt0CvJmH3VQuXauGXRfLhe76X981dntTjqGHfWHymrnXUXuAZC0zTQ94pJHIfkJS0tXBRwnVb7/Dtyu1L+fsJ3oIu1rvmhaesi2h6Jp6mZEgyHZstIgFQIJmsTtQHhe4= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:17.1842 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4ffb6a8c-ef60-4b99-eb05-08d56da094a0 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.117 Subject: [Qemu-devel] [RFC PATCH 08/34] hyperv: qom-ify SynIC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Make Hyper-V SynIC a device which is attached as a child to X86CPU. For now it only makes SynIC visibile in the qom hierarchy, and maintains its internal fields in sync with the respecitve msrs of the parent cpu (the fields will be used in followup patches). Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 4 ++ target/i386/hyperv.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++- target/i386/kvm.c | 14 ++++++- target/i386/machine.c | 9 ++++ 4 files changed, 134 insertions(+), 4 deletions(-) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index af5fc05ea4..20bbd7bb29 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -34,4 +34,8 @@ int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route); uint32_t hyperv_vp_index(X86CPU *cpu); X86CPU *hyperv_find_vcpu(uint32_t vp_index); +void hyperv_synic_add(X86CPU *cpu); +void hyperv_synic_reset(X86CPU *cpu); +void hyperv_synic_update(X86CPU *cpu); + #endif diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index 4d8ef6f2da..a27d33acb3 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -13,12 +13,27 @@ #include "qemu/osdep.h" #include "qemu/main-loop.h" +#include "qapi/error.h" +#include "hw/qdev-properties.h" #include "hyperv.h" #include "hyperv-proto.h" +typedef struct SynICState { + DeviceState parent_obj; + + X86CPU *cpu; + + bool enabled; + hwaddr msg_page_addr; + hwaddr evt_page_addr; +} SynICState; + +#define TYPE_SYNIC "hyperv-synic" +#define SYNIC(obj) OBJECT_CHECK(SynICState, (obj), TYPE_SYNIC) + struct HvSintRoute { uint32_t sint; - X86CPU *cpu; + SynICState *synic; int gsi; EventNotifier sint_set_notifier; EventNotifier sint_ack_notifier; @@ -37,6 +52,37 @@ X86CPU *hyperv_find_vcpu(uint32_t vp_index) return X86_CPU(qemu_get_cpu(vp_index)); } +static SynICState *get_synic(X86CPU *cpu) +{ + SynICState *synic = + SYNIC(object_resolve_path_component(OBJECT(cpu), "synic")); + assert(synic); + return synic; +} + +static void synic_update_msg_page_addr(SynICState *synic) +{ + uint64_t msr = synic->cpu->env.msr_hv_synic_msg_page; + hwaddr new_addr = (msr & HV_SIMP_ENABLE) ? (msr & TARGET_PAGE_MASK) : 0; + + synic->msg_page_addr = new_addr; +} + +static void synic_update_evt_page_addr(SynICState *synic) +{ + uint64_t msr = synic->cpu->env.msr_hv_synic_evt_page; + hwaddr new_addr = (msr & HV_SIEFP_ENABLE) ? (msr & TARGET_PAGE_MASK) : 0; + + synic->evt_page_addr = new_addr; +} + +static void synic_update(SynICState *synic) +{ + synic->enabled = synic->cpu->env.msr_hv_synic_control & HV_SYNIC_ENABLE; + synic_update_msg_page_addr(synic); + synic_update_evt_page_addr(synic); +} + int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) { CPUX86State *env = &cpu->env; @@ -65,6 +111,7 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) default: return -1; } + synic_update(get_synic(cpu)); return 0; case KVM_EXIT_HYPERV_HCALL: { uint16_t code; @@ -95,6 +142,7 @@ HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, HvSintAckClb sint_ack_clb, void *sint_ack_clb_data) { + SynICState *synic; HvSintRoute *sint_route; EventNotifier *ack_notifier; int r, gsi; @@ -105,6 +153,8 @@ HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, return NULL; } + synic = get_synic(cpu); + sint_route = g_new0(HvSintRoute, 1); r = event_notifier_init(&sint_route->sint_set_notifier, false); if (r) { @@ -135,7 +185,7 @@ HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, sint_route->gsi = gsi; sint_route->sint_ack_clb = sint_ack_clb; sint_route->sint_ack_clb_data = sint_ack_clb_data; - sint_route->cpu = cpu; + sint_route->synic = synic; sint_route->sint = sint; sint_route->refcount = 1; @@ -189,3 +239,60 @@ int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route) { return event_notifier_set(&sint_route->sint_set_notifier); } + +static void synic_realize(DeviceState *dev, Error **errp) +{ + Object *obj = OBJECT(dev); + SynICState *synic = SYNIC(dev); + + synic->cpu = X86_CPU(obj->parent); +} + +static void synic_reset(DeviceState *dev) +{ + SynICState *synic = SYNIC(dev); + synic_update(synic); +} + +static void synic_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->realize = synic_realize; + dc->reset = synic_reset; + dc->user_creatable = false; +} + +void hyperv_synic_add(X86CPU *cpu) +{ + Object *obj; + + obj = object_new(TYPE_SYNIC); + object_property_add_child(OBJECT(cpu), "synic", obj, &error_abort); + object_unref(obj); + object_property_set_bool(obj, true, "realized", &error_abort); +} + +void hyperv_synic_reset(X86CPU *cpu) +{ + device_reset(DEVICE(get_synic(cpu))); +} + +void hyperv_synic_update(X86CPU *cpu) +{ + synic_update(get_synic(cpu)); +} + +static const TypeInfo synic_type_info = { + .name = TYPE_SYNIC, + .parent = TYPE_DEVICE, + .instance_size = sizeof(SynICState), + .class_init = synic_class_init, +}; + +static void synic_register_types(void) +{ + type_register_static(&synic_type_info); +} + +type_init(synic_register_types) diff --git a/target/i386/kvm.c b/target/i386/kvm.c index dfce60e5cf..84c5cc2131 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -665,8 +665,7 @@ static int hyperv_handle_properties(CPUState *cs) env->features[FEAT_HYPERV_EAX] |= HV_VP_RUNTIME_AVAILABLE; } if (cpu->hyperv_synic) { - if (!has_msr_hv_synic || - kvm_vcpu_enable_cap(cs, KVM_CAP_HYPERV_SYNIC, 0)) { + if (!has_msr_hv_synic) { fprintf(stderr, "Hyper-V SynIC is not supported by kernel\n"); return -ENOSYS; } @@ -717,6 +716,15 @@ static int hyperv_init_vcpu(X86CPU *cpu) } } + if (cpu->hyperv_synic) { + if (kvm_vcpu_enable_cap(CPU(cpu), KVM_CAP_HYPERV_SYNIC, 0)) { + fprintf(stderr, "failed to enable Hyper-V SynIC\n"); + return -ENOSYS; + } + + hyperv_synic_add(cpu); + } + return 0; } @@ -1107,6 +1115,8 @@ void kvm_arch_reset_vcpu(X86CPU *cpu) for (i = 0; i < ARRAY_SIZE(env->msr_hv_synic_sint); i++) { env->msr_hv_synic_sint[i] = HV_SINT_MASKED; } + + hyperv_synic_reset(cpu); } } diff --git a/target/i386/machine.c b/target/i386/machine.c index 361c05aedf..8c4baa2f79 100644 --- a/target/i386/machine.c +++ b/target/i386/machine.c @@ -7,6 +7,7 @@ #include "hw/i386/pc.h" #include "hw/isa/isa.h" #include "migration/cpu.h" +#include "hyperv.h" #include "sysemu/kvm.h" @@ -653,11 +654,19 @@ static bool hyperv_synic_enable_needed(void *opaque) return false; } +static int hyperv_synic_post_load(void *opaque, int version_id) +{ + X86CPU *cpu = opaque; + hyperv_synic_update(cpu); + return 0; +} + static const VMStateDescription vmstate_msr_hyperv_synic = { .name = "cpu/msr_hyperv_synic", .version_id = 1, .minimum_version_id = 1, .needed = hyperv_synic_enable_needed, + .post_load = hyperv_synic_post_load, .fields = (VMStateField[]) { VMSTATE_UINT64(env.msr_hv_synic_control, X86CPU), VMSTATE_UINT64(env.msr_hv_synic_evt_page, X86CPU), From patchwork Tue Feb 6 20:30:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870113 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="P6NjbK1T"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcZd3pKRz9s7F for ; Wed, 7 Feb 2018 08:11:21 +1100 (AEDT) Received: from localhost ([::1]:34450 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAWN-0006Mh-Hi for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:11:19 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44699) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9to-0000jj-3H for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tk-00035u-OR for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:28 -0500 Received: from mail-eopbgr00099.outbound.protection.outlook.com ([40.107.0.99]:61504 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tk-00035N-DU for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Wgy6IrEBZxPUbMQR8q3MrYOLrNpuqv9GWXEprVuItP8=; b=P6NjbK1TAM0iWuQ6WGiIZLR2cGla+KsETpilRr0o4nCy5hrL2YJ8As337eXIvfqns+CKOLZC18RwLhFmE7Y1pNdNj/XVBoO7cK6TgolHv7RVsvI9W+rkaQJ30NFtp+4rczw6NOCfK07bQGzjW/PODk9lQYA9HLqtX4K9LSQ37ME= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:20 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:23 +0300 Message-Id: <20180206203048.11096-10-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 78f8b95d-39a6-4f2c-caf1-08d56da095c3 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:/rwqG4jIj/9DSMbnhKx7c3eRbD/5JCkDCBRbFPOhCm00owV9eJ2lAvA1izbnku4tB+V+/cbMYejdL1FzCX44j56Bcb3QC/5TkQq0W4Rk9nlHsiyJXCNhhaVJRs2bkSjwwjYSgH1iBokWS9YPe9W23mAVRFKPIhGQYxZ5PvCl3Fx0bcUn+neRo9M85lfd4rB4m4HNXSt8rMI0kf3NiyG9+8OviPrWqa25atAIYG6dK8cpjgoSmAFqkWirrZZsx+bo; 25:h7Y4l2A5HyNPwjLodaDqZgLiCgsrwge9lGysxglnu/Ogx2M86BcguCvJCtJR3RT7T/klTaNqZXAAcgVfa5kNt5+DrkPnlRQoqm4ZM/Q00kTuSIytinSdpHWSuLMbOCaPU4/TPUVW29xmIXET9Yh6J4YRj+rTp3GEXpMS42l4fmXipnMct48CPzUrr2bgoamkyucf1ooFHJMDf+1vek5uKpw1bPVFVCpY+lBek31YCdbOTsWz5C/QinJ5yScH/fHwAQ8IIi4oUMGMvQp626HiDcHw67t4q2r0LZu9WdjQvWeWYboSDFYY+ToP7eeodHS8LGsVD3PlnPXvynsAGxDDdA==; 31:T4HwBBerUvOk9t4g9L1jNsTz5xFnAQPnYq72b2YCjlB67R047UYzPbqjVp6YcUbXeMayEW/mYcBDF34KpwwMg1c/c3ZuBBLM37kqBKU1QW2OobEnogFai4TARzOuVxMicnDB9o3sXZ6YcMiq5F5mt2osb+PXGkDD3BzD0gGJMWDQOZ8kfgwcXMBRhI7YsRUobhrGOWYT1bLSQQJ2Z6iNy4Kheg1BUr8J+ESlzmc0MzI= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:/3r2cEYW2Xxu8mbwKfW0WfM1Ay9Dffbm1Zj0P0GMvra3Lj6G7ISBR/iSa+uOMCldey7zAWCo1a7L9NPnn5LH4zxsjhxQYu0uFZLAI8z5NOUZA0f7Gg0qLW8yBnj4XqRywIbusO3QDdy2NL2CLOro547tib3woF7uzs8thXnnD4/mgrHUIov0K+mBE8GLL3DlgXOIwgv+Vczeg5UxVZQZFHxvVjXJSp1TbF0rCAvTurrBWXLtYmo2UzKhchZLXzFnDv8Hutb/xHUnU388MIA4URDa4PM6mt43GWh2AW6LJx4utBeX/m1VHjoN3khzsqlyzaK+Il1GBvKy0wZRgVf0hXtn5LqEyeP3OcAOqJuaacgf+a+LnRz+uqD6xCQSktN94mqbajKJZxMYpQoE6IxjjsRX0oU76cD2xKuckNRjivA=; 4:BJteeU+Oy87daBr9Xluw7drHxdG9jOoxYXwSBlr36C+9Xh0uljZ978lE9wrY3MWqEAgzOLSO6ujvm0WTdiMYYSu/d1HDzPBuU/C/uTl+4cFidYxqiUgQ/4+UAwRgjqgLikNK1CaCeeG32ouOF66358cvnrUOljdUzhbFCkE2bWqBqBLsVRa/JhSHnu2lkdXD3f5UY1BOhTmk8jOuWAcLmVIW/XmqktzM/owVOA+RIs2kA+iMSaDUqwyP+X4BEFMF7G1/Ne/cU46NbizQHCUYdA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:cCcl37+MWTcD5DfVbV3UhLdUjGKZIE6S0j7XJQe?= mQ3LQB+ZL8onu4BSZaYlMES4jQo8KXPtRYGOdXSL0SIOi8Xm1ALt0pA41vljKlrVDwuGkPO6Gy+jwmQXiXnJPekzbE2yqbTuPQBuppmFscs2YdnO3lwqvZiOhsD7ct7qzNekUoPjdfnoU1U77J2lJAL2ArLV0QxeYcCuNZKSszJwxv/+1FGk/8vsAWNhummmbFQOCi7P0rgQkPhYzkBYKsV6aifdg81u+AbyX6uWW5M50sMuApO+JXwOjBGbOCspEfQKDCvmwmh0DaZLZ1D+fQP964paxftN+jT1LAy8XeGp7VDtreFVWcLEe3aPMjIDOxthLM6HIpBptHtUT+BLVqb78hi8ZkIu3HPWdpZp6vcNea/XwADvI4Flw8dH56QQ40ipQFeo+E6I0IuCkAHEI0zoyXInEJZJbv3qOTlOW/yWsEo9GYCd7wnPX7JJdwISOGAjxG+rcV9xnH6RurItaHqCoi652TBbVL9wZ/Za3+5YEJ7d55/cwuQVN9hzGRIFj82UbYVDC1TPLm93Usyp4FhcPqiLDJEjDXCrYzRum02tuLzhOJpWnFh4fTJiaPL4zav4ndFLo3YCzB6icZ0su5DfBC1jRRe4VG40yv3drrTVnfHsLyFZOcEmG2jkbpSHgn9ajqngbJ4VTEbaL+n6yYxszolDKZdTWiAICLaLi0DKV/jrYyIVQcFUTiWh8sKHLsOuxRv1oXo7iUbZyL9O6GZnIpJxQUHFInZQqEYnFPk66x69SOBdFRoiCNPN7oueOZ/8l85XON8YkjVWP0X4TlaVcpJST4tY4om99A29/msnZGi4wS3xb6+3cXl1250iBGIhi2wDe/U/ucpdfVNaj/znxSZn8Omr7WR9GYJGJ6eiAE2WGdsvRRd0f+/+KF6XEyw939fAV7XC4GoHBb3JUFKe9phqdlOuUMkuK3hKREFVKJQcLce7Y1WAOacqwXBnIp11/PP3fSfVeAwJEvaq2nEfYCw7vAOaA1wlyRYj81I+JJnqY3W+xgHMx2Or4cmsItSkIpkzyLGFjsRUsL6TFFidmDiM5TIYIf+6ly1k8HRyOxvEd8po3AxBt3o3PVgZlFRRJSkHhiiv/g1Sh7lxLdCuuo9pg6ye5OPNQPUUt5+Etj5Zza9XgQgqJYcg8N0ueueZou8Rz6s8y0ODosIIZlcAGUNtEUhoHw4CpqaMQweMNUd5bIQtA2RFZOTWNCGB8nlRHU98GHMhtKCgIHJlZ6dV5ddvtFkS1DsDjbtRJaMYwYg== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:EK83n8MIy90TbL5sa8vg7ayLrWov2TuskztdoPd9IlLCexNPZdxW68sGcWbnxGwFTiFB4KiDWzuY5rkZr4L7RrSVJ6wagdBnzhNky4v+G/pos2CHSy8qeOx2z+7IC2wHT9rvxo62klimthqCSPqDr5Kh6R0O2aXNxtWYcZojcm3MFE+/Gz6MSZIDHBkgs3jjNKkyJmzCu0sUT9DjwKYHnflWRotbk4v70jjtjXb4OCsui2pm/9nmi7TQDnMohm+rH7hLgei2vDK+lluVIUf5r+aSvDur/aqc1cnN8HtA/7bVukzYi8CjUyNoiGTFfxsCHdgdqKUecr8rcBpmU6dZriVjBnrtpc01ffS1MpHTRgI=; 5:M9PlNA3Ge5Wys/nJDsD/EZQO5sUniXLD2uPTnGqOzdZ46GQ4rJAVCEGnuTCyHSxG7l4owUCy8/nFjdnGVeUEZkaexix0bCdS4NmaAT6JXtqr7fcPQjfVLwc7rAc2UUJpYqtPeqMle6e179br+STZIZbBb1Ao/f/RFjM62cm5G7M=; 24:rF+gpgckj7trk8Pwd/9rVhHpNQOMZp/2feLqTHpEDlMUw/2M8pVTjc5LExR+Dbs5jlSNGd+HMuzkAh04WcLYYFveK6t+vfN7gq1N2so7CCU=; 7:1E4+qHeh4GTT37k37yrtlMKNWC/a+um+yLb3CipD0c1GtrVKhC4nmXin2CLDbjemoEg+CraraV6BKmrtmxHQvWwCA7r/jIIRuIko06+VrqlY5oBtpEJ64UaM2rssRcEHRkvts4uDW6yZ0T53r8vfGTb5JQsZ4GM49t0X+CDKXt5ZVp2pwbhoia23QQABlnsf4pcuoAbopparQRUWwDuCFZOSaR15ZUkHJS1zC5++Exu4nhtYvokDRiDQcEeUX2ao SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:1RNK/QH4qzRZcNkSiQcxC0+8ViSu+SvCJgDEGgLRfSp+g6731W+m7ahHPlCr0mguuvzDc7owPw7XiW0IYA7o4eSXYrkc3A5TEVqlYaSV6i2BVP+Aul6OC+onesdhFjpexzRCGcRPgYn2b/N5NENCQgyKZYQzLBMMA014SJNlqyw= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:20.1999 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 78f8b95d-39a6-4f2c-caf1-08d56da095c3 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.99 Subject: [Qemu-devel] [RFC PATCH 09/34] hyperv: block SynIC use in QEMU in incompatible configurations X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Certain configurations do not allow SynIC to be used in QEMU. In particular, - when hyperv_vpindex is off, SINT routes can't be used as they refer to the destination vCPU by vp_index - older KVM (which doesn't expose KVM_CAP_HYPERV_SYNIC2) zeroes out SynIC message and event pages on every msr load, breaking migration OTOH in-KVM users of SynIC -- SynIC timers -- do work in those configurations, and we shouldn't stop the guest from using them. To cover both scenarios, introduce a (user-invisible) SynIC property that disallows to use the SynIC within QEMU but not in KVM. The property is clear by default but is set via compat logic for older machine types. As a result, when hv_synic and a modern machine type are specified, QEMU will refuse to run unless vp_index is on and the kernel is recent enough. OTOH with older machine types QEMU will fine run against an older kernel and/or without vp_index enabled but will refuse the in-QEMU uses of SynIC (e.g. VMBus). Also a function is added that allows the devices to query the status of SynIC support across vCPUs. Signed-off-by: Roman Kagan --- include/hw/i386/pc.h | 5 ++++ target/i386/hyperv.h | 4 ++- target/i386/hyperv.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++- target/i386/kvm.c | 8 +++--- 4 files changed, 80 insertions(+), 7 deletions(-) diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index bb49165fe0..744f6a20d2 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -352,6 +352,11 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *); .property = "extended-tseg-mbytes",\ .value = stringify(0),\ },\ + {\ + .driver = "hyperv-synic",\ + .property = "in-kvm-only",\ + .value = "on",\ + },\ #define PC_COMPAT_2_8 \ HW_COMPAT_2_8 \ diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index 20bbd7bb29..249bc15232 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -34,8 +34,10 @@ int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route); uint32_t hyperv_vp_index(X86CPU *cpu); X86CPU *hyperv_find_vcpu(uint32_t vp_index); -void hyperv_synic_add(X86CPU *cpu); +int hyperv_synic_add(X86CPU *cpu); void hyperv_synic_reset(X86CPU *cpu); void hyperv_synic_update(X86CPU *cpu); +bool hyperv_synic_usable(void); + #endif diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index a27d33acb3..933bfe5bcb 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -14,6 +14,7 @@ #include "qemu/osdep.h" #include "qemu/main-loop.h" #include "qapi/error.h" +#include "qemu/error-report.h" #include "hw/qdev-properties.h" #include "hyperv.h" #include "hyperv-proto.h" @@ -23,6 +24,8 @@ typedef struct SynICState { X86CPU *cpu; + bool in_kvm_only; + bool enabled; hwaddr msg_page_addr; hwaddr evt_page_addr; @@ -78,6 +81,10 @@ static void synic_update_evt_page_addr(SynICState *synic) static void synic_update(SynICState *synic) { + if (synic->in_kvm_only) { + return; + } + synic->enabled = synic->cpu->env.msr_hv_synic_control & HV_SYNIC_ENABLE; synic_update_msg_page_addr(synic); synic_update_evt_page_addr(synic); @@ -154,6 +161,7 @@ HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, } synic = get_synic(cpu); + assert(!synic->in_kvm_only); sint_route = g_new0(HvSintRoute, 1); r = event_notifier_init(&sint_route->sint_set_notifier, false); @@ -240,17 +248,32 @@ int kvm_hv_sint_route_set_sint(HvSintRoute *sint_route) return event_notifier_set(&sint_route->sint_set_notifier); } +static Property synic_props[] = { + /* user-invisible, only used for compat handling */ + DEFINE_PROP_BOOL("in-kvm-only", SynICState, in_kvm_only, false), + DEFINE_PROP_END_OF_LIST(), +}; + static void synic_realize(DeviceState *dev, Error **errp) { Object *obj = OBJECT(dev); SynICState *synic = SYNIC(dev); + if (synic->in_kvm_only) { + return; + } + synic->cpu = X86_CPU(obj->parent); } static void synic_reset(DeviceState *dev) { SynICState *synic = SYNIC(dev); + + if (synic->in_kvm_only) { + return; + } + synic_update(synic); } @@ -258,19 +281,45 @@ static void synic_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); + dc->props = synic_props; dc->realize = synic_realize; dc->reset = synic_reset; dc->user_creatable = false; } -void hyperv_synic_add(X86CPU *cpu) +int hyperv_synic_add(X86CPU *cpu) { Object *obj; + SynICState *synic; + uint32_t synic_cap; + int ret; obj = object_new(TYPE_SYNIC); object_property_add_child(OBJECT(cpu), "synic", obj, &error_abort); object_unref(obj); + + synic = SYNIC(obj); + + if (!synic->in_kvm_only) { + synic_cap = KVM_CAP_HYPERV_SYNIC2; + if (!cpu->hyperv_vpindex) { + error_report("Hyper-V SynIC requires VP_INDEX support"); + return -ENOSYS; + } + } else { + /* compat mode: only in-KVM SynIC timers supported */ + synic_cap = KVM_CAP_HYPERV_SYNIC; + } + + ret = kvm_vcpu_enable_cap(CPU(cpu), synic_cap, 0); + if (ret) { + error_report("failed to enable Hyper-V SynIC in KVM: %s", + strerror(-ret)); + return ret; + } + object_property_set_bool(obj, true, "realized", &error_abort); + return 0; } void hyperv_synic_reset(X86CPU *cpu) @@ -283,6 +332,25 @@ void hyperv_synic_update(X86CPU *cpu) synic_update(get_synic(cpu)); } +bool hyperv_synic_usable(void) +{ + CPUState *cs; + + CPU_FOREACH(cs) { + X86CPU *cpu = X86_CPU(cs); + + if (!cpu->hyperv_synic) { + return false; + } + + if (get_synic(cpu)->in_kvm_only) { + return false; + } + } + + return true; +} + static const TypeInfo synic_type_info = { .name = TYPE_SYNIC, .parent = TYPE_DEVICE, diff --git a/target/i386/kvm.c b/target/i386/kvm.c index 84c5cc2131..663501355b 100644 --- a/target/i386/kvm.c +++ b/target/i386/kvm.c @@ -717,12 +717,10 @@ static int hyperv_init_vcpu(X86CPU *cpu) } if (cpu->hyperv_synic) { - if (kvm_vcpu_enable_cap(CPU(cpu), KVM_CAP_HYPERV_SYNIC, 0)) { - fprintf(stderr, "failed to enable Hyper-V SynIC\n"); - return -ENOSYS; + int ret = hyperv_synic_add(cpu); + if (ret) { + return ret; } - - hyperv_synic_add(cpu); } return 0; From patchwork Tue Feb 6 20:30:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870115 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="DVpVeuQt"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcdr5yjSz9s7F for ; Wed, 7 Feb 2018 08:14:08 +1100 (AEDT) Received: from localhost ([::1]:34754 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAZ4-0000mm-RJ for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:14:06 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44711) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tp-0000lU-Or for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tm-00036g-CF for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:29 -0500 Received: from mail-eopbgr00101.outbound.protection.outlook.com ([40.107.0.101]:58891 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tl-000360-O4 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=JR44dtPGv2W9cH0yaUFlGIAkMdNSPuI2qFALn+zLGiE=; b=DVpVeuQtJjR2pXNTDXHdjS8mr63/LcQFwCuqpYj1oQpsX2fW09L2xUpsvI2+bBCtcwEECLkIoiLgaXEYpvsOR9jchQ3+MrB0JjlNdOHNFK6IMkEH19Gx9rydDq4m9rr+J0oCN8oTlOiFexs+EVPeHTptMjSQ1sM7ri9MLBKKXVI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:22 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:24 +0300 Message-Id: <20180206203048.11096-11-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e8d12459-1f77-4213-9943-08d56da096b4 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:GdF8gurS+s9OomPNY3NvY3ckzlqa6MJXUqWKUmMktoCxgDapi3zJD7Zer/Xc6TNGsHj00d3zBkRApV44xafB2osAoV8WWZ5ZvDzOWwYXVvblAEh14fXTRwLFBRjUX3VRteG4/fpy36ndwv13oVl1j/ujDYdiwsWXORmELuUEMxnND5gNDdfURMHDYW6CtFuvehMOg8IUgrCvsWWxRTBUcqS7tq+Hqfe2Ps7pW6Yo6NmTTkqhJ9XxDJgMe4IlPyx/; 25:Tju9+Dbzz91rj+GlVilE8XTkuUyLgDwABF6EXlvro2yRoXCbSO5UQ9891nQrEk4zeb/ZrRzf3mLk0kvjv6xv9dqYY8mXUJLsFJzoRNzdNIWBGymhxNimuFQCxjbch0uSQPqGv4qJZqtbzIibkaf/LUmxL3udIsH1TlYZvNXyPAy5o0cGYwTXKatdmx1JDp/naqOXqh/ck5aiCSkFKdGzl843Qf3r4ZwtnUS+slshnUkBKN9JJIPHDHIAxhQvXHiHSqtWtG+89FRevBQE9Q6w7i+ZsRMdLsowN7FzWlJFyDfsEcx5e1hJtS4K3bm9wZJ55bkBrrGSjCP7eN173EPOvg==; 31:K+yprhtaOYAjOjfGsubSkK+2QLIEq98d2kYovlCxpgOON3gTHpt1v5+lbcvGI0mLlQDXLZPSddsHrVkBZ4dTtSqM55buaFfWos+6nZNuB+ZwLUG5+aJ4V0Z5b87URwM8z7Cw3NVEqD9u7CEA72ZFQ7Y65gUOj/eCL3CqYIeb1E7XbOoE6imocg5TRcng5Tzh7GjYWi8e6M67tgSgNbxJTV6Aij5XFGrgQ+3g/8C+ay0= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:OMTIlo4O7Ic8CmbKs209TY08MfNHjZuaEFuzKkd/kU0HAnmOHE3PWZIxuNMyYNvZ8+iJ80l11z5OPW2I7FIDJJjEL3SFw2KBOS7CqWeGdKUDNBF6daJGvYQ53igSCuZnSrleCfibUBsYrrIMfwZ3ioIEg0c7bS5aubNE3G9PWjYDr9EUwuJGVXf8Acy6uH9fUSNQB/ImcEnL1YukL5n2SpdxlV4hY2u7rIGd7O2SIWX6vXeU+2s3Aj+CzATGiHqL/apZ9HYZnZCNShYFuvgtrphxrWWEVWZm5Wjv7oj6VSaUBYH1eab02/kaWtAUTJLj8dpMN65/mJJwiQ7LahNy3QiuyeQ/m8Gtk+CF+ttXTzBpIeyo2BUlr18BnKjyI474DY/DcWWm9wk52MzmuLn6IgZdDlyC3vMBhasGf5nxn/0=; 4:0nvJO25DBVB07V9hzLJ0a4lpTOJoqCPwEsU3hcO+SfPcXoAgddSPfHy9jyzomzrJslZxsyRk+xpyk5mLftCa8wewgjCyCPxIPuQb/xbX6OZKkoHmI7kSXRXkn4xYwvxiT9rucdsH790Vfr7DC4DyIEJ8CS4sW4CFUWY18ASusLXpw+YVWiMqfwCUx+RGO0ruy3gmBBF0iKHvqCoPO8kuX35+J2/5yFzC4aMICLOKAWSY/oY5msTkSViTb++4oVvMSw6eCN6GrtzAg4m6iQVAJA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:DPNR6DOnzZuc5L4bl6RX2JRVjiVaXI1ft1S0tAT?= +7eJQljnmkhT3cJxRUkG4MzjNv/LuQzGWXVA113lduxhjmQS40uiipwxWWntmxqaald+s9/GV6IaCyv2uuYpz4hffSjq7tPIXUUlI+q3WsoRyl1pCpdsaRDekMGR1ZlcjLYIumzBHL/5NV89d/M0RF1UxLeSwY0DFrsHKj5vdhkbollIN/uKCFLNa5BJtkEQkoIlgWCBGrYhPWUXIfFp9KqC1egTpRgHw3efM4bZo29SyeJpurpyM7WaPIVWvQcRyXGO40wHIGXiOKEZUro5TW9bH8dz47vpyC6VNrEFkCj7Ip592WnNyCneczXWAg0lZ102TTc6NFvKXQ7S959BBkavwDimFODXjdgTrH5Xh7q1mwREYIQNEy8OtVtbKlvEVOOB0Gcw6rxaSTIyTpwDuATorfQItOcTwYp5MPNrzoFtM//eP3ulDgytX9Q+k8Y+Iwd7VBV1QuPeFDGu/qIWOcmFYKvgGdDrNqO1o0Cv6aVcai4q0gOM+ho46roGOI5npdtfobKPz1nGlMIIGuJp8DEtfUrYh52MKwUQXIypuIDi7lleySNLBa1TztffXRPqHARH0SrrLLZ3b5/NK69kysXi6JrJzCaHQl5R6WvXS+xLFF96PB6RJNwHejfcIdFIk3bAtxguyY4odx52+gGELHT7OjZAQzF6Tu7bNqS/B08/trvjvL83bhVng8WJNy5yMZFy/uXlQ5aRd8LbQcC592TdFq1yIvFCawzL6a5wUfFRCyDgWhdO0kzoX+Q+Eb5rF/pGwRray8ThH6BRdSYo6HwHChPQfDqmsnCR4qVAGsXXv8k+8vezoH7nmlAEH7joElygyHm6FMSF3gv7l0XmMm+BvxJKwM+bH7vtESbxFOCDjJn+9fiWbzGkkdBF4eqgEgHIEIh9VE05+EPyTjff/il4erJH4WDcRz57PrNAJNvfPrQu7OCZXyIkGXB/hGBvlLr4uYt8h8Ba9bVUF44RQaOszLNCvRioUQOkM1ymFjNax6OEOmYaHWP6PymjMlUMxUPiyHFeRQeLS2IQowvqgxAYNokyt/LdbYZGjYgc9EnRqa+lxCQnKgidwjXA59//L/twLWrKbBuxwEBYVkZSy4RBN/H+QeJAgCuTUXwybX1eZL3nd7tFHFKCyqWD0MuUKvy6DW84norlhIQnXvGJ5P+9YeaZIMfSdOvYjmQiLzrRig49i3dYIvPU9SgHe89vxkfLwZBzjh+ZBir+pi08Z/KGOkK1kE8wZhEh85heUjIZ+uQ== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:iV52Refe1xKZQeS5cgMCD6TuJYCzdMjtnusjLZeDshkIx2sncQrjjCh1D4gofrctgNAqiXRguWPPntV11oHucKJbHB0cf3PuDaOYr0GnJwppdUoDlRnqXPMMG6N5Ios+i0jE7hZHdZ32eo0f+Waxdf0JMl1waFFvbUsFmk/ctJSn647znK7XZUdq18O1HTg67c4jChaT7d5BktlwBPdD2W45+/FXt1ti0hBxfMl2D8R1bxwjdaVt4/3ZHCojhsfY0OSMzlfq3uBkH3dE3AipvF4Ph9FqDyKHzsqQ4YVmMzjwtP3yahb0HTAYmbnIwoS8Eb7rMRrfoJkusFwFbQOstNUHgZHkzsUfkcG9DlNveN0=; 5:gWtKGPY+KtL+VYIIsXUpokvUg+IpnQ1ZT++t2O/vH3jUDAdeGdE4M+qSrN/ECgu4RSwtXL5jHrkx0I7atLJIMsVMEG++VOWwRegaG5Xgna4scJr7AS32v4BQ8xi1wfvOOINYLzC7jtkcU3SK7WJRJ+MorVCtqkT0m5zEsTlm2Wo=; 24:CdqudPH+3S6rXbTYIedo8LZbzoUliz6u5CYRrEmm4YWksGms+eUlYem8s74NVc00l8w1wd1rjGxrcSW/31iLleAyVgBByy8a1jQFZ2K1HuM=; 7:BsEJmnUbIaBwToENrswXKaxaOMjdoMVQnCQCHd1oQ9UHZpc/iAIJkMd1w3NDvtujZcTJ4GtCXso6WHrhD9N1purBAuJ6NVQDyL6S3VL9aSWpJxHa1ptG59+Y6+0W7DzHV//nKTILSBW2aIKyyCpmnV1V6ee7cdy1bShrRB8cG5NivpsDM4WjjZLA++BK0igr/8owk1+QvdZ7HZoA7KJD1z6PwrFxsDyJfQ2B+bdnZWLoWvNwNGmX9/F3Dyewi0n9 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:WD/elgLJUKcGIvsnABlT0jU9h7Brxr7NhsubNshf2NZnBPdV7/pf4lKq5oQIyODG3VFqlKGqODanyiRUDJnunYDbYn9k8ay7pRHLzFzY/ewWlnDFRgYKjqxgKBTYKv3YxBheMhwE0BN5HX0uLC1SRvEZEWNBsCFzD1xLci53c10= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:22.1062 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e8d12459-1f77-4213-9943-08d56da096b4 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.101 Subject: [Qemu-devel] [RFC PATCH 10/34] hyperv: make overlay pages for SynIC X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Per Hyper-V spec, SynIC message and event flag pages are to be implemented as so called overlay pages. That is, they are owned by the hypervisor and, when mapped into the guest physical address space, overlay the guest physical pages such that 1) the overlaid guest page becomes invisible to the guest CPUs until the overlay page is turned off 2) the contents of the overlay page is preserved when it's turned off and back on, even at a different address; it's only zeroed at vcpu reset This particular nature of SynIC message and event flag pages is ignored in the current code, and guest physical pages are used directly instead. This (mostly) works because the actual guests seem not to depend on the features listed above. This patch implements those pages as the spec mandates. Since the extra RAM regions, which introduce migration incompatibility, are only added when in_kvm_only == false, no extra compat logic is necessary. Signed-off-by: Roman Kagan --- target/i386/hyperv.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index 933bfe5bcb..514cd27216 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -16,6 +16,9 @@ #include "qapi/error.h" #include "qemu/error-report.h" #include "hw/qdev-properties.h" +#include "exec/address-spaces.h" +#include "sysemu/cpus.h" +#include "migration/vmstate.h" #include "hyperv.h" #include "hyperv-proto.h" @@ -29,6 +32,10 @@ typedef struct SynICState { bool enabled; hwaddr msg_page_addr; hwaddr evt_page_addr; + MemoryRegion msg_page_mr; + MemoryRegion evt_page_mr; + struct hyperv_message_page *msg_page; + struct hyperv_event_flags_page *evt_page; } SynICState; #define TYPE_SYNIC "hyperv-synic" @@ -68,6 +75,17 @@ static void synic_update_msg_page_addr(SynICState *synic) uint64_t msr = synic->cpu->env.msr_hv_synic_msg_page; hwaddr new_addr = (msr & HV_SIMP_ENABLE) ? (msr & TARGET_PAGE_MASK) : 0; + if (new_addr == synic->msg_page_addr) { + return; + } + + if (synic->msg_page_addr) { + memory_region_del_subregion(get_system_memory(), &synic->msg_page_mr); + } + if (new_addr) { + memory_region_add_subregion(get_system_memory(), new_addr, + &synic->msg_page_mr); + } synic->msg_page_addr = new_addr; } @@ -76,6 +94,17 @@ static void synic_update_evt_page_addr(SynICState *synic) uint64_t msr = synic->cpu->env.msr_hv_synic_evt_page; hwaddr new_addr = (msr & HV_SIEFP_ENABLE) ? (msr & TARGET_PAGE_MASK) : 0; + if (new_addr == synic->evt_page_addr) { + return; + } + + if (synic->evt_page_addr) { + memory_region_del_subregion(get_system_memory(), &synic->evt_page_mr); + } + if (new_addr) { + memory_region_add_subregion(get_system_memory(), new_addr, + &synic->evt_page_mr); + } synic->evt_page_addr = new_addr; } @@ -90,6 +119,15 @@ static void synic_update(SynICState *synic) synic_update_evt_page_addr(synic); } + +static void async_synic_update(CPUState *cs, run_on_cpu_data data) +{ + SynICState *synic = data.host_ptr; + qemu_mutex_lock_iothread(); + synic_update(synic); + qemu_mutex_unlock_iothread(); +} + int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) { CPUX86State *env = &cpu->env; @@ -100,11 +138,6 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) return -1; } - /* - * For now just track changes in SynIC control and msg/evt pages msr's. - * When SynIC messaging/events processing will be added in future - * here we will do messages queues flushing and pages remapping. - */ switch (exit->u.synic.msr) { case HV_X64_MSR_SCONTROL: env->msr_hv_synic_control = exit->u.synic.control; @@ -118,7 +151,13 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) default: return -1; } - synic_update(get_synic(cpu)); + /* + * this will run in this cpu thread before it returns to KVM, but in a + * safe environment (i.e. when all cpus are quiescent) -- this is + * necessary because we're changing memory hierarchy + */ + async_safe_run_on_cpu(CPU(cpu), async_synic_update, + RUN_ON_CPU_HOST_PTR(get_synic(cpu))); return 0; case KVM_EXIT_HYPERV_HCALL: { uint16_t code; @@ -258,12 +297,29 @@ static void synic_realize(DeviceState *dev, Error **errp) { Object *obj = OBJECT(dev); SynICState *synic = SYNIC(dev); + char *msgp_name, *evtp_name; + uint32_t vp_index; if (synic->in_kvm_only) { return; } synic->cpu = X86_CPU(obj->parent); + + /* memory region names have to be globally unique */ + vp_index = hyperv_vp_index(synic->cpu); + msgp_name = g_strdup_printf("synic-%u-msg-page", vp_index); + evtp_name = g_strdup_printf("synic-%u-evt-page", vp_index); + + memory_region_init_ram(&synic->msg_page_mr, obj, msgp_name, + sizeof(*synic->msg_page), &error_abort); + memory_region_init_ram(&synic->evt_page_mr, obj, evtp_name, + sizeof(*synic->evt_page), &error_abort); + synic->msg_page = memory_region_get_ram_ptr(&synic->msg_page_mr); + synic->evt_page = memory_region_get_ram_ptr(&synic->evt_page_mr); + + g_free(msgp_name); + g_free(evtp_name); } static void synic_reset(DeviceState *dev) @@ -274,6 +330,8 @@ static void synic_reset(DeviceState *dev) return; } + memset(synic->msg_page, 0, sizeof(*synic->msg_page)); + memset(synic->evt_page, 0, sizeof(*synic->evt_page)); synic_update(synic); } From patchwork Tue Feb 6 20:30:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870081 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="icxPs830"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbbr16tdtz9s7F for ; Wed, 7 Feb 2018 07:37:52 +1100 (AEDT) Received: from localhost ([::1]:59057 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9zx-0006yQ-Pa for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:37:50 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44718) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tr-0000n4-1A for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tn-00037I-Lx for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:31 -0500 Received: from mail-eopbgr00097.outbound.protection.outlook.com ([40.107.0.97]:22064 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tn-00036m-9T for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:27 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=u3pnunSeSAby7NuQ3uWuzy2YX/HbHkK1yaVr8pYyo08=; b=icxPs830me7xV1V2NhTM7uucyZqmMGfyT0yNffl4NtMLUmcqeNJ5FZuY8QEusalyDc42RcJ58g3cb9J03gsiglCUYX0CN5Py33llcMLu5YJWMk4DBMnL38JxlPfwKa8kOKY0TI38fWoHXnXXh65FvyaAqD4RlLfdpPpt2sw0KSg= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:23 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:25 +0300 Message-Id: <20180206203048.11096-12-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a5c9d894-e493-49ff-a2ed-08d56da097a0 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:PhD2A2Fjto4sX1F4tYbubvBgJvkdKlCox/GZjR4xOUWHik3WboGLP0nCBklDS5iJ1Gayc/uuw0A8SEluPhuJfJoH4Z/PFJlEzOpcHknnEW6W0aIB73j+1JeCXk7lvxLOVVFmR5acNAeWsbNUz/pgmwohZ8fQBNV62gVmybo60J5AlvnWCt/10W1OUmYv+S5sS4XOvCLqf46DuweFRJglPF0UEoxyFZtWQlUARtj9bWgadsRLdeCiwi8IgdaqJ7JC; 25:EKKYzftb8Bygf1SXvBHpRRyZEWIHp7MKLsZX6rHgOdFA62o5ZeAuyq/TsjikKqKwL8tV/prHQXgkZSuqxHR+cj8Zx+EPtgCw/c/99RR3jSro+5XeSqJzl8kTCQhVP2RiVr8YH+80Wh36SB1J70Xc21iJZU7wIembrauYm1ufvRqPcQcdXP9VZf4FBxZ34Fdd/v2HHtyWjYOdBL1yfoMZh1wjAMfIDGfnkNkjJYjR4KjxcKxX2DipfgEv+zoVm5epwEu1btHhDzzuquYB31S8YtaMbOqHhtyyEjRxk46c6KsUmwVbXommDFNQJdO0oBiejcFR3+WLj0T2w4DRB+c+0w==; 31:dVvrHLyz2eMaikcbD+gHn/MYGsblUzKMjuLU2SsG457N+GlyBdWDMi5JhUdxUTQEGdjsMF6T1+xdnH34FZ+Xcdq7eIe0XDM9vmxkK4xjkL3gYxVwmat759FuAnLy6TdR814Uu+SknhDzCQpTItpWWONSl0OjSWhLTahdw0CJq4wvIEzCVIPxoBFCeZYz+hKxfGnpVojDcQL451/Xt7ADrUIcNYUTanmCKyrAy8Khqf8= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:WHZalwZp7a9JxkPaFbTMRu3m0NsFPPU0g0Kgmt6bYQAyksKtCC93t38R9gj8BtTauYkk0w7XK0r8t0k0Ho4UbdUboqL26iBO6fcRNZ/moEqIYT/qo5/Z3JfbLmqlGy4U7oKttjvgeyJvT6LtumjKZQOZMssD0mbyDOpbI7aMPnP2aAES2pCXmfYniTzakuk8bjU+aK/Nz235h1THQ0R/oMqoemAQvbS3c57cg1xUlu6FUWeX3EMxNNLSGHoJSDpj+Hei/NZikWT090I1XrxzjJkPltd5aOqrQEx7e699RBPfm6sH6pScaVQEcVcSIMNli8pGv57AgHXeRmPzo5+3wDgWbYCU311yg9TF8xBHsPFYJsmc8vLWT//SEtzuMoYwMqwOCBz2XPZIyucyppKVZ52ZH/D7wv7pLrAqUHmnrzM=; 4:VvVoqltmQTNZkvnvK9mFSUNbCx4d26/ySm0jrkg0jN5PMhgw2MWZoS8Sn6/6NsPbRHEFPN5zP2GqUOQC+rzBEZ0hmKDwfToboOq4CfXxAESBFOuhPIe0dNSk6ZaXzuI34TK2Cp0AUBzPkpVIljyW+UStZN/S907wiLR0yfYmJsxVPsj6hCy4OfM2FZsByWwHt+SGcXFFSPnrpsXCnWj6PZsHQ+750AdLVRUJey+4Nhgz0TiJnN4K/nkazBGx1bIY+y/bfKnmjymfPUwCCuID/g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(15650500001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:KazYIv4hbCFoRaCwlF0tgaEGZOAzZPF2rAJrw5n?= GEye3DwGLcPv4GiA0i+81IIBkM1fdmuoKe8zZJyhBpTsX6qUzqwLxGUbgMJHqQnoXmp/kpdj2HBG0px6ow/NP5ZU7N2A4MnRJ/P4KzvcQhF/r2xxEtlzulu+eTq2A5wfYFT8wonOgKr30klnEOHE4B7UU8gpRsULVMpPptIEyTRXVHBR+ac+OEn4FKoiLmQBwVfKv1vfRFFIpzYrlLAveUgw/nyfFgb3detGRVKyI/lt9VFoTU6AEJpzjqzP4QyIXb0QI4EuElAn/EqWrt3eQxMtj29YnrzgXDuC4woIfylCs3YvwsQaVpaJE1uA0I6wAaCyv+j+wFffMB/u8l2AxdNZqDFDPchFrLL7ysBRFtLYox7P4LJP+rEQPdz1b8e9tCi7QCfdtqqk8H8JWpfyDElcyhr0vhOFw1jaJOKZdh31AlAvERlFkpVtGdDwDhVV7yXJkzki5h4Z/JL0gatao2bmu1hNMQn9+Mbo0MSMKyNiAxMXPFWZ+b7mbBXo/7dfL2nYKNjYBvENipVbfuMUxvL10+z8xkOL+alG8N8M83Ris/CuTDx1L/2y9HCFXwPzTeQhTzbrfR4D1IdUFblWupkDdtH7/2Rwtdn8YASNo8e5vRIC3tdhueSxNbRLE219cbJiCqb+c5ngzF4TxW72Isnt/GxIqDi8JqzM/KDQfu8+Vsnbm3yo827KS5jfzIcEXUhjOAmVMCmljuTsLmU31bPBlL43B5eIYPja4RVEDZoHRggjMIq7STY+Gyul0FdC4f/cWy+ZcbkgUQU7ef/6XmENhFWd7o7pfpQjo+P8rtAAwQz1jhd6hvywOIpKSqcnH04q+g/2m8T7JbrRkyljS1HQmIHQ6qxu3F3dFzOboj1K8ixuFFlWkwgJmrZBvoT5rgPsUCifYibQR70W0zon+iYPpQJ5EcYWXCarjdcrYmwyL1UQlYqirNzL0MegGN4o+THtpRPn5n1Zh9JGuhFo3jSapABet9mINfNXVNM7if60kLDuK6Nqaz5Y0q26JoY7raqQw2wdl4yowaWZu50YZsi+zSU9SJZm2tqNjV2XrLSTEu04SkL1Fn0mR9Fyqx80KLIRn7piPntRhp5vjhXYsF2jjO4m2aqrbIh+HlaVrHbUI7xuVhlOadstOWweOW4Hi58KNCxPAvdBYYjdMAUw3aLNWTxhsV+TFYhFrGVFy1Ah5gvNiUOzvRe73HRWlEmdPuML0wIt6Lblt62BR4e5AomBVW3jf/u0VNhaATaokWVo5C1R3lRkC/RxgjzrhegHDSZ4= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:o4X7Rm7g3j2OWBWOU2pQ2xdwBvzqCL/3uXGpvAjC/DWt/Srxx5FR/+9u+MX5S2sEgUztK82xaxa5ncUt0oUXaC+2pa4h+EnMnhWREUAffmWD+9/zvxR2Um9SfmJy6cLOULeGI/XxnHUXGO+raY47htQe1NfH188X7AFtiohOYStpKb9avjYvbBPrKlB/v9pj7RRF3osZU+urRkFcNN0zbCYLUbwyVqFeTAX3sexl3x6Wb6guMh1TOzruN0Bi9CEgR6fRA35JgM38Khi5P9fAQKfA0KJFu34IumQmh1wDYQyTN9h3HLyKskcwET0rC6lnxNGtey7/eD7PiirHlvQW0xy1obJ2hoyVreKDupps31w=; 5:MSDX/8k1agXN7Q8ljfkyc7me1Tj2VDIpOzB4eL2PK2O85sLfHLK4ZreLdt82vD3Az8oYEfluKOsR+1A5O94/XQ1Azmc+DwwvtajLUEKaYnNiwccEHP23N7TcSSVsZnrHvt26oGw+jTCtnCkoNOhfIuD3x8k7Tfj+7V4LkhhpDfE=; 24:JOxTL4yCXTij2B/Fr3rqEKRx0nrJL3mVHpgCnNFDHagYpG94LGeHpkNi1lmndc6F7k8bLWqqcsPnXre7OudkMkXFSTd/HO36OKgZ2rzaej4=; 7:KPS3nLwwdOYZq2w/8B5Ir2655CgOkP/KWdVkq/VU631TOhaGZ1FxCCDuYrtTDCkpQdVMe9hVGom/RdSa43no5FtdcKWdM/H9XkWM6/DfXJYZcy2j62nr2v/j4mBU65ir/NSo9KWa1ikuSXj+UbG61tZFtByL4n7A67LuSFLKfZ2iJemrO4OCwTkZJNDl9h7qjUu9Zm+g6fubV00V6auNSk+05n7dhHNdr4ScEhrcM2K9+3+/9ndI1jqoxwrMOGMy SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:pV6fMBVLVIdOPMsOYCwgf2zDeJJYxadx3i99nToKAUkSsrKO73Ha9vzElP4ITEk+X6pL+FA+Kg6itd197D3Bw6CXsoA++zMbthWIP0AJwrdPh5Y6w54xZQJW/iIQv+axJ4XR49moPuIJy18rcfvI9QMeP6OVYHAR1Xy6NhjgAbY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:23.6843 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a5c9d894-e493-49ff-a2ed-08d56da097a0 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.97 Subject: [Qemu-devel] [RFC PATCH 11/34] hyperv: add synic message delivery X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add infrastructure to deliver SynIC messages to the guest SynIC message page. Note that KVM also may want to deliver (SynIC timer) messages to the same message slot. The problem is that the access to a SynIC message slot is controlled by the value of its .msg_type field which indicates if the slot is being owned by the hypervisor (zero) or by the guest (non-zero). This leaves no room for synchronizing multiple concurrent producers. The simplest way to deal with this for both KVM and QEMU is to only deliver messages in the vcpu thread. KVM already does this; this patch makes it for QEMU, too. Specifically, - add a function for posting messages, which only copies the message into the staging buffer if its free, and schedules a work on the corresponding vcpu to actually deliver it to the guest slot; - instead of a sint ack callback, set up the sint route with a message status callback. This function is called in a bh whenever there are updates to the message slot status: either the vcpu made definitive progress delivering the message from the staging buffer (succeeded or failed) or the guest issued EOM; the status is passed as an argument to the callback. Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 7 +-- target/i386/hyperv.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 111 insertions(+), 14 deletions(-) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index 249bc15232..df17d9c3b7 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -19,13 +19,12 @@ #include "qemu/event_notifier.h" typedef struct HvSintRoute HvSintRoute; -typedef void (*HvSintAckClb)(void *data); +typedef void (*HvSintMsgCb)(void *data, int status); int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit); HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, - HvSintAckClb sint_ack_clb, - void *sint_ack_clb_data); + HvSintMsgCb cb, void *cb_data); void hyperv_sint_route_ref(HvSintRoute *sint_route); void hyperv_sint_route_unref(HvSintRoute *sint_route); @@ -40,4 +39,6 @@ void hyperv_synic_update(X86CPU *cpu); bool hyperv_synic_usable(void); +int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *msg); + #endif diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index 514cd27216..918ba26849 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -47,8 +47,20 @@ struct HvSintRoute { int gsi; EventNotifier sint_set_notifier; EventNotifier sint_ack_notifier; - HvSintAckClb sint_ack_clb; - void *sint_ack_clb_data; + + HvSintMsgCb msg_cb; + void *msg_cb_data; + struct hyperv_message *msg; + /* + * the state of the message staged in .msg: + * 0 - the staging area is not in use (after init or message + * successfully delivered to guest) + * -EBUSY - the staging area is being used in vcpu thread + * -EAGAIN - delivery attempt failed due to slot being busy, retry + * -EXXXX - error + */ + int msg_status; + unsigned refcount; }; @@ -119,6 +131,83 @@ static void synic_update(SynICState *synic) synic_update_evt_page_addr(synic); } +static void sint_msg_bh(void *opaque) +{ + HvSintRoute *sint_route = opaque; + int status = sint_route->msg_status; + sint_route->msg_status = 0; + sint_route->msg_cb(sint_route->msg_cb_data, status); + /* drop the reference taken in hyperv_post_msg */ + hyperv_sint_route_unref(sint_route); +} + +/* + * Worker to transfer the message from the staging area into the guest-owned + * message page in vcpu context, which guarantees serialization with both KVM + * vcpu and the guest cpu. + */ +static void cpu_post_msg(CPUState *cs, run_on_cpu_data data) +{ + int ret; + HvSintRoute *sint_route = data.host_ptr; + SynICState *synic = sint_route->synic; + struct hyperv_message *dst_msg; + + if (!synic->enabled || !synic->msg_page_addr) { + ret = -ENXIO; + goto notify; + } + + dst_msg = &synic->msg_page->slot[sint_route->sint]; + + if (dst_msg->header.message_type != HV_MESSAGE_NONE) { + dst_msg->header.message_flags |= HV_MESSAGE_FLAG_PENDING; + ret = -EAGAIN; + } else { + memcpy(dst_msg, sint_route->msg, sizeof(*dst_msg)); + ret = kvm_hv_sint_route_set_sint(sint_route); + } + + memory_region_set_dirty(&synic->msg_page_mr, 0, sizeof(*synic->msg_page)); + +notify: + sint_route->msg_status = ret; + /* notify the msg originator of the progress made; if the slot was busy we + * set msg_pending flag in it so it will be the guest who will do EOM and + * trigger the notification from KVM via sint_ack_notifier */ + if (ret != -EAGAIN) { + aio_bh_schedule_oneshot(qemu_get_aio_context(), sint_msg_bh, + sint_route); + } +} + +/* + * Post a Hyper-V message to the staging area, for delivery to guest in the + * vcpu thread. + */ +int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *src_msg) +{ + int ret = sint_route->msg_status; + + assert(sint_route->msg_cb); + + if (ret == -EBUSY) { + return -EAGAIN; + } + if (ret) { + return ret; + } + + sint_route->msg_status = -EBUSY; + memcpy(sint_route->msg, src_msg, sizeof(*src_msg)); + + /* hold a reference on sint_route until the callback is finished */ + hyperv_sint_route_ref(sint_route); + + async_run_on_cpu(CPU(sint_route->synic->cpu), cpu_post_msg, + RUN_ON_CPU_HOST_PTR(sint_route)); + return 0; +} static void async_synic_update(CPUState *cs, run_on_cpu_data data) { @@ -176,17 +265,20 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) } } -static void kvm_hv_sint_ack_handler(EventNotifier *notifier) +static void sint_ack_handler(EventNotifier *notifier) { HvSintRoute *sint_route = container_of(notifier, HvSintRoute, sint_ack_notifier); event_notifier_test_and_clear(notifier); - sint_route->sint_ack_clb(sint_route->sint_ack_clb_data); + + if (sint_route->msg_status == -EAGAIN) { + aio_bh_schedule_oneshot(qemu_get_aio_context(), sint_msg_bh, + sint_route); + } } HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, - HvSintAckClb sint_ack_clb, - void *sint_ack_clb_data) + HvSintMsgCb cb, void *cb_data) { SynICState *synic; HvSintRoute *sint_route; @@ -208,14 +300,16 @@ HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, goto err; } - ack_notifier = sint_ack_clb ? &sint_route->sint_ack_notifier : NULL; + ack_notifier = cb ? &sint_route->sint_ack_notifier : NULL; if (ack_notifier) { + sint_route->msg = g_new(struct hyperv_message, 1); + r = event_notifier_init(ack_notifier, false); if (r) { goto err_sint_set_notifier; } - event_notifier_set_handler(ack_notifier, kvm_hv_sint_ack_handler); + event_notifier_set_handler(ack_notifier, sint_ack_handler); } gsi = kvm_irqchip_add_hv_sint_route(kvm_state, vp_index, sint); @@ -230,8 +324,8 @@ HvSintRoute *hyperv_sint_route_new(uint32_t vp_index, uint32_t sint, goto err_irqfd; } sint_route->gsi = gsi; - sint_route->sint_ack_clb = sint_ack_clb; - sint_route->sint_ack_clb_data = sint_ack_clb_data; + sint_route->msg_cb = cb; + sint_route->msg_cb_data = cb_data; sint_route->synic = synic; sint_route->sint = sint; sint_route->refcount = 1; @@ -244,6 +338,7 @@ err_gsi: if (ack_notifier) { event_notifier_set_handler(ack_notifier, NULL); event_notifier_cleanup(ack_notifier); + g_free(sint_route->msg); } err_sint_set_notifier: event_notifier_cleanup(&sint_route->sint_set_notifier); @@ -274,9 +369,10 @@ void hyperv_sint_route_unref(HvSintRoute *sint_route) &sint_route->sint_set_notifier, sint_route->gsi); kvm_irqchip_release_virq(kvm_state, sint_route->gsi); - if (sint_route->sint_ack_clb) { + if (sint_route->msg_cb) { event_notifier_set_handler(&sint_route->sint_ack_notifier, NULL); event_notifier_cleanup(&sint_route->sint_ack_notifier); + g_free(sint_route->msg); } event_notifier_cleanup(&sint_route->sint_set_notifier); g_free(sint_route); From patchwork Tue Feb 6 20:30:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870092 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="YIXTDglF"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbc0R3Q7Vz9s7F for ; Wed, 7 Feb 2018 07:45:11 +1100 (AEDT) Received: from localhost ([::1]:59441 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejA73-0005Nx-D3 for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:45:09 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44735) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tu-0000qu-8J for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tq-00038T-Tf for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:34 -0500 Received: from mail-eopbgr00096.outbound.protection.outlook.com ([40.107.0.96]:29741 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tq-00037n-3k for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:30 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=QUdUAVNLoRlGXHLt+wNoTVjjPBIRVw6gHkv0l+GKd0w=; b=YIXTDglFLO0VQxavtaV3BHSYCsIZsgNPlqItOTJky0dZAIXa6wDH0QLgyRGNXxgxU7MSlQ3vyzIYUfgdPr+dTJg2N2xHxvvVL0asW8rnoYjz7hHBjrZnQ329yFdMiJ++AChy04wV6POuYTfJ/9qkKvthC7tikME1uyRLSgAj1OQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:25 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:26 +0300 Message-Id: <20180206203048.11096-13-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5c8b3981-69e6-4b38-f965-08d56da098b9 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:aiUgFP6sSIoze7Fiux26hzMW0SEfb7JUO4nJOrw0jmaHO14ZUYR5sSDhG85gA2SarE57m9N3aUjrOZBLlFg7M2ijuCmXxnQ/thH4DVkfsmskoCgCS7HHy69ZbHsfOIS7r9U76Mk/JFHIrrQOzyD+DKAnbJF3QORJyyep3N6n+L1ARbmfZuFZNsl74LSSSnGoDkkbgIx3WMclsvzLqjXFYXROL3a6Jts5vPYLgaJUg+wL0I+PKLfryYv7G0pY52hh; 25:JKTVcqn1RzEHECFybREUQ+e6fM5DmC8awAGSJegIY4qnzsw0+PtftyowCPlooXmFsZEqslMrIkAMJWDOPLCEFNbx/oWrigb+wLPv2EdeX38yRwUlCtCxBbf1FBB44NvpleOKrmnX9RSrU3gBrLFgHQPbOwKKj1OyI3TCetuPZwDuHzJ0eZS3nPaRZEWQt6IbLdwuOwJHJMz/ud4EBgcPp/kNg06Cms0x7eP9KpzNkjgztbdwEXryyaHOEa4jvUbTecxkE7yt7Cy1KkYMC35MKRA+YY9WvpGBAqb13jwEISCLkOuv2WVlnWP1UfzwoJ1mT5otaSGYyzB2lQBw0/XFpg==; 31:keE3Oe5jrOa85tWb/ZntDtzfA7I37KFmcfEi4FAIjpCvSks9SS4fwKgQB++WRuZfuKk8yH72zPgyBb1I5uhKrOKAqkQ8BaFzKq6QYfqR24VoI4JNzY9cqcAcR2MTIzFYSV9A2O6grOfCI0cIO/SBs3VTl08dmtu7E37sPVVimlaXw0V69T9DaEWE3biFYtjWxkAFGu6YBD46QP0Rs3vMZLkuD2hB2eRjFBhl+CUqsY8= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:X+weAq4M5xpH2a+Ww9saJ3x/91amcWCN9pACz53kUIC++fw4/SxYX2sWt3VP4yAdJ7wJ6KGSFvWtB7FRWusyHS/n9QBtI6PHO5W0yMlKeBqVdgjdZ09Jj+YDLafQHhAUxKBqCen0pMTgC5wSXAR1F+qzAiFDES1gXWZnKe7WSbxRhSXl0ElQKtrYbDjpH05fWWpMJsjS+qfHJfNttHqz3kUpDIpYhNY8m8is1oeNxhMXPZ0YhDeodKtGfPZTu/7+4xO0OlmWIl97espE920y9fr4PVmhJt8mAnDXMaNwpM++WbetOtOA8Zv0xlvNz6tLvp/1Z6GGsPcLE1KbXeSpPY8GMWCUdzOxH2Bie3ix23qg2t+9PcXmkcMNLU3fTuhUSMkGqKWYihRcnQ4PiL3b6NTdkdJQktWHi5b+mlI6Txg=; 4:PAHy9Mqv1UNb+c+8n1G1zVsY7qk2rzVYcuutM/3iry18nn3hFBNv+UpxGtPM+cNRC7VDk3wjDj9oJiq2PFcMC0cJXKhbI7Djpet1uokQCebTjy5QTzyeaPRl5Wk+hr+6nm+DW6SjiHiJRKeaYbbFq0/Wvy5wo0y8zlexx7sl3Jh6QrHMYjeYiAQ34NWtZtxuXB39h1TbH9rbQil75ZT0ztHwRuIyckvCR10pCjNv6Q1kZr+WJFcVev8LY83+YAeOe2n3qxXz9fpPXdQI12D1pA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:POo3XV6tGiDGFUJHzLXPLcPFQgkyaeLE28bUzl/?= 66URHtI1mNEscGOL+joJJuBuDyTpAfR0ei7HItNbI2mS3UGpYmqsTknKQV+WlAwsc7b1+OTo+YTL4c+XiRsVhhSWuP6s10iD4rnMF/iwMW12Jvhi85Qwze2QUkWPpik5hPOrCx98HDBKEP61SDDjWnpjI4bkkZ1vl/4QddHEdbSI2tQDi5qIbxFhwm3i80pj1i2U8PbWLfWUxjc4BDfzvQN6oUe2Czk1sc0pfkMiQh/zhHYFsvgu/cYJlyhzzP+inHqinBODC7R1EBzY9pX6uMeQHE+ZpvC2IXLDh2k35oNbAwOMl1KL8SutQtmRAYgvNFbVmJZHZk7rX3C7zYd34C/qlveqJ4oN5T4qPM/c49UJ6ytAiL2qmU0nW0k6KtL7v7Sa0UwwqBL5l/09LUf86VnhzvG+35pqDTix9SBOAcyP4ugl06ivpBiD0r8xTpaiYUh3jUCK+Ru7zomVHHn4CoEGUeF2uxhk3J0NsgyQoGV5Al9HWOS2EA0dvz10cngkwOYAFzQmq13+ADoFKsq7lSaQ6m2bleZxjL6N7IwQkUvO9ErHM/WZg6I4IFTIzKh7ChI909UQZvzhTb0EZkYFduX3FUJXTCiOeBX4nTFMDjsg9Otf0XRyBGDLxClRFWGWQPUb7kFnmNi6dBNk6NHLI3ioGc6ASqKiTak9SY2yyLL9T7LUEm54+6f+1h2wSSNyFCkd0ty6N0MhIsCponxFpIkGGO1qgMbSv7tug5MkiBA244b8CkuQ35TaBNYCWInrVxLOxxrvY3q6DrfbA+zvEwLOBuQh4sRvRoCKVIpriKOpD8QRSBW8xs1G9PZ2lX3fi8VrHYCvsOOu5cFCPVXqnBuAmmlM/tdoSwlv0fGOu/tZFJGQna2cOcwwuzBC9XpXq7Bw8gQEts9zSfO042+y/9nnVHBw+SmXde7tesFKdQgg7ZyDcPkvLQ4YWGTIhT6pAzfvifpS0mLR6DK5J9UA4NSy5iK80nXQuJpnRFqtw3um/POmkCKjaOR2r4gaShqNhbw25JdVKvgqjYJtFT3D0ofVle8NpMgKfhjTrPSDP6HuYcRkJsJa9X29EMT3/q8x2wXgXPzQ4Muw0TY066IY/gVhVWNTFbHJxz1cZ3erFmVuxLueBCAukqBYfKN7szDGIdgUjrLLB8Q3+aJokpXgL16grRXShoEh2ZBocLRV3sN0pIK9hnxpM1pbWYbWwSWJKz483YDEYIePs4+aitOsCeRl3zgvu9atTbEm+zCG/o1B7jg== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:+XV8LvF6ssv/IkcfvMisM6K45Ssvtea2g4xLYNMpuClJ8u5oFpE4QfjJj2/UcYQKSmnmysfQENIMDs64cap5hkIeItBK4Y6M3/iYlXo1Yv087V6UEoRapiesT2pVtV+90QzuA0RLA8HHkAmnkWu0WSSDdzUHWCwfejEVslh2FrCb3YoroWtGp2Mblt6kKvpRJno+gKU+fTo2siUccH99KQGk1ypVdcXUWPlZL7Yq1rS9G9O3BJHTTkCnwr0oJZxu3Os1Yk8vuBL+Q3KbB/y9wLfLEMT9bSQmtfkHVR193y85KHxxoaRW5MXWP9TSIjMKUig/NR98oX8YO/SDZhvnEx95q8AOAxE95sbETiK+yDo=; 5:1mBSlGeAVqHz9SS4JHM72m7pGFlXG4mwOgbjKXJrHTPX9R6rcSYp27JscmyzQubLvolOMZ85JzoDHcl+Zft1dmcuWctIuDbwSSsDpR7HzyVNWsc0TU38gjPOBHtEgLxFRd0xsNgi33s+SdJGfbxqGemC+SjDdiv9xhvTg+jWvNc=; 24:vVrmTVjpZSFRxezok6h48yeYW20Y3uXH/BlD8GIH7FKomHFkXkxbzMlVJ+SxjQ1rPJ+lhTCX/DShiJ5O/I5+F3BzixbANsT8dIL5fY7GHi0=; 7:YritMpXdXQFVp2UBeEX55gOVrDXLfMT6TSuh5/NO4m95y02MedFAJflUQUMgoFsEuNNaFMHElS2QA+e7+7XLij46/2vchEeVNUWec2iHa1MJKBwWrYY6T1KrPF9xWto952v3voJGZGyrPg3D9BkfiC/8/Y6NwuEnOtQ1jkNS09fmOVn0MEBoBBDc5rGbMNYm/u0T1qYrXWK7UaLsDoWLkJ02cFrXBmXm3RoOejGoMSFejYAbjqmAew/1mknkSoEK SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:nE3gFzONcskGpyLy1qHlD57bx0X20kyHEpJApd4nwYJ1XngwneUf84lmQ4rjwqBoIQjtIgDJq2H5JtX7OgdEYKN6KgG5+PLYsOyWHv+qWFjoqkCwNzm/V6E9OoywVMF6hmVZKRCVQD5HckJntrxu+CUW7ZjOLrxtcRdX6DHkZuM= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:25.2156 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5c8b3981-69e6-4b38-f965-08d56da098b9 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.96 Subject: [Qemu-devel] [RFC PATCH 12/34] hyperv: add synic event flag signaling X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add infrastructure to signal SynIC event flags by atomically setting the corresponding bit in the event flags page and firing a SINT if necessary. Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 2 ++ target/i386/hyperv.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index df17d9c3b7..3d942e5524 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -41,4 +41,6 @@ bool hyperv_synic_usable(void); int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *msg); +int hyperv_set_evt_flag(HvSintRoute *sint_route, unsigned evtno); + #endif diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index 918ba26849..b557cd5d5d 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -18,6 +18,7 @@ #include "hw/qdev-properties.h" #include "exec/address-spaces.h" #include "sysemu/cpus.h" +#include "qemu/bitops.h" #include "migration/vmstate.h" #include "hyperv.h" #include "hyperv-proto.h" @@ -209,6 +210,37 @@ int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *src_msg) return 0; } +/* + * Set given event flag for a given sint on a given vcpu, and signal the sint. + */ +int hyperv_set_evt_flag(HvSintRoute *sint_route, unsigned evtno) +{ + int ret; + SynICState *synic = sint_route->synic; + unsigned long *flags, set_mask; + unsigned set_idx; + + if (evtno > HV_EVENT_FLAGS_COUNT) { + return -EINVAL; + } + if (!synic->enabled || !synic->evt_page_addr) { + return -ENXIO; + } + + set_idx = BIT_WORD(evtno); + set_mask = BIT_MASK(evtno); + flags = synic->evt_page->slot[sint_route->sint].flags; + + if ((atomic_fetch_or(&flags[set_idx], set_mask) & set_mask) != set_mask) { + memory_region_set_dirty(&synic->evt_page_mr, 0, + sizeof(*synic->evt_page)); + ret = kvm_hv_sint_route_set_sint(sint_route); + } else { + ret = 0; + } + return ret; +} + static void async_synic_update(CPUState *cs, run_on_cpu_data data) { SynICState *synic = data.host_ptr; From patchwork Tue Feb 6 20:30:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870119 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="Ekvd5wvy"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcjx1TW7z9s7F for ; Wed, 7 Feb 2018 08:17:41 +1100 (AEDT) Received: from localhost ([::1]:35132 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAcV-0004ag-10 for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:17:39 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44736) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tu-0000qw-8p for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tr-00038x-Gx for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:34 -0500 Received: from mail-eopbgr00096.outbound.protection.outlook.com ([40.107.0.96]:29741 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tr-00037n-4A for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:31 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=b/nGWI46PYRXW9WpjdHnEyPBvE3ovz5On+nlIyh+Nt4=; b=Ekvd5wvyIdGBBhU6NdkbI/oMY+PrUM2c9M1TTWwKfYkvu27bQpzFBPKlcwS00j3zTPTzHKjIbpDZx6vbrFfEk0FJEzov+tNEfk+I1GXopczqgXNSboLiRjul80Gop35WuicNa4hlH7dZq9Phv2NYQSi/J//9T+Trk1GzauOmSsE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:27 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:27 +0300 Message-Id: <20180206203048.11096-14-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b55302f5-2d19-4f89-6167-08d56da09a05 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:Ekbeez63ENOUkZOV3KZEwrigR/0bjtUc0e8gx0JPbCEEolhc+dS8+Sn74VCGIs/vpNB9Lvt5+b3rnbavOvFja+5KZpGzJtvSkAx7w3vYhY40+mW249EneJFwUVS1DukZFA9pEx7bHvmL4A3rvUsoCurHb9WhtSd35w1D9TgYIOuIv/8KmsNXOlWS7Zq7Ge81YFlenVLtv6RLO97puFpMVkfMg559aukccmwS1+BOKmRq1kaBVRxeIvmKn7R2lUL+; 25:DFCzmXLthMgeR5ghYTbokjFj3Zrt4VK6XoBfSEURRcotcLdYctIUfXs/plVNm68bmwdjW+a/klvuRXrjQ7UJkBq3wPGM0g/rqpJTLZ7GMZ8yCLlSP8NUF2Wd+GQB/jfIXRsC5U1aIc7a95uCZD/vv0A3FikYVjS4icZ1sFSjo1GQQzJcUQKUoYntztJpCKENKVnMig40WTM4e2s9dTrtbbmkb5h+x7HdfEdAZIddDOYHJHF3EnhmVdUGdn5UjSv9+PZ6G97kmmkxbsWKhH7PyJredeHnewYxPbsGIk1+TtUJSYTlSvUOgqUyPnJYe81KAEPcnYrhKYqaK3Gb3TEjFQ==; 31:bD4L8x5XdJkcOLmN1uUm86bxCAvCbb2o87S7VcoUeKS7/2Or97Wl5XDmM1bBWpcjIkvssFle8q3YBPEERWoNP6zoirtdo8GNggsuLOg9bV+TpnWIQDzcbexnNPlVEpuvSoKi6spo6+f7LSc0kvVfs6raZe7Gil0Z0qN53NNafLZqApC0ICxnAiNH+rnMR9BjnkMN2bFc/JZWKXM/gT3rayUB/ql0t9jbCU8e04uCKVo= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:kbBXyM4RQlSYE0GSrbFaJj6FDI4s9ps7p+xi5OJnogIFFwt741mA6IeoykayXccrpO8/GK9pFFVITaiXO2pcdUhZkHuR2Vr3M4G0PjIm7D+R5hlZSPxxKn4orFBSYV+y41G4+M2YjDdcIaz6aSySweWMJYrJvW8qXhVdSMZCem6bw4dysHQbEd4GSZMg0pllE4SEpYKbAIm7LO0xphhV+K9FUrN0+hmVZX2Lb7gmnQei6SYAboJpUrkOLCi2FAfqAke9H1YI0eyzSg8ZY/E1ab+yL5bIWry2GG59hssfju5C6x8FuPKU3ved8NVYqf14Qele6r1cgHhGprtGx4a6kEEwkHsuoRjgynbwZ73S+2JLG5ogsweXv3IbhxiX69Su6YHCnNOSAkNTVEwjA+DYJjooaNxs2qvGJouggYaa/uY=; 4:sNrsAtxaBBjlmML/WOsSRwL+3ZZE1G1Pb+Ojt5GI9ShQMfjbR4ISNzdnjUNGd10lQLlXjA6uZghRm/hMoFXYMt/fXIIUC12KSWUJ9sq0HoT+1BrGoVusxtx1CaQjWJAW9iBzH03ODB7C81jITSfsBxyGZLSb0ewKJ4mhBIBmtMLKQFT1SAUdEfHilaZRnjgRe7ohcDw5z+sQxVJTYOd9jNJAObsgL+d9+n6DhJXmFby8CteeE1nIoIOnPYCfkeeMTcKhM5FBxVYXDt/stpLCCQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:SAzIJFDMqCgIxIdQ9aEV/TLZQH5AZbEeBd9yFPU?= sanQZUIF5/3YN98n9u5urzGaFn4PvWAZWRn8/rJjYNFDRXYxOyGREA8ShduItWUSu5YZOk17SyWuQq7chDAJEJNUJUE/3hseIVgjVkM6/DtfHGplRQJkxCt17kVVvT15zh2bxWtkIb+QjLHgIjLFRijOJYmqy9nNgFZbuhLZ9TJSRpwlIMqX9j41BV9+vPtWD9pzxDpdRuKK7iVCA9J4aiIvvR+Lexw+9BMvbcBGt0xH25pxUqrxU3j7y9qBeOzUQLo5h+ceqdxh1nhXu2WFuEQE6hbcsYyTKe4J5zVnVLo+j37ioAkXoLiZNtXC6Yp4wlE172RViOlim42VOxiJS8Sj9CKUbHsctksMJUVnZ7DyGOojZDsaj9LrHswwUjNLRTsBhqlyKyEkKY9eCS5HOOTeCyZfie3Am7YW3g9a39tW9Pg0Iv+z6MgfjLELNDHApcbicEJhrGxP6EWDvIxmxdsNPJlCgeRJl8YeCnL4uOeknISUR6qsxwWQRS8JyRugCai9/OrNVgmU1lmVQ100bdrcO2MyIPwj1iUohIHoAQbBVBx+dr35moW05lVryBI9FZGvGcos9MoQqg4tibpkjWRyWwdy37J4yqkXxPCNzefLJjkCMOyobK4v4JS2pqQGOeR2Jvca+2p2JgBMVvGXbFawO/pDqPk+0SHwend1R5wv54VI3nlhZL5TqXZbqSDZesYiIz+F8Q8BMmUoxYxP+oVlLCYtApS3L76CEGt2Ptftp1HhLEUL4SmLJcBirZ2F7xA9uG4tlJlOBp7CAVt+f9Jy/TameSS6cx/MhHuZqC9Zc3SpNec2lUcGx+llab8BAno//WJmkJt5iDKDGfPN+UPPLx0VT6T6EJi6yy1PwPfzFA8V7/yAUpcXB2iXLc3kNK+c6LqIkWrT9yjetIccGv06P/8lmzHQKVvM3g2Ut2o8Ylfw3syV2jBSlmeSs6buN2FHhDt8EVKN2sqI9QqJNAKi7olSwduC4VfFx/WqWeo9jlMX+Ud4yr2i4l6pv/B5+eZoJpljQfhdx3WWlpAN2izfHRL5eWYf9xleH8P36NsT+9qSSJOdvXU7NnbKjEeyNWNg9/RWUP03T79ppRKPujPmnqFSR/cYT8+935XbsmYf73mslocAd4bJb1t9ExBFetjGekr893dm/+HynXPJfpO2maqIT1x5dt6UuFglYa7KtyGJC6AEgVtehnR8cJpsJ9HcmmNd5tEMVBGxKZa3e03qT+9Q6SuB10lqzhBsWpj+A3g== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:46C9Noyd7IvI03EismJxxq0dUvVqVndxNKyzLrT8RwVbdR1AxPUNhuDr9TBrwR9Y4uh6wXQPlrIywOzViL67QEeRux2BKjXVc33OQAVTlpscU5UZp5Jx1+guGTV5aKipsj3FCxVdUVjneYOzQgQCcV1v7iEjLG/BbU3qZB07VtKtxEKQs9vpl7T4JPNto4yGZeRuNzIjR2uQUscgRbOfdH1fMsxAaueRN9Wdm5VdECRx4jHNjSPoUZVjANlJ8uFtORSKbfLRfBt1hOgYuH9Z7XA1hxPibDWDk77lqcPdotOnymRttlwaeKUx/3jymJoVL1cfxnym9+9wt6Z9g4CnKiznMXGjQHbLT8z162Z3Chg=; 5:HyHgRRXXmp0rnVT21LJtWsFK4tx4hkaX95auKH1UPnpWt1h6KRf/TBytJ7geYDjgZMUv5JFa4XRdBq6j1VdbXmq71G1v5bk8Fsb/K2oAtyJOmp1XLMGxVmLfUMBeadiutyN0Q16i3SxVswyheTNO82wQG9PUSiGFlGyVbXiJxVA=; 24:xSEwIz7/6N5uyMANKtv2CD3ZwCuJg2WcGZ5iso/F6LD5VT/p4IhodGH+LZ/J03hUrIh7UpxRDDQe8ifi/EApQxu+S2VhvOoVetjJOWae6qY=; 7:3L5hJxQTUgAxVZS6BwVxizyzlPLrY/KtUv4W+KXqzL507ejgKw5VyLtl3Rul5c9FqqLy7k3m4oqQ1Tkazsshe+j6gj8r7l50XGeJpI20D8Vwi1eYkl74WHHPfMb4tEbs4vf2E7g132S7U/vGrF34U51P6ccO9pebJ4Etaad3uqJgbzty3Jj16DmJehk9Cgmb8xqzXwlPOeZ1HG7v661MJWgymdaG7ZnzfSCfkEFRbuMMaYV9gf2Wrg9wP1SOtRAS SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:F4edwrgRSvDwSHxGGGCTayx18gg2iaOR9wc8mjVRT9SMk2Et6GF8NZQ0JVdjHm42BM1onGARPN9e3RZrS3aQ+o9QzGPnOWc7crSy2HUwpB/u/SSVfYVIeEvYJK9WcoNUw/L4F0DW0aaSlFdHnGmyUquN2DMUKvhIsops5c3q2JI= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:27.4031 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b55302f5-2d19-4f89-6167-08d56da09a05 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.96 Subject: [Qemu-devel] [RFC PATCH 13/34] hyperv: process SIGNAL_EVENT hypercall X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add handling of SIGNAL_EVENT hypercall. For that, provide an interface to associate an EventNotifier with an event connection number, so that it's signaled when the SIGNAL_EVENT hypercall with the matching parameters is called by the guest. TODO: we should be able to move this to KVM and avoid expensive user exit just to look up an eventfd by connection number and signal it. Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 2 + target/i386/hyperv.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 111 insertions(+), 4 deletions(-) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index 3d942e5524..4ce41fe314 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -43,4 +43,6 @@ int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *msg); int hyperv_set_evt_flag(HvSintRoute *sint_route, unsigned evtno); +int hyperv_set_evt_notifier(uint32_t conn_id, EventNotifier *notifier); + #endif diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index b557cd5d5d..9cf1225385 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -19,6 +19,9 @@ #include "exec/address-spaces.h" #include "sysemu/cpus.h" #include "qemu/bitops.h" +#include "qemu/queue.h" +#include "qemu/rcu.h" +#include "qemu/rcu_queue.h" #include "migration/vmstate.h" #include "hyperv.h" #include "hyperv-proto.h" @@ -249,6 +252,106 @@ static void async_synic_update(CPUState *cs, run_on_cpu_data data) qemu_mutex_unlock_iothread(); } +typedef struct EvtHandler { + struct rcu_head rcu; + QLIST_ENTRY(EvtHandler) le; + uint32_t conn_id; + EventNotifier *notifier; +} EvtHandler; + +static QLIST_HEAD(, EvtHandler) evt_handlers; +static QemuMutex handlers_mutex; + +static void __attribute__((constructor)) hv_init(void) +{ + QLIST_INIT(&evt_handlers); + qemu_mutex_init(&handlers_mutex); +} + +int hyperv_set_evt_notifier(uint32_t conn_id, EventNotifier *notifier) +{ + int ret; + EvtHandler *eh; + + qemu_mutex_lock(&handlers_mutex); + QLIST_FOREACH(eh, &evt_handlers, le) { + if (eh->conn_id == conn_id) { + if (notifier) { + ret = -EEXIST; + } else { + QLIST_REMOVE_RCU(eh, le); + g_free_rcu(eh, rcu); + ret = 0; + } + goto unlock; + } + } + + if (notifier) { + eh = g_new(EvtHandler, 1); + eh->conn_id = conn_id; + eh->notifier = notifier; + QLIST_INSERT_HEAD_RCU(&evt_handlers, eh, le); + ret = 0; + } else { + ret = -ENOENT; + } +unlock: + qemu_mutex_unlock(&handlers_mutex); + return ret; +} + +static uint64_t sigevent_params(hwaddr addr, uint32_t *conn_id) +{ + uint64_t ret; + hwaddr len; + struct hyperv_signal_event_input *msg; + + if (addr & (__alignof__(*msg) - 1)) { + return HV_STATUS_INVALID_ALIGNMENT; + } + + len = sizeof(*msg); + msg = cpu_physical_memory_map(addr, &len, 0); + if (len < sizeof(*msg)) { + ret = HV_STATUS_INSUFFICIENT_MEMORY; + } else { + *conn_id = (msg->connection_id & HV_CONNECTION_ID_MASK) + + msg->flag_number; + ret = 0; + } + cpu_physical_memory_unmap(msg, len, 0, 0); + return ret; +} + +static uint64_t hvcall_signal_event(uint64_t param, bool fast) +{ + uint64_t ret; + uint32_t conn_id; + EvtHandler *eh; + + if (likely(fast)) { + conn_id = (param & 0xffffffff) + ((param >> 32) & 0xffff); + } else { + ret = sigevent_params(param, &conn_id); + if (ret) { + return ret; + } + } + + ret = HV_STATUS_INVALID_CONNECTION_ID; + rcu_read_lock(); + QLIST_FOREACH_RCU(eh, &evt_handlers, le) { + if (eh->conn_id == conn_id) { + event_notifier_set(eh->notifier); + ret = 0; + break; + } + } + rcu_read_unlock(); + return ret; +} + int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) { CPUX86State *env = &cpu->env; @@ -281,16 +384,18 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) RUN_ON_CPU_HOST_PTR(get_synic(cpu))); return 0; case KVM_EXIT_HYPERV_HCALL: { - uint16_t code; + uint16_t code = exit->u.hcall.input & 0xffff; + bool fast = exit->u.hcall.input & HV_HYPERCALL_FAST; + uint64_t param = exit->u.hcall.params[0]; - code = exit->u.hcall.input & 0xffff; switch (code) { - case HV_POST_MESSAGE: case HV_SIGNAL_EVENT: + exit->u.hcall.result = hvcall_signal_event(param, fast); + break; default: exit->u.hcall.result = HV_STATUS_INVALID_HYPERCALL_CODE; - return 0; } + return 0; } default: return -1; From patchwork Tue Feb 6 20:30:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870101 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="Gxh1CsBF"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcKb1tsWz9s7F for ; Wed, 7 Feb 2018 08:00:03 +1100 (AEDT) Received: from localhost ([::1]:33555 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejALR-0004H5-Bv for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:00:01 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44772) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tx-0000uK-1k for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tt-00039n-Ly for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:37 -0500 Received: from mail-eopbgr00092.outbound.protection.outlook.com ([40.107.0.92]:23240 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tt-00039J-Bf for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=VxUZBSjLTiUsgL5mvmFLLYKdnauB0r6p23zuys97A+8=; b=Gxh1CsBFeSWkBBWmsN36UjyQ8+Xom6G8gVMR9obvBXDsJRjBPswa8cE+hKBhUEOxpVah/hlJeZ2HHyJLA++bRvfLCJbTEtBCI25LmD7FLfGfOXW+X6mABvIGj0enTayJ+I/KOuwyRW4D6kzgcocyr3OxZn241Vldu69vvIoQwI4= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:29 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:28 +0300 Message-Id: <20180206203048.11096-15-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a16fb1cb-e0a3-4c39-7c93-08d56da09b23 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:SxViIqLAY83+V2/S6q934YXDBPpv+uvPmlZZv5w0YVIEsyqW57lkmQkDdTBvZvuZMCxh9Ajpy9K+NAUj+8lUhV84Lv5YHbixSVli/MrVFAG2hy5Ah5RMLVeswRhvWIRd7RngfrLT90JIFby3uPFTTkEM8iI9sOePdwV/8sX0aTL/yY6E+T436nYS8xn8sb9J6MB/ruJ/JDG5j14U6b6IshAeMIIfYn3pxPCiRGAtIkDDkcRTCu4EnTFHqGx0uijT; 25:JFiHS8AoZlqrlLNbLnRG8TP9WkXMD8t14tCC1uBu9Tr11HkPHTMmXhHww+tzwlTyBoXPEAsUZ9p1aW7D159w8rfXYrol9Zrz0l3Cn6YalwngpUSg/sTtoNuE4K/Ot1iqJn78+IqAjULLoKI/fOAR5kOQ0kpyv6r6gUtd/uv436KondF6Hii2sIiv9cvKkKBuBJL9zJ3RrhZSnWbPjmGml5GVfp3XjPDjB/ZLJqtEizzjyt5foqS5hWudSyUl1H5wIrUsef5tIfSatP5mQSRxLtkv8F/y6PDc5OB16ld0qh/WXbJIy6b99/xbJkUBQJIF5Bqd6HyMIrmTl4bs0x+Cpw==; 31:2T4CCrX/4Ha4Qh+xx/iSf6C+SBB9OVQMf/48U+4bBxQPMNsFnGjkOHa4V6L+Nf6on9ihJ6+GyiGEiYl80KXOHplR7Ro8M384yhoj1Y4B8lgCiVI38dg5tcnqdgEwmOpNr2lnQsWOgHlZmZCUGImJe4NgfrxJXAkPMWsa7oWbNgNL3Wkg0Tt8OE5hCvcYBwEJ3Fy0SiLHqigbzxp7GXPjsKRl9acip6rmgFkVh+VXkm4= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:IpyNqbjYB6TcAOjVgRQxy3Dh73BtkQQLWQ7VHq/aNLoW1QWr7oV6jPVu587j7IUv/E1MUHGBjE8KWa8w2qfAQg7cbnLTGCX7pcFjBOhNW8Czvu0rdQ5/7yr/AiTFGFDk1jJcugV5KnOJdy54izNMxTonCfKnYV6p0sBkJdotkw+645czCkmFJxMIFYNii0+rBqiuahahISzEVJ5IdQbdNDl1bup9tXSNP0UWKbv1y/+Ls3p5NGkVjp6D2im+j8z0zyg9XQHEh7l8VwZkKxbne8kEEekKpbp/N3IBGWAuEaojfjDZwba96wSuQl37nfSNO6MEKLiCah9ZMOI05A0tVQf/QVMXAcEYWipI+4Fda3ilmeHgA1Ya5L0D1lghqR3/7uSHW8bxZvET5XtU2XgnKeJQPdEGeypzQj1jZ8Qu2Zo=; 4:aLcJ55513RGAVAUbx78DvS64Fvvm+TiViZsPLckRzoMuWvQH+G4oE1WTTH5q5y5IDNttI46iRXQS7Xs69OCo6sg4xEn6fhR2JrIDySGxfihHCO4p2etXq8tpkdu6yzURaMWCZPQjitzxAyTX/ugQckmReKAiDT5G0wpfCcxvWjkXAD65zxwPraoapGwDuV0l9DF/TEtDuq4Kz9Q813+pAi4hJLQZMcwHRWdAiYadB1uUt9a998j0gcJHF1NqHXVSVa/1GoAnZu3i5gEU7xCiGg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:ptrAJhyTYxJ4QhizDugx4Fk81SJlEPLt+deYe5Q?= yImBMW2JhZHkhg4kOyvoHlkaKDKactH/LRwzh5hAhvpFp/IToFiMlsLYXqxxFYSfjMMTX23XIiQZgh2NDBN/AX65VV7jU7ZYX0MRodH7EhtcH1/ly5/93M0SW+3+a2kixQiZygsL9JhooD5/s9RXeckpKEqe6aQceIgOoViXDojtGeDhP6bWj4xhazpWZlMIbGKRvoFUX/DRajwGYmFbuCJXtOnLG3MEwZnh5n2x0eN5LSsl5C2xRPY6L3NTub0aGBCJ9u4sw6XZKNCLqGBVYzYPTdGPPThfhURrPOQYkPSJuMSCcErniMHV5FRZcTuJgjT9Le45I0J0e/Y/EO1IIBO/C09u5YVzMNIJ70qhIl/FaJx8re+r7MD/xITfhrhdy+9saVV9GP6IOXZNHgM7Yt1x7uKlSy+u3K9iP8/esmo7i1WuAJkT8ATfpcDnbV5UXQXxIt9G2J63f1iQqdjk5wwSnH1qnuH5g33y0jdcSo/BqbVX3wyd1SdN6/scK/G3WCbAdh2zRbrAVFyHwqTYYuITfuKXGchP6UOoBDAnJSr1j0EsWDVvM58HUzyDyAPVcHWvOMQfr6pg9hIJo0psB5Jlred5bMM5Pios/pEpGrDp/QEnw24kpF0EWwUOv9VleRabjoSmlVwRgHb4SohzavYdX5mWLIVtrTn6GTnchK+Vt2rGkz1iXcpw/4C5RoVqDtLn+I181iCiwEne5dKhEBbxM5gRXv27U0qlDNRnVjJCvoCsxnJNUAAZZyg1rfi1EIhfJjIqify2hXbJn86piNkUb3q5ZKAvLSbmt+FSkV5kz76bcbIvDEEN9FlCnLEXpHlD3PjtgM3sfwnWr3s/pbAQ1LpLiZWOooKNJPN3on1rrz+YkbLEkEA1AhMvJ8YcjOAvw9d7M9O+3qrSziuC4hd47EboUZwqDsf9JSD2SQbRDDWldIN7kjYO+9mYugceI+MLOLTDXq1A3t7jpjOXCN2KXoyEOaOZUsuEc2V8zBPQdCGgy2Cb3DEW7C8h5Vyy9ICPLvFtigUBaWn2fz2zCwQh/L9CMsRGws525QTD3JKnnNYz+coZz0nl9uhBtPeNEj4cnMWTl52Ts61dszy87wKILFNQebFbN8Cy+76Iksqi6UBwjkmWdxB/IydrgQgZvpPrs9Qq2SPD2iy3yH89tsSRjVUusxf23HZgK6pSTBUVMNHgOxUi9EaIm44Axq0ihd1nj78RBr3lzhW0Oe3V4ZX4UHIdTqtBq6BO+aVuo5SNDtQ== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:7RhMv+GcEpYLmjYiqDOfWFdFwqEbKwsPkBc/iyvAJoZWIgGuvA5/RYI/E+XMyCcFhJ6hnEYDNxPmz3Xsga8HVEGkLe8qhbTbQPiIAnLRyBmQqxQ4wkSRboBFZlnFkukHamj24NSUB3+xw4QGpBbzAsvRvmJ5jPi4xtWL2LYzYyBochvSw0sB+ZuRDi1N3fyqvn1dfgepw1NmsKrg8E1xbXcDwh1Vemim44UttpcQ/tAamO5jlvG7WzrDjNBbTYfpr3yFFt06ca3ax1cq3vI8MP4mPmCTcalkboKEpnmwll6qlLaDIR7KJa78fjMUYq+5YRtvIBPf0XDKWnjAFsSM3bDpiqRZpu9wOPxFxo+i5qo=; 5:rEKJP5+XfloVk5W/lqrG5v0Gpf25dyITUsvLXl/GL8s4BWQstkhFPMOJ0Medw990ggR694p5FgnLvSNaIdziCauVcdNyG6FQvSkWeUGCt3JCA681RgVPWOrKiC0EEcEk71TH/Lld81qPnhBPYdqMQMICz4mMX+fjvUhI1D8UIiI=; 24:oMPjhIShHjZ44Qp2Ws3hSax2HtsfpOYU5L+6vdB9yHlyZmCLKE8QAeJgJX2X7W1dQ6WJybwC5fC+j7ZiKxAPcw+zPJvaV/ECXpELgWkHJjw=; 7:e9NSUgWAcdtCCgglMfgJqqPCVZrtSDpbn1eIFDcBI+cg8+g271Ol6NrjFqN799wRBsMJ/yzv0z6APYxha5AtAiY9+Sb/8beeiqmfbm4ivk8RqMsglwA2OoT5Jh4SvKgTt9nIIkcqL0p+F9lfwJD2fo7tugk2EvvHo0JKqe6Xjcti5ggJtyM5wP1D7hegm6VqhT20RFgx6gEpljhhih4xYBomfGxNafwJBUCdWohFjU1odNh5JrCmFOzI5cVEB01y SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:xi8TzFjiaf/zewuVoxmJiEdYhui0aoGZuLGWSgBQwy+RNOt1h+QdPV26aiX08SGq0Vt+KAtBwlJThMS7SzVqhH5T6s3sAhbVjruXWSYiWMNdXyo0zkPPRyD8eqjr/ksCuuNuZfgsMk0G6ODi5qnhzZMZP9FFPvm+7nvgseUwgXQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:29.5594 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a16fb1cb-e0a3-4c39-7c93-08d56da09b23 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.92 Subject: [Qemu-devel] [RFC PATCH 14/34] hyperv: process POST_MESSAGE hypercall X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add handling of POST_MESSAGE hypercall. For that, add an interface to regsiter a handler for the messages arrived from the guest on a particular connection id (IOW set up a message connection in Hyper-V speak). Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 5 +++ target/i386/hyperv.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index 4ce41fe314..fcc41caf1f 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -43,6 +43,11 @@ int hyperv_post_msg(HvSintRoute *sint_route, struct hyperv_message *msg); int hyperv_set_evt_flag(HvSintRoute *sint_route, unsigned evtno); +struct hyperv_post_message_input; +typedef uint64_t (*HvMsgHandler)(const struct hyperv_post_message_input *msg, + void *data); +int hyperv_set_msg_handler(uint32_t conn_id, HvMsgHandler handler, void *data); + int hyperv_set_evt_notifier(uint32_t conn_id, EventNotifier *notifier); #endif diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index 9cf1225385..3dc8a7acb0 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -252,6 +252,14 @@ static void async_synic_update(CPUState *cs, run_on_cpu_data data) qemu_mutex_unlock_iothread(); } +typedef struct MsgHandler { + struct rcu_head rcu; + QLIST_ENTRY(MsgHandler) le; + uint32_t conn_id; + HvMsgHandler handler; + void *data; +} MsgHandler; + typedef struct EvtHandler { struct rcu_head rcu; QLIST_ENTRY(EvtHandler) le; @@ -259,15 +267,51 @@ typedef struct EvtHandler { EventNotifier *notifier; } EvtHandler; +static QLIST_HEAD(, MsgHandler) msg_handlers; static QLIST_HEAD(, EvtHandler) evt_handlers; static QemuMutex handlers_mutex; static void __attribute__((constructor)) hv_init(void) { + QLIST_INIT(&msg_handlers); QLIST_INIT(&evt_handlers); qemu_mutex_init(&handlers_mutex); } +int hyperv_set_msg_handler(uint32_t conn_id, HvMsgHandler handler, void *data) +{ + int ret; + MsgHandler *mh; + + qemu_mutex_lock(&handlers_mutex); + QLIST_FOREACH(mh, &msg_handlers, le) { + if (mh->conn_id == conn_id) { + if (handler) { + ret = -EEXIST; + } else { + QLIST_REMOVE_RCU(mh, le); + g_free_rcu(mh, rcu); + ret = 0; + } + goto unlock; + } + } + + if (handler) { + mh = g_new(MsgHandler, 1); + mh->conn_id = conn_id; + mh->handler = handler; + mh->data = data; + QLIST_INSERT_HEAD_RCU(&msg_handlers, mh, le); + ret = 0; + } else { + ret = -ENOENT; + } +unlock: + qemu_mutex_unlock(&handlers_mutex); + return ret; +} + int hyperv_set_evt_notifier(uint32_t conn_id, EventNotifier *notifier) { int ret; @@ -301,6 +345,46 @@ unlock: return ret; } +static uint64_t hvcall_post_message(uint64_t param, bool fast) +{ + uint64_t ret; + hwaddr len; + struct hyperv_post_message_input *msg; + MsgHandler *mh; + + if (fast) { + return HV_STATUS_INVALID_HYPERCALL_CODE; + } + if (param & (__alignof__(*msg) - 1)) { + return HV_STATUS_INVALID_ALIGNMENT; + } + + len = sizeof(*msg); + msg = cpu_physical_memory_map(param, &len, 0); + if (len < sizeof(*msg)) { + ret = HV_STATUS_INSUFFICIENT_MEMORY; + goto unmap; + } + if (msg->payload_size > sizeof(msg->payload)) { + ret = HV_STATUS_INVALID_HYPERCALL_INPUT; + goto unmap; + } + + ret = HV_STATUS_INVALID_CONNECTION_ID; + rcu_read_lock(); + QLIST_FOREACH_RCU(mh, &msg_handlers, le) { + if (mh->conn_id == (msg->connection_id & HV_CONNECTION_ID_MASK)) { + ret = mh->handler(msg, mh->data); + break; + } + } + rcu_read_unlock(); + +unmap: + cpu_physical_memory_unmap(msg, len, 0, 0); + return ret; +} + static uint64_t sigevent_params(hwaddr addr, uint32_t *conn_id) { uint64_t ret; @@ -389,6 +473,9 @@ int kvm_hv_handle_exit(X86CPU *cpu, struct kvm_hyperv_exit *exit) uint64_t param = exit->u.hcall.params[0]; switch (code) { + case HV_POST_MESSAGE: + exit->u.hcall.result = hvcall_post_message(param, fast); + break; case HV_SIGNAL_EVENT: exit->u.hcall.result = hvcall_signal_event(param, fast); break; From patchwork Tue Feb 6 20:30:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870086 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="DgzT0eb7"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbbvX0w8Vz9s7F for ; Wed, 7 Feb 2018 07:40:56 +1100 (AEDT) Received: from localhost ([::1]:59082 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejA2w-0001Gs-4Z for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:40:54 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44788) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tz-0000wr-5c for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tv-0003Bi-Pm for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:39 -0500 Received: from mail-eopbgr00109.outbound.protection.outlook.com ([40.107.0.109]:52480 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tu-00039t-S7 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:35 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=i0x+wtZkjAsg0L26jI0afzFxLxJRCL3lOphEs1hx0mY=; b=DgzT0eb7GiuJo20OrZvE/toYvMlWNbeXrntLAIMEpkORF/L6nxifg+6eh5iEZMSdQuBoHha1EuQP6RjH6MpyfdbG4/EbPBUcuDE6vl4eDha9aP6UfB122vLrviBOssdv1BxZxYiJEncMUBjD6CrEj9y1qsKvj0W6dRdePATTAQA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:31 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:29 +0300 Message-Id: <20180206203048.11096-16-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3f6c3688-94b0-4f0e-ad49-08d56da09c16 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:P0lks0n1n9t4lH6nGxm3bCpIR8Zqj7E2DvqghXfqiqabLMLkOg5zZ5X4PruBZAiQxdeSb53VW8RHaUy32gIhXiDnofWEdSnwpErtzi7oCqtrRsAns0adfmEI6NLSJYZz1T1CaYdY3+pbPkD2iBLa3t6geqEp8XEQYVbnqTM0lXkA67qe4FBz7Vn+VPUu5GBFOicS1ZFtFhhpsI46qYNjX7thZ8VVN/J58XDZGWA41Sug061DhKr6d3cO0s2mcqjB; 25:eIhej/Qp9x4kD9CWK1d8SC0NG/q7AzjnTUPb/OxfKRc3eGQLxBEx/p9sT/dxi7UAsJxKh3z8YY/lkVzVtREPDkgAcZTYyk4Is+9vzP2Cs79Gmi/h4SyOXmYb4f1ls9EUOm7JezpkqaXFZpHV2Y9txg2AajJYdei9t5Pg0Iyhi1xcP8iNvXCm9hk/KrrszbzdblP/zQmBrNGLcJpPvWT+l1LSRZOGKlsP3Nbcpew5IcZ5EsRdGqFBx5QqrEmzsn38kghJKcesGkwrKpS8Xjp0WZNPfG4xS0wLTpkVtRNe+WtXlKLuo5CHZmWIhY0GHuNNO02weuhTPmzGMuw69xJMpw==; 31:507T1NUhWrhrVa7MPINmUH27Rdimn4QUWRqdm5Q5KmDcU2tiOrY/u1PqSqx6RW7xgf70Wse22xkpeFAYzSu9qGXvBe6OhduvQc9TcQpgV+BhdqB/SX28LQIVfQv+hCPOmv5aR8MMeupWs+EuprdECoIgwoRBJb9ipiexrCUWU9i9QCS66ok7rqMtP0/9jAeQFX5JqbzSrVyuvNHtOHR2AxSwZDI4uuxlGJ/Ske3y9LE= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:u6G8+Q+ruyvjVwYWeasuaVsZqrvYGud9crJ67yuyDyfbyOGQz16Ofr3KBMyEJNktiH2gk/SUclvznGrL5cJ+v8SIQvdVw7U6QSw7JYRwkxeDlL12JPSy0XiW2GelvnY2RjIiLn+7/9rON5ClDlfAwS+83jQxiRVmwWnLB5qt4fPcIuz5iTE66s2miVd9GqfBdVbxq+AdV6F8Nfi67TjGXsSKQFfpQna8/qG/NpRwpVNOzpYXMFsr+ENpO/IUyVnJVCqwMdL2hszGUBrfHdmg9FgBqYB9mD7oqKwGIfND6OOfSKpjEVfecunEXy8F+vfJNlt36foolpnYENJdSmFeNm+ip+w4oVqayjKq7K1DP7N8JUjTqRKZM7o7Ay7DrCK0h2sqjzXrDR6f0B3Na180Uot7otuLqN79Dib4oGDnMM4=; 4:1GiccypZ2CZgildwSvBZXhhj580yiXnCWpfdgBNiiHrG7H6afUfyug657ZdytFdXMBtrndKxeLQlttx1a4h9jVvAkP9UWSA/c+MUV6LVjrWB7cSNYxyalK0j6jnuVSxw8J0Ja2Itpos1DHlopDwZlfp0iw0WWaSUkHzACptaOL8r2DF3z8a0sN9xYJMsmMUG3fiZHfrEKvi2aHwvNy+888T0vL5aXimh7vsUf+CKrvVQAyOKqoj6/4WzIBHVBFF0rd5DIeTna+sIEFsSu0+upw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(86362001)(68736007)(66066001)(15650500001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:0YbN7Hl69egw7u+EvuxDkasQcAQJE2kQ1NPl2Ya?= GQTovgKs2hRBt2jPUUX7gcIdRwbMZzl+SUlAKu2ZX+rbA7OJEdUTDwQh8N1WndAA3tm9KFaCkNrxvxVX8fzznMHPbjQqFLusEFKUDUmNWNOjb5Mc05ZRxj/OTh5GkU0QK6sP1k7v3OZafothqXvK7lyO98sgRhkn0zuCd3yvh32uc7gdDG9DgRgnv45XZtnN738vmxE3gsQdRuBjTQaCMpwgolTw4k2vIquk/cfRYmRY3Y1JRd/iZWA2oxZ44RBvqSykpsqw6Nqz0TI2MLh2ttKu8yBXgDqN79jry4hMm+IWKxJf74C8fNY6bxsym/m0h3939ktrHmAuaLY36UQ39JcGrT4afhS1AGg4mEHnLzsQH6qMTDMqn2SPfLwljqWH1DBgoOMMiz37/1fpXEojfPnesnmwgVrMs8xA1KXExJabGsIuzYfjTknOR1CqfC088h0hA84pMQFzUhCf2UGGJWafOzxIJ9i9hKR7/wrc0NOiiGYOuEC3I0MUdmlvSbBeKuEh4rtsmEFq3CbPhbLdljQWt9vfigOGyyQ5aJEPU+tkHMUjJjAEoWc+pfnXUHMkPcgnj4ivHl1EkllA8CBrP3f8TkDCFKlRnRfW15Uu+6Ja3xputp7rfpdtcPXeQKMAuoHSUIX22dM/+uICKwM3Pr6V59zMpWe77o8GiF3E6Pb2zwvk/W+u5EMt7zI9cmyDyp9R09JZoGX0PDbXBxtHyHYziNxoh6WOBrrrmUDz+n0VFtD1QbxqD9FN6QiXVhac+87QVUpLREZ11Z+4fqTSQMBE7Rwy5iXupIWs3J23boMub/jev7wXh9owLfJUisF9oWzD59JboZriegPZoKe35t9xQtiuUSsTFk1SgS3HCfqr3lfV6NLD3Hp7xAVWrfQG2me1etze8N1DtI5XPe1Kl8IwucLPPvVGLYzepOkeiSig7fgQ9MxzQTQAb7ar3EG7GiFRefBBv2KVa/mkeV2knHIwX7NrxCjRSyfqzHD5+vjxu1wfBlBDT2VOkOa9oCUlaGvBWsUTVFBcw275XdzZFEnkAXhp/0/3QhcqUdSoO06sThMl6rzVarcfM2ZlvDvr13P9+pA+cMJdQ8NXenwTdUxjTOwS2WwjM5xvv9dOWm8qzsKAJDCPos32H7BcrtCXWUg3fhHPC9rxzfCLbikeSx6Co5Rtp/hiK7OYXBVLg9LuVW8PsQRmaSJobpyz8cf5u74yVi0vxu6Np0d94EvnrQjqXLw85eP6xBux7ouN04fazSWBSA0+/8x15pHEAjj5sGq0= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:EFDuAMLQ6xk6hmrj5XXqBPixN7KzERcAGgxmDmOMb75hN9ge8qsm+wGvQLDZwuYCElIRRZhNJGa4i2XIVMp1VPdoKLMBJtxWwaugkPDCI6I9Q2N2DjScr72+YGK0vppS2XqucNvFsoRqvqRUIhnH6DsMyZ7QJJcwpq8SWRgAnQsmi/slmN3EmRbEYcNrj7CcGlFJaV8tHGtMDrQeAMYxev5LixyJ/VX9y5EMOL2rtlPnzvTE7SwZbUBBSRmo4K+H6ndycc1xbJLWWWge+IrFunNf83tNiL5KXS3Vr7+9NR/fmoSR/+2kVXtXdGh4cVtGfamnODy5y7dizcJr6ITxhotmHlQBwVBkvintOydnHhc=; 5:iOr8n5tn6NavAw7Kqrhf556xSa+iS7FAYMCDfrVvpPSXczqyX8l14MjT944jKalldYmdNWKY6HM8zrGPBX5BkQj9dw5EpURlQJYS6BdmKL3EA11FkJI2dp4URzxPjtT1mcDp0/HcXU71Md93SC1rhbpslDBp8vLOh4TgObjsB1s=; 24:1nDGsI8PRxKjkUMqs5eXKdXey6HUGFWeINWFuJHK2xT6++wUK5xs5Aphu/HjYPKz84zyVD9FVW1FWfUMAkq9+enKY3hYaEN0rZT0VX1he5A=; 7:KdR/7pNi+9ZD5q5uTvF1W4EjPhAo6ScAnGxncVhpXZgAIgdMXBeNZH/hCI3L7hcBh14p1NU4blbzEFdCRzT81QKsm3MTda91LY9AFSkRfS1UkgJuj6dOEzRza+PVp/q47ofVrrVov0ccoDab3VvvWEaRRANxWVhfvqFKaaXh/UxthHxGqpj7exvhAVhaxJajvThVolO1AgSusREd78iHva3Xlw5y/d0/mambVibPXySe4ml4FJOQYrpAF0C3uvu1 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:ThlAdVS+vluW9BP6fkRnOVxxcNHy2mFKA7be2pQy5dfEOPZ6dQ6JDtj1fdtdlBiM6WJAK+6eh37czbrfGWjsVI1PM9x4e2ctQvPeiDv3Pji9rvLpGjjz7xWOQ7E6pI9gvcIYAQp6/zVSmiW8zOoHCtYiIkMGPYFOobV75JvwsvA= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:31.4344 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3f6c3688-94b0-4f0e-ad49-08d56da09c16 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.109 Subject: [Qemu-devel] [RFC PATCH 15/34] hyperv_testdev: add SynIC message and event testmodes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add testmodes for SynIC messages and events. The message or event connection setup / teardown is initiated by the guest via new control codes written to the test device port. Then the test connections bounce the respective operations back to the guest, i.e. the incoming messages are posted or the incoming events are signaled on the configured vCPUs. Signed-off-by: Roman Kagan --- hw/misc/hyperv_testdev.c | 162 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 161 insertions(+), 1 deletion(-) diff --git a/hw/misc/hyperv_testdev.c b/hw/misc/hyperv_testdev.c index fa435abbbf..79077789e1 100644 --- a/hw/misc/hyperv_testdev.c +++ b/hw/misc/hyperv_testdev.c @@ -13,12 +13,15 @@ #include "qemu/osdep.h" #include "qemu/queue.h" +#include "qemu/event_notifier.h" +#include "qemu/main-loop.h" #include #include "hw/hw.h" #include "hw/qdev.h" #include "hw/isa/isa.h" #include "sysemu/kvm.h" #include "target/i386/hyperv.h" +#include "target/i386/hyperv-proto.h" #include "kvm_i386.h" typedef struct TestSintRoute { @@ -28,10 +31,26 @@ typedef struct TestSintRoute { HvSintRoute *sint_route; } TestSintRoute; +typedef struct TestMsgConn { + QLIST_ENTRY(TestMsgConn) le; + uint8_t conn_id; + HvSintRoute *sint_route; + struct hyperv_message msg; +} TestMsgConn; + +typedef struct TestEvtConn { + QLIST_ENTRY(TestEvtConn) le; + uint8_t conn_id; + HvSintRoute *sint_route; + EventNotifier notifier; +} TestEvtConn; + struct HypervTestDev { ISADevice parent_obj; MemoryRegion sint_control; QLIST_HEAD(, TestSintRoute) sint_routes; + QLIST_HEAD(, TestMsgConn) msg_conns; + QLIST_HEAD(, TestEvtConn) evt_conns; }; typedef struct HypervTestDev HypervTestDev; @@ -42,7 +61,11 @@ typedef struct HypervTestDev HypervTestDev; enum { HV_TEST_DEV_SINT_ROUTE_CREATE = 1, HV_TEST_DEV_SINT_ROUTE_DESTROY, - HV_TEST_DEV_SINT_ROUTE_SET_SINT + HV_TEST_DEV_SINT_ROUTE_SET_SINT, + HV_TEST_DEV_MSG_CONN_CREATE, + HV_TEST_DEV_MSG_CONN_DESTROY, + HV_TEST_DEV_EVT_CONN_CREATE, + HV_TEST_DEV_EVT_CONN_DESTROY, }; static void sint_route_create(HypervTestDev *dev, uint8_t vpidx, uint8_t sint) @@ -95,6 +118,128 @@ static void sint_route_set_sint(HypervTestDev *dev, kvm_hv_sint_route_set_sint(sint_route->sint_route); } +static void msg_cb(void *data, int status) +{ + TestMsgConn *conn = data; + + assert(status == 0 || status == -EAGAIN); + + if (!status) { + return; + } + + /* no concurrent posting is expected so this should succeed */ + assert(!hyperv_post_msg(conn->sint_route, &conn->msg)); +} + +static uint64_t msg_handler(const struct hyperv_post_message_input *msg, + void *data) +{ + int ret; + TestMsgConn *conn = data; + + /* post the same message we've got */ + conn->msg.header.message_type = msg->message_type; + assert(msg->payload_size < sizeof(conn->msg.payload)); + conn->msg.header.payload_size = msg->payload_size; + memcpy(&conn->msg.payload, msg->payload, msg->payload_size); + + ret = hyperv_post_msg(conn->sint_route, &conn->msg); + + switch (ret) { + case 0: + return HV_STATUS_SUCCESS; + case -EAGAIN: + return HV_STATUS_INSUFFICIENT_BUFFERS; + default: + return HV_STATUS_INVALID_HYPERCALL_INPUT; + } +} + +static void msg_conn_create(HypervTestDev *dev, uint8_t vpidx, + uint8_t sint, uint8_t conn_id) +{ + TestMsgConn *conn; + + conn = g_new0(TestMsgConn, 1); + assert(conn); + + conn->conn_id = conn_id; + + conn->sint_route = hyperv_sint_route_new(vpidx, sint, msg_cb, conn); + assert(conn->sint_route); + + assert(!hyperv_set_msg_handler(conn->conn_id, msg_handler, conn)); + + QLIST_INSERT_HEAD(&dev->msg_conns, conn, le); +} + +static void msg_conn_destroy(HypervTestDev *dev, uint8_t conn_id) +{ + TestMsgConn *conn; + + QLIST_FOREACH(conn, &dev->msg_conns, le) { + if (conn->conn_id == conn_id) { + QLIST_REMOVE(conn, le); + hyperv_set_msg_handler(conn->conn_id, NULL, NULL); + hyperv_sint_route_unref(conn->sint_route); + g_free(conn); + return; + } + } + assert(false); +} + +static void evt_conn_handler(EventNotifier *notifier) +{ + TestEvtConn *conn = container_of(notifier, TestEvtConn, notifier); + + event_notifier_test_and_clear(notifier); + + /* signal the same event flag we've got */ + assert(!hyperv_set_evt_flag(conn->sint_route, conn->conn_id)); +} + +static void evt_conn_create(HypervTestDev *dev, uint8_t vpidx, + uint8_t sint, uint8_t conn_id) +{ + TestEvtConn *conn; + + conn = g_new0(TestEvtConn, 1); + assert(conn); + + conn->conn_id = conn_id; + + conn->sint_route = hyperv_sint_route_new(vpidx, sint, NULL, NULL); + assert(conn->sint_route); + + assert(!event_notifier_init(&conn->notifier, false)); + + event_notifier_set_handler(&conn->notifier, evt_conn_handler); + + assert(!hyperv_set_evt_notifier(conn_id, &conn->notifier)); + + QLIST_INSERT_HEAD(&dev->evt_conns, conn, le); +} + +static void evt_conn_destroy(HypervTestDev *dev, uint8_t conn_id) +{ + TestEvtConn *conn; + + QLIST_FOREACH(conn, &dev->evt_conns, le) { + if (conn->conn_id == conn_id) { + QLIST_REMOVE(conn, le); + hyperv_set_evt_notifier(conn->conn_id, NULL); + event_notifier_set_handler(&conn->notifier, NULL); + event_notifier_cleanup(&conn->notifier); + hyperv_sint_route_unref(conn->sint_route); + g_free(conn); + return; + } + } + assert(false); +} + static void hv_test_dev_control(void *opaque, hwaddr addr, uint64_t data, uint32_t len) { @@ -102,6 +247,7 @@ static void hv_test_dev_control(void *opaque, hwaddr addr, uint64_t data, uint8_t sint = data & 0xFF; uint8_t vpidx = (data >> 8ULL) & 0xFF; uint8_t ctl = (data >> 16ULL) & 0xFF; + uint8_t conn_id = (data >> 24ULL) & 0xFF; switch (ctl) { case HV_TEST_DEV_SINT_ROUTE_CREATE: @@ -113,6 +259,18 @@ static void hv_test_dev_control(void *opaque, hwaddr addr, uint64_t data, case HV_TEST_DEV_SINT_ROUTE_SET_SINT: sint_route_set_sint(dev, vpidx, sint); break; + case HV_TEST_DEV_MSG_CONN_CREATE: + msg_conn_create(dev, vpidx, sint, conn_id); + break; + case HV_TEST_DEV_MSG_CONN_DESTROY: + msg_conn_destroy(dev, conn_id); + break; + case HV_TEST_DEV_EVT_CONN_CREATE: + evt_conn_create(dev, vpidx, sint, conn_id); + break; + case HV_TEST_DEV_EVT_CONN_DESTROY: + evt_conn_destroy(dev, conn_id); + break; default: break; } @@ -132,6 +290,8 @@ static void hv_test_dev_realizefn(DeviceState *d, Error **errp) MemoryRegion *io = isa_address_space_io(isa); QLIST_INIT(&dev->sint_routes); + QLIST_INIT(&dev->msg_conns); + QLIST_INIT(&dev->evt_conns); memory_region_init_io(&dev->sint_control, OBJECT(dev), &synic_test_sint_ops, dev, "hyperv-testdev-ctl", 4); From patchwork Tue Feb 6 20:30:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870094 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="GmINLmb9"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbc4z0H7Zz9t2c for ; Wed, 7 Feb 2018 07:49:07 +1100 (AEDT) Received: from localhost ([::1]:60166 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAAr-0000sC-4K for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:49:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44787) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9tz-0000wq-5K for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tw-0003Bz-9h for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:39 -0500 Received: from mail-eopbgr00109.outbound.protection.outlook.com ([40.107.0.109]:52480 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9tv-00039t-W9 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:36 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Yzl955D4AJP+HDY4o8jL4Xpx68LaBIxzOshJ/CmYSOU=; b=GmINLmb9EPr99snS1e5dmP7HRYlnCpFnvrcRzflZ7DSnAlDdbKA0PH+AxNCLuG/eiv8t2P5i66TG6w4brlq4NCbXBkgiAPc/Hgt2Z6JHR/7oBoD71/bzOOQL+ARXjcD9KaMristoVNffaFmtRsd5iLf740VXcz95Wa+25iwV91g= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:33 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:30 +0300 Message-Id: <20180206203048.11096-17-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5d6a25d3-1718-4979-7ba3-08d56da09d07 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:PBgFSx8XLWtmr6Zrf+/l0C8M6sSpVMF/t2Ob+bga8oC0mPmm/0hBWaFSCO1FKKvw6NQsW/E29mlFgHjuO3PW9S2vjrccRkgrfuRFG78s+InjWRGAByuHWolIkNPSfs17YcYPT0LLv5tIoQQ8Q4mkgNj5eYsGDcN1rdjhzP54ZuokdpxGubJ9s8ADR3caDPJ7/zYwAcKnyGUxRJ1CGDbxVhZKIwfgi9jSeMiHpEAG/ECvKgUOvvMZl3YPJqsXufow; 25:inqpSRaKD3WFnqzU2T3y6ivcZ17xGgBNO3DPXAp/QkfFaOaZcFGjJG2BgtBd1tKQpMWnZBffJ2vQ+v02WHUnbruFSRHT86zVEpG7XFxcJn6MeU610i2fV2aATs/tT38Lj2OftpZPuANV1cuy3MrVwJ0JVhBz5f/HGJS+Wotnuh/b/vz75bI7xloOFp5SUbc4SmcFEaGWzHMlyACweFl2Q0ofSoMzbUJbkI3lNBGvm2ycS+oZCMOcuHkR7gRGtHzUu2kWDMnfMTzdiSJfKuX3Q06cufrwBbYRdY2g8XzGkcXcwUDJcbsl5Isj/ZS/iZbjbq3pKt4NC9yyNNcv56v7tg==; 31:TaBDGbHGBJr7WC/zfgepnoNv/0+MN/aMwibhOQ4V7GWV5EufJJv4Wi/SPQml9eP1CfPrJdp3ZGzTOXDoRmJFfpflx4eGT5OJO5cv9VffEtLu6FNR9fl2z2Ra35SKDUPZEzX3S4Z7kA0Eet8JY7Fuj7uoX1eeFPMoA8w/oW+MYMW28bcjIRGuNA+M3E9LQ/S7+9wUEMwcIAmOX71s6aooySqmj1yeuutg7x6HEJpQWwM= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:IzAv3pYEcye1h+8MoyNh3fJP+bCAxoKx7nPsu4n3rBGBZuwF7wK6Z3wMXnRMVcDVNgg6Ikq5p97yQolp6R4G0XyYYw1oSjdyhh93+3zQ8uwBvdXY5Gq0iHKhj2QOxxXNaFG2pq6+yls5UDhLNjUw4aS/l7f8mxnvtljJf+F/4aTC7P805Vamex30g2RDXEwhzkQzbD9NBjFIwMzHR/ARFzRUTIlVSNWo8hLiPLA0239pNfBmsBGXOuglqblnpJt08dn5kbM+iGetBpllCPPsatTcvtf7wg/Lato5B7aJBck0Q7pau06bIyZWPp9kwJFYJpYi6WUK8X2LmRuIOkcYqI7XO9N2QVNxFp6x5bGFyjPRlWR6Ibth+QsgXopEyP1GZogAAT/jU2nZ0/n0J944wU+lzdHfRl3rWWvBTEO6m+E=; 4:FM4dqjWoPV6lFV83k2QfrgDPrXpLAnDCLtasX4oxuHCF012qp9s7q4zUV6QgBf8Kg1GOOouexR11oevOmW1f+qKuHdOI1z7VEghtT6DaqpSi9B2lxfbOK58rvvnXscK+2MfGIB5/ghsM5mwmA/D7vmUYCisjjBeGtCyyC4igEJGP0Vnij9Cvp9fNh1jDLCdE+6sMxUfK89NIjQhXI3wDhFd7iqYbwkHCmux+2QHqjApU/cKyLM5mPvHB1Gl8ztar8e8KrdKspAD9hKD/2/T8ow== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:AuKHeffZczEUkhJYkVkiFhoyDHdwPvpwtvo8JrP?= gW8Bxk/yyZ58tdINzI1OXtWUbKTnNvHK9MbE/uxnrliUVUEl9Q7K2Wo8n48KC3mOtH43JUdW89X6tPWeDfRCahsZwH4dfSk5XgXBtCWAGmheMS8kiXP4WLMbvSRYaPxVy+KeYMWLyAM7UInErSlomgOqQXXI7YfBCCbqFWx84G5qVLvlOo1IhZ4/lB+GUslCzPJGzDivrNCIePEPgsdKqWsMfV8qEXME2/Zic6vIPljuFjufvS06rawYrOU3qFGvACTmKJB0EAklDEG8ZUIAn3ii+lkW0G5LU67xmW2KjVEz6uiZdRuRDK1XODUpfr39lXNX65A1vEgEEIQ36md879+OwsN8oNcM52xF++CtuJg96++MFPEdW3FSpw39ngqF4IprJCnDH/Fa7Biv39kCwOmlMttYgmHgpHcVhUgn2WLlg02O/qqyvrQVOuDatqhYkojny7xbarCzD4QxiIjhxgAZuYx/n5Cjl212qBD5vG18qmosp7D7eHX1/UuX9LuGTByHku/6y6kFTASCLlqOWDRNXifgsbvdy/cIF5ZpND2djCrc43KyFBxRCF7Y+ImhGUHo1uMYAgmhGU5B32A7y5+LFsjF6fYsDGgzq6XjCjuqqUoRsmErk6K7WYkpQwOx9Vs1jRlWjQymW+nXZXNKy1H1FYOiEBwpNDDKR4Utwclrvm8kRHpu2zRrmEU5G/PzOYKIU6cdzZ3cnloD9JeqzDeCa4rhv4DPCdybizohLxK7+Lz9/hU/QGirLcvzZAp0blcRpgnrTxLTPVuFT3c70twvWWj4W4HE239hSnveBIf/ULIHRwdLpeCPsMeibD/RH85xqEOnZZhgaiU+AF62Whk+DUgMBlVlRa2qmflWtx/C9L39usgsca+d06GF4D9DBC6VAcEK1AmofNZcEY9LT5vbgUE5deHJ43/rCwBW3J3TyYCk05WOYzfYh/R12rc3r6F7QaG17zjLoQnWScV+/CQUP74DsOOuXBKA8XldxE4LkQBtq2ccu873kzDjgfF1Q/aIWwAZLp5HFaqjxY+Yubns0DDKv9mAn68vRXRRgBxyZhkCnSS4OK+Udf3oeYWsUDhBVowjab90bmOdpk49OMFf/Kz9aHlOsaODF8z/nVMJRxxLEeF4QQan6uFhfJOIRTOO1jHhDmoLdaulryoiWQhIuybO5LvKI6E5EXQXIShNAwkTpyRMgCZ7buv6Wk4DsDjNH7CYeh+D85WlxxXDNc0Z1jU0/WG374BAkTRIqLI6SRA== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:r54Ac2qcOJawB1lxBKwoeU5qu3PVKqs0GGvuYfCyfLzRjXazmjpZQ5GavjeJu/YV6GpBJlY5/xrWgf22h1XSHmkwGlx7QNByYMbOn1Ofk2w7cVLIy+/mbVrTOHid50q2Q8rYtL58UGwH6x2B99F6CoquSu8WmgPQshtOTUADE1pA4bswEt4jVxDSXjWN935fgki/yFFoJcfGh7YEo6B4VUVK3NRqBjC3RM+A82UQ0aYB6IDZ/dJPrEfwTqaK+gnuTJFmFn91FKNPzrp/B5BjIIyFnIBGsYZIAZFL6/R/8OUDb7uC7se9Qnh0Rxm4mH1vILKzrBivaZGMoE6uwB6pvW/SgdOcVuGXmY8yxxTC4G0=; 5:MxqyUFO9I15IDXTTrwOHo976E4MoY2OJQXm2Ri0JsuPIeMcIUVS9OYB2AYvWgrMElp4nPazYzzzfdBVvV5E+ILDqZaojQZovOFKZyXKaOgavBILfO56IWKVnRu6JtFSJSLr+1q414jzTdf5OwOT7BvPKsMML6vEIfrIbI4G8Alk=; 24:VRo9igIWpTqevGAaApuSrI3lp94h4W98X27CJrOc078v67NC/OQQkLjKFkb3n6OMckgnwQY3yVVUyVPZzX2Gf7VevhvsHtrK1Ol9e42Dr4w=; 7:SWId9OuGdAc/YVAUdjXe4elKfAMfngPZ64aeOn43wlmkWTn3aDCzE/yKdqWaOqBf6AOX1P/i5X68qWCRE1vthNV44JhdtCVK33fSO6mOAaeEN7B6c//M1YY25NGEKkeZXbOHyn/q8k3+GJUdaa32jK6wVs9k8JR+SQjpckbolCgrO2NIWdhqU0Zw21yvEZzYErST25MUWBa2MfaTgGHU8Zkvs9U52P/9szJV53o43bTuXbMqww02e9Caito0pBBC SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:p3ftjtR9xFtNr7LWRzt6NNBzx/GSnFwAJU45EgW5+j2ySDuTJLiNEs+Zi4pQ0RlCQOljo79cCgAKg0XJURU1cmIRftzAgSelbHhw75Ns/0IOOAHNp8xWPeGL0pmL6duXMuToI9v9O7wI9VR02stKTLZ734nkzOW7gV2PJ/2hUdY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:33.0126 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5d6a25d3-1718-4979-7ba3-08d56da09d07 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.109 Subject: [Qemu-devel] [RFC PATCH 16/34] hyperv: update copyright notices X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Roman Kagan --- target/i386/hyperv.h | 1 + hw/misc/hyperv_testdev.c | 1 + target/i386/hyperv.c | 1 + 3 files changed, 3 insertions(+) diff --git a/target/i386/hyperv.h b/target/i386/hyperv.h index fcc41caf1f..8b7fcd0b48 100644 --- a/target/i386/hyperv.h +++ b/target/i386/hyperv.h @@ -2,6 +2,7 @@ * QEMU KVM Hyper-V support * * Copyright (C) 2015 Andrey Smetanin + * Copyright (c) 2015-2018 Virtuozzo International GmbH. * * Authors: * Andrey Smetanin diff --git a/hw/misc/hyperv_testdev.c b/hw/misc/hyperv_testdev.c index 79077789e1..b9e1f1cc74 100644 --- a/hw/misc/hyperv_testdev.c +++ b/hw/misc/hyperv_testdev.c @@ -2,6 +2,7 @@ * QEMU KVM Hyper-V test device to support Hyper-V kvm-unit-tests * * Copyright (C) 2015 Andrey Smetanin + * Copyright (c) 2015-2018 Virtuozzo International GmbH. * * Authors: * Andrey Smetanin diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index 3dc8a7acb0..e43cbb9322 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -2,6 +2,7 @@ * QEMU KVM Hyper-V support * * Copyright (C) 2015 Andrey Smetanin + * Copyright (c) 2015-2018 Virtuozzo International GmbH. * * Authors: * Andrey Smetanin From patchwork Tue Feb 6 20:30:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870120 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="bU/wnl6g"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcmT6nkzz9s7F for ; Wed, 7 Feb 2018 08:19:53 +1100 (AEDT) Received: from localhost ([::1]:35357 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAee-0006aL-2q for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:19:52 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44820) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9u3-00010s-7e for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9tz-0003Cz-6k for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:42 -0500 Received: from mail-db5eur01on0101.outbound.protection.outlook.com ([104.47.2.101]:55583 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9ty-0003Cf-SF for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:39 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=zjjxaZfQzG+f4pwRVsigO6UQlCiz4O+xafgxTo3/WL0=; b=bU/wnl6gNyR7EGEJ4GE34Ws7d0a/TPWHUc9lclbaf+HbH65m3XAox4mO5926TzdlYoH6fRnodChcgZEqHgT5/ta4Yr/FOW7sNYEfT00WYJlZXkuiIEhtqruWJw+y+jMPTPb5e/th7DS4snMv7NLR+Uu6mCCW+M7f377yRve6U9U= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:34 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:31 +0300 Message-Id: <20180206203048.11096-18-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a0d766f4-23c6-4efe-6bcc-08d56da09e7b X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:GMHSr2e4bpiohCzd9KWjLABn59q87qSVq2SvfZ+7Lp9h+TsOta+XcY+bFJeoErfr6PSrdVPHEzNDJ6pxNaNJkff6XXtRl6vba+wYt3Dj92JrMEGS3K6VJsM9rRgMOzaaYHJ/VyLSQwmtc9F2DwMP/VJCusocdl9UT/1NRnSGNaN7RuQYlmr13EZSdtuSSBIi/+Ou1OV+AMARdwcfXZfH4sGmzfrtzkXCNJc5raqtYJxx/7tNifbeeORxebuAhf29; 25:lHcE/JUHuL2kwWB02Vbvf/0qy5UI0Tf8fHkgNycm6TxaV76AecXu1HWfu44M2ADCaDs6fW7aMArgFvVr5XT+nd263cKnF/eQD/dGLvH9xyCUiVy1/h0gykX9Oxh//GdQUrKvdBfxFCDgfd0aepNRA826EtfyF0vt6jT739XWiwwnYvPpq69Vsy+k4ETj0yobvzco4kcDny5M2RiUZLBGtYxvXqgObE/5rcP3MbARcTsIwMJ19FZcH+nROrnYZ5THBjKe/FujRiQ8eWB3SDS9cJR6Cghz3GYZ5GwBB/ewogndP/eKvT6rg3QTCatJsFi4t/x6C4eCb61zmYEauS+Trg==; 31:gBCi3IrMcxDu3SDunLVebumvOzrJYr6h7kcwb2ieVWTO/roe73I1W03zBAe0c8tzHOErzPR68krjUfYwlBvExNg+ApQEJzvoiOKnuZ79KaNCjN/aqZMDUaNp8bIK/3etUGiKo5BLM+U3iiHPKA8YhidsQrzkVRXmk7JT3xw9SY8Vu/NjXsA25+E20Y4RbIiyZ5sZItqYoZGKViB4vW0h6XJhR1nkWFd722PT4rtj9y0= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:DHkPZ9fQihZ1bkmb+FWtvOd4oR6kbe+CR52ClbZGVDa3ZcXhuwMFS6QQkY5YdtEWhJrXneWkLTpQEYTlQa0InMYqyZjUHKLA6LQlDkPlh1ClEuNQOfuO0hr6XfjNWADLVOy+lZVxnSy4K3oWUAvt68ondGLlWswQTB27I716e/QD02keb918esJHSgVXBca3DzBDEmoHLHW4l6s4tTSQmL1gV/9gMPyxZKBxjLpapF1Vc9AF3BG8GQ5hc0QUF24PM3ooAphr2xFqV8JGOuihnYrymDhw+SKm6pEhJk8EF4bGK+iBnKi8eoWmzlrtwmxsqeDvtfQCVzQqk2nL1lJfKqpgSX9bUiXV0Oh0eyAIdmCCUypT52A95X9BFDG3Y4WwHshUtkzL+se0Bw57Cmm1egDI5GKxceM4TyF+l8Tr/4M=; 4:SwBB+qIwcSRbzSY+g4KWYTCHc1XnltouRyufWGdbwU6p2lz5U8b/vHSpP7wkzlpWJYpwxlG3/UsHYWNfOrHMnpAFYkkYri4I30t3Tm8XyzTVmJEq7jFsXt5hJ87SEO+q1nHxMDtCeWdxGBdXCyMkwT/Z3+c5jnEq5rdQtweplcbRdZM5pVfJL24Sw2usuwyC2rl5gbUolmgK3jwDCfu/0DrhwmaBm75iiqjaQnAfyd/C4gWXlpmnDfReJCZ8bDxZAVt1d8ZPQAvXtuVxyQRteQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(979002)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:HhWDiOaDVaJZRRVAGwOzgw5pj6uD+m2KM/QMSZX?= IE2WIsfv3/1vpmp0o8dcM06vydKqhxRZTplyQml6csc0+4ul2pUWlmUY+QYgyW5+toHSp0f21c9mUtatAgY87v4CJwvM+ijEYT9WIuuy88XgwGGCsDyKVlARoJTl8hOSqLpQgbK9US5DPR4hKXKC2s+3NOWq2DwSKf3p7r/8j/nqxSyOuOwWPswPsn+6tBhTOrlQ+XicFj82+dmwrtxsl8hh092jf5e/omfH4sIYYOTx9UWP+8cvrxP0S1ssmoUQ4zB4y81uYE1b29z0K0aZ5Ugs5D+0QsE8AKGlzfXh8IHf5GXaU3SsfGNQGwz1OJUuCHG4KpwTh9avmnNp+RTS25YZg/8FZhfviMieIbVvF13ytuETDQZ+Hcy5prbU5L9d40zf8Z4PWCYLAF4qGdcf2sv5MeyfvlL+vv2n44F6fb5hXP9MQb7GE+fWrJW5slMFQ9Hf9bB89OmIJbkUg1ud0DZbTb5LlaZ6fXhzYFl8IxCVr/0T9WJpCjCTuDB/2XYZI4pRn3GV5TPlu+UYBTpMej91+jiAX55lOLMfnCL1LXxkN9GYhgbaHuqngqdFrQDeUZgVy/16TnpZHUg4sODfvi5DV2IbTCxL96SpNkAq1CkRqbAOMLHU6MvPJ2bNaPKHLGWuP3eQIGCRhzY6H5QuaGSNAkwFKfEOiVC7B0U777I1vun0NC7za5XK61uwy0cg41p9wwpLcPGjquBoioALQrHqpm682qpQyAkLFVfrMvCZSqRxoo3WBCy3ot7YiNuqC6NkOko/tjueshbKBZMTBqRqhlm2K6hiaDD7zlxQTgAeejix4SbjY2SMumKhRhLNnQV/7GllVbN86512HFxyvW7NReYX4iqk26iQbVi/IOYn45SlI7z1uo9EwO2MdDQZ5DJgHxhZAzN3xsI+3X9lPrLTSDVFaJR9fVG8t77eBWm5g7CRzOA/L8B9i/uJj6kLCI+IdkpcLgIZN53/0acVQlmmP3o85ld0pch22qtxl1a5d1MGePogXOgsc7FnYTMOHYtEY3C93kHvDSYmPXGeUG6lSCGDR93/7GgIF/BARK/+HdJcPWHfSjsrCLc0d18qkhvQgoEAoNeas8pi9uEJSmMM7FLYduZtKJHbzqc083KQKPVd0mDVf9xAKlC6KuQCxjilcd6cHqS51Hke883ipLOeIArqo6UoVaBSQ43gCjSBwEo1NFUA5X1Xa2B2yFZ3rCBX3c8H9qFoJzKs2+8QvuOywR8RlNfSRNQqguVtvKZmV2Wz21nVICGXWza59lmgF1apknAg7+qzgOGLeLSsre817ppDF7HO3dkU/cm4rDNgJ1GnN7nyyPRDMRr3b8pqZr5keBUyAseFZnuuGckqwuFAM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:aIFojas1UBDdvuAbe6CeOT0hTDp2FZtf3kzwBGej8xf3Iy2b2RZW0c8KcXZrnnPjV/QZtSoV1XcYLasrFlOQfF7LWaoBnAZrDp682OOIGTpZmMHRow6VKZSEE4rc6KoqfpnFf56dscnJcVGOpMIZpoo6VWEuWTvJE76QwjEvZFxZCjMIWc0fHj3XzQ9k7BFsSBxjApj2zPMOHcRnn7nhxLcwzLj4nRedIgMUfzoL8U/xTNNtl/8XgM9wMueaAj7FiVVOjbst95L9D0COoT7ioQa2KrguOvdOxCR2dzjnXEJjNKTQpM0nwnez7eSJ03kafhkMU352b1E2rK2Gwg4hbADx0iqG2VWNUS7AiFgpZPM=; 5:OaI8RsBh5u2pB1Im2nt+fEobbP/8kHC39zFiw8ZrTpni6J8mWvuCObzcIAXxYT8xcjn7KadgqI6bsSzYX0N5nOMW4NrqqcWQUDwDtwFDMAwNrZ3BBcZbbgTdss3vPO2h+bdwHYC3QRXM681OmPuLlWIFPNi+WfKsO+9vVdj0N3I=; 24:OSiOBX9jPdU50CL14qtA37LIIDAW+CJJIbWA/3Uqj/JhuNdkC57GzfUI9//vo+SUXXJGg3cGLrz95XGN/Qxl7zRkKEA4eIXK2Y/iL/3m0IA=; 7:f87kzahw5n/PRcHyuVH4Wwz5rarpChUddFWQihEoTtSBgHVeuB2hVRoojHAGQenQ0py7KnQ+bXbgC3jA6cAUPLCmY6MiH5JdkZsWX3Z4gt29VbE5lE0AYO/ehniqLYcgSjuvfuXQyFA383s+pfbVAA4YOTIdXyqzoU1PuL6HQlV1DqHC+KBAg2tJ4k5BujTR1zbECqDvHRTm7gWNNDpBVxpy+XOcnnMAMMF58+acJ4UKmWnfvdk8F4bzH4yik3dV SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:TSrbOLITc3IjHJhK+Netx+/5tcQUVb/9O3EkAniG1bWdlwr3dM0CLXtvrhja3kR/M6Qy8UYZRHaUm2xX2PcnXAXAIffPMQWsElcyRKYak+ZNsSr+uuLV+G0Cp/I5HowV/vf0sRvGOU/21WMCdvB65ajRt8//3XIpkFmBnKA243Y= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:34.2939 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a0d766f4-23c6-4efe-6bcc-08d56da09e7b X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.101 Subject: [Qemu-devel] [RFC PATCH 17/34] [not to commit] import HYPERV_EVENTFD stuff from kernel X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Allow to build and test HYPERV_EVENTD until it comes through the regular kernel headers import. Signed-off-by: Roman Kagan --- linux-headers/linux/kvm.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/linux-headers/linux/kvm.h b/linux-headers/linux/kvm.h index d92c9b2f0e..47100cb6a3 100644 --- a/linux-headers/linux/kvm.h +++ b/linux-headers/linux/kvm.h @@ -934,6 +934,7 @@ struct kvm_ppc_resize_hpt { #define KVM_CAP_S390_AIS_MIGRATION 150 #define KVM_CAP_PPC_GET_CPU_CHAR 151 #define KVM_CAP_S390_BPB 152 +#define KVM_CAP_HYPERV_EVENTFD 153 #ifdef KVM_CAP_IRQ_ROUTING @@ -1363,6 +1364,9 @@ struct kvm_s390_ucas_mapping { #define KVM_S390_GET_CMMA_BITS _IOWR(KVMIO, 0xb8, struct kvm_s390_cmma_log) #define KVM_S390_SET_CMMA_BITS _IOW(KVMIO, 0xb9, struct kvm_s390_cmma_log) +/* Available with KVM_CAP_HYPERV_EVENTFD */ +#define KVM_HYPERV_EVENTFD _IOW(KVMIO, 0xbd, struct kvm_hyperv_eventfd) + #define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) #define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1) #define KVM_DEV_ASSIGN_MASK_INTX (1 << 2) @@ -1423,4 +1427,14 @@ struct kvm_assigned_msix_entry { #define KVM_ARM_DEV_EL1_PTIMER (1 << 1) #define KVM_ARM_DEV_PMU (1 << 2) +struct kvm_hyperv_eventfd { + __u32 conn_id; + __s32 fd; + __u32 flags; + __u32 padding[3]; +}; + +#define KVM_HYPERV_CONN_ID_MASK 0x00ffffff +#define KVM_HYPERV_EVENTFD_DEASSIGN (1 << 0) + #endif /* __LINUX_KVM_H */ From patchwork Tue Feb 6 20:30:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870105 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="GKJG0ufk"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcPT6NzXz9s7F for ; Wed, 7 Feb 2018 08:03:25 +1100 (AEDT) Received: from localhost ([::1]:33780 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAOi-00070D-1E for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:03:24 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44847) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9u5-00011K-Gi for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9u2-0003Ed-5p for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:45 -0500 Received: from mail-eopbgr00120.outbound.protection.outlook.com ([40.107.0.120]:37069 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9u1-0003E0-Rq for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:42 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=KLZaHQnE++7UzaipdpN652CN9oB043tbHoW05nDRHAs=; b=GKJG0ufk82Nug2Cp0z6zpVik9Xz+3KnLAi2r25S53HPjRi0nZvgfvhHCI3lkeC5k9ralc10qfsz8S4ErgThcN1pMtKnmesEFLtLdRvMt/KDa4CIDZPqpooirzs4tcqbAyiTA0cNNIlhL8ioezJgyOhpIRcxnJKNqKjAGOGvcW9g= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:36 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:32 +0300 Message-Id: <20180206203048.11096-19-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 74ddbd17-7263-4bb3-f5a3-08d56da0a049 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:stMqXEpQCin9VElbwSpJBg4o4/aS16sWBFDuaN4+Ljwst2Nku21xsRpD0u8gqAgQ1s4v+q166ZUXC9YVV3sduQizgQHyiQBmBCxabISMIpHyWh3AcOOt0iAgKDZjfIdsv+BscZmcK71qHeWfgDLDQlt4eKb0GddOAvfxU+5pXe8SKM2S8CuQ7ChP/zxzd1Jl/Mr7ejggov99BcpAti1rc+/l1Lsv8SddSP2ZUQ8SNDXu6/XPjfmk2Eko2KKHQb3Y; 25:/esRkhjAsOyDnzWu1I0LQQDM//7suwQfXqFr7yaBjj0PDM1PIzwaZazs+clge5ETXh2Ym/voUvVvDaGiLXrt6wcH3ovlAcdfQQzA4UdaGl9ztDCrBXldA5GjR7DZFAN2IpJwZcmJknrKvtGO9GIGqQfUC0Ct5nn9D6/DhoP3eacBWdrPtITtK91I0Z4f/jaIdPnsZeEkbhvlPtD1/eewNeL08/HknFZUG5ukWi9dNkBZkbaZdGd2rUjtUG3UUoUKVQuO/EJ2DjnlgjjsDnjJuC6tQrmqOnTxc6QuZbXRjATcSjsxPJLdpzoO21C0q59Qu9hshcU5tbVj0in3FR667w==; 31:kPW7xzKBgip+g1asj+xMOQlagq+h8Rzu3RJKkFmXkaAL5nnv/TCo2/hmyek86T7cbJTpEKvACf9NO+Kh396Imw0vFHlO0xTHEgVkvEPDt3LfYiPl+URRd9jdh5gBB4vQGgOGXRX2BvygtNfTU2NQaHf6GJ2PRz/i/OrNpWeT8Q8W49J8oJX8eviI7lEKyrW6n2HfTBi+QfDERaz9GqCbqAt9yjeYA5xRdIUinBEMo+A= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:NuIGvN7ZwUJUrrYUsK+0dej2J4DoQ8tKpJ82OtbDrb5iIoEHvxSK9JCtMPwHV8bNhMBjuwmP7GFt3Z4Pxfwes8TKroZN8mdn7+Y50XFbSVHVGmcys44GsrNekTGf7RXJuZ5adI3JnIMfIYcXWT4cvvlL+Hq0qWh5CczDf5wDosUxPc3B64yfym512neI9c7SeEdhuvCJo47BQFpmOmCNPL05Ubi5DOQ728SOdeL3HGBCIaWkP1ytKEPlUEp/v6Re24b4JKZLid8OzfnaX23VIgcVc6+7hVgXKb/SRcOj16JS6dHqF4Csgr7NIakeU4pliRhb/yTDPsYYYCaFl1ntu6kpVZJUzmMtIKHXphVOT8nrNv5Biq0H/O0hn/3WkLxO1fJH0EasGnFsFFPyAYDdSWvxD2ApKa9laUKhByJVnT8=; 4:qXxCtke1lWFTHk69r3+haYOfECAKrtCeu5SSwddH11TlzxZLfjYfCEF5bCgd2xta2QxYL1zu5NMN700SxxOfFrw+14V+1AbBlcFHmHA1AUZXLHtIyzaKKd1Z4zZnu5Ydktq4Cl7pAaV8CfhVxRlMw4X8ms2SVaBOWSE7eDfzdhwkAAmiF1YQ+MPWjI88HqI1HFwqWzgWLj5DPIRfwgH4ZTe8p+ydOFJa9LDj5/rF/CviUOvNIBE1WHWEdVcdpoyI1SOwBymoOTO+wPSV/j216g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:PXS8OOnAzhiwXe0OL2fGmZOKL+2vRw6v8azIhOf?= y/vJGsmUcYwGejEPLux5e5Al4UiQwMZGexwfju3NO7Hl3O6rAV8H2ZxWBIecbpz9iAJ+9ch+ohYS0bw4NvMT+n1hk9AQ31Y16yd0Owr8bHIcNsmt1TDirXknrXJhCnGUzW540j/u11pjGwQvYrzf++LUPpLxVTc3OYOy6zPhHgAaf5t6v5jxvVkwbANPRC94S+ZmeAAh+79BxdLejF4CWgEJNcT1TtI1yx7Viehi2AR5T/s6Zbhxed638+IA4/pYZy7eweCfMWhwyh/HICV0DmSscZCH8fiRCXwORd1u6JL+Z7EnOCF9/gllCtp8FEx/agYFyjR1KAZtG6lVy3rWkrDt+I051x25kL1hI0BSjcdojYYvBp4ZQh4HaU59Icz8bHu3gEKqC14XUqe/Ia25QYpsBn5Z6a8QcYaKiA/gpf72akoX8rOJwkhLJcsJTqCFtDNzLPqfxlASOh/0Xf9pn7hQHfwJJ1K0R2wLAy9clSLBQqPftxtmgdA3i+2lCADt5diPzeu/MfMUEBNugerwwUxJDzKSDihE2Pg5MrLbg9MuTSoQuooC0U+kdaM1lLIkeU1Dg+GzMj/wcZcsHa0SIw2CtP47sOkj6WoAMUPN+KMHT0ERYZt80bK5OsGfASt2cOWGFJUYXqykYavm6q/itu50yay8Iu1xR4nE08bS0iihJ4HF5Ds/I6ak1ey0Y5iDmd+bthTXEOIKml0Dk8Wcm3G+QMeAqv0E0jenBAYHUdtFd9UKWk9N8RRW89WekmF0LCSzJG3rcuwSqtQTEcPIt7+4irA/2t9IutirR2a/eALCCCX8QOvFfHuqle0r563Z0cL7iUO5PmSiFethoEMDBmWV9JqFLbFYGEaJWI6O2+UNv2flBFiSV14NaOtS6mApfd570xKTmQwjZl2OkKNcMJtcE9p1e3F7KMLA5OGTh4Piu5YlWGul4RPR+aiWrVMxZKcfTFzc5nh7G3XL31ephthrj31NEVA11spRNGaCykVcSFpSA68O7iv7h1wPmi56MapOeLEEAsKY6/b0sx2ypTV5DRBi6385ZFCeM8CLopfANLjfOKMQKpkgLo9IXR66YmDaewxs3UYHYQUfBOfvc0nKyXh+LGgWoXwqIP3w+ttiMWCAVAytqT5IdBYPBxCdanQeVwgNJdx3McuxHQdoxOWNZGV5tkFH4y0Tr7TWIFkdJROpsNDmioJTTtGqvAcnJW1QLzfR2Toitkq54SZFeWaKlCOnIVDPupzVEQ0NWaPNbyeGo8HjQUtzVzmSRNfz5ITJSnIESisG8hkXbt4t3bYhI X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:PslBzXjTfKZmHLSqVHMkO9nT9Pjo0H8IQhD7PUimAuFDl8QVFOn6Gw6VYmfPygM3o7QbdJu0LxuIV4XP+aFtYaoxg+S8qDkha9vFJSAcZsan1Sag2CEq1zI2tNhRxuQvpbFD4LX8YiOPEJgpqyL3TCBkxudnOFFAx6I+4ww9nSw0ELwKlgnrEmDYFta1SiFGs9OGEw4wcarg6Y7+eZMhHGB2pq+4t4gtJMQNuQA1jEsGXfYaiPjKZhGcYmq+s7KwVWn9piw40e+2Ye20D/YPcDf5CnWa41y9h46upRlNDbZY4sYbHfJ26JofiJMp0tR/Chv38sMDvnierAyAMROGgvpfYa9T5QdwTMkkFD3DCvE=; 5://M0w8AQN1zOWT2LRBQED+bhiObYY6X22aIl5CmpnYNCG46LWrN3+LkSfZZp4CveNx9zH3cCOL9NScq2noZZgPCwnKhQk+TqgJX6Y44XQInvgvroEKwMplfA6jplsHg/LEsDmawZbgb3Tj5XUECq95df25TGyzcK3djWxpWkddw=; 24:c2mg92A09s1z0jPYuW4kaBCXHQ9+z/K5ZWA8UOBimVKLKnPgBkB8T5oDMolD7aRPpDStoGQMuXbg3LF5qffWqiPmE1kAHZknEd45t4F1Dvg=; 7:590QxvAbYc6dI3mQwxJB9KMcoO4CVcO6gGxHONc+uPihj9PeAdyxX1nTEPxvMxVk78FiRMh7nRVcbb0X66xKxDgowTXflTRwUYztv+hXZwRzfBhgm/9wMJQzNmhMfjyz1pmjFXdN6nxwcWWHsNW24xAkeRKEeV/bpYm6SSLm9Hhof++H3W6ul+zowQfL4OV6bd2ctNJrU4L6MwUJJ3Y6uVcBw3PbuQYRCOm3z56YFYJclsE9o41R70m5HZHb8TLb SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:bPZN0z7RMgdWuN8VOJbFlXB99ZWMFN41xP8ntJfIlCu5usuiZB89ghGTjWPgwuuwXfzHw+nEr9V7vhLL+DzhzC41cOLHAv9qRa1ud+v+HUjhhoCZ+Om3Jgl501Zaf/okc8kn4zx9ZzAW3JT2WnITzq/hzTM0jR4tnp+rybiw/Hw= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:36.7158 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 74ddbd17-7263-4bb3-f5a3-08d56da0a049 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.120 Subject: [Qemu-devel] [RFC PATCH 18/34] hyperv: add support for KVM_HYPERV_EVENTFD X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" When setting up a notifier for Hyper-V event connection, attempt to use the KVM-assisted one first, and fall back to userspace handling of the hypercall if the kernel doesn't provide the requested feature. Signed-off-by: Roman Kagan --- include/sysemu/kvm.h | 1 + accel/kvm/kvm-all.c | 15 +++++++++++++++ target/i386/hyperv.c | 21 ++++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index bbf12a1723..70ad0a54b7 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -496,6 +496,7 @@ void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi); void kvm_pc_gsi_handler(void *opaque, int n, int level); void kvm_pc_setup_irq_routing(bool pci_enabled); void kvm_init_irq_routing(KVMState *s); +int kvm_set_hv_event_notifier(KVMState *s, uint32_t conn_id, EventNotifier *n); /** * kvm_arch_irqchip_create: diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index f290f487a5..c3ba87b701 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -1423,6 +1423,21 @@ static void kvm_irqchip_create(MachineState *machine, KVMState *s) s->gsimap = g_hash_table_new(g_direct_hash, g_direct_equal); } +int kvm_set_hv_event_notifier(KVMState *s, uint32_t conn_id, EventNotifier *n) +{ + struct kvm_hyperv_eventfd hvevfd = { + .conn_id = conn_id, + .fd = n ? event_notifier_get_fd(n) : -1, + .flags = n ? 0 : KVM_HYPERV_EVENTFD_DEASSIGN, + }; + + if (!kvm_check_extension(s, KVM_CAP_HYPERV_EVENTFD)) { + return -ENOSYS; + } + + return kvm_vm_ioctl(s, KVM_HYPERV_EVENTFD, &hvevfd); +} + /* Find number of supported CPUs using the recommended * procedure from the kernel API documentation to cope with * older kernels that may be missing capabilities. diff --git a/target/i386/hyperv.c b/target/i386/hyperv.c index e43cbb9322..63dcb23fa8 100644 --- a/target/i386/hyperv.c +++ b/target/i386/hyperv.c @@ -313,7 +313,8 @@ unlock: return ret; } -int hyperv_set_evt_notifier(uint32_t conn_id, EventNotifier *notifier) +static int hyperv_set_evt_notifier_userspace(uint32_t conn_id, + EventNotifier *notifier) { int ret; EvtHandler *eh; @@ -346,6 +347,24 @@ unlock: return ret; } +static bool hv_evt_notifier_userspace; + +int hyperv_set_evt_notifier(uint32_t conn_id, EventNotifier *notifier) +{ + if (!hv_evt_notifier_userspace) { + int ret = kvm_set_hv_event_notifier(kvm_state, conn_id, notifier); + if (ret != -ENOSYS) { + return ret; + } + + hv_evt_notifier_userspace = true; + warn_report("Hyper-V event signaling in KVM not supported; " + "using slower userspace hypercall processing"); + } + + return hyperv_set_evt_notifier_userspace(conn_id, notifier); +} + static uint64_t hvcall_post_message(uint64_t param, bool fast) { uint64_t ret; From patchwork Tue Feb 6 20:30:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870108 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="ENX1r97c"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcTH6gd7z9s7M for ; Wed, 7 Feb 2018 08:06:43 +1100 (AEDT) Received: from localhost ([::1]:34040 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejARu-0001jB-0R for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:06:42 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44854) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9u6-00012v-SU for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9u3-0003FJ-G8 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:46 -0500 Received: from mail-eopbgr00119.outbound.protection.outlook.com ([40.107.0.119]:45030 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9u3-0003Ej-2w for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:43 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=gKeZO/+MFpI62LwXQEL+qVZEPbsLAgIaxXeWUtlz0fw=; b=ENX1r97c41nrAakLjRe5olmBaG6rBoqk0Ve4N+tQSf7axAmNRF5Efii8QGHpot11t+iF5Ta0glRikmpoJJMIbGwdFvJnt2LQ3jB0hd8WUp/0hZCt9QwhtBensXiM0b5HSmvJbadltB3D2Pt/RdHqAg1URoFGA8RezGEvpIk0+cs= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:39 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:33 +0300 Message-Id: <20180206203048.11096-20-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c2f39e38-9bae-448c-771e-08d56da0a10d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:uwV3tGnuZmKwcRfeROKTZQRCwcJ0Da29z49Y3bewIfk8n3EbKjgP7sO6SoLGI31Cr2WYFtSY8ZK8p86+izzSH9rxo1JGf+CNJsgQImL1oD9xn0AMi80yauTuenpCKWIiTFGNLG1I6JX5lRqYeIr5BjM8Cw68cAHSKOKA8OIGVCLqvuW/pBcbYgoN1P7jdjCAfDIpKfi1nn99SzUoAGsGgyWqWK5x2hg40GBrlK4cjfFFs7xJ77EZmfYXWob4hyxl; 25:lhjU/O1NHf8vjZHqQRqgR74svth+zE2Q7n21gHv2nH+sBKaEogXtqBHDXau1nrd3TC+cjqhgL7KlFFwudLwCN0i98OQ9t4LU82XOapOl9uFc6IlQYiezA0hrZW4/BRcGDdUqTGXvOzdEti3TkjbnV/it2k3+Tux7QVmE8CMl3AJe4qmMHSKXZ0DLXE36praEKsNVfN6Gr9xRAnlAHAJGHjt9Vi0mbKQjKD8D5HxnC1MmeRXZb5R/Ojr6TvaZCAHB5bGer1V3tPnVI2d1oCHyHwZLqRgnNYyRSoj0D/eWB/53yT9Bf+msU4ZMqBPJnC6vUPLNacz8jFodUXwo0hzwpQ==; 31:5O9/QeCnZ1SRtY8qAEI2ar0Mc2HRW12npFTKEb0I3BRj6Lwe/g+NgHVbNYhNSqWTm2g6BnrMGztj9GfJtHOzEBk7R/4o8BijqPwD+Xdu/Gp+BcxIMFt4SETRi5xbhfd5RPGbWCvyucJU1eVf+MRDzjwrhELokc7Vd8eAOhdg5qV6XRQu7MQqyNoxnsEKlsteoySSKUveR381sYMYkuRwSZHlxmOuB2w0kKpIoHNLkXg= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:2meZa8O0XHLRA9mdgl3pAEItthPTU+N0T9Qd0efCa/8ELrj+VvbV7Le7zjHjoXFPy9oYXzfT33sEC+4lzWaHvGe8FGKtIjSpCjdW7GCasFjhbG6XBvbXgRS+3wBNM/8LZbv5T7HIrUEsLeeDP5Yfcz0BdrmHx9S95CFJGCr56YYoY4Io1kCjEc4YBqEh4Dwvt/igiOSviO3wg3c3CUQa72rruHRubZ//6KtXO7QEGQZz5D7VNDvXU/zN9/t/ce41D5Wn97sm2xjRfUom/Fph/I2IgNXn6xy+ZC43hk90C03xJw44rXmCFQqC5thGH6OUOQcnhHeouerbhup4Le2Ew6joiMV0YqXKPAEHDaZG7Plu8+sKj3zWGoxfMDeKCxvkgMAYyduH97Ro73CEHPV7VCZ4Hx+14MdZVD0DVoSGc+s=; 4:mAc5Tqwcow6mCjm/sFhE1wZtcwLf3J5YatxZjedjroEpZr0d8gilQDC6I8GadFrXQjio8E1cHkDu6HjOJHaqGcDrPnsT9sH49Um3T02RvD0WHKf8kh+s72Jwt9nEYHhVnbPFyeLccnbw37pYYWIMNFgj3mpCIRfnW//6fWtVUgZdJNPPJcQJqCxVFTZVbahyOFuJkF1ew7HXbB/Lp3vumren0L3Vxr7q6Mb1HdP4xqOmpbxNHN67vc9CDmmjsr2PjPYJ8HdmI3oerD8qfIpgaw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(551934003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:Ze2dUCVwSvEx5mF9baZeBJsKOy06Fd+tHIfTZT8?= H4/2+5BcVREI9pIgKUnk+/oe0nO/FEag3QPI+N2E3jCn3JCcTOnSyoI6tDhaCGkr5CoyiQYXTLuPf6TzGy5WiJQfh7HDTtWn8vX2RIMhuo0R/YmGsMbvV6rUGV9J3gJQeqjB2nXPV0oF7JLQVnV3KcP/49Vu30r/NH5zWvDj85ZrdvXzZh1RlCIExzblar9YZPTTz2DSVDRvbkH6Pxucf+74QQQDSK/66/x0BcXWIQzfEaCvR2dm4QsYK1yzRha3dWFQqaUtk1VB7fQX5Yz/8muaQl2E4fsDJQlxFiTpmE2pmBV7yDgfHrmNa1VVVSOQ+C0g3ehAjF2ZOI1COTcOZD0KdrMyiHtS18V8RCb0bnJnKWSijfv+vnjGuhKSd3GrQ8+Lf0sFckl0MeXXFrF8vLfOHYmM0Vgc0mSlz3nb+VyIEccQG/xtubNgKtNEpEdS4oFvXqGlb5xRRRdtNdnNYbw8zpB+XZLuj4ruPWk7Lm3L4i94xi4FGLt5FSn6PMx/hqioIN2nVP+6gOhle62rSSfwtGELR/hEVltB0Uwh+ztdbkisLhqf8BHwt8CtWWwHW//aXy4VNzf1Yg8RLwQILv2dxqoZbHG3ghjikqhSv8fTtdMjXvDqXC8p6G8XgkR6EJ2uJ/wWmS/l930A/kYvoliID5N71OOJZVzmmVbIQOkkkosMf9s5wEH/sElUWu+/O9Zi/WZ3ok59H65Iz6wdeUq0fs5jl4sObr4nzbYkWwgPIfetq8CJqr1wF/LRwBrkfrQ157HMUKpUKBCyl1W8d2A/RvLUTjQaW+P77/h5bjbBq8uQRc/ziQWOw0cbGtztrtUA2Bv6vg4R2mnKDJAlAb/wWUOWUC0bdp+CA3WRCjbGKJkDBM75f1b4pmjrjei92wzf5waKWAv861grq17r3dh+IY48rG1jyuloPbz50jXbixqNaX7bFTKA5OEnN98bh8p97Ufj1CGj9qQZuvEKlxQXwM5kzr99kuytFP5R4PXtDkQUneIvCIKbY+/yQKNpTujR50EFyZ7N7ae2vMDxsLS8hIJk8uFdPfaG3HUU41yXCLbelJol8EdS4K7hHq82EnD8YUmBKjc2M6ihqjTqkXCbO1LhJnSquMWBOKgGZXPAxf+x6A+ZzQ2HFkyiq44Vi3czyh6KZqoDQlGXKnV/+oJjteNWQjVFpdXuZ0VbRJM63r0Spc4Dv9aKswXiDxV9m/I4TBNi5lqoXy4pEtBAJwtFVK3UDPf8D3qsI+2FfSW6qzcGIhylRRXMStbh5dAfdOH3AyVY6wYDe2pkbd7CtzofL X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:OifL3WlYkh+8sUHuTFWC4O9aDFq7AmwOR0O+k2ZBTv9NO1FfxbjB5tGeb6sd6BnYgbCj0Znoy/cdFSCNU0H7mvV1F4mll5dQtAkM60J4x3NalRSWpfyVXpdQVpKx/ahgMXwjrxxS0YI+mLhfJEqnBP1nmGB/b+W3UDHjcHBwlkrUzDvwbraGedizg8iAAh07AUhq1GrnbDjWKS4v3/kwNpnMIjYejcZpAl/WpxJ4R49RGDhQrVv4bc/bK2aTVj6bzXCymLrZNM1Y8891KjowpDzAxYSf+gmfEMCs6JKFpkbWYwE7ajaVvNrICdI4J4vJs2cfNEFkFRY96GvO7v4YxmhGY3FKuax/FO8kw8Dt1dA=; 5:j3wd+V51vdM3f77ERXkEXW3lZpSOAK8i3m1pC63+y8aLBVjnaYsjsLxrT7gW/nZ0icCtFs6T7U1QRXpgbJbvrKpfqXkGv/zqRNG6yOelwIsspRxB5lS/R4Dn4TAnjcn1wQbr87kGMCSK5v55HG+MvXhEjkwSn53tROu+kJHKGA8=; 24:F00cUIjmHzg045FNG6k1gWeKD+t5Vt2qtXb1xMJuoTxvao1YByo0To9j4mrIpuXchixOpXJsGvK2Ww/qyviJjUUi7dNe/DqhDaF7TV+aVHw=; 7:KwQTTv9t6s4lpl0vTgnzFfoVHWnucX2mbXiPD1JWhfvQc5iACkTZeiD6k2Q3Ygo8uEDC3EtTqliPatjkayIlO4O0TUX4jA/QlFEJm1Qelg11+INdqtQbboI17b/wztZ+EFynjKfhlWM/EsPKgVFwEx4gzWO2muu2/O9XVfmqM5e8eEu8UwYxWQy67UMkIX7pDlKvE8I5tCHrEL0+DY3OgMQHzyVXhyb/0bxG5O/Ha9Y67JZ2ClXAXQMwbzxVj6vG SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:lVvofNIYLK6QigqWNpysNFlsg/INPFzcb4W/QjuUbv7LHBzAdjBJCq67RzkeznsxBM2niqt5gE1x6+Zdq1mN5NCN6Zu2L3GQdpqr3mk3FAomrrMckFNzA73em0VT+ydO8skHUI8WvpanMw7+qhDxLC0xsbF5tiFE0BO7R7sKbQg= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:39.7627 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c2f39e38-9bae-448c-771e-08d56da0a10d X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.119 Subject: [Qemu-devel] [RFC PATCH 19/34] vmbus: add vmbus protocol definitions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add a header with data structures and constants used in Hyper-V VMBus hypervisor <-> guest interactions. Based on the respective stuff from Linux kernel. Signed-off-by: Roman Kagan --- include/hw/vmbus/vmbus-proto.h | 222 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 include/hw/vmbus/vmbus-proto.h diff --git a/include/hw/vmbus/vmbus-proto.h b/include/hw/vmbus/vmbus-proto.h new file mode 100644 index 0000000000..1a60309650 --- /dev/null +++ b/include/hw/vmbus/vmbus-proto.h @@ -0,0 +1,222 @@ +/* + * QEMU Hyper-V VMBus support + * + * Copyright (c) 2017-2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef _INCLUDE_HYPERV_VMBUS_H_ +#define _INCLUDE_HYPERV_VMBUS_H_ + +#define VMBUS_VERSION_WS2008 ((0 << 16) | (13)) +#define VMBUS_VERSION_WIN7 ((1 << 16) | (1)) +#define VMBUS_VERSION_WIN8 ((2 << 16) | (4)) +#define VMBUS_VERSION_WIN8_1 ((3 << 16) | (0)) +#define VMBUS_VERSION_WIN10 ((4 << 16) | (0)) +#define VMBUS_VERSION_INVAL -1 +#define VMBUS_VERSION_CURRENT VMBUS_VERSION_WIN10 + +#define VMBUS_MESSAGE_CONNECTION_ID 1 +#define VMBUS_EVENT_CONNECTION_ID 2 +#define VMBUS_MONITOR_CONNECTION_ID 3 +#define VMBUS_SINT 2 + +#define VMBUS_MSG_INVALID 0 +#define VMBUS_MSG_OFFERCHANNEL 1 +#define VMBUS_MSG_RESCIND_CHANNELOFFER 2 +#define VMBUS_MSG_REQUESTOFFERS 3 +#define VMBUS_MSG_ALLOFFERS_DELIVERED 4 +#define VMBUS_MSG_OPENCHANNEL 5 +#define VMBUS_MSG_OPENCHANNEL_RESULT 6 +#define VMBUS_MSG_CLOSECHANNEL 7 +#define VMBUS_MSG_GPADL_HEADER 8 +#define VMBUS_MSG_GPADL_BODY 9 +#define VMBUS_MSG_GPADL_CREATED 10 +#define VMBUS_MSG_GPADL_TEARDOWN 11 +#define VMBUS_MSG_GPADL_TORNDOWN 12 +#define VMBUS_MSG_RELID_RELEASED 13 +#define VMBUS_MSG_INITIATE_CONTACT 14 +#define VMBUS_MSG_VERSION_RESPONSE 15 +#define VMBUS_MSG_UNLOAD 16 +#define VMBUS_MSG_UNLOAD_RESPONSE 17 +#define VMBUS_MSG_COUNT 18 + +#define VMBUS_MESSAGE_SIZE_ALIGN sizeof(uint64_t) + +#define VMBUS_PACKET_INVALID 0x0 +#define VMBUS_PACKET_SYNCH 0x1 +#define VMBUS_PACKET_ADD_XFER_PAGESET 0x2 +#define VMBUS_PACKET_RM_XFER_PAGESET 0x3 +#define VMBUS_PACKET_ESTABLISH_GPADL 0x4 +#define VMBUS_PACKET_TEARDOWN_GPADL 0x5 +#define VMBUS_PACKET_DATA_INBAND 0x6 +#define VMBUS_PACKET_DATA_USING_XFER_PAGES 0x7 +#define VMBUS_PACKET_DATA_USING_GPADL 0x8 +#define VMBUS_PACKET_DATA_USING_GPA_DIRECT 0x9 +#define VMBUS_PACKET_CANCEL_REQUEST 0xa +#define VMBUS_PACKET_COMP 0xb +#define VMBUS_PACKET_DATA_USING_ADDITIONAL_PKT 0xc +#define VMBUS_PACKET_ADDITIONAL_DATA 0xd + +#define VMBUS_CHANNEL_USER_DATA_SIZE 120 + +#define VMBUS_OFFER_MONITOR_ALLOCATED 0x1 +#define VMBUS_OFFER_INTERRUPT_DEDICATED 0x1 + +#define VMBUS_RING_BUFFER_FEAT_PENDING_SZ (1ul << 0) + +#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 0x1 +#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 0x2 +#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 0x4 +#define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10 +#define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100 +#define VMBUS_CHANNEL_PARENT_OFFER 0x200 +#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400 +#define VMBUS_CHANNEL_TLNPI_PROVIDER_OFFER 0x2000 + +#define VMBUS_PACKET_FLAG_REQUEST_COMPLETION 1 + +typedef struct vmbus_message_header { + uint32_t message_type; + uint32_t _padding; +} vmbus_message_header; + +typedef struct vmbus_message_initiate_contact { + vmbus_message_header header; + uint32_t version_requested; + uint32_t target_vcpu; + uint64_t interrupt_page; + uint64_t monitor_page1; + uint64_t monitor_page2; +} vmbus_message_initiate_contact; + +typedef struct vmbus_message_version_response { + vmbus_message_header header; + uint8_t version_supported; + uint8_t status; +} vmbus_message_version_response; + +typedef struct vmbus_message_offer_channel { + vmbus_message_header header; + uint8_t type_uuid[16]; + uint8_t instance_uuid[16]; + uint64_t _reserved1; + uint64_t _reserved2; + uint16_t channel_flags; + uint16_t mmio_size_mb; + uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; + uint16_t sub_channel_index; + uint16_t _reserved3; + uint32_t child_relid; + uint8_t monitor_id; + uint8_t monitor_flags; // VMBUS_OFFER_MONITOR_* + uint16_t interrupt_flags; // VMBUS_OFFER_INTERRUPT_* + uint32_t connection_id; +} vmbus_message_offer_channel; + +typedef struct vmbus_message_rescind_channel_offer { + vmbus_message_header header; + uint32_t child_relid; +} vmbus_message_rescind_channel_offer; + +typedef struct vmbus_gpa_range { + uint32_t byte_count; + uint32_t byte_offset; + uint64_t pfn_array[0]; +} vmbus_gpa_range; + +typedef struct vmbus_message_gpadl_header { + vmbus_message_header header; + uint32_t child_relid; + uint32_t gpadl_id; + uint16_t range_buflen; + uint16_t rangecount; + vmbus_gpa_range range; +} QEMU_PACKED vmbus_message_gpadl_header; + +typedef struct vmbus_message_gpadl_body { + vmbus_message_header header; + uint32_t message_number; + uint32_t gpadl_id; + uint64_t pfn_array[0]; +} vmbus_message_gpadl_body; + +typedef struct vmbus_message_gpadl_created { + vmbus_message_header header; + uint32_t child_relid; + uint32_t gpadl_id; + uint32_t status; +} vmbus_message_gpadl_created; + +typedef struct vmbus_message_gpadl_teardown { + vmbus_message_header header; + uint32_t child_relid; + uint32_t gpadl_id; +} vmbus_message_gpadl_teardown; + +typedef struct vmbus_message_gpadl_torndown { + vmbus_message_header header; + uint32_t gpadl_id; +} vmbus_message_gpadl_torndown; + +typedef struct vmbus_message_open_channel { + vmbus_message_header header; + uint32_t child_relid; + uint32_t open_id; + uint32_t ring_buffer_gpadl_id; + uint32_t target_vp; + uint32_t ring_buffer_offset; + uint8_t user_data[VMBUS_CHANNEL_USER_DATA_SIZE]; +} vmbus_message_open_channel; + +typedef struct vmbus_message_open_result { + vmbus_message_header header; + uint32_t child_relid; + uint32_t open_id; + uint32_t status; +} vmbus_message_open_result; + +typedef struct vmbus_message_close_channel { + vmbus_message_header header; + uint32_t child_relid; +} vmbus_message_close_channel; + +typedef struct vmbus_ring_buffer { + uint32_t write_index; + uint32_t read_index; + uint32_t interrupt_mask; + uint32_t pending_send_sz; + uint32_t _reserved1[12]; + uint32_t feature_bits; // VMBUS_RING_BUFFER_FEAT_* +} vmbus_ring_buffer; + +typedef struct vmbus_packet_hdr { + uint16_t type; + uint16_t offset_qwords; + uint16_t len_qwords; + uint16_t flags; + uint64_t transaction_id; +} vmbus_packet_hdr; + +typedef struct vmbus_pkt_gpa_direct { + uint32_t _reserved; + uint32_t rangecount; + vmbus_gpa_range range[0]; +} vmbus_pkt_gpa_direct; + +typedef struct vmbus_xferpg_range { + uint32_t byte_count; + uint32_t byte_offset; +} vmbus_xferpg_range; + +typedef struct vmbus_pkt_xferpg { + uint16_t buffer_id; + uint8_t sender_owns_set; + uint8_t _reserved; + uint32_t rangecount; + vmbus_xferpg_range range[0]; +} vmbus_pkt_xferpg; + +#endif From patchwork Tue Feb 6 20:30:34 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870114 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="aQmUgRop"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbccg5VYtz9s7F for ; Wed, 7 Feb 2018 08:13:07 +1100 (AEDT) Received: from localhost ([::1]:34497 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAY5-0007yY-Ne for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:13:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44945) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uD-0001CN-Gk for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9u7-0003HN-92 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:53 -0500 Received: from mail-eopbgr00098.outbound.protection.outlook.com ([40.107.0.98]:32000 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9u6-0003GM-Lv for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=g0dIdbnnE/S4N1oJ/qLHS9eUbbKufc7noUYZ+cLBbjU=; b=aQmUgRopDqs37Yy153zMmpMMvkSrIPuERdqDiW5BLaidTojQ3Dr3JO0gwAR7AO35QtL+rCwy2MdEsQw+BDddL9vHgJMVO+K/atMRpQV/amOqgF7GFGWXaBYDxSTHS+x0BWXVFFUJjhu/X6cduHGCus5P8V9PHOHB98hSX9h325E= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:41 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:34 +0300 Message-Id: <20180206203048.11096-21-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1051dbcb-33c2-4d08-8e5b-08d56da0a288 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:sdUB4q/TArUDZoRaXrjMkMB/U+MJHXFkuEb7ZXMsQR6cCgdLoJa7lnD4/LxVtILIapSdrpPgj2mXMOXXyUQaBVS8vpy84Edgy7Eh/GHMAMBU6zZ8cl1XEFuh9KchrR6CjEmKBMv7ZZuxOqrIdRvJSlMPmLvG0YRIvgT4Speu7oOOlgw41A2QoTnHwMRstCf+ooELDd6GzrcntIjyceJYd95tP5Ymsbo0+pgmEvuQBvlSzl3PHwQiZUJL8Hpp5nQ2; 25:N0bueuAk6qIPilC+hS+zgwQVow7huZJGIfYTB6T24xqFGPLIM1Udr167DNPv7dekVNBw2gIFX5kJ+ya58h6oyOISIPpv3i2L6gtUJ6nOs4TAclg+DaijnLKhFAff9JvQaeWFdVSMOYB64L9ExjPVsNMvY+l9TSGYWzM/UcheMwOJMxfg2JXrJ0m12UTGlVCw74UKFqsGghUzcOMwL4HJUTgsFqj4/7fXVSiJu0h8sNO1W2avQJN7LHThmbQ9mJTYFVb8SY50528psQiF1DbDH7dV2TekTUUAhOT6pifZMgtQ6QuM2iEjIV6KNHDyNs7qUgZ4zrOUZgYej9POqWM8Tg==; 31:d2td6h4zB1lNG0pvYysM/FulxgjXNbd/Db5unFTB9fXMJRKSdVakTuVQYS67KGy5mX++3X5VKjpANpyQZvAtFpehUXOekivtp7vc0oevk55vlDlSRB0I0pvKrdNPCetacHrBpOUBGp1V7WRV0RXd4za0Ej6V54mcNmjNMAkSup/z+aCmwKDvZ67p2zxClNkvGu7I7sM/nY3VdNnGH2ze4hs8OMgx8JwkVPUa/GQGCTI= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:RgReTHtX+y2UME6sPL1AbsPF6q9mW91+LwdwBRUkTU0VCWCST0MkJxqSYhfsuVLYtbqWvT33MtnIMeva9g4n8BvHw1uBxaiuvw2nPIHz5NNGLg+YmwHuSPZEFgYb+uPueJ8CyNKoXEVS1Fs32gWS+h7R2G8USZ4Vnq1/4JQzNlKqYDqCkbX6cRcFOC5CtxOI9BKwOOJxzZ7D0UCWrzvH6sJ8/h1oZAsACPgEahU1B7Q+g+pf4UrhN1SLTQGixq+dkaoW7tbKonHMvAvqxU55EIdBIOn8InNdn0i3Bt4OcGCPAIDXiWMnTDYMah3ydCmnuK2pWIZRAfPEyP/nVCouO7G5c+rg9aivP7eqvumHyVV1yJF9XxZ7W8CXmctDbAjTXnJzilLsTn+npCnEL1emmZ2YUdIDpOX816BIGeN/1QM=; 4:tyejGZZzM8CQlyNjhvjNERsCK+Lq5Z6Wboq5JE3QSOoStbNfRHaYyrhMeqtA7/wy5QRvBVwHpvjdN59RRP3R1nxOdKzp58H2bXRXlKl4k4e02GaJ4wnx/enjDhZR/c83VH5bbM3+2KWa3ECaK2LhB4ZV9Fn3JdeO0ePuABeo4PbbLHABcdK11zbHCQeVDIKsKkKDBzaEAOzGt3241jHGdfjvjToPdvnN7IEvZX00rd5Y/885knPqtQAG/nvoElIphM9kbw5uleYQaqxQO5mVPg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(53946003)(54906003)(7736002)(3846002)(316002)(16200700003)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(551934003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(167084002)(217873001)(569006); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:IIJA3Bodwy24AEP73pHrzmBJiQRlDUnq3rNPruB?= DMORrKB3IytKE2+OsCaTffhEPRlalSFRWLToSxRpc0kWKQx1WVo3t1CWPftO6diNhMw6oETwZexYLyjOgRiBhDLFAeBW9ZdmUtSxGHodCOLEKElkunm9J+UQU2Vl5R1Tu8667gozWApFTg7DUIjlX88YQSY8kq/CJt7UtPchXIie5EOxPCb9UifmjUbImLYCRqhWjjvrd5M/E+FRg1kqJUJ0hP3X3sLzZi7lZ8ZfWj4AyPHnyMzKN81uE/CzyqassLf4eehy5GDr3qrgp7IhIRR9a5q6eVVIN05cJCoucP0cm6eeQt0KhriQGYhfhc8zcEAy4b3xhW70kS8cU8vEwpCwyJmmzF4WrAjSACI5+aR+DN3irY3AU9K5nC46SLn0JXOlfRYJpQxFXZvNWjz70L5GuHyV3OE5xrHXEepbBduEZLx3JN6lg28GEDhU1J7gH0aWLIR2RQMjpeM3jb33svKN3u+PYXdYrC+RCT2I+eezmoCE6MGGFwiCj4ttnNj2EKqHIEolbWkIH7bQgg5ljeTqdIvC7C1/aHyiRaqvx+CVtRpKFOOj34zpKqJ9mGiQpdSPMXSCNtKj4Rp0IDc8qj3rOqieUANzPZy5HcxNTyHZJ6VLIfcOOTIXZLi6/1SDgO5148FaZj0JkLCJF7mYHgO1HABKXht4SUtC26xx+sFD/5/ySG5C5g3vDz4Kp3Eegg2ZBPyfm3QpaBDrPkuS+V0TXsZBrfMHwedvOd9cly1tY4Vym3MrDfdM7+W0Ll0z8AxqO38CdCUakqaz69a6DZ/Kdz+K3TyzcPtvM1+K2faZ6CwCZikSrQerZIwAHjkjBDnUZTMRLtJygSMti3DB9TgDTZVNPLk6zEjbNlef4bzwng/EX/igF8+1zUuX00QLSIAtp1Pw8xLufcp8oIWYOvuA0tktiDvYPf6giuWW8yABYSvjIJ4W35OCL+5Q92jekYSEYa8a/Wvr/562A0tPO82jZH1z+DFQqR3t8LllmRYBQ/61o5pp6N72+Q2zKKgEEGoSBfe2x6Vmf6mRoCNEUbhuKVYsnB4MigrId+AIcuBXnQuwbW/vI8j18aPtdP+XlEv3tU8NrWnLfFxY4XVW3KOTDRpN3D5Vr153Aj3aChdi8ZydX4l+hbGFSafzF5+9kkQrGD3oKY6ogAsj0epHQ5pzMB5jxN427YKDU62Y+Mv8hSNwO6K+e8GCB2hphjKw0boAc6CztdEBzS3iV8w8JlCVgZSzy/4G/k6Kdf70pAC0pTUHfMjYPBJh1kJfnfXdEq7xBLIa/h+o79SSIkpFd6snljvRUyDL+tYDHhckBW9zm4kLeIWbq5wH4vk9ukeqibcIxl9hLDkQMwcU4qjw0GHbjDj2XDdrgkN8jGtGFiwRS7E7Eleqsv4n215E+rK+vYGk= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:svYqQpI2Fult+Yhrj6dBzu4DLqAWaJcC5bGPQENHNQhR7awxuSczsc7l7LmGJVzC8ohlCbXQssf+oyhkQ5o6B7ZfL1RF36/9nfG9O4aq2TFNQI+b3bYbv6cA8CS392NWpt+hAFh/wOeOoHDEGBtkYbC6nFn+6tUXWF7O0PzcZHvdArIjF9NI6/t8bDXqj39WBIJIIOaY3OjiGSJbk8ocpDgzUgm2kVPyajE1/3T+ubbMd91DNWwRj781VfdVVF2WZC9Mmo8i6cNTX/dLCIXyLhAuRSRa53tecORVt4Hl1glB5RCE/Ug+Xm4G6LybZKMUqcD0lexkAu76lPfb6s5sTnHyTR0HqzpZoeKFOM7L3tc=; 5:n0Ass1PQmTZtiLaJxIVmbjurVyA7lz4Tz5tyY7ZUcLaaqoCBYcHRirors3cYPcSuJZIsXpT9pOjicUpPl1ByXrbyMYUy76tyJoWf9sBu5MwoxjZPXc8v69psv3QnnOlNpWrTGd6k5EtBB64RDxCzGQRh2YoqYlMVITeP+1PvUus=; 24:teM88B6KGSHtKNWEN1gCzT+IQGcA+ENy6OAoQkUTNz9f6rT6kIxTrwX8jV3KaaddDexaSVyf1UK5jdrx9zHXohrXX6La/al4M3O2AiH1wHA=; 7:QPB/KpFbUm8ojT7LgRKqmUBd1r64/C8a9jnfSht54n7f7ttk59+aRK+q/ajIITWkvl2W+SfClKJkJ210xZkXKygP13Se60CYZosAjoUUVKqwrdJ3y+jrCO5hyvriV0aRjkg3Lqm11qPw4T6BygvfiU0w2AaOhFryNSclXT6O0gIMKJRwuatLf/57mq28TAPA2/QAAmLe1pMMgUNho6/dcT9tIblcpEaacfE3kvaHW7VEg76Z3LkvdaUQSQeN84HT SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:4Mr6rBMg50zwwVfIQXaajYoLCpIKQ00EzwfEqFY9b/AV7+Sds7+ji/NqkU16Ai/ffQvdjWsyuvi0Mjn3GmylNvEgyZLRDu02aCmsijdNxePX0LKNr59zU4M2dQA9EezGCx9mROFYX1aHkHOsGKjiWPzrjzSqr6w0zSSSnSLHhXQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:41.0439 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1051dbcb-33c2-4d08-8e5b-08d56da0a288 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.98 Subject: [Qemu-devel] [RFC PATCH 20/34] vmbus: vmbus implementation X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add the VMBus infrastructure -- bus, devices, root bridge, vmbus state machine, vmbus channel interactions, etc. TODO: - split into smaller palatable pieces - more comments - check and handle corner cases Kudos to Evgeny Yakovlev (formerly eyakovlev@virtuozzo.com) and Andrey Smetatin (formerly asmetanin@virtuozzo.com) for research and prototyping. Signed-off-by: Roman Kagan --- Makefile.objs | 1 + include/hw/vmbus/vmbus.h | 106 ++ hw/vmbus/vmbus.c | 2436 ++++++++++++++++++++++++++++++++++++++++++++++ hw/vmbus/Makefile.objs | 1 + hw/vmbus/trace-events | 8 + 5 files changed, 2552 insertions(+) create mode 100644 include/hw/vmbus/vmbus.h create mode 100644 hw/vmbus/vmbus.c create mode 100644 hw/vmbus/Makefile.objs create mode 100644 hw/vmbus/trace-events diff --git a/Makefile.objs b/Makefile.objs index 2efba6d768..14a36a4736 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -159,6 +159,7 @@ trace-events-subdirs += hw/alpha trace-events-subdirs += hw/hppa trace-events-subdirs += hw/xen trace-events-subdirs += hw/ide +trace-events-subdirs += hw/vmbus trace-events-subdirs += ui trace-events-subdirs += audio trace-events-subdirs += net diff --git a/include/hw/vmbus/vmbus.h b/include/hw/vmbus/vmbus.h new file mode 100644 index 0000000000..cdb5180796 --- /dev/null +++ b/include/hw/vmbus/vmbus.h @@ -0,0 +1,106 @@ +/* + * QEMU Hyper-V VMBus + * + * Copyright (c) 2017-2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef QEMU_VMBUS_H +#define QEMU_VMBUS_H + +#include "hw/qdev.h" +#include "sysemu/sysemu.h" +#include "sysemu/dma.h" +#include "target/i386/hyperv.h" +#include "target/i386/hyperv-proto.h" +#include "hw/vmbus/vmbus-proto.h" +#include "qemu/uuid.h" + +#define TYPE_VMBUS_DEVICE "vmbus-dev" + +#define VMBUS_DEVICE(obj) \ + OBJECT_CHECK(VMBusDevice, (obj), TYPE_VMBUS_DEVICE) +#define VMBUS_DEVICE_CLASS(klass) \ + OBJECT_CLASS_CHECK(VMBusDeviceClass, (klass), TYPE_VMBUS_DEVICE) +#define VMBUS_DEVICE_GET_CLASS(obj) \ + OBJECT_GET_CLASS(VMBusDeviceClass, (obj), TYPE_VMBUS_DEVICE) + +typedef struct VMBus VMBus; +typedef struct VMBusChannel VMBusChannel; +typedef struct VMBusDevice VMBusDevice; +typedef struct VMBusGpadl VMBusGpadl; + +typedef void(*VMBusChannelNotifyCb)(struct VMBusChannel *chan); + +typedef struct VMBusDeviceClass { + DeviceClass parent; + + QemuUUID classid; + QemuUUID instanceid; /* Fixed UUID for singleton devices */ + uint16_t channel_flags; + uint16_t mmio_size_mb; + + void (*vmdev_realize)(VMBusDevice *vdev, Error **errp); + void (*vmdev_unrealize)(VMBusDevice *vdev, Error **errp); + void (*vmdev_reset)(VMBusDevice *vdev); + uint16_t (*num_channels)(VMBusDevice *vdev); + int (*open_channel) (VMBusDevice *vdev); + void (*close_channel) (VMBusDevice *vdev); + VMBusChannelNotifyCb chan_notify_cb; +} VMBusDeviceClass; + +typedef struct VMBusDevice { + DeviceState parent; + QemuUUID instanceid; + uint16_t num_channels; + VMBusChannel *channels; + AddressSpace *dma_as; +} VMBusDevice; + +extern const VMStateDescription vmstate_vmbus_dev; + +typedef struct VMBusChanReq { + VMBusChannel *chan; + uint16_t pkt_type; + uint32_t msglen; + void *msg; + uint64_t transaction_id; + void *comp; + QEMUSGList sgl; +} VMBusChanReq; + +VMBusDevice *vmbus_channel_device(VMBusChannel *chan); +VMBusChannel *vmbus_device_channel(VMBusDevice *dev, uint32_t chan_idx); +uint32_t vmbus_channel_idx(VMBusChannel *chan); +void vmbus_notify_channel(VMBusChannel *chan); + +void vmbus_create(void); +bool vmbus_exists(void); + +int vmbus_channel_send(VMBusChannel *chan, uint16_t pkt_type, + void *desc, uint32_t desclen, + void *msg, uint32_t msglen, + bool need_comp, uint64_t transaction_id); +int vmbus_chan_send_completion(VMBusChanReq *req); +int vmbus_channel_reserve(VMBusChannel *chan, + uint32_t desclen, uint32_t msglen); +void *vmbus_channel_recv(VMBusChannel *chan, uint32_t size); +void vmbus_release_req(void *req); + +void vmbus_save_req(QEMUFile *f, VMBusChanReq *req); +void *vmbus_load_req(QEMUFile *f, VMBusDevice *dev, uint32_t size); + + +VMBusGpadl *vmbus_get_gpadl(VMBusChannel *chan, uint32_t gpadl_id); +void vmbus_put_gpadl(VMBusGpadl *gpadl); +uint32_t vmbus_gpadl_len(VMBusGpadl *gpadl); +ssize_t vmbus_iov_to_gpadl(VMBusChannel *chan, VMBusGpadl *gpadl, uint32_t off, + const struct iovec *iov, size_t iov_cnt); +int vmbus_map_sgl(QEMUSGList *sgl, DMADirection dir, struct iovec *iov, + unsigned iov_cnt, size_t len, size_t off); +void vmbus_unmap_sgl(QEMUSGList *sgl, DMADirection dir, struct iovec *iov, + unsigned iov_cnt, size_t accessed); + +#endif diff --git a/hw/vmbus/vmbus.c b/hw/vmbus/vmbus.c new file mode 100644 index 0000000000..42d12dfdf6 --- /dev/null +++ b/hw/vmbus/vmbus.c @@ -0,0 +1,2436 @@ +/* + * QEMU Hyper-V VMBus + * + * Copyright (c) 2017-2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qapi/error.h" +#include "hw/vmbus/vmbus.h" +#include "hw/sysbus.h" +#include "trace.h" + +#define TYPE_VMBUS "vmbus" +#define VMBUS(obj) OBJECT_CHECK(VMBus, (obj), TYPE_VMBUS) + +#define TYPE_VMBUS_BRIDGE "vmbus-bridge" + +#define VMBUS_CHAN_RELID_COUNT HV_EVENT_FLAGS_COUNT +#define VMBUS_CHAN_FIRST_RELID 1 /* 0 is reserved */ +#define VMBUS_CHAN_CONNID_COUNT HV_EVENT_FLAGS_COUNT +#define VMBUS_CHAN_FIRST_CONNID (VMBUS_MONITOR_CONNECTION_ID + 1) + +#define VMBUS_VMSTATE_VERSION_ID 1 + +#define VMBUS_RX_QUEUE_CAPACITY 16 + +typedef struct VMBusGpadl +{ + QTAILQ_ENTRY(VMBusGpadl) link; + + uint32_t id; + uint32_t child_relid; + + uint32_t num_gfns; + uint32_t seen_gfns; + uint64_t *gfns; + + bool alive; + bool in_use; +} VMBusGpadl; + +typedef enum VMBusOfferState { + VMOFFER_INIT, + VMOFFER_SENDING, + VMOFFER_SENT, +} VMBusOfferState; + +typedef enum VMBusChannelState { + VMCHAN_INIT, + VMCHAN_OPENING, + VMCHAN_OPEN, +} VMBusChannelState; + + +typedef struct VMBusRingBuf { + VMBusGpadl *gpadl; + AddressSpace *as; + DMADirection dir; + dma_addr_t rb_addr; + uint32_t base; + uint32_t len; + uint32_t my_idx; + uint32_t pending_sz; +} VMBusRingBuf; + +typedef struct VMBusChannel +{ + VMBusDevice *dev; + + uint32_t relid; + uint16_t subchan_idx; + uint32_t connid; + uint32_t open_id; + uint32_t target_vp; + uint32_t rb_gpadl; + uint32_t rb_rcv_offset; + + VMBusOfferState offer_state; + VMBusChannelState state; + + VMBusChannelNotifyCb notify_cb; + EventNotifier notifier; + + VMBus *vmbus; + HvSintRoute *notify_route; + VMBusGpadl *gpadl; + + VMBusRingBuf ringbuf_rcv; + VMBusRingBuf ringbuf_snd; + + uint32_t snd_reserved; + + QTAILQ_ENTRY(VMBusChannel) link; +} VMBusChannel; + +typedef enum VMBusState { + VMBUS_LISTEN, + VMBUS_HANDSHAKE, + VMBUS_OFFER, + VMBUS_CREATE_GPADL, + VMBUS_TEARDOWN_GPADL, + VMBUS_OPEN_CHANNEL, + VMBUS_UNLOAD, + VMBUS_STATE_MAX +} VMBusState; + +typedef struct VMBus +{ + BusState parent; + + VMBusState state; + bool msg_in_progress; + uint32_t version; + uint32_t target_vp; + HvSintRoute *sint_route; + hwaddr int_page_gpa; + + DECLARE_BITMAP(chan_relid_bitmap, VMBUS_CHAN_RELID_COUNT); + DECLARE_BITMAP(connection_id_bitmap, VMBUS_CHAN_CONNID_COUNT); + + struct hyperv_post_message_input rx_queue[VMBUS_RX_QUEUE_CAPACITY]; + uint8_t rx_queue_head; + uint8_t rx_queue_size; + QemuMutex rx_queue_lock; + + QTAILQ_HEAD(, VMBusGpadl) gpadl_list; + QTAILQ_HEAD(, VMBusChannel) channel_list; + + EventNotifier notifier; +} VMBus; + +static void vmbus_resched(VMBus *vmbus); +static void vmbus_msg_cb(void *data, int status); + +static bool gpadl_full(VMBusGpadl *gpadl) +{ + return gpadl->seen_gfns == gpadl->num_gfns; +} + +static bool gpadl_broken(VMBusGpadl *gpadl) +{ + return !gpadl->num_gfns; +} + +static VMBusGpadl *create_gpadl(VMBus *vmbus, uint32_t id, + uint32_t child_relid, uint32_t num_gfns) +{ + VMBusGpadl *gpadl = g_new0(VMBusGpadl, 1); + + gpadl->id = id; + gpadl->child_relid = child_relid; + gpadl->num_gfns = num_gfns; + gpadl->gfns = g_new(uint64_t, num_gfns); + QTAILQ_INSERT_HEAD(&vmbus->gpadl_list, gpadl, link); + return gpadl; +} + +static void free_gpadl(VMBus *vmbus, VMBusGpadl *gpadl) +{ + QTAILQ_REMOVE(&vmbus->gpadl_list, gpadl, link); + g_free(gpadl->gfns); + g_free(gpadl); +} + +static VMBusGpadl *find_gpadl(VMBus *vmbus, uint32_t gpadl_id) +{ + VMBusGpadl *gpadl; + QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { + if (gpadl->id == gpadl_id) { + return gpadl; + } + } + return NULL; +} + +VMBusGpadl *vmbus_get_gpadl(VMBusChannel *chan, uint32_t gpadl_id) +{ + VMBusGpadl *gpadl = find_gpadl(chan->vmbus, gpadl_id); + if (gpadl) { + if (!gpadl->alive || gpadl->in_use) { + return NULL; + } + gpadl->in_use = true; + } + return gpadl; +} + +void vmbus_put_gpadl(VMBusGpadl *gpadl) +{ + gpadl->in_use = false; +} + +uint32_t vmbus_gpadl_len(VMBusGpadl *gpadl) +{ + return gpadl->num_gfns * TARGET_PAGE_SIZE; +} + +typedef struct GpadlIter { + VMBusGpadl *gpadl; + AddressSpace *as; + DMADirection dir; + uint32_t off; + /* cached mapping of the currently accessed page, up to page boundary */ + void *map; +} GpadlIter; + +static void gpadl_iter_init(GpadlIter *iter, VMBusGpadl *gpadl, + AddressSpace *as, DMADirection dir, uint32_t off) +{ + iter->gpadl = gpadl; + iter->as = as; + iter->dir = dir; + iter->off = off; + iter->map = NULL; +} + +static ssize_t gpadl_iter_rw(GpadlIter *iter, void *buf, uint32_t len) +{ + ssize_t ret = len; + + while (len) { + uint32_t off_pgoff = iter->off & ~TARGET_PAGE_MASK; + uint32_t pgleft = TARGET_PAGE_SIZE - off_pgoff; + uint32_t cplen = MIN(pgleft, len); + void *p; + + if (!iter->map) { + dma_addr_t maddr; + dma_addr_t mlen = pgleft; + uint32_t idx = iter->off >> TARGET_PAGE_BITS; + assert(idx < iter->gpadl->num_gfns); + + maddr = (iter->gpadl->gfns[idx] << TARGET_PAGE_BITS) | off_pgoff; + + iter->map = dma_memory_map(iter->as, maddr, &mlen, iter->dir); + if (mlen != pgleft) { + dma_memory_unmap(iter->as, iter->map, mlen, iter->dir, 0); + return -EFAULT; + } + } + + p = (void *)(((uintptr_t)iter->map & TARGET_PAGE_MASK) | off_pgoff); + if (iter->dir == DMA_DIRECTION_FROM_DEVICE) { + memcpy(p, buf, cplen); + } else { + memcpy(buf, p, cplen); + } + + buf += cplen; + len -= cplen; + iter->off += cplen; + if (cplen == pgleft) { + uint32_t mlen = TARGET_PAGE_SIZE - + ((uintptr_t)iter->map & ~TARGET_PAGE_MASK); + dma_memory_unmap(iter->as, iter->map, mlen, iter->dir, mlen); + iter->map = NULL; + } + } + + return ret; +} + +static void gpadl_iter_done(GpadlIter *iter) +{ + if (iter->map) { + uint32_t map_pgoff = (uintptr_t)iter->map & ~TARGET_PAGE_MASK; + uint32_t off_pgoff = iter->off & ~TARGET_PAGE_MASK; + assert(map_pgoff <= off_pgoff); + dma_memory_unmap(iter->as, iter->map, TARGET_PAGE_SIZE - map_pgoff, + iter->dir, off_pgoff - map_pgoff); + } +} + +static void gpadl_iter_set(GpadlIter *iter, uint32_t new_off) +{ + if (iter->map) { + uint32_t map_pgoff = (uintptr_t)iter->map & ~TARGET_PAGE_MASK; + uint32_t off_pgoff = iter->off & ~TARGET_PAGE_MASK; + if ((iter->off & TARGET_PAGE_MASK) != (new_off & TARGET_PAGE_MASK) || + (new_off & ~TARGET_PAGE_MASK) < map_pgoff) { + dma_memory_unmap(iter->as, iter->map, TARGET_PAGE_SIZE - map_pgoff, + iter->dir, off_pgoff - map_pgoff); + iter->map = NULL; + } + } + iter->off = new_off; +} + +ssize_t vmbus_iov_to_gpadl(VMBusChannel *chan, VMBusGpadl *gpadl, uint32_t off, + const struct iovec *iov, size_t iov_cnt) +{ + GpadlIter iter; + size_t i; + ssize_t ret = 0; + + gpadl_iter_init(&iter, gpadl, chan->dev->dma_as, + DMA_DIRECTION_FROM_DEVICE, off); + for (i = 0; i < iov_cnt; i++) { + ret = gpadl_iter_rw(&iter, iov[i].iov_base, iov[i].iov_len); + if (ret < 0) { + goto out; + } + } +out: + gpadl_iter_done(&iter); + return ret; +} + +int vmbus_map_sgl(QEMUSGList *sgl, DMADirection dir, struct iovec *iov, + unsigned iov_cnt, size_t len, size_t off) +{ + int ret_cnt = 0, ret; + unsigned i; + ScatterGatherEntry *sg = sgl->sg; + + for (i = 0; i < sgl->nsg; i++) { + if (sg[i].len > off) { + break; + } + off -= sg[i].len; + } + for (; len && i < sgl->nsg; i++) { + dma_addr_t mlen = MIN(sg[i].len - off, len); + dma_addr_t addr = sg[i].base + off; + len -= mlen; + off = 0; + + for (; mlen; ret_cnt++) { + dma_addr_t l = mlen; + dma_addr_t a = addr; + + if (ret_cnt == iov_cnt) { + ret = -ENOBUFS; + goto err; + } + + iov[ret_cnt].iov_base = dma_memory_map(sgl->as, a, &l, dir); + if (!l) { + ret = -EFAULT; + goto err; + } + iov[ret_cnt].iov_len = l; + addr += l; + mlen -= l; + } + } + + return ret_cnt; +err: + vmbus_unmap_sgl(sgl, dir, iov, ret_cnt, 0); + return ret; +} + +void vmbus_unmap_sgl(QEMUSGList *sgl, DMADirection dir, struct iovec *iov, + unsigned iov_cnt, size_t accessed) +{ + unsigned i; + + for (i = 0; i < iov_cnt; i++) { + size_t acsd = MIN(accessed, iov[i].iov_len); + dma_memory_unmap(sgl->as, iov[i].iov_base, iov[i].iov_len, dir, acsd); + accessed -= acsd; + } +} + +static int gpadl_pre_load(void *opaque) +{ + memset(opaque, 0, sizeof(VMBusGpadl)); + return 0; +} + +static const VMStateDescription vmstate_gpadl = { + .name = "vmbus/gpadl", + .version_id = 0, + .minimum_version_id = 0, + .pre_load = gpadl_pre_load, + .fields = (VMStateField[]) { + VMSTATE_UINT32(id, VMBusGpadl), + VMSTATE_UINT32(child_relid, VMBusGpadl), + VMSTATE_UINT32(num_gfns, VMBusGpadl), + VMSTATE_UINT32(seen_gfns, VMBusGpadl), + VMSTATE_VARRAY_UINT32_ALLOC(gfns, VMBusGpadl, num_gfns, 0, + vmstate_info_uint64, uint64_t), + VMSTATE_BOOL(alive, VMBusGpadl), + VMSTATE_END_OF_LIST() + } +}; + +static vmbus_ring_buffer *ringbuf_map(const VMBusRingBuf *ringbuf) +{ + vmbus_ring_buffer *rb; + dma_addr_t mlen = sizeof(*rb); + + rb = dma_memory_map(ringbuf->as, ringbuf->rb_addr, &mlen, + DMA_DIRECTION_FROM_DEVICE); + if (mlen != sizeof(*rb)) { + dma_memory_unmap(ringbuf->as, rb, mlen, DMA_DIRECTION_FROM_DEVICE, 0); + return NULL; + } + return rb; +} + +static void ringbuf_unmap(const VMBusRingBuf *ringbuf, vmbus_ring_buffer *rb, + bool dirty) +{ + dma_memory_unmap(ringbuf->as, rb, sizeof(*rb), 1, dirty ? sizeof(*rb) : 0); +} + +static int ringbuf_init(VMBusRingBuf *ringbuf, VMBusChannel *chan, + DMADirection dir) +{ + int ret = 0; + int off_pg, len_pg; + vmbus_ring_buffer *rb; + VMBusGpadl *gpadl = chan->gpadl; + + if (dir == DMA_DIRECTION_FROM_DEVICE) { + off_pg = chan->rb_rcv_offset; + len_pg = gpadl->num_gfns - chan->rb_rcv_offset; + } else { + off_pg = 0; + len_pg = chan->rb_rcv_offset; + } + + if (len_pg < 1) { + return -EINVAL; + } + + ringbuf->gpadl = gpadl; + ringbuf->as = chan->dev->dma_as; + ringbuf->dir = dir; + ringbuf->rb_addr = gpadl->gfns[off_pg] << TARGET_PAGE_BITS; + ringbuf->base = (off_pg + 1) << TARGET_PAGE_BITS; + ringbuf->len = (len_pg - 1) << TARGET_PAGE_BITS; + + rb = ringbuf_map(ringbuf); + if (!rb) { + return -EFAULT; + } + + if (dir == DMA_DIRECTION_FROM_DEVICE) { + ringbuf->my_idx = rb->write_index; + rb->feature_bits |= VMBUS_RING_BUFFER_FEAT_PENDING_SZ; + ringbuf->pending_sz = rb->pending_send_sz; + } else { + ringbuf->my_idx = rb->read_index; + } + if (ringbuf->my_idx >= ringbuf->len) { + error_report("%s: inconsistent ring buffer: idx:%u len:%u", __func__, + ringbuf->my_idx, ringbuf->len); + ret = -EIO; + goto out; + } + +out: + ringbuf_unmap(ringbuf, rb, true); + return ret; +} + +typedef struct VMBusRingIter { + VMBusRingBuf *ringbuf; + vmbus_ring_buffer *rb; + GpadlIter gpiter; +} VMBusRingIter; + +static int ring_iter_init(VMBusRingIter *iter, VMBusRingBuf *ringbuf) +{ + iter->ringbuf = ringbuf; + gpadl_iter_init(&iter->gpiter, ringbuf->gpadl, ringbuf->as, ringbuf->dir, + ringbuf->base + ringbuf->my_idx); + iter->rb = ringbuf_map(ringbuf); + return iter->rb ? 0 : -EFAULT; +} + +static uint32_t rb_avail(uint32_t my_idx, uint32_t other_idx, uint32_t len, + bool is_write) +{ + uint32_t ret = other_idx + len - my_idx - is_write; + if (ret >= len) { + ret -= len; + } + return ret; +} + +static bool ring_iter_rcv_update_idx(VMBusRingIter *iter) +{ + VMBusRingBuf *ringbuf = iter->ringbuf; + vmbus_ring_buffer *rb = iter->rb; + uint32_t old_idx = ringbuf->my_idx; + + assert(ringbuf->dir == DMA_DIRECTION_TO_DEVICE); + + ringbuf->my_idx = iter->gpiter.off - ringbuf->base; + + /* + * make sure the data operation is finished before we update the index; + * pairs with (the guest-side equivalent of) the final smp_mb() in + * ringbuf_snd_request_room() + */ + smp_mb(); + + rb->read_index = ringbuf->my_idx; + smp_mb(); + + if (rb->interrupt_mask) { + return false; + } + + if (rb->feature_bits & VMBUS_RING_BUFFER_FEAT_PENDING_SZ) { + uint32_t other_idx; + uint32_t wanted = rb->pending_send_sz; + + /* barrier-less shortcut */ + if (!wanted) { + return false; + } + + /* pairs with smp_mb() in ringbuf_snd_request_room() */ + smp_rmb(); + other_idx = rb->write_index; + + /* other (write) side wasn't blocked on our (read) state */ + if (rb_avail(other_idx, old_idx, ringbuf->len, true) >= wanted) { + return false; + } + /* there's not enough space for the other (write) side */ + if (rb_avail(other_idx, ringbuf->my_idx, ringbuf->len, true) < + wanted) { + return false; + } + } + + return true; +} + +static bool ring_iter_snd_update_idx(VMBusRingIter *iter) +{ + VMBusRingBuf *ringbuf = iter->ringbuf; + vmbus_ring_buffer *rb = iter->rb; + uint32_t old_idx = ringbuf->my_idx; + uint32_t wlen; + + assert(ringbuf->dir == DMA_DIRECTION_FROM_DEVICE); + + ringbuf->my_idx = iter->gpiter.off - ringbuf->base; + wlen = rb_avail(old_idx, ringbuf->my_idx, ringbuf->len, false); + + if (ringbuf->pending_sz) { + /* we didn't have enough room at ringbuf_snd_request_room() */ + assert(wlen < ringbuf->pending_sz); + /* successful send reduces our needs; inform the other side */ + ringbuf->pending_sz -= wlen; + rb->pending_send_sz = ringbuf->pending_sz; + } + + /* + * make sure the data operation is finished before we update the index; + * pairs with (the guest-side equivalent of) the barrier in + * ring_iter_avail() + */ + smp_mb(); + + rb->write_index = ringbuf->my_idx; + smp_mb(); + + if (rb->interrupt_mask) { + return false; + } + + /* + * other (read) side hasn't caught up with our (write) previous state + * so it's not blocked + */ + if (rb_avail(rb->read_index, ringbuf->my_idx, ringbuf->len, false) > + wlen) { + return false; + } + return true; +} + +static void ring_iter_done(VMBusRingIter *iter, bool dirty) +{ + gpadl_iter_done(&iter->gpiter); + ringbuf_unmap(iter->ringbuf, iter->rb, dirty); +} + +static uint32_t ring_iter_rcv_avail(VMBusRingIter *iter) +{ + uint32_t other_idx; + assert(iter->gpiter.dir == DMA_DIRECTION_TO_DEVICE); + + other_idx = iter->rb->write_index; + /* + * pairs with (the guest-side equivalent of) the barrier at the + * beginning of ring_iter_snd_update_idx() + */ + smp_mb(); + + return rb_avail(iter->gpiter.off - iter->ringbuf->base, other_idx, + iter->ringbuf->len, false); +} + +static int ring_iter_rw(VMBusRingIter *iter, void *buf, uint32_t len) +{ + int ret1 = 0, ret2 = 0; + uint32_t remain = iter->ringbuf->len + iter->ringbuf->base - + iter->gpiter.off; + + if (len >= remain) { + ret1 = gpadl_iter_rw(&iter->gpiter, buf, remain); + if (ret1 < 0) { + return ret1; + } + assert(!iter->gpiter.map); + gpadl_iter_set(&iter->gpiter, iter->ringbuf->base); + buf += remain; + len -= remain; + } + ret2 = gpadl_iter_rw(&iter->gpiter, buf, len); + if (ret2 < 0) { + return ret2; + } + return ret1 + ret2; +} + +static void ring_iter_set(VMBusRingIter *iter, uint32_t new_off) +{ + new_off += iter->ringbuf->my_idx; + if (new_off >= iter->ringbuf->len) { + new_off -= iter->ringbuf->len; + } + gpadl_iter_set(&iter->gpiter, iter->ringbuf->base + new_off); +} + +static int ringbuf_snd_request_room(VMBusRingBuf *ringbuf, uint32_t needed) +{ + uint32_t avail; + bool dirty = false; + vmbus_ring_buffer *rb; + + assert(ringbuf->dir == DMA_DIRECTION_FROM_DEVICE); + + rb = ringbuf_map(ringbuf); + if (!rb) { + return -EFAULT; + } + + avail = rb_avail(ringbuf->my_idx, rb->read_index, ringbuf->len, true); + + if (needed <= avail) { + needed = 0; + } + + if (needed != ringbuf->pending_sz) { + ringbuf->pending_sz = needed; + /* pairs with smp_rmb() in ring_iter_rcv_update_idx() */ + smp_mb(); + rb->pending_send_sz = needed; + dirty = true; + } + /* + * pairs with (the guest-side equivalent of) smp_mb() at the + * beginning of ring_iter_rcv_update_idx() + */ + smp_mb(); + + ringbuf_unmap(ringbuf, rb, dirty); + return needed ? -ENOSPC : 0; +} + + +VMBusDevice *vmbus_channel_device(VMBusChannel *chan) +{ + return chan->dev; +} + +VMBusChannel *vmbus_device_channel(VMBusDevice *dev, uint32_t chan_idx) +{ + if (chan_idx >= dev->num_channels) { + return NULL; + } + return &dev->channels[chan_idx]; +} + +uint32_t vmbus_channel_idx(VMBusChannel *chan) +{ + return chan - chan->dev->channels; +} + +void vmbus_notify_channel(VMBusChannel *chan) +{ + event_notifier_set(&chan->notifier); +} + +static bool channel_broken(VMBusChannel *chan) +{ + return !chan->gpadl; +} + +static int signal_channel(VMBusChannel *chan) +{ + int res = 0; + unsigned long *int_map, mask; + unsigned idx; + hwaddr addr = chan->vmbus->int_page_gpa; + hwaddr len = TARGET_PAGE_SIZE / 2, dirty = 0; + + trace_vmbus_signal_channel(chan->relid); + + if (!addr) { + return hyperv_set_evt_flag(chan->notify_route, chan->relid); + } + + int_map = cpu_physical_memory_map(addr, &len, 1); + if (len != TARGET_PAGE_SIZE / 2) { + res = -ENXIO; + goto unmap; + } + + idx = BIT_WORD(chan->relid); + mask = BIT_MASK(chan->relid); + if ((atomic_fetch_or(&int_map[idx], mask) & mask) != mask) { + res = kvm_hv_sint_route_set_sint(chan->notify_route); + dirty = len; + } + +unmap: + cpu_physical_memory_unmap(int_map, len, 1, dirty); + return res; +} + +int vmbus_channel_send(VMBusChannel *chan, uint16_t pkt_type, + void *desc, uint32_t desclen, + void *msg, uint32_t msglen, + bool need_comp, uint64_t transaction_id) +{ + int ret = 0; + vmbus_packet_hdr hdr; + uint32_t totlen; + VMBusRingIter iter; + + if (chan->state != VMCHAN_OPEN) { + return -EINVAL; + } + + ret = ring_iter_init(&iter, &chan->ringbuf_snd); + if (ret) { + return ret; + } + + hdr.type = pkt_type; + hdr.offset_qwords = sizeof(hdr) / sizeof(uint64_t) + + DIV_ROUND_UP(desclen, sizeof(uint64_t)); + hdr.len_qwords = hdr.offset_qwords + + DIV_ROUND_UP(msglen, sizeof(uint64_t)); + hdr.flags = need_comp ? VMBUS_PACKET_FLAG_REQUEST_COMPLETION : 0; + hdr.transaction_id = transaction_id; + totlen = (hdr.len_qwords + 1) * sizeof(uint64_t); + + assert(totlen <= chan->snd_reserved); + + ret = ring_iter_rw(&iter, &hdr, sizeof(hdr)); + if (ret < 0) { + goto out; + } + if (desclen) { + assert(desc); + ret = ring_iter_rw(&iter, desc, desclen); + if (ret < 0) { + goto out; + } + ring_iter_set(&iter, hdr.offset_qwords * sizeof(uint64_t)); + } + ret = ring_iter_rw(&iter, msg, msglen); + if (ret < 0) { + goto out; + } + ring_iter_set(&iter, totlen); + + if (ring_iter_snd_update_idx(&iter)) { + signal_channel(chan); + } + chan->snd_reserved -= totlen; +out: + ring_iter_done(&iter, ret >= 0); + return ret; +} + +int vmbus_chan_send_completion(VMBusChanReq *req) +{ + assert(req->comp); + return vmbus_channel_send(req->chan, VMBUS_PACKET_COMP, NULL, 0, req->comp, + req->msglen, false, req->transaction_id); +} + +int vmbus_channel_reserve(VMBusChannel *chan, + uint32_t desclen, uint32_t msglen) +{ + uint32_t needed = chan->snd_reserved + + sizeof(vmbus_packet_hdr) + + ROUND_UP(desclen, sizeof(uint64_t)) + + ROUND_UP(msglen, sizeof(uint64_t)) + + sizeof(uint64_t); + + int ret = ringbuf_snd_request_room(&chan->ringbuf_snd, needed); + + if (!ret) { + chan->snd_reserved = needed; + } + return ret; +} + +static int sgl_from_gpa_ranges(VMBusRingIter *iter, uint32_t len, + VMBusChanReq *req) +{ + int ret; + vmbus_pkt_gpa_direct hdr; + hwaddr curaddr = 0; + hwaddr curlen = 0; + int num; + + if (len < sizeof(hdr)) { + return -EIO; + } + ret = ring_iter_rw(iter, &hdr, sizeof(hdr)); + if (ret < 0) { + return ret; + } + len -= sizeof(hdr); + + num = (len - hdr.rangecount * sizeof(vmbus_gpa_range)) / sizeof(uint64_t); + if (num < 0) { + return -EIO; + } + qemu_sglist_init(&req->sgl, DEVICE(req->chan->dev), num, iter->gpiter.as); + + for (; hdr.rangecount; hdr.rangecount--) { + vmbus_gpa_range range; + + if (len < sizeof(range)) { + goto eio; + } + ret = ring_iter_rw(iter, &range, sizeof(range)); + if (ret < 0) { + goto err; + } + len -= sizeof(range); + + if (range.byte_offset & TARGET_PAGE_MASK) { + goto eio; + } + + for (; range.byte_count; range.byte_offset = 0) { + uint64_t paddr; + uint32_t plen = MIN(range.byte_count, + TARGET_PAGE_SIZE - range.byte_offset); + + if (len < sizeof(uint64_t)) { + goto eio; + } + ret = ring_iter_rw(iter, &paddr, sizeof(paddr)); + if (ret < 0) { + goto err; + } + len -= sizeof(uint64_t); + paddr <<= TARGET_PAGE_BITS; + paddr |= range.byte_offset; + range.byte_count -= plen; + + if (curaddr + curlen == paddr) { + /* consecutive fragments - join */ + curlen += plen; + } else { + if (curlen) { + qemu_sglist_add(&req->sgl, curaddr, curlen); + } + + curaddr = paddr; + curlen = plen; + } + } + } + + if (curlen) { + qemu_sglist_add(&req->sgl, curaddr, curlen); + } + + return 0; +eio: + ret = -EIO; +err: + qemu_sglist_destroy(&req->sgl); + return ret; +} + +static VMBusChanReq *vmbus_alloc_req(VMBusChannel *chan, + uint32_t size, uint16_t pkt_type, + uint32_t msglen, uint64_t transaction_id, + bool with_comp) +{ + VMBusChanReq *req; + uint32_t msgoff = QEMU_ALIGN_UP(size, __alignof__(*req->msg)); + uint32_t compoff = QEMU_ALIGN_UP(msgoff + msglen, __alignof__(*req->comp)); + uint32_t complen = with_comp ? msglen : 0; + uint32_t totlen = compoff + complen; + + req = g_malloc0(totlen); + req->chan = chan; + req->pkt_type = pkt_type; + req->msg = (void *)req + msgoff; + req->msglen = msglen; + req->transaction_id = transaction_id; + req->comp = with_comp ? ((void *)req + compoff) : NULL; + return req; +} + +void *vmbus_channel_recv(VMBusChannel *chan, uint32_t size) +{ + VMBusRingIter iter; + vmbus_packet_hdr hdr = {0}; + VMBusChanReq *req = NULL; + uint32_t avail; + uint32_t pktlen, msglen, msgoff, desclen; + bool with_comp; + + assert(size >= sizeof(*req)); + + if (chan->state != VMCHAN_OPEN) { + return NULL; + } + + if (ring_iter_init(&iter, &chan->ringbuf_rcv)) { + return NULL; + } + + avail = ring_iter_rcv_avail(&iter); + if (avail < sizeof(hdr)) { + goto err; + } + + if (ring_iter_rw(&iter, &hdr, sizeof(hdr)) < 0) { + goto err; + } + + pktlen = hdr.len_qwords * sizeof(uint64_t); + if (pktlen + sizeof(uint64_t) > avail) { + goto err; + } + + msgoff = hdr.offset_qwords * sizeof(uint64_t); + if (msgoff > pktlen || msgoff < sizeof(hdr)) { + error_report("%s: malformed packet: %u %u", __func__, msgoff, pktlen); + goto err; + } + + msglen = pktlen - msgoff; + + with_comp = hdr.flags & VMBUS_PACKET_FLAG_REQUEST_COMPLETION; + if (with_comp && vmbus_channel_reserve(chan, 0, msglen)) { + goto err; + } + + req = vmbus_alloc_req(chan, size, hdr.type, msglen, hdr.transaction_id, + with_comp); + + switch (hdr.type) { + case VMBUS_PACKET_DATA_USING_GPA_DIRECT: + desclen = msgoff - sizeof(hdr); + if (sgl_from_gpa_ranges(&iter, desclen, req) < 0) { + error_report("%s: failed to convert GPA ranges to SGL", __func__); + goto err; + } + break; + case VMBUS_PACKET_DATA_INBAND: + case VMBUS_PACKET_COMP: + break; + default: + error_report("%s: unexpected msg type: %x", __func__, hdr.type); + goto err; + } + + ring_iter_set(&iter, msgoff); + if (ring_iter_rw(&iter, req->msg, msglen) < 0) { + goto err; + } + ring_iter_set(&iter, pktlen + sizeof(uint64_t)); + + if (ring_iter_rcv_update_idx(&iter)) { + signal_channel(chan); + } + ring_iter_done(&iter, true); + return req; +err: + vmbus_release_req(req); + ring_iter_done(&iter, false); + return NULL; +} + +void vmbus_release_req(void *req) +{ + VMBusChanReq *r = req; + + if (!req) { + return; + } + + if (r->sgl.dev) { + qemu_sglist_destroy(&r->sgl); + } + g_free(req); +} + +static const VMStateDescription vmstate_sgent = { + .name = "vmbus/sgentry", + .version_id = 0, + .minimum_version_id = 0, + .fields = (VMStateField[]) { + VMSTATE_UINT64(base, ScatterGatherEntry), + VMSTATE_UINT64(len, ScatterGatherEntry), + VMSTATE_END_OF_LIST() + } +}; + +typedef struct VMBusChanReqSave { + uint16_t chan_idx; + uint16_t pkt_type; + uint32_t msglen; + void *msg; + uint64_t transaction_id; + bool with_comp; + uint32_t num; + ScatterGatherEntry *sgl; +} VMBusChanReqSave; + +static const VMStateDescription vmstate_vmbus_chan_req = { + .name = "vmbus/vmbus_chan_req", + .version_id = 0, + .minimum_version_id = 0, + .fields = (VMStateField[]) { + VMSTATE_UINT16(chan_idx, VMBusChanReqSave), + VMSTATE_UINT16(pkt_type, VMBusChanReqSave), + VMSTATE_UINT32(msglen, VMBusChanReqSave), + VMSTATE_VBUFFER_ALLOC_UINT32(msg, VMBusChanReqSave, 0, NULL, msglen), + VMSTATE_UINT64(transaction_id, VMBusChanReqSave), + VMSTATE_BOOL(with_comp, VMBusChanReqSave), + VMSTATE_UINT32(num, VMBusChanReqSave), + VMSTATE_STRUCT_VARRAY_POINTER_UINT32(sgl, VMBusChanReqSave, num, + vmstate_sgent, ScatterGatherEntry), + VMSTATE_END_OF_LIST() + } +}; + +void vmbus_save_req(QEMUFile *f, VMBusChanReq *req) +{ + VMBusChanReqSave req_save; + + req_save.chan_idx = req->chan->subchan_idx; + req_save.pkt_type = req->pkt_type; + req_save.msglen = req->msglen; + req_save.msg = req->msg; + req_save.transaction_id = req->transaction_id; + req_save.with_comp = !!req->comp; + req_save.num = req->sgl.nsg; + req_save.sgl = g_memdup(req->sgl.sg, + req_save.num * sizeof(ScatterGatherEntry)); + + vmstate_save_state(f, &vmstate_vmbus_chan_req, &req_save, NULL); + + g_free(req_save.sgl); +} + +void *vmbus_load_req(QEMUFile *f, VMBusDevice *dev, uint32_t size) +{ + VMBusChanReqSave req_save; + VMBusChanReq *req = NULL; + VMBusChannel *chan = NULL; + uint32_t i; + + vmstate_load_state(f, &vmstate_vmbus_chan_req, &req_save, 0); + + if (req_save.chan_idx >= dev->num_channels) { + error_report("%s: %u(chan_idx) > %u(num_channels)", __func__, + req_save.chan_idx, dev->num_channels); + goto out; + } + chan = &dev->channels[req_save.chan_idx]; + + if (vmbus_channel_reserve(chan, 0, req_save.msglen)) { + goto out; + } + + req = vmbus_alloc_req(chan, size, req_save.pkt_type, req_save.msglen, + req_save.transaction_id, req_save.with_comp); + if (req_save.msglen) { + memcpy(req->msg, req_save.msg, req_save.msglen); + } + + for (i = 0; i < req_save.num; i++) { + qemu_sglist_add(&req->sgl, req_save.sgl[i].base, req_save.sgl[i].len); + } + +out: + if (req_save.msglen) { + g_free(req_save.msg); + } + if (req_save.num) { + g_free(req_save.sgl); + } + return req; +} + +static void channel_event_cb(EventNotifier *e) +{ + VMBusChannel *chan = container_of(e, VMBusChannel, notifier); + if (event_notifier_test_and_clear(e)) { + chan->notify_cb(chan); + } +} + +static int register_chan_ids(VMBusChannel *chan) +{ + int ret; + + ret = hyperv_set_evt_notifier(chan->connid, &chan->notifier); + if (ret) { + return ret; + } + + set_bit(chan->relid, chan->vmbus->chan_relid_bitmap); + set_bit(chan->connid, chan->vmbus->connection_id_bitmap); + return 0; +} + +static void unregister_chan_ids(VMBusChannel *chan) +{ + clear_bit(chan->connid, chan->vmbus->connection_id_bitmap); + clear_bit(chan->relid, chan->vmbus->chan_relid_bitmap); + hyperv_set_evt_notifier(chan->connid, NULL); +} + +static void init_channel(VMBus *vmbus, VMBusDevice *dev, VMBusDeviceClass *vdc, + VMBusChannel *chan, uint16_t idx, Error **errp) +{ + int res; + + chan->dev = dev; + chan->notify_cb = vdc->chan_notify_cb; + chan->subchan_idx = idx; + chan->vmbus = vmbus; + + chan->relid = find_next_zero_bit(vmbus->chan_relid_bitmap, + VMBUS_CHAN_RELID_COUNT, + VMBUS_CHAN_FIRST_RELID); + if (chan->relid == VMBUS_CHAN_RELID_COUNT) { + error_setg(errp, "no spare relid"); + return; + } + + chan->connid = find_next_zero_bit(vmbus->connection_id_bitmap, + VMBUS_CHAN_CONNID_COUNT, + VMBUS_CHAN_FIRST_CONNID); + if (chan->connid == VMBUS_CHAN_CONNID_COUNT) { + error_setg(errp, "no spare connid"); + return; + } + + res = event_notifier_init(&chan->notifier, 0); + if (res) { + error_setg(errp, "event_notifier_init: %d", res); + return; + } + + event_notifier_set_handler(&chan->notifier, channel_event_cb); + + res = register_chan_ids(chan); + if (res) { + error_setg(errp, "register_chan_ids: %d", res); + event_notifier_cleanup(&chan->notifier); + return; + } +} + +static void deinit_channel(VMBusChannel *chan) +{ + assert(chan->state == VMCHAN_INIT); + QTAILQ_REMOVE(&chan->vmbus->channel_list, chan, link); + unregister_chan_ids(chan); + event_notifier_cleanup(&chan->notifier); +} + +static void create_channels(VMBus *vmbus, VMBusDevice *dev, Error **errp) +{ + uint16_t i; + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(dev); + Error *err = NULL; + + dev->num_channels = vdc->num_channels ? vdc->num_channels(dev) : 1; + if (dev->num_channels < 1) { + error_setg(&err, "invalid #channels: %u", dev->num_channels); + goto error_out; + } + + dev->channels = g_new0(VMBusChannel, dev->num_channels); + for (i = 0; i < dev->num_channels; i++) { + init_channel(vmbus, dev, vdc, &dev->channels[i], i, &err); + if (err) { + goto err_init; + } + + /* + * The guest drivers depend on the device subchannels (channels #1+) to + * be offered after the main channel (channel #0) of that device. To + * ensure that, record the channels on the channel list in the order + * they appear within the device. + */ + QTAILQ_INSERT_TAIL(&vmbus->channel_list, &dev->channels[i], link); + } + + return; + +err_init: + while (i--) { + deinit_channel(&dev->channels[i]); + } +error_out: + error_propagate(errp, err); +} + +static void free_channels(VMBus *vmbus, VMBusDevice *dev) +{ + uint16_t i; + for (i = 0; i < dev->num_channels; i++) { + deinit_channel(&dev->channels[i]); + } + g_free(dev->channels); +} + +static HvSintRoute *make_sint_route(VMBus *vmbus, uint32_t vp_index) +{ + VMBusChannel *chan; + + if (vp_index == vmbus->target_vp) { + hyperv_sint_route_ref(vmbus->sint_route); + return vmbus->sint_route; + } + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (chan->target_vp == vp_index && chan->notify_route) { + hyperv_sint_route_ref(chan->notify_route); + return chan->notify_route; + } + } + + return hyperv_sint_route_new(vp_index, VMBUS_SINT, NULL, NULL); +} + +static void open_channel(VMBusChannel *chan) +{ + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(chan->dev); + + chan->gpadl = vmbus_get_gpadl(chan, chan->rb_gpadl); + if (!chan->gpadl) { + return; + } + + if (ringbuf_init(&chan->ringbuf_rcv, chan, DMA_DIRECTION_TO_DEVICE) || + ringbuf_init(&chan->ringbuf_snd, chan, DMA_DIRECTION_FROM_DEVICE)) { + goto put_gpadl; + } + + chan->notify_route = make_sint_route(chan->vmbus, chan->target_vp); + if (!chan->notify_route) { + goto put_gpadl; + } + + if (vdc->open_channel && vdc->open_channel(chan->dev)) { + goto err_vdc_open; + } + + return; + +err_vdc_open: + hyperv_sint_route_unref(chan->notify_route); +put_gpadl: + vmbus_put_gpadl(chan->gpadl); + chan->gpadl = NULL; +} + +static void close_channel(VMBusChannel *chan) +{ + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(chan->dev); + + if (chan->state != VMCHAN_OPEN) { + return; + } + + if (vdc->close_channel) { + vdc->close_channel(chan->dev); + } + + vmbus_put_gpadl(chan->gpadl); + chan->gpadl = NULL; + chan->state = VMCHAN_INIT; + chan->snd_reserved = 0; + hyperv_sint_route_unref(chan->notify_route); + chan->notify_route = NULL; +} + +static int channel_post_load(void *opaque, int version_id) +{ + VMBusChannel *chan = opaque; + + if (chan->state == VMCHAN_OPENING || chan->state == VMCHAN_OPEN) { + open_channel(chan); + } + + /* + * if the channel was still transitioning we'll report failure via reply + * message, no need to error out now + */ + if (chan->state == VMCHAN_OPEN && channel_broken(chan)) { + chan->state = VMCHAN_INIT; + return -1; + } + + if (chan->state == VMCHAN_OPEN) { + /* resume processing on the guest side if it missed the notification */ + kvm_hv_sint_route_set_sint(chan->notify_route); + } + return 0; +} + +static const VMStateDescription vmstate_channel = { + .name = "vmbus/channel", + .version_id = 0, + .minimum_version_id = 0, + .post_load = channel_post_load, + .fields = (VMStateField[]) { + VMSTATE_UINT32(relid, VMBusChannel), + VMSTATE_UINT16(subchan_idx, VMBusChannel), + VMSTATE_UINT32(connid, VMBusChannel), + VMSTATE_UINT32(open_id, VMBusChannel), + VMSTATE_UINT32(target_vp, VMBusChannel), + VMSTATE_UINT32(rb_gpadl, VMBusChannel), + VMSTATE_UINT32(rb_rcv_offset, VMBusChannel), + VMSTATE_UINT32(offer_state, VMBusChannel), + VMSTATE_UINT32(state, VMBusChannel), + VMSTATE_END_OF_LIST() + } +}; + +static VMBusChannel *find_channel(VMBus *vmbus, uint32_t relid) +{ + VMBusChannel *chan; + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (chan->relid == relid) { + return chan; + } + } + return NULL; +} + +static int enqueue_incoming_message(VMBus *vmbus, + const struct hyperv_post_message_input *msg) +{ + uint8_t idx, prev_size; + + qemu_mutex_lock(&vmbus->rx_queue_lock); + + if (vmbus->rx_queue_size == VMBUS_RX_QUEUE_CAPACITY) { + qemu_mutex_unlock(&vmbus->rx_queue_lock); + return -ENOBUFS; + } + + prev_size = vmbus->rx_queue_size; + idx = (vmbus->rx_queue_head + vmbus->rx_queue_size) % + VMBUS_RX_QUEUE_CAPACITY; + memcpy(&vmbus->rx_queue[idx], msg, sizeof(*msg)); + vmbus->rx_queue_size++; + + qemu_mutex_unlock(&vmbus->rx_queue_lock); + + /* only need to resched if the queue was empty before */ + if (!prev_size) { + vmbus_resched(vmbus); + } + + return 0; +} + +static uint64_t vmbus_recv_message(const struct hyperv_post_message_input *msg, + void *data) +{ + VMBus *vmbus = data; + struct vmbus_message_header *vmbus_msg; + + if (msg->message_type != HV_MESSAGE_VMBUS) { + return HV_STATUS_INVALID_HYPERCALL_INPUT; + } + + if (msg->payload_size < sizeof(struct vmbus_message_header)) { + return HV_STATUS_INVALID_HYPERCALL_INPUT; + } + + vmbus_msg = (struct vmbus_message_header*)msg->payload; + + trace_vmbus_recv_message(vmbus_msg->message_type, msg->payload_size); + + if (vmbus_msg->message_type == VMBUS_MSG_INVALID || + vmbus_msg->message_type >= VMBUS_MSG_COUNT) { + error_report("vmbus: unknown message type %#x", + vmbus_msg->message_type); + return HV_STATUS_INVALID_HYPERCALL_INPUT; + } + + if (enqueue_incoming_message(vmbus, msg)) { + return HV_STATUS_INSUFFICIENT_BUFFERS; + } + return HV_STATUS_SUCCESS; +} + +static bool vmbus_initialized(VMBus *vmbus) +{ + return vmbus->version > 0 && vmbus->version <= VMBUS_VERSION_CURRENT; +} + +static void vmbus_reset_all(VMBus *vmbus) +{ + qbus_reset_all(BUS(vmbus)); +} + +static void post_msg(VMBus *vmbus, void *msgdata, uint32_t msglen) +{ + int ret; + struct hyperv_message msg = { + .header.message_type = HV_MESSAGE_VMBUS, + }; + + assert(!vmbus->msg_in_progress); + assert(msglen <= sizeof(msg.payload)); + assert(msglen >= sizeof(struct vmbus_message_header)); + + vmbus->msg_in_progress = true; + + trace_vmbus_post_msg(((struct vmbus_message_header *)msgdata)->message_type, + msglen); + + memcpy(msg.payload, msgdata, msglen); + msg.header.payload_size = ROUND_UP(msglen, VMBUS_MESSAGE_SIZE_ALIGN); + + ret = hyperv_post_msg(vmbus->sint_route, &msg); + if (ret == 0 || ret == -EAGAIN) { + return; + } + + error_report("message delivery fatal failure: %d; aborting vmbus", ret); + vmbus_reset_all(vmbus); +} + +static int vmbus_init(VMBus *vmbus) +{ + if (vmbus->target_vp != (uint32_t)-1) { + vmbus->sint_route = hyperv_sint_route_new(vmbus->target_vp, VMBUS_SINT, + vmbus_msg_cb, vmbus); + if (!vmbus->sint_route) { + error_report("failed to set up SINT route"); + return -ENOMEM; + } + } + return 0; +} + +static void vmbus_deinit(VMBus *vmbus) +{ + while (!QTAILQ_EMPTY(&vmbus->gpadl_list)) { + free_gpadl(vmbus, QTAILQ_FIRST(&vmbus->gpadl_list)); + } + + hyperv_sint_route_unref(vmbus->sint_route); + + vmbus->sint_route = NULL; + vmbus->int_page_gpa = 0; + vmbus->target_vp = (uint32_t)-1; + vmbus->version = 0; + vmbus->state = VMBUS_LISTEN; + vmbus->msg_in_progress = false; +} + +static void handle_initiate_contact(VMBus *vmbus, + vmbus_message_initiate_contact *msg, + uint32_t msglen) +{ + if (msglen < sizeof(*msg)) { + return; + } + + trace_vmbus_initiate_contact(msg->version_requested, msg->target_vcpu, + msg->monitor_page1, msg->monitor_page2, msg->interrupt_page); + + /* + * Reset vmbus on INITIATE_CONTACT regardless of its previous state. + * Useful, in particular, with vmbus-aware BIOS which can't shut vmbus down + * before handing over to OS loader. + */ + vmbus_reset_all(vmbus); + + vmbus->target_vp = msg->target_vcpu; + vmbus->version = msg->version_requested; + if (vmbus->version < VMBUS_VERSION_WIN8) { + /* linux passes interrupt page even when it doesn't need it */ + vmbus->int_page_gpa = msg->interrupt_page; + } + vmbus->state = VMBUS_HANDSHAKE; + + if (vmbus_init(vmbus)) { + error_report("failed to init vmbus; aborting"); + vmbus_deinit(vmbus); + return; + } +} + +static void send_handshake(VMBus *vmbus) +{ + struct vmbus_message_version_response msg = { + .header.message_type = VMBUS_MSG_VERSION_RESPONSE, + .version_supported = vmbus_initialized(vmbus), + }; + + post_msg(vmbus, &msg, sizeof(msg)); +} + +static void complete_handshake(VMBus *vmbus) +{ + vmbus->state = VMBUS_LISTEN; +} + +static void handle_request_offers(VMBus *vmbus, void *msgdata, uint32_t msglen) +{ + VMBusChannel *chan; + + if (!vmbus_initialized(vmbus)) { + return; + } + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (chan->offer_state == VMOFFER_INIT) { + chan->offer_state = VMOFFER_SENDING; + break; + } + } + + vmbus->state = VMBUS_OFFER; +} + +static void send_offer(VMBus *vmbus) +{ + VMBusChannel *chan; + struct vmbus_message_header alloffers_msg = { + .message_type = VMBUS_MSG_ALLOFFERS_DELIVERED, + }; + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (chan->offer_state == VMOFFER_SENDING) { + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(chan->dev); + QemuUUID classid = vdc->classid; + QemuUUID instanceid = chan->dev->instanceid; + struct vmbus_message_offer_channel msg = { + .header.message_type = VMBUS_MSG_OFFERCHANNEL, + .child_relid = chan->relid, + .connection_id = chan->connid, + .channel_flags = vdc->channel_flags, + .mmio_size_mb = vdc->mmio_size_mb, + .sub_channel_index = vmbus_channel_idx(chan), + .interrupt_flags = VMBUS_OFFER_INTERRUPT_DEDICATED, + }; + + /* Hyper-V wants LE GUIDs */ + qemu_uuid_bswap(&classid); + memcpy(msg.type_uuid, &classid, sizeof(classid)); + qemu_uuid_bswap(&instanceid); + memcpy(msg.instance_uuid, &instanceid, sizeof(instanceid)); + + post_msg(vmbus, &msg, sizeof(msg)); + return; + } + } + + /* no more offers, send completion message */ + post_msg(vmbus, &alloffers_msg, sizeof(alloffers_msg)); +} + +static void complete_offer(VMBus *vmbus) +{ + VMBusChannel *chan; + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (chan->offer_state == VMOFFER_SENDING) { + chan->offer_state = VMOFFER_SENT; + chan = QTAILQ_NEXT(chan, link); + if (chan) { + chan->offer_state = VMOFFER_SENDING; + } + /* more offers or terminator, no state transition */ + return; + } + } + /* no more offers, can listen again */ + vmbus->state = VMBUS_LISTEN; +} + + +static void handle_gpadl_header(VMBus *vmbus, vmbus_message_gpadl_header *msg, + uint32_t msglen) +{ + VMBusGpadl *gpadl; + uint32_t num_gfns_tot, num_gfns, i; + + if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { + return; + } + + if (msg->rangecount != 1 || + (msg->range.byte_count & (TARGET_PAGE_SIZE - 1)) || + find_gpadl(vmbus, msg->gpadl_id)) { + /* create a temporary broken GPADL to reply with failure */ + num_gfns_tot = 0; + } else { + num_gfns_tot = msg->range.byte_count >> TARGET_PAGE_BITS; + } + + gpadl = create_gpadl(vmbus, msg->gpadl_id, msg->child_relid, num_gfns_tot); + + num_gfns = (msglen - sizeof(*msg)) / sizeof(uint64_t); + if (num_gfns > num_gfns_tot) { + num_gfns = num_gfns_tot; + } + + for (i = 0; i < num_gfns; i++) { + gpadl->gfns[gpadl->seen_gfns++] = msg->range.pfn_array[i]; + } + + if (gpadl_full(gpadl)) { + vmbus->state = VMBUS_CREATE_GPADL; + } +} + +static void handle_gpadl_body(VMBus *vmbus, vmbus_message_gpadl_body *msg, + uint32_t msglen) +{ + VMBusGpadl *gpadl; + uint32_t num_gfns_left, num_gfns, i; + + if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { + return; + } + + gpadl = find_gpadl(vmbus, msg->gpadl_id); + if (!gpadl) { + /* create a temporary broken GPADL to reply with failure */ + gpadl = create_gpadl(vmbus, msg->gpadl_id, 0, 0); + } + + num_gfns_left = gpadl->num_gfns - gpadl->seen_gfns; + num_gfns = (msglen - sizeof(*msg)) / sizeof(uint64_t); + assert(num_gfns_left); + if (num_gfns > num_gfns_left) { + num_gfns = num_gfns_left; + } + + for (i = 0; i < num_gfns; i++) { + gpadl->gfns[gpadl->seen_gfns++] = msg->pfn_array[i]; + } + + if (gpadl_full(gpadl)) { + vmbus->state = VMBUS_CREATE_GPADL; + } +} + +static void send_create_gpadl(VMBus *vmbus) +{ + VMBusGpadl *gpadl; + + QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { + if (gpadl_full(gpadl) && !gpadl->alive) { + struct vmbus_message_gpadl_created msg = { + .header.message_type = VMBUS_MSG_GPADL_CREATED, + .gpadl_id = gpadl->id, + .child_relid = gpadl->child_relid, + .status = gpadl_broken(gpadl), + }; + + post_msg(vmbus, &msg, sizeof(msg)); + return; + } + } + + assert(false); +} + +static void complete_create_gpadl(VMBus *vmbus) +{ + VMBusGpadl *gpadl; + + QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { + if (gpadl_full(gpadl) && !gpadl->alive) { + if (gpadl_broken(gpadl)) { + free_gpadl(vmbus, gpadl); + } else { + gpadl->alive = true; + } + + vmbus->state = VMBUS_LISTEN; + return; + } + } + + assert(false); +} + +static void handle_gpadl_teardown(VMBus *vmbus, + vmbus_message_gpadl_teardown *msg, + uint32_t msglen) +{ + VMBusGpadl *gpadl; + + if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { + return; + } + + gpadl = find_gpadl(vmbus, msg->gpadl_id); + if (!gpadl || gpadl->in_use) { + return; + } + + gpadl->alive = false; + vmbus->state = VMBUS_TEARDOWN_GPADL; +} + +static void send_teardown_gpadl(VMBus *vmbus) +{ + VMBusGpadl *gpadl; + + QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { + if (gpadl_full(gpadl) && !gpadl->alive) { + struct vmbus_message_gpadl_torndown msg = { + .header.message_type = VMBUS_MSG_GPADL_TORNDOWN, + .gpadl_id = gpadl->id, + }; + + post_msg(vmbus, &msg, sizeof(msg)); + return; + } + } + + assert(false); +} + +static void complete_teardown_gpadl(VMBus *vmbus) +{ + VMBusGpadl *gpadl; + + QTAILQ_FOREACH(gpadl, &vmbus->gpadl_list, link) { + if (gpadl_full(gpadl) && !gpadl->alive) { + free_gpadl(vmbus, gpadl); + vmbus->state = VMBUS_LISTEN; + return; + } + } + + assert(false); +} + +static void handle_open_channel(VMBus *vmbus, vmbus_message_open_channel *msg, + uint32_t msglen) +{ + VMBusChannel *chan; + + if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { + return; + } + + chan = find_channel(vmbus, msg->child_relid); + if (!chan || chan->state != VMCHAN_INIT) { + /* FIXME: think of replying with an error */ + return; + } + + chan->state = VMCHAN_OPENING; + chan->rb_gpadl = msg->ring_buffer_gpadl_id; + chan->rb_rcv_offset = msg->ring_buffer_offset; + chan->target_vp = msg->target_vp; + chan->open_id = msg->open_id; + + open_channel(chan); + vmbus->state = VMBUS_OPEN_CHANNEL; +} + +static void send_open_channel(VMBus *vmbus) +{ + VMBusChannel *chan; + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (chan->state == VMCHAN_OPENING) { + struct vmbus_message_open_result msg = { + .header.message_type = VMBUS_MSG_OPENCHANNEL_RESULT, + .child_relid = chan->relid, + .open_id = chan->open_id, + .status = channel_broken(chan), + }; + + post_msg(vmbus, &msg, sizeof(msg)); + return; + } + } + + assert(false); +} + +static void complete_open_channel(VMBus *vmbus) +{ + VMBusChannel *chan; + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (chan->state == VMCHAN_OPENING) { + chan->state = channel_broken(chan) ? VMCHAN_INIT : VMCHAN_OPEN; + vmbus->state = VMBUS_LISTEN; + return; + } + } + + assert(false); +} + +static void handle_close_channel(VMBus *vmbus, vmbus_message_close_channel *msg, + uint32_t msglen) +{ + VMBusChannel *chan; + + if (msglen < sizeof(*msg) || !vmbus_initialized(vmbus)) { + return; + } + + chan = find_channel(vmbus, msg->child_relid); + if (!chan) { + return; + } + + close_channel(chan); +} + +static void handle_unload(VMBus *vmbus, void *msg, uint32_t msglen) +{ + vmbus->state = VMBUS_UNLOAD; +} + +static void send_unload(VMBus *vmbus) +{ + vmbus_message_header msg = { + .message_type = VMBUS_MSG_UNLOAD_RESPONSE, + }; + + qemu_mutex_lock(&vmbus->rx_queue_lock); + vmbus->rx_queue_size = 0; + qemu_mutex_unlock(&vmbus->rx_queue_lock); + + post_msg(vmbus, &msg, sizeof(msg)); + return; +} + +static void complete_unload(VMBus *vmbus) +{ + vmbus_reset_all(vmbus); +} + +static void process_incoming_message(VMBus *vmbus) +{ + struct hyperv_post_message_input *hv_msg; + struct vmbus_message_header *msg; + void *msgdata; + uint32_t msglen; + + qemu_mutex_lock(&vmbus->rx_queue_lock); + + if (!vmbus->rx_queue_size) { + goto unlock; + } + + hv_msg = &vmbus->rx_queue[vmbus->rx_queue_head]; + msglen = hv_msg->payload_size; + if (msglen < sizeof(*msg)) { + goto out; + } + msgdata = hv_msg->payload; + msg = (struct vmbus_message_header*)msgdata; + + trace_vmbus_process_incoming_message(msg->message_type); + + switch (msg->message_type) { + case VMBUS_MSG_INITIATE_CONTACT: + handle_initiate_contact(vmbus, msgdata, msglen); + break; + case VMBUS_MSG_REQUESTOFFERS: + handle_request_offers(vmbus, msgdata, msglen); + break; + case VMBUS_MSG_GPADL_HEADER: + handle_gpadl_header(vmbus, msgdata, msglen); + break; + case VMBUS_MSG_GPADL_BODY: + handle_gpadl_body(vmbus, msgdata, msglen); + break; + case VMBUS_MSG_GPADL_TEARDOWN: + handle_gpadl_teardown(vmbus, msgdata, msglen); + break; + case VMBUS_MSG_OPENCHANNEL: + handle_open_channel(vmbus, msgdata, msglen); + break; + case VMBUS_MSG_CLOSECHANNEL: + handle_close_channel(vmbus, msgdata, msglen); + break; + case VMBUS_MSG_UNLOAD: + handle_unload(vmbus, msgdata, msglen); + break; + default: + error_report("unknown message type %#x", msg->message_type); + break; + } + +out: + vmbus->rx_queue_size--; + vmbus->rx_queue_head++; + vmbus->rx_queue_head %= VMBUS_RX_QUEUE_CAPACITY; + + vmbus_resched(vmbus); +unlock: + qemu_mutex_unlock(&vmbus->rx_queue_lock); +} + +static void vmbus_run(void *opaque) +{ + VMBus *vmbus = opaque; + + if (vmbus->msg_in_progress) { + return; + } + + switch(vmbus->state) { + case VMBUS_LISTEN: + process_incoming_message(vmbus); + break; + case VMBUS_HANDSHAKE: + send_handshake(vmbus); + break; + case VMBUS_OFFER: + send_offer(vmbus); + break; + case VMBUS_CREATE_GPADL: + send_create_gpadl(vmbus); + break; + case VMBUS_TEARDOWN_GPADL: + send_teardown_gpadl(vmbus); + break; + case VMBUS_OPEN_CHANNEL: + send_open_channel(vmbus); + break; + case VMBUS_UNLOAD: + send_unload(vmbus); + break; + default: + assert(false); + }; +} + +static void vmbus_msg_cb(void *data, int status) +{ + VMBus *vmbus = data; + + assert(vmbus->msg_in_progress); + + trace_vmbus_post_reply_callback(status); + + if (status == -EAGAIN) { + goto out; + } + if (status) { + error_report("message delivery fatal failure: %d; aborting vmbus", + status); + vmbus_reset_all(vmbus); + return; + } + + switch (vmbus->state) { + case VMBUS_HANDSHAKE: + complete_handshake(vmbus); + break; + case VMBUS_OFFER: + complete_offer(vmbus); + break; + case VMBUS_CREATE_GPADL: + complete_create_gpadl(vmbus); + break; + case VMBUS_TEARDOWN_GPADL: + complete_teardown_gpadl(vmbus); + break; + case VMBUS_OPEN_CHANNEL: + complete_open_channel(vmbus); + break; + case VMBUS_UNLOAD: + complete_unload(vmbus); + break; + default: + assert(false); + } + +out: + vmbus->msg_in_progress = false; + vmbus_resched(vmbus); +} + +static void vmbus_resched(VMBus *vmbus) +{ + aio_bh_schedule_oneshot(qemu_get_aio_context(), vmbus_run, vmbus); +} + +static void vmbus_signal_event(EventNotifier *e) +{ + VMBusChannel *chan; + VMBus *vmbus = container_of(e, VMBus, notifier); + unsigned long *int_map; + hwaddr addr, len; + bool is_dirty = false; + + if (!event_notifier_test_and_clear(e)) { + return; + } + + trace_vmbus_signal_event(); + + if (!vmbus->int_page_gpa) { + return; + } + + addr = vmbus->int_page_gpa + TARGET_PAGE_SIZE / 2; + len = TARGET_PAGE_SIZE / 2; + int_map = cpu_physical_memory_map(addr, &len, 1); + if (len != TARGET_PAGE_SIZE / 2) { + goto unmap; + } + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + if (bitmap_test_and_clear_atomic(int_map, chan->relid, 1)) { + event_notifier_set(&chan->notifier); + is_dirty = true; + } + } + +unmap: + cpu_physical_memory_unmap(int_map, len, 1, is_dirty); +} + +static void vmbus_dev_realize(DeviceState *dev, Error **errp) +{ + VMBusDevice *vdev = VMBUS_DEVICE(dev); + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); + VMBus *vmbus = VMBUS(qdev_get_parent_bus(dev)); + BusChild *child; + Error *err = NULL; + char idstr[UUID_FMT_LEN + 1]; + + if (!qemu_uuid_is_null(&vdc->instanceid)) { + /* Class wants to only have a single instance with a fixed UUID */ + vdev->instanceid = vdc->instanceid; + } + assert(!qemu_uuid_is_null(&vdev->instanceid)); + + /* Check for instance id collision for this class id */ + QTAILQ_FOREACH(child, &BUS(vmbus)->children, sibling) { + VMBusDevice *child_dev = VMBUS_DEVICE(child->child); + + if (child_dev == vdev) { + continue; + } + + if (qemu_uuid_is_equal(&child_dev->instanceid, &vdev->instanceid)) { + qemu_uuid_unparse(&vdev->instanceid, idstr); + error_setg(&err, "duplicate vmbus device instance id %s", idstr); + goto error_out; + } + } + + vdev->dma_as = &address_space_memory; + + create_channels(vmbus, vdev, &err); + if (err) { + goto error_out; + } + + if (vdc->vmdev_realize) { + vdc->vmdev_realize(vdev, &err); + if (err) { + goto err_vdc_realize; + } + } + return; + +err_vdc_realize: + free_channels(vmbus, vdev); +error_out: + error_propagate(errp, err); +} + +static void vmbus_dev_reset(DeviceState *dev) +{ + uint16_t i; + VMBusDevice *vdev = VMBUS_DEVICE(dev); + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); + + if (vdc->vmdev_reset) { + vdc->vmdev_reset(vdev); + } + + if (vdev->channels) { + for (i = 0; i < vdev->num_channels; i++) { + VMBusChannel *chan = &vdev->channels[i]; + if (chan->state == VMCHAN_OPEN) { + close_channel(chan); + } + chan->offer_state = VMOFFER_INIT; + } + } +} + +static void vmbus_dev_unrealize(DeviceState *dev, Error **errp) +{ + VMBusDevice *vdev = VMBUS_DEVICE(dev); + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); + VMBus *vmbus = VMBUS(qdev_get_parent_bus(dev)); + + if (vdc->vmdev_unrealize) { + vdc->vmdev_unrealize(vdev, errp); + } + free_channels(vmbus, vdev); +} + +static void vmbus_dev_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *kdev = DEVICE_CLASS(klass); + kdev->bus_type = TYPE_VMBUS; + kdev->realize = vmbus_dev_realize; + kdev->unrealize = vmbus_dev_unrealize; + kdev->reset = vmbus_dev_reset; +} + +static int vmbus_dev_post_load(void *opaque, int version_id) +{ + int ret; + uint16_t i; + VMBusDevice *dev = opaque; + + for (i = 0; i < dev->num_channels; i++) { + ret = register_chan_ids(&dev->channels[i]); + if (ret) { + goto err_reg; + } + } + + return 0; + +err_reg: + while (i--) { + unregister_chan_ids(&dev->channels[i]); + } + return ret; +} + +const VMStateDescription vmstate_vmbus_dev = { + .name = TYPE_VMBUS_DEVICE, + .version_id = 0, + .minimum_version_id = 0, + .post_load = vmbus_dev_post_load, + .fields = (VMStateField[]) { + VMSTATE_UINT8_ARRAY(instanceid.data, VMBusDevice, 16), + VMSTATE_UINT16(num_channels, VMBusDevice), + VMSTATE_STRUCT_VARRAY_POINTER_UINT16(channels, VMBusDevice, num_channels, + vmstate_channel, VMBusChannel), + VMSTATE_END_OF_LIST() + } +}; + +/* vmbus generic device base */ +static const TypeInfo vmbus_dev_type_info = { + .name = TYPE_VMBUS_DEVICE, + .parent = TYPE_DEVICE, + .abstract = true, + .instance_size = sizeof(VMBusDevice), + .class_size = sizeof(VMBusDeviceClass), + .class_init = vmbus_dev_class_init, +}; + +static void vmbus_realize(BusState *bus, Error **errp) +{ + int ret = 0; + Error *local_err = NULL; + VMBus *vmbus = VMBUS(bus); + + qemu_mutex_init(&vmbus->rx_queue_lock); + + QTAILQ_INIT(&vmbus->gpadl_list); + QTAILQ_INIT(&vmbus->channel_list); + + ret = hyperv_set_msg_handler(VMBUS_MESSAGE_CONNECTION_ID, + vmbus_recv_message, vmbus); + if (ret != 0) { + error_setg(&local_err, "hyperv set message handler failed: %d", ret); + goto error_out; + } + + ret = event_notifier_init(&vmbus->notifier, 0); + if (ret != 0) { + error_setg(&local_err, "event notifier failed to init with %d", ret); + goto remove_msg_handler; + } + + event_notifier_set_handler(&vmbus->notifier, vmbus_signal_event); + ret = hyperv_set_evt_notifier(VMBUS_EVENT_CONNECTION_ID, + &vmbus->notifier); + if (ret != 0) { + error_setg(&local_err, "hyperv set event handler failed with %d", ret); + goto clear_event_notifier; + } + + return; + +clear_event_notifier: + event_notifier_cleanup(&vmbus->notifier); +remove_msg_handler: + hyperv_set_msg_handler(VMBUS_MESSAGE_CONNECTION_ID, NULL, NULL); +error_out: + qemu_mutex_destroy(&vmbus->rx_queue_lock); + error_propagate(errp, local_err); +} + +static void vmbus_unrealize(BusState *bus, Error **errp) +{ + VMBus *vmbus = VMBUS(bus); + + hyperv_set_msg_handler(VMBUS_MESSAGE_CONNECTION_ID, NULL, NULL); + hyperv_set_evt_notifier(VMBUS_MESSAGE_CONNECTION_ID, NULL); + event_notifier_cleanup(&vmbus->notifier); + + qemu_mutex_destroy(&vmbus->rx_queue_lock); +} + +static void vmbus_reset(BusState *bus) +{ + vmbus_deinit(VMBUS(bus)); +} + +static char *vmbus_get_dev_path(DeviceState *dev) +{ + BusState *bus = qdev_get_parent_bus(dev); + return qdev_get_dev_path(bus->parent); +} + +static char *vmbus_get_fw_dev_path(DeviceState *dev) +{ + VMBusDevice *vdev = VMBUS_DEVICE(dev); + char path[32 + 1 + UUID_FMT_LEN + 1]; + int off; + + off = snprintf(path, sizeof(path), "%s@", qdev_fw_name(dev)); + if (sizeof(path) - off > UUID_FMT_LEN) { + qemu_uuid_unparse(&vdev->instanceid, path + off); + } + return g_strdup(path); +} + +static void vmbus_class_init(ObjectClass *klass, void *data) +{ + BusClass *k = BUS_CLASS(klass); + + k->get_dev_path = vmbus_get_dev_path; + k->get_fw_dev_path = vmbus_get_fw_dev_path; + k->realize = vmbus_realize; + k->unrealize = vmbus_unrealize; + k->reset = vmbus_reset; +} + +static const TypeInfo vmbus_type_info = { + .name = TYPE_VMBUS, + .parent = TYPE_BUS, + .instance_size = sizeof(VMBus), + .class_init = vmbus_class_init, +}; + +typedef struct VMBusBridge { + SysBusDevice parent_obj; + + VMBus bus; +} VMBusBridge; + +#define VMBUS_BRIDGE(obj) OBJECT_CHECK(VMBusBridge, (obj), TYPE_VMBUS_BRIDGE) + +static void vmbus_bridge_realize(DeviceState *dev, Error **errp) +{ + VMBus *vmbus = &VMBUS_BRIDGE(dev)->bus; + qbus_create_inplace(vmbus, sizeof(VMBus), TYPE_VMBUS, dev, "vmbus"); +} + +static int vmbus_post_load(void *opaque, int version_id) +{ + int ret; + VMBusChannel *chan; + VMBus *vmbus = &VMBUS_BRIDGE(opaque)->bus; + + QTAILQ_FOREACH(chan, &vmbus->channel_list, link) { + unregister_chan_ids(chan); + } + + ret = vmbus_init(vmbus); + if (ret) { + return ret; + } + + vmbus_resched(vmbus); + return 0; +} + +static const VMStateDescription vmstate_post_message_input = { + .name = "vmbus/hyperv_post_message_input", + .version_id = 0, + .minimum_version_id = 0, + .fields = (VMStateField[]) { + VMSTATE_UINT32(connection_id, struct hyperv_post_message_input), + VMSTATE_UINT32(message_type, struct hyperv_post_message_input), + VMSTATE_UINT32(payload_size, struct hyperv_post_message_input), + VMSTATE_UINT8_ARRAY(payload, struct hyperv_post_message_input, + HV_MESSAGE_PAYLOAD_SIZE), + VMSTATE_END_OF_LIST() + } +}; + +static bool vmbus_rx_queue_needed(void *opaque) +{ + VMBus *vmbus = &VMBUS_BRIDGE(opaque)->bus; + return vmbus->rx_queue_size; +} + +static const VMStateDescription vmstate_rx_queue = { + .name = "vmbus/rx_queue", + .version_id = 0, + .minimum_version_id = 0, + .needed = vmbus_rx_queue_needed, + .fields = (VMStateField[]) { + VMSTATE_UINT8(bus.rx_queue_head, VMBusBridge), + VMSTATE_UINT8(bus.rx_queue_size, VMBusBridge), + VMSTATE_STRUCT_ARRAY(bus.rx_queue, VMBusBridge, + VMBUS_RX_QUEUE_CAPACITY, 0, + vmstate_post_message_input, + struct hyperv_post_message_input), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_vmbus_bridge = { + .name = TYPE_VMBUS_BRIDGE, + .version_id = 0, + .minimum_version_id = 0, + .post_load = vmbus_post_load, + .fields = (VMStateField[]) { + VMSTATE_UINT32(bus.state, VMBusBridge), + VMSTATE_UINT32(bus.version, VMBusBridge), + VMSTATE_UINT32(bus.target_vp, VMBusBridge), + VMSTATE_UINT64(bus.int_page_gpa, VMBusBridge), + VMSTATE_QTAILQ_V(bus.gpadl_list, VMBusBridge, 0, + vmstate_gpadl, VMBusGpadl, link), + VMSTATE_END_OF_LIST() + }, + .subsections = (const VMStateDescription*[]) { + &vmstate_rx_queue, + NULL + } +}; + +static void vmbus_bridge_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *k = DEVICE_CLASS(klass); + k->realize = vmbus_bridge_realize; + k->fw_name = "vmbus@0"; + set_bit(DEVICE_CATEGORY_BRIDGE, k->categories); + k->vmsd = &vmstate_vmbus_bridge; + k->user_creatable = false; +} + +static const TypeInfo vmbus_bridge_type_info = { + .name = TYPE_VMBUS_BRIDGE, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(VMBusBridge), + .class_init = vmbus_bridge_class_init, +}; + +VMBusBridge *vmbus_bridge; + +void vmbus_create(void) +{ + DeviceState *dev; + + assert(!vmbus_exists()); + + if (!hyperv_synic_usable()) { + error_report("VMBus requires usable Hyper-V SynIC and VP_INDEX"); + exit(1); + } + + dev = qdev_create(NULL, TYPE_VMBUS_BRIDGE); + qdev_init_nofail(dev); + vmbus_bridge = VMBUS_BRIDGE(dev); +} + +bool vmbus_exists(void) +{ + return vmbus_bridge; + // return qdev_find_recursive(sysbus_get_default(), TYPE_VMBUS_BRIDGE); +} + +static void vmbus_register_types(void) +{ + type_register_static(&vmbus_bridge_type_info); + type_register_static(&vmbus_dev_type_info); + type_register_static(&vmbus_type_info); +} + +type_init(vmbus_register_types) diff --git a/hw/vmbus/Makefile.objs b/hw/vmbus/Makefile.objs new file mode 100644 index 0000000000..3f0708588e --- /dev/null +++ b/hw/vmbus/Makefile.objs @@ -0,0 +1 @@ +obj-y += vmbus.o diff --git a/hw/vmbus/trace-events b/hw/vmbus/trace-events new file mode 100644 index 0000000000..4e1c507cb8 --- /dev/null +++ b/hw/vmbus/trace-events @@ -0,0 +1,8 @@ +# vmbus +vmbus_initiate_contact(uint32_t version, uint32_t vcpu, uint64_t monitor_page1, uint64_t monitor_page2, uint64_t interrupt_page) "version requested %d, target vcpu %d, monitor pages 0x%"PRIx64" 0x%"PRIx64", interrupt page 0x%"PRIx64"" +vmbus_recv_message(uint32_t type, uint32_t size) "recvd message type %d, size %d" +vmbus_signal_event(void) "vmbus event signaled" +vmbus_signal_channel(uint32_t relid) "signaling channel id %d" +vmbus_post_msg(uint32_t type, uint32_t size) "posting message type %d, size %d" +vmbus_post_reply_callback(int status) "staged message status %d" +vmbus_process_incoming_message(uint32_t message_type) "processing incoming message %d" From patchwork Tue Feb 6 20:30:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870090 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="iifewaV+"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbbzC3ZRPz9s7F for ; Wed, 7 Feb 2018 07:44:07 +1100 (AEDT) Received: from localhost ([::1]:59157 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejA61-00047R-3M for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:44:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44904) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uA-00018c-RN for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9u7-0003Hh-M1 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:50 -0500 Received: from mail-eopbgr00098.outbound.protection.outlook.com ([40.107.0.98]:32000 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9u7-0003GM-F3 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:47 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=MvFeN++Nu21eWm216p6LWwyG5ws131JGov43NPI1mU0=; b=iifewaV+ukagxSCtX311T10AJeqEw9x18HXJueHxW9CUBWrhJ2l2k0Mt2uLamgZTOcAVKOZeaF4HYqsa6jssacTJIc9vAvtjfGhNyjF/KjEUZqq/bntjEMwk6LE171hvwCA5Hw7DsL1jZLGPANhOVc/f01UqG22IIKx01jS94nY= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:43 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:35 +0300 Message-Id: <20180206203048.11096-22-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e4832ebd-c7eb-4502-70e8-08d56da0a36d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:6/4h1xmFBy12poZgiC8Zq0j71kJuMM8Zc3C31KnysSTFvlrR9EEkYWPyJs5VkH59pLWmMecfPcnRJECy4SUL5J4WrqzlN7iejKdnlW98YjaHSxNirT0WEzAYLNUZDLlpUtv3drQRfpYzrWhcfwl3O0PFc9fgaj6J3yk7YwJz/+/mZ4bNqZd/uHBvFVznTvmtdKAAxCBdkwA6U8Es2ejOy3JHnfcA06HM4Se8itUG+kzZluwDutY5yzc2KjXbglN1; 25:nh6er/jq3ShT0Op2WPG0HOvg4ZdMw76kTZQ8wxGfCw0pF4eq9CG+pLtYmTpf7IwLncycBUjZFSb7haDpLDH7yzuvmfQtgCY4Lfsq0TvH/HcAerrmGcN7igobBF9lbbE2iJArxw99u8EQmf/0F5kd+Yis2eZ0+vl9ep6KpvWxWFPda8ucFVnmFau8RzMrVH+5Wlrh6kv8lstGP/NXWZ/QsHFIyOwV/rDEqYR0Q0Z8YmbR9uVoCJpV0a2FZ/u2jIq872UL/buBmIyz8sNfIbURHrctlc+S3h3iN7SZF5xL0LWwkKOPoPe4e0JuhDBAlMz7KlBq4zljL5+iMq0PhyiwBg==; 31:pQ9QcFheazdhdIlLQ1WrjC3vhFnk/jeEuOzCh/rj8lo1BEDChpMlAyalQRMev75DO3Pss6D1kEI2sfn9AWUc3Ifor85nJtuetLgCAhRMVFxYQzrmi9pXEtWzSNERmrB1jE8Iif0bG2mnOGyzP6dvyMeQ7emdqsUcSg00M7Ef3hlYTNrLAO0k1bVDvMkfHLKmLVJ9SKU1Rbjj7latnD26gP6iVbzwnWqxr5B4nCS2akk= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:ruO7x7kc/HsOyF97h+nrdTz9dIgTwujwt4boExj3VtvYjyY4HYjwvBE2L+chPY8q/LHpOjfIvGfXt4Et2Np8jNqhPvziNXpvQneRAwgEbHdnBuguhai0RbtplkKWKmiSzdEWj2zplN9N5gkJK6+hlv4oh64vR/TtNMv0SPJd4I0VDeQW9zuQvDkpyCs62ccaJDLb6e54dYoSnMvGmml984Vbd+CZFRcKXPlohJv95T3f2GfI0g5BihBHMTp97rnHY07QCLO+xDlltc8x4NhTa3zYyrlPQsyRrlCuOPvIuWBeqszo+DQnTaFOpLGwfFrrU7QtgojisMdK/lHGewnl4ZfA4ovVaMSYhEckIkGgQlKAiU2C6UbClkUiSfSwA1ZxJFK9g0wDVe9A+ndN2EjMKrt8wMV1WayVoxjP41b/O/I=; 4:10BBUIEDTAkdebQNKcOjzXbW44AZz5svxbfo5ffQ3Sv+F/eD18P86V3Gm8SfuEoki6itTQthdhNFJQRFAqKOTMg8D5QXsadofkospw/Hnw1GgakStiSU+eqlv0iivsbWpPeyiTYSkw2ky1W0YcU4EUqg9ffHZtdUzpbOD040r+qCWDbdjtUnOMFkACZQpgnGfvIOmnL2AauhnIBAFHOP9QpTRrYT4PaFnpYFCUDyCaUXysiSES/WwKQRhC0UgnCBLdLWI3bUOf4m/jmcWGILmw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:BRUCLXqXfMGZ5fGyDIF8pdantvnMNNfMbnErKpA?= LLGsYyZe40gSXx6cJeRcEdV9lVXL7ZQHmHRyNOd5wRnTLNmS8dJD60zSW7ee0k4YSvwK4J7jAXvgyCE+bUU3V8lPaDpAELF8au/3BJtmZXTEWq8nHsufwBFgTXR6S43xO/9K/KSjuOZ2iFRj+ZV/RKk56cYxpl/KI45nvOQR95kkEA1YpPgIIpy1joqOqyphtw8uGC+0HKjN0Toz3KLL6tAKkI+E6lNsy1L4RcaNY2PkG/0V7FiTk/SVG96DCSby6/K5DHHtNB1HCRAOxBRqW3UrMrPDAglb8pn7/ZWT80EfYIpFErli6HND+0CICRqtybhTLNfBpaBEOMsQ/rt/JbyfGhg2YTgal6PIPaWk0qASxWJaxOlPUdWrqTBNKpSr/bsnfkZEq3mmW9VSapmQAPVruufoD7SrER/MD/zvW6f/VAX/CfE//FgTirOKviUpFFqI01PhR7ABK5wdIKQsxQPE7qCrYJtV7NcKcnkK1Cznjo4UhyPmLQYn53+VxD/xaoy/35DOZyD0cV4ksInOkkXs1R/QG1kv+zE4Fl4lm1b8SEnFcK0b3u2eiXlyWy9D6cWCAPF55yHML0CH6tR9BQJUwpX13PGEOML1shNS086ytSF5zC3GyKzOHJCPRc4k7U7ZyI3udV6TfFS/jG3I1UsmDqriHt6+7pKPA9pv+O4NqpQUiXPalErVaXe+3C/opiR9YB2UnKwwOvdHCQU2h4wRB6qahy9O+byuonIZZ8tX0ZDOX7pCzpXLfGj70zX8ZdNF04nbm6imkI+4XKzxL34gK+LifqDs5mqS3ky5grtQJCG99OqOZFFqSAp/c7Sh2WcVboJgbhlXBOVZVaQPmp2GHoqn8ANmn+9SGMYfkBJKOIF4b5zfjql+2vjTs6i2WCruLepMFQZDxFsLqInDCVlb2QTRd0OWsb275qVww00xN1x4RrEDIrCHwN08CPHbxKNWh8klj1pvpePouNb52JzFUCzUWY/CnUGTtFZFaKJk9WeKRj09SttlsDgi+NYiEb3LgnqukPVHlRQBNW2EsykoDskEGxSSKeaBjOwA/qK+u9v5Bo/mXvFpY87FAKR3sxu3FyMBB+6JXUC7Jrfi2aZCX792XLK3jYTE9p9Q5dckvkwXx4vj5cp4h3FnZ+lDdPP1177ECzjf+8wNIVWdemLzx4QarO+RkO8i6tePBetXY0LrmIJGcO370mJHbeIkT5D3g5J/2SnQ+e37D6+w6Axtt3nxnTBUaqIdaVYIzCKG79Y/yVpPGHAlF4ZSsrVrqONJKDm6xCWQWiqZTPHW87Dwd0H9F+Tqfa/4s4DK+otYsCA== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:7V294+lGw50o+1O+HIuL0VXofxyN5SuCF8y73uSwCE2VW3mcVRwZUE33rTueDB13o2FodjAmVdEd/fAAe+IQsNvq6n+bsMMP8yp2usUrqhdsQ5g7IFxXHYtB8rpnOf37ENCaXJgustbGwMpjLZhEhjkwkHL9AeX6AJvRLVYX9kJgc/v0/STrNJaEGxDvLyiXZ8STBIG1CnFh0c0tAz+U/Q6lMx7KWOdt2lAiLwYJCDBu1BMKnU54amvnK6zcXeWqVh9xzG7P/HK/8kmUluCnkQtVI/uPovhDY++HH5uagtvL1t9bzoYzlzFP7XCHdrJxfYzclwOQgYDS78bU1toj+pjWAEq59uHl3q7eQJ/fk1g=; 5:SqjjdKs7YxvXhSB0uLsAgLW8qlw739OT5SqbBAVdBiaug+EARxx/KZBC3yGBXEWf6MU8XBt2T7xGtuR6qJOuhEA3WAtyDiQeaQR9F6WJ7MkSJXQoUAHTIld9obtkBIcyZsRPyjPXqWeUR0EDplKlK5UAbfYVK9ajodsb0nqCyrk=; 24:NCpL1N2xLK1WFmCOqE3gLS4JeBvv3Nc8IHhE6N5pVoF0b+qJ0aTV0LFShLNQGzUjsRfSevIaHgQNw/xRcIH4/Oi0UjbKbaRfmo4BOLO+rZ8=; 7:ohhI9uXBH1o8jP9IYco5jnKqnbIXqAPc9L0SEONr3NSgWGDF5t5yKJBt6b5hz7PJlKIpkrfgZP7z7786CctY5DnzoFNpx0QHc5yoVslTrXKEBxHFPvEJHbYeRyN1bB3tpd9rW/jGkGDYBzsdK8pdHCxUHeyiTjQVTZFysDVgMfsJjq3MSmXncRjLT4n7gkDAp8TdFBKSF4oswdt5u4QjEOoA6/Kf/1rYANPY7UU0h9SeDyybc7a1sJM+SdAY6HkU SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:qXkKqU7HnmSPXRhbEiG8NwXTVdIi9+W7w+n049hPTBSq5S0Ir25Csdh/16mU55+upyBvyQlS/eXDOyXfhX9u0WSlEqr70szARD1Q5matT7XkGsPHO3rEk5YmyaP3YhaHSAJsflK7L9Zo3H21yNTUIFf/k1l3RIM9tZmu3jqZEd0= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:43.7471 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e4832ebd-c7eb-4502-70e8-08d56da0a36d X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.98 Subject: [Qemu-devel] [RFC PATCH 21/34] vmbus: build configuration X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Evgeny Yakovlev Add option to configure and makefiles to enable building vmbus support (default to "on" on Linux and "off" otherwise). Signed-off-by: Roman Kagan --- configure | 11 +++++++++++ hw/Makefile.objs | 1 + 2 files changed, 12 insertions(+) diff --git a/configure b/configure index 302fdc92ff..5a0ca5dc4a 100755 --- a/configure +++ b/configure @@ -436,6 +436,7 @@ jemalloc="no" replication="yes" vxhs="" libxml2="" +vmbus="no" supported_cpu="no" supported_os="no" @@ -804,6 +805,7 @@ Linux) vhost_net="yes" vhost_scsi="yes" vhost_vsock="yes" + vmbus="yes" QEMU_INCLUDES="-I\$(SRC_PATH)/linux-headers -I$(pwd)/linux-headers $QEMU_INCLUDES" supported_os="yes" ;; @@ -1341,6 +1343,10 @@ for opt do ;; --disable-git-update) git_update=no ;; + --disable-vmbus) vmbus="no" + ;; + --enable-vmbus) vmbus="yes" + ;; *) echo "ERROR: unknown option $opt" echo "Try '$0 --help' for more information" @@ -1592,6 +1598,7 @@ disabled with --disable-FEATURE, default is enabled if available: crypto-afalg Linux AF_ALG crypto backend driver vhost-user vhost-user support capstone capstone disassembler support + vmbus Hyper-V VMBus devices support NOTE: The object files are built at the place where configure is launched EOF @@ -5657,6 +5664,7 @@ echo "avx2 optimization $avx2_opt" echo "replication support $replication" echo "VxHS block device $vxhs" echo "capstone $capstone" +echo "vmbus support $vmbus" if test "$sdl_too_old" = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -6347,6 +6355,9 @@ fi if test "$have_static_assert" = "yes" ; then echo "CONFIG_STATIC_ASSERT=y" >> $config_host_mak fi +if test "$vmbus" = "yes" ; then + echo "CONFIG_VMBUS=y" >> $config_host_mak +fi if test "$have_utmpx" = "yes" ; then echo "HAVE_UTMPX=y" >> $config_host_mak diff --git a/hw/Makefile.objs b/hw/Makefile.objs index cf4cb2010b..c12fc0cc22 100644 --- a/hw/Makefile.objs +++ b/hw/Makefile.objs @@ -34,6 +34,7 @@ devices-dirs-$(CONFIG_SOFTMMU) += watchdog/ devices-dirs-$(CONFIG_SOFTMMU) += xen/ devices-dirs-$(CONFIG_MEM_HOTPLUG) += mem/ devices-dirs-$(CONFIG_SOFTMMU) += smbios/ +devices-dirs-$(CONFIG_VMBUS) += vmbus/ devices-dirs-y += core/ common-obj-y += $(devices-dirs-y) obj-y += $(devices-dirs-y) From patchwork Tue Feb 6 20:30:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870111 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="AiD0Jewa"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcXZ5gsjz9t0m for ; Wed, 7 Feb 2018 08:09:33 +1100 (AEDT) Received: from localhost ([::1]:34149 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAUc-0004JP-D9 for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:09:30 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44905) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uA-00018d-RS for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:52 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9u8-0003I2-2u for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:50 -0500 Received: from mail-eopbgr00098.outbound.protection.outlook.com ([40.107.0.98]:32000 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9u7-0003GM-SC for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:48 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=7Zeco3xCxjdx2pw4cRdXAXBi3YLtPvx39HDdBxl/HBI=; b=AiD0JewafHKGaDdi68A7bybzod9px6QtbNS8YdKIKnIHIa7OtQ//plZ9hU2moc0O2mjhV5Rbsk5rqX32VaX3zTKA9oPjxw1L7nHotVDqmZNEuISlKgqCYJ7rMoSucYWF1bWbYsiEF7HfZC5R6Rp5ufB1tmWTqQgfgbklAkCNgIo= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:45 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:36 +0300 Message-Id: <20180206203048.11096-23-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 39af4b7d-baff-4e04-7a8e-08d56da0a459 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:FpQFVyC4L5IvxazrM9XKhbvo8UKwKRKw6i0SCK7fL+E1ka5mnxXc4xLnbPAMydEzJ0/3iFabXhtFmkOA5kTGxZlbgw37rnKCGjKXRAej8dy6xIL0dGwKsHAKoZFXhoFs66ggnEgIVX+CApULtaux1T5UV7pQQ/eIRdZdUFV5w6e3QH/XpXDVKlwY0RRiwbyea0+96hA4PPYSlMmTphxV34yA1pZE6WnZNIzNRZY0qvtG7t3MCIHVKjQkUWAp5qmx; 25:ZHa5y3s1RUGF3zov2QU4ecwt1NHydvG03Ga/JUkXFJQfRej9v/fR8rh9ryQDHEaenuyryhsaBGKcqA5LcTOV9yfbVYKJy2SOKl5MY7N9BZ+WqNbdlq2Qesl378PyX10euqtUc9w8QU5P3vBplBbUhKwNj+g2K7QdINDsImK8nkDXJooBHxRb1atkCIu5DORe/OXOyqzzguCusLZd6Z6VXuI4mxuZ+2j8z4NW9OIIRK+6JprvWCpmPh3EGxuLJod2qhW18bHD9J93PKU2ll65BRHsfg59ihJ2ffVnClrJLFzQTOc3smthKvsh6SADSB3tCD/7VNwJlvZQsTUHM1F6IQ==; 31:2GBPVuqKnuv9cO0xOnTJRb7DFvwcdShPks0Z1g5RuTzAmJfamOkD+R+r8Pd5C7wdCnyfLmZLDzgceVtUoO6sXL8FTZ5C4B50zDxAM2Z65AS14ZgyLl0ww9Gn99T3g9Q8E+bnbsceIUlsunUr3hsp3z0lUv9j4p6JT3iIlbmXqPIryS9a2qtfIuJVQaZlQTM+4Ed+p9y7JFSzii8RnFf9MYkPq50A4INzxzKojnJpnMA= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:fsMJvonrh9Hm6B6uj6/iHXP2DaQhEkXMaG0D7CNZHUvBeMD+Ad4ZbutOA0xQ6JN/SeUfHBIztIFaEpXCC3nh0kmccUeHbm5ZCXjkqqSTFVqVXy/UyXYIUDqNju6LTvap3klHb0cUxOikGH+Sd3XUacMxJYVWZ6rKDDu9AzhSFZMWdL2F37IC0NqeBgnlbNLHhvlp8HwYU0YktD71oG5U/x7CD4z2NsYbsb0XMb0Q47QDA/fm+R6MYAgwXP0frBb7ixLG9UisSF+1wlSfRXkADz77EVy5l+QUDtnHfh5Eg+IOAcI99xHHkRDULKnqZ+K4jkdc2dqw7BOdTI7rhvzruq9Df8Kodil4Pqi2bCLA+vgRbX4k7sRW1rQPl5r49aVjz78j6vOKmF2L5Fw4c6Oo0nE/6zFOfL+z5R/XAm9LLcM=; 4:h52WQ0E1U0C+UYIFJhwkrzaLvo14W4pon8AKh0C2WKMJiz3tPGtxql6MgKiWDWp4zjZd0Vo/2NsyGVEX7MRerC2d/UhgTpOg4CqhZreMYFQ0Jbg2zzwGGqZjYGK3oypA6RiDdlNFarsZPMAZaLkNqWsBTY+UEGwHffC+oGH577AmH08SjJWuuU4GObqtBYn08nP+Ef/MNLdOKbyEKjhQhQ3V/8waq/Rtp4MpmQtcvtkb6pq/OfILe8TUHqEvwkkpHpuHFHrlBqpvjLtyw2rl0A== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:Bt6X2lVtA1AraHoGIw3fZfXgbL4ALRPsmRgkBTg?= RgU/PZuCEL89Te2Xn5CaWGya4qzRWVpZjW4eX4WEH61MQnxcbvWQvMksB3vLs1tZLOHBDkqmPS4lEo2LhE4DXun0OiW/Pqr3agretLus6bI5Hfzv60rcshZviWv5qdpQ+Mq6JBkQgLRs0JeJOKJgM3+40RZmFryl4eOAf74cgj9Tq7yG1oUgAgpBNn56ATBUdWX2MplgqCWqLub9FyIMSLwzoEMDSod66ANC42opyGCo42+HfFyR9bmdnTnD446g4YuLqex/pn9cf4GUOj/JkjiGgl5nPVH9yCG2DhtHrXVmLe1C3Q9PaTaadzPKiKSiFaRUvaV2lPSnTXgx+oOwrFTCU0KVza3wU7eS3A1iP8EyHYlFZnZOdVpeNfTBrugIcCYtslHUWBhJwi5g8KxhPf16+MUkXA8LkFiwE3WisHvQ6PekiXm2a7f186hTcdjXhK+PCG2GBRSU1ZnolybhzY19C7L3TvaWI95v7xhjGjUdIcsx6yDd8CbmdEg0g4+bxEF49aZ2RlgP08AoTNhn0hy6iVPnEEA6Pu1CCfZF58LfdvRo39aQhFJRbNZWuhUkh91d27hNV5wO/Z0ZrtoAk59n3qW50JwKbJQPIh00JDjRWR65B5Q9IkVPurlC+Fq2ysXhEZ4UU0P4lp2MdnaKFGx1ReyUnRZOylyukJRYVjL5zZbKwOORCt9iU/jN7ezohREcOuUQ9Qgr5RJsDFGd0YkUB2uz6NBiuabXNVFsYyt+GqvnnoNS9BlPHzfsYtqC31MH4RSyu+yTAERq2EqpYhTAHO69if5omBa1KEESmSpjkyVc8eocHJWYmPx2k3f7GJmTY6ysvTdseVlfRFUW6frZTpv6tw3GqQEwP4pbWNvEeQnneDN9D+44e3wA4ex4wL3D6S78x4rfVOes15+Qrs1IAOMvBJSsxCqhn3rbkQjjRfKgdao+nGUpOFHGng1Vr8+ivXI9g3Mat8Ufq54PEm7i4tkAP1c5ROAZA2FgotGnLhYXiHI7B1cyqeUiv6RfD8y7E0d/2fGJB600X08DWx4bNlunoucLcDleTimkAtF403oSiI1qg8CVNrReNvBqT/1s075ayfQVlQQekB9cXm+LKgtpEr9uGlUkMT4L4O0SDG49lm0vn7pdabWCyZD6Cg0KE0+egQJhYg4QwtAjeGRUd8CrPz/cL8l1fvgdiz5RaUwX5vkxaMeZ2PAEPbs8bISumMXL7rPwGucPY7wTsLJzti/kRVD3mUxpsBeFC4Wmehw== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:M+OBevr2PwmVSOHR3KC9Lr9A58vVG6TkrpzyzzTCEw0Yif+sMpms5Zw8DGoOIjZDTsS1jJ7NA25gSmK/gsIUGJFSJrPwlBwPGNSKN/m5jWsP6Fjq1sVCLukkphM/qi6ACynOWh5M8QbItvvjLT6W4t8AzDuo/rVIOM1msZRHRUmWS3qTDx8fdflNfRttq+msVuo81//5gWPIgukDMRKNLAzngJRCSsQtaowy0OF9pBalNiibztJXG2Rz7bO/nbHXrn3d8qD7Hr1WqD7nFhO0Ntm5iq+3GOD2b7wfwQ1ZxHlgULLnCbkbUJGYrsR6FuxYHjk01AQjT7mraoqzbppHlWt5JiO1GqCWLsH5y2hfcGs=; 5:ITwHq/4qFYKWbkF3NrxO6BdAASOBay1hrh3u5TzDB5VplBuXZ1Vr1xFUB3/NbvvTlFmx0nW0PhwU8rWkIGvFfvQJGOo2o/LB2pRpMFs7VXO4t93x9s8nMCx6dN5BCGNcc/XK+0UfJ9G4K4KqCH/Z+Td851x9WnZBqyiD4hFM8VE=; 24:IiNdecSWUu8tISRJvWZIztcVqjkiqrzSmndaN1aLEukPSm+jWoQS6pnKprxvlo/CqDg4JJPamZ9DIaHw1AabmIHNnj04tRbClrBgTDN14k0=; 7:CoY+sP2u2roZE5G5M0DKjVt6KHIcI+gIpm5EyyqolbNc9KlrnW9B5VIJ+zVc60086oK0FHDOu6cg2dsI0KXHWFhmbhpI8rUh2j7s5B7hN6Id1NxzvQBv18gOqVLMTV3Aq/hNRQbMj9rTg0CoSMnECa1p7tqySQZ4ksnT84+vLAG3fxqi2SIIXGv/adMEvIrRQafErzSp8thpvmeK6XAgICrf0iqWxBaj0ZSq7Gmr28My1qD7KgoYpxCOYFOPdtjb SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:npEzt1d3nCZ0TuRiJVz7UPVpJx8D1gy0MPbDI3XS6wOsc++oK9pNg43iRGzRHemIVDOuWZQGmApgyVRD5DsoriSkqh6h1NDFKScbU69IimPPQI8j6AF0GiyMZBuR047ATltMOfz9AcQ8+nfL/2JP9v4quB968ZmzbQjYppo/7IQ= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:45.0284 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 39af4b7d-baff-4e04-7a8e-08d56da0a459 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.98 Subject: [Qemu-devel] [RFC PATCH 22/34] i386: Hyper-V VMBus ACPI DSDT entry X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Andrey Smetanin Guest OS uses ACPI to discover vmbus presence. Add a corresponding entry to DSDT in case vmbus has been enabled. Experimentally Windows guests were found to require this entry to include two IRQ resources, so this patch adds two semi-arbitrarily chosen ones (7 and 13). This results, in particular, in parallel port conflicting with vmbus. TODO: discover and use spare IRQs to avoid conflicts. Signed-off-by: Evgeny Yakovlev Signed-off-by: Roman Kagan --- hw/i386/acpi-build.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index ed78c4ed9f..6f8cd3eb41 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -46,6 +46,7 @@ #include "sysemu/tpm_backend.h" #include "hw/timer/mc146818rtc_regs.h" #include "sysemu/numa.h" +#include "hw/vmbus/vmbus.h" /* Supported chipsets: */ #include "hw/acpi/piix4.h" @@ -1317,6 +1318,43 @@ static Aml *build_com_device_aml(uint8_t uid) return dev; } +static Aml *build_vmbus_device_aml(void) +{ + Aml *dev; + Aml *method; + Aml *crs; + + dev = aml_device("VMBS"); + aml_append(dev, aml_name_decl("STA", aml_int(0xF))); + aml_append(dev, aml_name_decl("_HID", aml_string("VMBus"))); + aml_append(dev, aml_name_decl("_UID", aml_int(0x0))); + aml_append(dev, aml_name_decl("_DDN", aml_string("VMBUS"))); + + method = aml_method("_DIS", 0, AML_NOTSERIALIZED); + aml_append(method, aml_store(aml_and(aml_name("STA"), aml_int(0xD), NULL), + aml_name("STA"))); + aml_append(dev, method); + + method = aml_method("_PS0", 0, AML_NOTSERIALIZED); + aml_append(method, aml_store(aml_or(aml_name("STA"), aml_int(0xF), NULL), + aml_name("STA"))); + aml_append(dev, method); + + method = aml_method("_STA", 0, AML_NOTSERIALIZED); + aml_append(method, aml_store(aml_name("STA"), aml_local(0))); + aml_append(method, aml_return(aml_local(0))); + aml_append(dev, method); + + aml_append(dev, aml_name_decl("_PS3", aml_int(0x0))); + + crs = aml_resource_template(); + aml_append(crs, aml_irq_no_flags(7)); + aml_append(crs, aml_irq_no_flags(13)); + aml_append(dev, aml_name_decl("_CRS", crs)); + + return dev; +} + static void build_isa_devices_aml(Aml *table) { ISADevice *fdc = pc_find_fdc0(); @@ -1343,6 +1381,10 @@ static void build_isa_devices_aml(Aml *table) build_acpi_ipmi_devices(scope, BUS(obj)); } + if (vmbus_exists()) { + aml_append(scope, build_vmbus_device_aml()); + } + aml_append(table, scope); } From patchwork Tue Feb 6 20:30:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870096 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="EjJRnrbK"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbc9C4zn6z9t0m for ; Wed, 7 Feb 2018 07:52:47 +1100 (AEDT) Received: from localhost ([::1]:60706 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAEP-0004el-Mi for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:52:45 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44950) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uD-0001D1-Vn for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uA-0003J1-MR for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:54 -0500 Received: from mail-eopbgr00125.outbound.protection.outlook.com ([40.107.0.125]:6512 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uA-0003Ia-Cj for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:50 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=10wR7YKcZ+e56JyADh7bx9WStDVikRQe3+6IJhZck4g=; b=EjJRnrbKd47iHXnB3/f7401gULapTc+pFxig3gcRXqcoyBR2q+oXVf9TwUilAaqrtNHPWCVlJ6+afY9xAhsM37PIjuFG/UkLzm7T5TTZCCSNAIOLK19hoiC+aFsP3xBJYeVJzCv0FeaGA1iEv6d+mqmfv+ZIQ0PEpM0XAzyxeso= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:46 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:37 +0300 Message-Id: <20180206203048.11096-24-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 778496a9-a7ba-423a-3751-08d56da0a518 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:kWDQptguG4qXqjfLyYR3D//6jw5R3KPkNrHGQ5Lzmx7olY8DTjeWRk3rNPZDUCUeRUJnZ1xuZqFBpMvnZMk+FPCG9XBJzktxf0OKhMOM56pQfMVGqkYOzPPHplbTNnDc3F36Av2+L3euD1+3YJZgpMFq6EClR4vkxmpfhTRVGj9QY9s82W89jc+SyqzV7Rd21kGklzdCxfZ0YLSHZ56oGW7ffJ99uwIdjSk4zlpar9uQBuGyTn+Hb9xR9vU4fH7o; 25:f0EUXrhEKVH7jSo4r0U3OgGFBmhf2wsNJweXSpXjsZGHS3FCT6vlJfsBzBxnEyyvh/tmMWutXaOIk+QWbeSUPzMTGgiGqbXqtU1e+22fuvCW5dRNN0OOw8iSHPngyplgbFfSkVZJz2uvYyDCMWK76ohUKD1R0xEkHHgw08VAmTK+jKF9P4bPhBcEMrzdd5cT2bRjznkeY0sLt6KcLrSYVvDAX97AbLZ8n+l4KgSi5B0QY0vRwIwcWVpk1R+IUybTk44p8SaZ8gs74kxVeygaOvzwve0jNZtpenvDw25WJCAYwGQ9206fXVPZozHGMMAf13LyQrgufw8hYZGbJIPfqw==; 31:uaMkEs5pNaR0fyBZWO9piJy6vT/D04xQJsQ6bctYZGjr1YEjEvzHJNj6X3QqS1mmqCTRyKN3LZcoZh1bqAolu1AAlppZTCffwQ4rF9kwQ0AGvVyYs6xiTPZVFPImstlvCqSQUGaEKiLql3DVP32bid14zehMzLmxhU86JmWUSaNarH6P+iCz83sx+883lty24cHcnCiMCGqWCegYd4E+4sYFKgWKT5WTbk4xVINGHSY= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:en0EtT9hT2V5tmyrxixUbgHltQjrsMxs0CYYACZ/sZGoGJvbteIWNr9zTMMXTrXHcteWcDLJSNXnVUGLQPg+VVQd5HkbaK1a1g0KmaAlAX6DQBkeF+RXBERb2dOeJpAXMY0p65eWDdXVoCX1mIoOMT7krkoxora8tXM6pzttfWmEsY+dio+CR6R5+LHqUgKxEhzcAbBKIRzLruYFk73qGihpliDjmBv213Pb6jErVfukDJIYFeBYwx9xz4SuGKD4AwryoNgy9GlsXp4kDa0TIiEfJZji5OhzPZ3NvhkaKA7S9QYZvFhaUaynRTD1jJ8cMMXX/c55l4zG88+w2db21DV0/Tbdyw9V3i5O9QJ/Z8VHTXkrUV2tNvA+9uOAUnTqyiPoGuzX+jwieLT970tX8kVDdrQHoIm8DbkK7BNyIPg=; 4:P4TuSvcK7vhBeYwEeLkR6K0oksIgg4K66h0q/APVzXClt8FE/lAxK0z59oo5LxHx57CJchXMt4zdQfMg8Js0IpSnfcbWKswJeRUc3p83coEnf9CGEKZ0EVgPtNqW2M0VJT1cw8eXXEAnPJtWHuEegEwy4OxO+m6Wmn2foBiVR8Nfd0jKDkEPZpoZzouHzb4c4vW09Tiv0nC4+TkF8/4dN2p1wZ3o+FesN7lKfWr098PPKvbNIg6kv9DU4OSXMlcMcAIhtJEmSmCrm1qzNFu5XA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:plr4ficDIWqd48qFzz+pYmPQu//CIuENebuX3e+?= BgS7sdAlN1FD81ASI+gvGvBEQTQAJQdSTYCpAz9/064q5vTymDbTPBbA+LXuayBiAKLe4nATX9ESCgZe/H6Zh1g2vna+QRlpiGDxl6OgK3ZedVk+qqSLciffTdwgIcolvVp0luHW2t/3I5nbEjYNsGtH38s4JFXyhMu6uHEpDeEIsnKv4eafpR835j155WLg5Vq4PWAS85Kc7gLW4q3WzgTwbUlO328aVXcnUvk8zNf1J6v4V5jAxqJmHspWJEvUXJJOx6fafMe5yUIPPiMkMmOzFi+vPwcSxUC2JJlSTCp56vGH3IyUE6c0WOk1AvKBh9CWdu4QY1FeV4JD39HkfKGF/2zayiZhoHm7ZAugKzj/vfFp3FtCZIGodjlJ1DHzbikx5hBIPNClLLlFJtbk9o1D1P/SJoPZvL81mkaldOAguLCCEWHGxPw/BbuqnUdz31ORubkLL1ED4wIXLbdhxfOX0ES1lfBSFVPMteAy/dSJSX0N8U7cebmrdGDxsBhXg72IzsbDnjljDxqXkkWEBUnQpjzieeWYJd7ayyQHrh8vr++1ygKdNYZ3YUXkw0EvZZqTyHchE6MXFWwdnwv+C8dhbq+Z9qGKPw5wYzz0oOxgwYq3Y7ziHn2Xz0+1gO902E7mEPdVVmq6ZwwNxO6Z4Y9qdthhrFJy1KD+VMWwjHhdu3OV8EYN3SX0zBt2lS4NqvsaoKYYKOraBYtYBWvpcZucahQBgcOhcx4aN3ZYKps/EQjNSvdGs672cRO753IKa6SoX82i915gJJQhgVcCcIFByEWzgVybsVBfrIn7U/Zx/Kamc4PonkzKQv4fstNwyYI0Gf1pjeiaiobRuYFFat/+lXktlKjnUg5fIN127ZmkxAd1l7BdQeKw3JogckplikNkIT4LCj5hd5n05w472GfUICb1HW2fb0MQVSlh6Ag/aseB90Mys8ej9B90Z724u7oBx5FN68yDtDPnnBTvIUvZaG5CmIvtYJphlGz3VIcCPD6P6bmfbX2kwloECG8r6QVoKLllFbdWMM60gmjQFySe6hqwTifIlVhlmTbslGeor7nvVwgEZGsaOLFN2c8c2KjdU5Z3u3+rnh58uyE9G6vZILcOwSnhZthg6aZATN8rMNo2HG9SPWYwC4VQlBYk0GUd0D2MmNXkG/abQIVTUicS/57ehQd8t823iLpzyiZ8Bt8oCUCSE33KnWfB6xfDm6DMqKicH+Ofr59FC+xF1r/FZVhbLH102b9aog0FN1f+g2Lul4dpJkwcac/fUscP8BNQPBpWZlrFwDJTAqoxyJoaX X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:MA9nDaiSty7X39dwLEWVApg8k7otdvX4KH57sSJhuL4z5+0kX3ZUswkDolCf6QWnUne4VS2Rx2PNvfE8hpjSOAGkP77t1Q+bi+4AGej5QdWaXbDLiqJcfJwYLTe7Ub7AsCQfcnTBE4CcfXSWSmnmDmGPhlsSzf4PNdYqnK7shwJ2H93f8kMiOfPXzP9G1o3Wd384glUslpKQm0iPymELXSUylju6JhpFodtGMBgknjJJOt6wLvOWbQ/uAeAdb1wp3M0KdY19eifZPs9NqVG0CUSlJtesjEc1zgvC94OoZZ0Nm42yVVRXwzS+sJftGV5lVhkQ8wIDEU8dnJGco+gj3Q0xyui7/VYKKAHMPN0WDOI=; 5:FnBpgOv49J6uU6CCiaYMazrgDuTf/az7GB3RfWL1WralKZF49rfU3GF3HVhZKoqXwVzna4rh8W81Tn1n2HGG27Sa0iWWCw1Z+rnp0e8Unx14fMgbVRBB9zDLM65A361YHfRjzuja+rIO8SF958WymaWCXEjriBjlczsqOT92KZk=; 24:MmZtqt6iaFcnEYKgFS/O9jk8XlZL3R1lzOe4P/7RyZ9Uf8SB7MCB/W8cr9g1rbjUbDJof0wT25ZI4xpaeFSVrmesnWBQEZ3u7HIi3Lds/q0=; 7:EKhvEtRP4kT6iBJr9vZWh1fo8mNHd9rBYUmX/CNz9NJtqhn7eBXeQh+2/wGHqMleHWoIVrLSl52eXuxQ5/faMMaiZKj1ZVZjHGcu6dmOxCyn8PE5FkJD0B2VDF7tT2U1L9uBUghqT1ndBZcDL+/1yoq9YswZLBng92+Jj+JLG7uazTcxNvHVj3ifIfYjyandrsNSAV33iG9B+5yKlnutRyvdqWNql6IykfWOMaQ/4Qq59XkBoZssHOIwrRGik6R5 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:p1aWVcgK0F7ArrGVIEA9/Am2y4alafOx61hPgBWvLu3HoLbjynjIAz9Tg55QVwEyDAFQmQAilWOp1p2E5bR13W07NxbeEHwSFizbUoTpIRpYTUuzcup11sbAJXktNhVz3ZpwYieuyoCsDxvYC72cIFTnxGE8FhfeD2X17Wya2TI= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:46.5440 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 778496a9-a7ba-423a-3751-08d56da0a518 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.125 Subject: [Qemu-devel] [RFC PATCH 23/34] i386: en/disable vmbus by a machine property X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Hyper-V VMBus logically belongs to the machine, so make its presence be controlled by a boolean property of the machine. TODO: consider doing this through adding the vmbus-bridge device instead Signed-off-by: Roman Kagan --- include/hw/i386/pc.h | 3 +++ hw/i386/pc.c | 34 ++++++++++++++++++++++++++++++++++ hw/i386/pc_piix.c | 5 +++++ hw/i386/pc_q35.c | 5 +++++ util/qemu-config.c | 4 ++++ 5 files changed, 51 insertions(+) diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 744f6a20d2..62b67cd927 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -46,6 +46,7 @@ struct PCMachineState { uint64_t max_ram_below_4g; OnOffAuto vmport; OnOffAuto smm; + bool vmbus; AcpiNVDIMMState acpi_nvdimm_state; @@ -80,6 +81,7 @@ struct PCMachineState { #define PC_MACHINE_SMBUS "smbus" #define PC_MACHINE_SATA "sata" #define PC_MACHINE_PIT "pit" +#define PC_MACHINE_VMBUS "vmbus" /** * PCMachineClass: @@ -209,6 +211,7 @@ void i8042_setup_a20_line(ISADevice *dev, qemu_irq a20_out); extern int fd_bootchk; bool pc_machine_is_smm_enabled(PCMachineState *pcms); +bool pc_machine_is_vmbus_enabled(PCMachineState *pcms); void pc_register_ferr_irq(qemu_irq irq); void pc_acpi_smi_interrupt(void *opaque, int irq, int level); diff --git a/hw/i386/pc.c b/hw/i386/pc.c index ccc50baa85..d37072b575 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -2178,6 +2178,34 @@ static void pc_machine_set_smm(Object *obj, Visitor *v, const char *name, visit_type_OnOffAuto(v, name, &pcms->smm, errp); } +bool pc_machine_is_vmbus_enabled(PCMachineState *pcms) +{ + if (!pcms->vmbus) { + return false; + } + + if (!kvm_enabled()) { + error_report("VMBus requires KVM"); + exit(1); + } + + return true; +} + +static bool pc_machine_get_vmbus(Object *obj, Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + + return pcms->vmbus; +} + +static void pc_machine_set_vmbus(Object *obj, bool vmbus, Error **errp) +{ + PCMachineState *pcms = PC_MACHINE(obj); + + pcms->vmbus = vmbus; +} + static bool pc_machine_get_nvdimm(Object *obj, Error **errp) { PCMachineState *pcms = PC_MACHINE(obj); @@ -2413,6 +2441,12 @@ static void pc_machine_class_init(ObjectClass *oc, void *data) object_class_property_add_bool(oc, PC_MACHINE_PIT, pc_machine_get_pit, pc_machine_set_pit, &error_abort); + + /* no vmbus by default */ + object_class_property_add_bool(oc, PC_MACHINE_VMBUS, + pc_machine_get_vmbus, pc_machine_set_vmbus, &error_abort); + object_class_property_set_description(oc, PC_MACHINE_VMBUS, + "Enable Hyper-V VMBus", &error_abort); } static const TypeInfo pc_machine_info = { diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index a25619dfbf..4a3cb406d5 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -56,6 +56,7 @@ #include "migration/misc.h" #include "kvm_i386.h" #include "sysemu/numa.h" +#include "hw/vmbus/vmbus.h" #define MAX_IDE_BUS 2 @@ -302,6 +303,10 @@ static void pc_init1(MachineState *machine, nvdimm_init_acpi_state(&pcms->acpi_nvdimm_state, system_io, pcms->fw_cfg, OBJECT(pcms)); } + + if (pc_machine_is_vmbus_enabled(pcms)) { + vmbus_create(); + } } /* Looking for a pc_compat_2_4() function? It doesn't exist. diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index ed3a0b8ff7..9e5ce429b4 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -50,6 +50,7 @@ #include "hw/usb.h" #include "qemu/error-report.h" #include "sysemu/numa.h" +#include "hw/vmbus/vmbus.h" /* ICH9 AHCI has 6 ports */ #define MAX_SATA_PORTS 6 @@ -279,6 +280,10 @@ static void pc_q35_init(MachineState *machine) nvdimm_init_acpi_state(&pcms->acpi_nvdimm_state, system_io, pcms->fw_cfg, OBJECT(pcms)); } + + if (pc_machine_is_vmbus_enabled(pcms)) { + vmbus_create(); + } } #define DEFINE_Q35_MACHINE(suffix, name, compatfn, optionfn) \ diff --git a/util/qemu-config.c b/util/qemu-config.c index 029fec53a9..951a6360a0 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -234,6 +234,10 @@ static QemuOptsList machine_opts = { .help = "Up to 8 chars in set of [A-Za-z0-9. ](lower case chars" " converted to upper case) to pass to machine" " loader, boot manager, and guest kernel", + },{ + .name = "vmbus", + .type = QEMU_OPT_BOOL, + .help = "enable Hyper-V VMBus", }, { /* End of list */ } } From patchwork Tue Feb 6 20:30:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870093 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="I1XC3YQS"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbc3b6XzGz9s7F for ; Wed, 7 Feb 2018 07:47:55 +1100 (AEDT) Received: from localhost ([::1]:59992 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejA9i-000891-0V for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:47:54 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44990) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uF-0001GT-P3 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uC-0003KG-Er for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:55 -0500 Received: from mail-db5eur01on0132.outbound.protection.outlook.com ([104.47.2.132]:58540 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uC-0003JV-4b for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=qALjUu/oshzsrN8wfHqz8Es7WVaXBTFY8yySmDSyiIA=; b=I1XC3YQSec4tvD5B8xbb2jiMuW20NRRkwTrraSLEGuuFR479BAKWbiy2rmI7Fximr5RtyPWRWROe1sAIUlC2PfRvJvzekXAD+oBF4ptvKEi0hAWF9kuerfY2F12jkPa8fwp/cr5i1oIUud4Zqaf+fGLZEgX3vOoxm1pfsrrwJtE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:48 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:38 +0300 Message-Id: <20180206203048.11096-25-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2f5619c0-e174-4173-28d0-08d56da0a66d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:WfpQp8vVY+uop1iXILo6OpbuK5DGZSSsTTBR5YO/zuHTpntiVnPHqgMwoAFbP4R3YKWtwye3RjypWNKebKxejai7hASwza/AeTPe7O6ctS6Gkhi5X7Xv+7sJk5hNlULlKHiOR9D4ITjBqFnMoZv18NKrXble1km6sibN68HdSerTb/WVwGqfbSQcLErLVqOThqv4HazU1CvZD6BP6kJNn0w3BxC3zLgXAVEfdQuTZNCQRYJ6VN3+LeUyhy1Q6/++; 25:q3g8gQ8xldcQIDGV5zlnv2dDdu8jJvM1yO6A/krWfalrG4YHo3jZpKVDYAhYyFURamaseMPXSdTTCB9pzYJgshJHERhxubxY2pbyvN6DM0vU9fzBLU7jjFrfoZm4wpECX0XarIyUUHgcXPVA7B51XwqAc0T5JF6UwHbutOosvKzIhzM5jsaJ7gTyod5Ow61bt5PtyBW2ZYfPgEgCflikUy4uHfudOiNwpn90vz0T5EQJkHKNgPi8YJRZdfhoMZdxVaqsoScZWBIMy50c6vQU1F85cGStExun76DlRNBSbcuWqnmDct4fm93PxZYB7znoP6kPhTqckbwE5zacshs+XA==; 31:Urayt2VAlcSO0dHj9mpSVE98eVhzNDPYiWhr2UjWRP4JZHu/8ADkkCO+D2kQ6kXoQNbGeHk+XNVX7PdaQ4wh9LwjAA3tZrmypXCZsaVC9Y5Nx3SfKLc65xhUHL0vp44ldgj0AfaovmJ9hGOpzzFS63FAxsOBojEBaF0c4GSCTIlhsRwayG5cbp0FXpOgtYUwTUV9UeopkfD9AH+iD+joyjLQEzk2Ltx1a6ekZW9Kvg4= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:TQfd5PlcXqbUWFDkCfU8HcyvJK8ZmdeXm9m25zH79kKgeEL1AZCYBTTKQWuwO1cz0WnTOo/Glo+rQ2cUEEGFr7hr4TD8NYqw1VQc9CspxtTUyT2qSIed1GDJKtIH3rrfR498KKSTp8FXZG7lYr2DocyOH2pZOp7CSTsA0kEIzGOn8l4+eg2RYxkAapf7CpenyWOqLwUveMgr4xBr3gCe7wT3rFKrYQjrfKGttITr9fLqKAJT6/8q05qxaUJiDoQbrfsMicB/ly2avkvu9wGE+4nC1WhUyBUZ4QUg5FaDzecEqqIvzIuwzWeCpeO5405Drtq3L2cB974CjXcb/IJtL2Jofr3xR+hhfwk4E/CJ1rY3ZLFTVKNGw1U+/vOHnpSGqnHck9UoFRHlrSrgJ6pzaApQyywLNSb0JgOa4zGZOlI=; 4:XAnDyfS93sEuHM4iI6QQGBW8pqA5acWDMnUGtznFjXGVBWDsq+uLDS3DEInERqRYrRH91rZM58vpM45NgfWAt5+UZ9bWRqwVi8wvLTWAoViq5odF3NtjPIorJ/5oW0L5iZ6J73nrsHWam8/gmX88mvkS19Uo2OBFf15nOaDbCOBVYs7AB6XVUJKeaNAy5WFA4EStNAFr9A4PKFr6Dv8OUO0TvDriTQBK5ueIa5Hfv9NqvmXefBYb/dwSRmV3TIWQx+T19LfHyOSmXoM1eVGI0w== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(45080400002)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:f3QlhRGIR8AR4+Qsrexym/BEY+A58UECpO5MxS4?= RO13nI3nwMJGYB/nn4OlTDGrRkRK+Tb9Bq11wpoVCtv8wQXOfwb06as9lnPCuKhlNTqd72QrTrfjOS+AjRUTzfL1IaV5Jmd55CXU+vJFZLq41KM4tiOEEy5UieWd6RR8aaoCm8KMPXMJaV6e81HxHjq9TYA1fdt8Z1FJrryihBqW8RPTZRePfeVt3myBJb9vOsNrXX/I+viILXUG6fjn5U5AvOVH34N/HomgVVQ7lZY/nka7g1WWXNDXGXhIBXVf+LJe7SCJr34c1cHdf0+9K4cE8esQUvjQqKGMn7Q1rvKRTobNKjqdmuzllI/SiOfSdetDO+o0EY31LAClXMlw5lkMXv2HYGU5C7EG0cu7xFBA/4VSNm1j3s6U/7EQHR/83IPbn+PudZbPCq72F+oLyk6hZaE3/X5UvsUh4ZhjoSL2VLb2mmQMu0U6BWKaNZd7ww6Zm0hAzNmO0PotbJQYhsbPwLNToqXZWx7Odg9cex/atnfa3pJD7qvoxJhOSsxiBMiaGqqZxsWlc5W+xvN4VO7n8qQtC1DYi1OmboTMZonSwjQQWIue6bVGwtcwBAs/0A72JGdPuEaVFzMLWjX6BvtP+wKtDWhPCjaVFwugb6GW32cl2d8QxOZl8N9ebMMO/TVnt7tXe2hOm6RTC3nBUSUzJh3QgiB1qsFcLKeqfH/K2G9l4J2dfBVTWYYdeVdwIAZwnoabB0pYjNq1Xbze91coVrqdE9zJ7PV2kkdMFbwG5ZpdYEaygw8J/Tq/T8S+CGMMQ1StF4EJ8BnbnaphvrWGXWz+0eTt7FP+zRbbBL9PV80Bt1NsAMCvvH5kIV0ecBfpSLOngfO16HuLGg72GrrtW1y/kdDfSdpCVAu0JctnLfvvmb4xWTV7LKkrX44Op9dCM/UuRJN2S/48CawHGS0qRXBNyO9AELFHQfeNpQKarQoImUPxGcYGhPs2lk2k41Em5ARTVav1UdOTUCAnJGCuxRIdBD7vbp24lhBXPC8P+5bESPjASvcSVabDfkYcuDndnsr2lh+S4u5kYCsAusiYxSxiwaviSzwjLoc7pTkk0fzXFd2HWdjuDMpdZEna1e2jhl+snhE2tmLFmQ9Z8M3OQKwKd+H2hAx3Y7rgYZXg53UblMbcqOSErM8IUR6cwSPRcTfciS/HrCcp04BwwLQP75QIk9XMemM9FzI7BK144cjTDdWhU99KctYg7mQQx7LE0ElNuy1ZM1O86Ix/qz7DSXwYT8MUMkvflsS684RdCVHQFpwhoFBcA4jrM4jfv1oHkt+Wv/VGSHWdFMxAr3wor4x2yVov1Lrt1cSsZc8TQ/tnFwArnLdez23/NqoFr1o0= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:QuqSwG+9AGBwh1CZN7iVC+5SzTKDW/wOT3UxyAHq2z6OReHIHdlM0GPKSSjSTya86TUBAjASAlYW0wUwDq/e6WodUQI603QMICQdSMlwpW7AcLhI+7lEPd8TVpxSo4M2hJRb5UN6dtkcd7jQjGqVTOZQICef3qYi01zQRvVn36N9mEvs0mQkkZ6R2fHH+ISzwrU95rBxA7hnnmebk+/ohY3xKdSKWQvt1iMtnyV35squchrtJLq4BDpx79voDShVvqu9khulpjW2jZIcLA2iaUYKpGQwSBp1v49HubmlLGqONo/CnxmBYCqztNIlJltCu2+qloYZ/pMnBfKpa0ZuxlTIy9TYF/ijdpAS/Mko/RU=; 5:F9C8x9PDF/LmR/zsIECs0lY+Zdx4msi+/d/jU+bjTG2qm0VQ5dfbwZgNlbpJaWZnjCzqkHgugo+/U8TgN5wbXtgz6+xutcAzNfsKHPEdkKxa6aHQTv25HmfHqMySvv0zk3mGpz2YcqfNgWejyhwcokp4d2vxTohWfppJxgEE92o=; 24:X0I0CAcFw6vnTWHXJcjPExas0KrzTtJiZo0Wz/0/UfdJOS7zfUfzOloAWmuJclgV1XVwIUaGzmqQiH0jwNQZKSn9JBc9Gye1dso4H9a6GjU=; 7:CDWsSHk0GkNEpLsiCb4ps8bh0ZBJPh2T89WnY+hdumA8jaeZGhlaU385Ib+gt70QEX/+4hNShkArqwtKO04+dUq4Ch0Ynwen7c56V5IX9koyLWreJmOZUN9dMLTNKGqB7FY8nCGFUX+a6TYjkGb7N+jWeqDHtZ/soUPzoipEzBc5NSYKUQ/alxKjVBPU88S4fg0O+kRnR6XTSOKsWdQrWonphew/78J8xY71WWxQNqmzhU/ovKKtP/aLvLvocw1c SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:0UPUPh0GPkw1NQblE3PRmid8MliE2lTaXZcG5jTMUXHrziCy4RLNm7tUcWcYIci3iPghCOLxGD+DYr1hieUFxDK7ZYQfcuG5j9muke+oBjW53XtKuyXQY0QK5lWXF8jAmncP8a5zx2NesToEc+9N5pln0BMuUFZpwh+7/oO/ZZY= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:48.4815 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2f5619c0-e174-4173-28d0-08d56da0a66d X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.132 Subject: [Qemu-devel] [RFC PATCH 24/34] scsi: add Hyper-V/VMBus SCSI protocol definitions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add a header with data structures and constants defining the protocol between the guest and the hypervisor implementing the Hyper-V VMBus SCSI controller. Mostly taken from the corresponding definitions in the Linux kernel. Signed-off-by: Roman Kagan --- hw/scsi/hvscsi-proto.h | 150 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 hw/scsi/hvscsi-proto.h diff --git a/hw/scsi/hvscsi-proto.h b/hw/scsi/hvscsi-proto.h new file mode 100644 index 0000000000..9dd20c9bfa --- /dev/null +++ b/hw/scsi/hvscsi-proto.h @@ -0,0 +1,150 @@ +/* + * Hyper-V storage device protocol definitions + * + * Copyright (c) 2009, Microsoft Corporation. + * Copyright (c) 2017-2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef _HVSCSI_PROTO_H_ +#define _HVSCSI_PROTO_H_ + +#define HV_STOR_PROTO_VERSION(MAJOR_, MINOR_) \ + ((((MAJOR_) & 0xff) << 8) | (((MINOR_) & 0xff))) + +#define HV_STOR_PROTO_VERSION_WIN6 HV_STOR_PROTO_VERSION(2, 0) +#define HV_STOR_PROTO_VERSION_WIN7 HV_STOR_PROTO_VERSION(4, 2) +#define HV_STOR_PROTO_VERSION_WIN8 HV_STOR_PROTO_VERSION(5, 1) +#define HV_STOR_PROTO_VERSION_WIN8_1 HV_STOR_PROTO_VERSION(6, 0) +#define HV_STOR_PROTO_VERSION_WIN10 HV_STOR_PROTO_VERSION(6, 2) +#define HV_STOR_PROTO_VERSION_CURRENT HV_STOR_PROTO_VERSION_WIN8 + +#define HV_STOR_OPERATION_COMPLETE_IO 1 +#define HV_STOR_OPERATION_REMOVE_DEVICE 2 +#define HV_STOR_OPERATION_EXECUTE_SRB 3 +#define HV_STOR_OPERATION_RESET_LUN 4 +#define HV_STOR_OPERATION_RESET_ADAPTER 5 +#define HV_STOR_OPERATION_RESET_BUS 6 +#define HV_STOR_OPERATION_BEGIN_INITIALIZATION 7 +#define HV_STOR_OPERATION_END_INITIALIZATION 8 +#define HV_STOR_OPERATION_QUERY_PROTOCOL_VERSION 9 +#define HV_STOR_OPERATION_QUERY_PROPERTIES 10 +#define HV_STOR_OPERATION_ENUMERATE_BUS 11 +#define HV_STOR_OPERATION_FCHBA_DATA 12 +#define HV_STOR_OPERATION_CREATE_SUB_CHANNELS 13 + +#define HV_STOR_REQUEST_COMPLETION_FLAG 0x1 + +#define HV_STOR_PROPERTIES_MULTI_CHANNEL_FLAG 0x1 + +#define HV_SRB_MAX_CDB_SIZE 16 +#define HV_SRB_SENSE_BUFFER_SIZE 20 + +#define HV_SRB_REQUEST_TYPE_WRITE 0 +#define HV_SRB_REQUEST_TYPE_READ 1 +#define HV_SRB_REQUEST_TYPE_UNKNOWN 2 + +#define HV_SRB_MAX_LUNS_PER_TARGET 255 +#define HV_SRB_MAX_TARGETS 2 +#define HV_SRB_MAX_CHANNELS 8 + +#define HV_SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002 +#define HV_SRB_FLAGS_DISABLE_DISCONNECT 0x00000004 +#define HV_SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008 +#define HV_SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010 +#define HV_SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020 +#define HV_SRB_FLAGS_DATA_IN 0x00000040 +#define HV_SRB_FLAGS_DATA_OUT 0x00000080 +#define HV_SRB_FLAGS_NO_DATA_TRANSFER 0x00000000 +#define HV_SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT) +#define HV_SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100 +#define HV_SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200 +#define HV_SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400 +#define HV_SRB_FLAGS_D3_PROCESSING 0x00000800 +#define HV_SRB_FLAGS_IS_ACTIVE 0x00010000 +#define HV_SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000 +#define HV_SRB_FLAGS_SGLIST_FROM_POOL 0x00040000 +#define HV_SRB_FLAGS_BYPASS_LOCKED_QUEUE 0x00080000 +#define HV_SRB_FLAGS_NO_KEEP_AWAKE 0x00100000 +#define HV_SRB_FLAGS_PORT_DRIVER_ALLOCSENSE 0x00200000 +#define HV_SRB_FLAGS_PORT_DRIVER_SENSEHASPORT 0x00400000 +#define HV_SRB_FLAGS_DONT_START_NEXT_PACKET 0x00800000 +#define HV_SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000 +#define HV_SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000 + +#define HV_SRB_STATUS_AUTOSENSE_VALID 0x80 +#define HV_SRB_STATUS_INVALID_LUN 0x20 +#define HV_SRB_STATUS_SUCCESS 0x01 +#define HV_SRB_STATUS_ABORTED 0x02 +#define HV_SRB_STATUS_ERROR 0x04 + +#define HV_STOR_PACKET_MAX_LENGTH sizeof(struct hv_stor_packet) +#define HV_STOR_PACKET_MIN_LENGTH \ + (sizeof(struct hv_stor_packet) - sizeof(struct hv_srb_win8_extentions)) + +typedef struct hv_stor_properties { + uint32_t _reserved1; + uint16_t max_channel_count; + uint16_t _reserved2; + uint32_t flags; + uint32_t max_transfer_bytes; + uint32_t _reserved3[2]; +} hv_stor_properties; + +typedef struct hv_srb_win8_extentions { + uint16_t _reserved; + uint8_t queue_tag; + uint8_t queue_action; + uint32_t srb_flags; + uint32_t timeout; + uint32_t queue_sort; +} hv_srb_win8_extentions; + +typedef struct hv_srb_packet { + uint16_t length; + uint8_t srb_status; + uint8_t scsi_status; + + uint8_t port; + uint8_t channel; + uint8_t target; + uint8_t lun; + + uint8_t cdb_length; + uint8_t sense_length; + uint8_t data_in; + uint8_t _reserved; + + uint32_t transfer_length; + + union { + uint8_t cdb[HV_SRB_MAX_CDB_SIZE]; + uint8_t sense_data[HV_SRB_SENSE_BUFFER_SIZE]; + }; + + hv_srb_win8_extentions win8_ext; +} hv_srb_packet; + +typedef struct hv_stor_protocol_version { + uint16_t major_minor; + uint16_t revision; +} hv_stor_protocol_version; + +typedef struct hv_stor_packet { + uint32_t operation; /* HV_STOR_OPERATION_* */ + uint32_t flags; // HV_STOR_FLAG_* */ + uint32_t status; + + union { + hv_srb_packet srb; + hv_stor_properties properties; + hv_stor_protocol_version version; + uint16_t sub_channel_count; + + uint8_t _reserved[0x34]; + }; +} hv_stor_packet; + +#endif From patchwork Tue Feb 6 20:30:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870123 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="CrZloFy0"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcsc2WpQz9s7F for ; Wed, 7 Feb 2018 08:24:20 +1100 (AEDT) Received: from localhost ([::1]:35922 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAiw-0001vw-BO for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:24:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44991) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uF-0001GU-PP for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uD-0003LB-SW for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:55 -0500 Received: from mail-db5eur01on0132.outbound.protection.outlook.com ([104.47.2.132]:39281 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uD-0003KQ-FI for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:53 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=piOk7/LJe5v+1n75BcjKaDEM9LTzPZ/UBtXP7li/rUc=; b=CrZloFy0hUbk9uBsYhcx97WkXhge4RbpBBCFzv7wTOFIWDR/f3JRlEjPxPhIUOmhfxNb0QezqEBJLatp/cosDEblqWB32HVSxXYRapXBOBhWegJtEb22LiNFeRuZLL1gS9jSx5Ct4cZieE0ctNJtgPGUPrak7i8jtZBfk7IqvQI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:50 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:39 +0300 Message-Id: <20180206203048.11096-26-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4d2d1d1a-6050-4e28-47ef-08d56da0a72e X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:/Rjjal7gdC6eP3P4kpZcK1g2qmLfiuyu2zMu33N3oKKAAI8BhaeFBAazN1C0A92bQaJH+55HIdj2FP0I9oOZJoXpq6YmcMzRUDFVcA01Hr/dQ6ADD/fBosfsq92R7C40t5uDGGvf0Dv1HWzRWSmuUGC2BXKl2lzp4+ZHTTlxpC8Aj0giaHNnXUCcQQI+3ssk8EOQlmeVVxWcWIfL+jjQHfFnJN8hEj/LsO7FFJdlFYAwdiPMN3c81/1Qba8xp3cc; 25:rj3tA7U5WWk20VFCpi0ICL90wPDwnjCv2iZI8LtRFpLlEgq+OL5+lqVftTdm0s24YVHPml2DlpB66oNV6NC3tdlR/udnc0+/3EuJEw4DkcJYsDlCM8onl/1QbaIoteVmvKFaE1YvvLgW7BZH0dGTWIqAq/MHmjNaJ2N1j4gViFwwBKaVY+HfmgJTmgk9gIIyiQONukeHtjDqqUtv11sADRoHm2v1KAaobeZzyVCD1CMuv7E5wyOfSA+7KXGsiXd3QmxnC2StVznnyk9kZMfhsVYxZ62ilVOVMJOnaKQFnT7CZkYM/8QlJYkgLVQ+L4uktJn6pIW9PJjIcFJOj0EbEQ==; 31:RBlcVRbOtS2TXZlWQ6HcMECItazzBlNNGG8Ws+K9GVYPZMG2ysTckGWHE61wUndq1iCGBQA+NQlRrQFx6QickFmS5/IwRkr1i6vQcO3q+LXjOB3fjlhmVgVID5nr9EY5ZBx12AIp/q5kv4gu5ypMsV7qcXVN+CL938WcJZBf+P0++fSiaj7nCcAlI21uPZk9IwDM+tImEKlvspdR2Umw27i9dDtaLtVlLHXj2d8iXY8= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:S1VC12kXPlzrBezSvdeT8fUSv9S6IuBcO3U2y35jxs5rAgN0LhetWBxKpbqHRHcPT1RT4Y/dvj4F6OgIxbe13VpthbS9KxYVFwvd8R4gpMP4mZY+8ktKzTUkf9bIRlaalUXqKCRAzm6ZPMK/PGKyHnVB6tKonywS3+th7DQBmV90jC8cmXOxEeq87JjRPBptSHGgdNOhRaQVFjyKOQvZwXhdOCk26ykPVi037gtmza8E5VPqdxtqdYtx2If24phKJ4pxWY+P6+8tSTl9XxjgPCa7UC8WnYpQggm6UcwxEF/Un2H2Asb7Xm28j17W9uMjF0wMTKzQ8BvL6i1EeYQWtVY4KmJxi+o2jRurnhi4RXhzRIblGbUZ1057eN8mk5fhug56Z9HWgxwB2a/6WWa7spXXHLk7VD+52+sbLVZwRdE=; 4:7Av1XjrrraXrd1DY/Snc+UV7MJ/rSSlhiiociwDsRHXzOF36wQ8RVPu9gpTWZiItuI7eHq/hrXYQYlH3elOfNde3RvgXZn7yXZEe3zcCuxc/BBczQIZLPelONQURJsLQHMrm/P7t28OICcS0RmvGAIx7VyFQMBy3Lh6iSSU1GmTDI8GSPME3Awri8khvcOuAtsXUqsz8LJbGujjEM719IlQa2vMTBesWxUJzMF+R+BSSq2Af643TwqpYtz1qNBh4SSKYksHV9hZwfbxDCuWiJQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(290074003)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:hEh1pFxLAGSj/jAPwbMyO/KQ6zmOueZUG0eRDfm?= s4ILLHw53DQXpajk2dsza8B7iGTw1Hc2k+vcP39WMRqGfMnR8aUT+DIVbwbU26vN/bfGqpcNRTDp94cNI53UKx1/ugwJ3nhzsBtN6UiA0mSH9/2N5kc3hp8UD9tb9UUKC+bc7ic7PjJGmuZE/cpCR+wlC7pF8DN0tAzrxdMA2N3KIv1qiFlgMM6wwj8gzwHLCsRwB3yWqS+/aM/SgIDncw1rAdVXZBqfLFXaGfwuB1P1qzd4KnaJQvhunQyb+cBruTU8qJJdb2pip0oN6BjQJECreUQbdoMt3++pMK7rqDRaJd7dH3lLGo0skAEMIlWoOBFh1MOTIfNhP37LRetwmFIkYf6U2ZlALDbbPa3lLjFvJDxy5/Qmoq48aOa3Oe/np2klvAecVPmp/QPumPFg7FGFxib2f6iXcB/Oqozy4FjSRH9XblCR9yU1D7gckD/kIgzyTdiNRZ1CowyZ3vcQn2kPdwPPhcrbV2Qa75tbRJFr0Q97eAB5pq21Bss/OthPNVzinH0jImZXniP82ggXcATGbBCYccwX8bagZefH4G/BteBEGLT+Q1y+/g0jUelNaIrayJRvWKIPZekspJEOTlVJksERzi6vzxsQfDADRnWYsD6Q0FeJLd4pk60cqm6/mQbC5hSMBnLqJ7HMuwm96fgwkEv9iDChmm3qui49z7o22LQsV5eZRUPdl+2AGiVVf8lVCOl70LdyMwM5MmhnsgPH+QnXxzVQtCfaJyfyJszyRCSuhExO6jhcJ0A31kTaTMME1td18OmS71DpgOpQKT66lup/wCSgy7WUu40/+tSvuq6CKoooCB9IRbew28EL6+NRDwlW+iIQQieVEvJP4/WQp7Er3V73x+3QFlkAJxf4FHrHWPBvHV8PQskxX901jpz8XQv5cHsdjRiNpendTpVaexo94zY5sZbOAVuO2w1THeqepXZm9TpYy8R6gcpbq6+qYpDTIIL2uIZobMhQ0KNbBstFm1JnvoaovHQpIHGGsElo0bevyJgIF2JpxNJOX/Fc5dVPDe2DbqOIAIQL7brPHYgoV69i2kGkBHuJf78Y9yF3Ain2a8BLf6qdurcPRb/1D5EAK6c0q6SIJ+8kG7GyaZPqVaw0SmscZsPQ/M1oGiU+3d8idIo8Hp0+824UzRc2QkkVueXAERHW7yoFKYKYPqvH49xDWFujLF9gL0dvdraNk0bFte6GkLmGkOhkyZ3SC1VK9LlzfzFL6I4/hqRHQ9D8yvE2CZ5YuRUqAGBLttp3HyeWmveB+Bx0TdgJg/UqTpD4gigJBokyilIyMHCQ0VXqhAUEAgpUo+q22y00bsYEteLqBlFXTMqCZYkTXWGY= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:bpj5sBELZc/NtFRcTk1xBuj2zak5kOVxeYYj0rBML42/+XPmdC2R9z7bHZHwiSZGiu7T8P/qcWpDgPQwfqHKqbsfavphU/wyGPmloo6gRsLJ5q5GIYeIXmUIBqGDrcM2QK4gb4tdek03sy/2+e4znGpArhB/xyr7PXK/JHPHY/di9dVEBwRn1MHoIN+Z0GBxWKQuUPCr7wIy4vTeRMxe+xqpTVtGPVru3WIPjFUM9HXvEGVvcoS7RdJC0/ERZLTjlPIy/RhW3tDFSwA3ogbgORuVuh2N4UDlfbULePRwfSLzTlUkg6QAyYWvM1XuDvaAJ9+VKBH2cCVBmxsqdfyFThQovcJ62A980oTjq4mzdPQ=; 5:QWPtIP/x8KDTxnHHGR13dIL/1fV1umcsxqeAJWQSdeZ/jUIaEMPc4CmI+OVBjuU7LgcCUzdCKoSMLUjgQfKZN3RTp5vdEfDbjBD9gmh7SYGOXEdduPCiTgcIdc92dRNbLniGhT4bmcDg0TiA5y7WmrmDj4BQ7pOv4hmaoiB/mo0=; 24:V7ROFipXEAXGytzMjIVcdggUyoRY4vsjkwQLZaQr9Q01vw3FbXchudFoa9Tjrv8HVnkbdGmZMgkZiKXXA3P4yt1Aah3btckuZrMce6jGxTw=; 7:zvm+YvWE/W2OzxejYGl/HYac473aeZQ7jJjDgSYPAZnmZNwqbUVysYYWlFll7rtGF3uBuCVuFkKzpqh248uWKoyoyk0XSMk8zLQvllLyqYFWuZa0VCTzRIcm418Pu4tLeHEOaJykUkFHJteeE4scszYd1pWrEbzvutzNmQ+sH9n7PEo3xIcH74NBMhSh8oWPCqqM1eb/zCcvLM8ZXjoHXc34TKOk0+Ll4YMgkksWngbHThR7TBOCNWX0TsR4LEYv SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:Zw5Yeb3kfECojXn3se/A5BYW4qIODgF3gKIvDkeH6m3i5ODCM/BWmqpeEOsrmT5X9Zo2DLPSNY+cRL5UmSmrgqqfJWQynmbVAmnjOdGkcpBpC3OTfJRFeOhRimgt40UTeSUb3r5/i0ZIAR3b8oYtAVbcxIwwssvOC7wlTiOC/Rg= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:50.0441 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4d2d1d1a-6050-4e28-47ef-08d56da0a72e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.132 Subject: [Qemu-devel] [RFC PATCH 25/34] scsi: add Hyper-V/VMBus SCSI controller X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add an implementation of Hyper-V/VMBus SCSI controller. Kudos to Evgeny Yakovlev (formerly eyakovlev@virtuozzo.com) for research and prototyping. Signed-off-by: Roman Kagan --- hw/scsi/hv-scsi.c | 398 ++++++++++++++++++++++++++++++++++++++++++++++++++ hw/scsi/Makefile.objs | 2 + hw/scsi/trace-events | 6 + 3 files changed, 406 insertions(+) create mode 100644 hw/scsi/hv-scsi.c diff --git a/hw/scsi/hv-scsi.c b/hw/scsi/hv-scsi.c new file mode 100644 index 0000000000..bbfc26bf0a --- /dev/null +++ b/hw/scsi/hv-scsi.c @@ -0,0 +1,398 @@ +/* + * QEMU Hyper-V storage device support + * + * Copyright (c) 2017-2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qapi/error.h" +#include "hw/vmbus/vmbus.h" +#include "sysemu/block-backend.h" +#include "sysemu/dma.h" +#include "qemu/iov.h" +#include "hw/scsi/scsi.h" +#include "scsi/constants.h" +#include "trace.h" +#include "hvscsi-proto.h" + +#define TYPE_HV_SCSI "hv-scsi" +#define HV_SCSI_GUID "ba6163d9-04a1-4d29-b605-72e2ffb1dc7f" +#define HV_SCSI_MAX_TRANSFER_BYTES (IOV_MAX * TARGET_PAGE_SIZE) + +typedef struct HvScsi { + VMBusDevice parent; + uint16_t num_queues; + SCSIBus bus; + enum { + HV_SCSI_RESET, + HV_SCSI_INITIALIZING, + HV_SCSI_INITIALIZED, + } state; + uint8_t protocol_major; + uint8_t protocol_minor; +} HvScsi; + +#define HV_SCSI(obj) OBJECT_CHECK(HvScsi, (obj), TYPE_HV_SCSI) + +typedef struct HvScsiReq +{ + VMBusChanReq vmreq; + HvScsi *s; + SCSIRequest *sreq; + hv_stor_packet *reply; +} HvScsiReq; + +static void hv_scsi_init_req(HvScsi *s, HvScsiReq *req) +{ + VMBusChanReq *vmreq = &req->vmreq; + + req->s = s; + if (vmreq->comp) { + req->reply = vmreq->comp; + } +} + +static void hv_scsi_free_req(HvScsiReq *req) +{ + vmbus_release_req(req); +} + +static void hv_scsi_save_request(QEMUFile *f, SCSIRequest *sreq) +{ + HvScsiReq *req = sreq->hba_private; + + vmbus_save_req(f, &req->vmreq); +} + +static void *hv_scsi_load_request(QEMUFile *f, SCSIRequest *sreq) +{ + HvScsiReq *req; + HvScsi *scsi = container_of(sreq->bus, HvScsi, bus); + + req = vmbus_load_req(f, VMBUS_DEVICE(scsi), sizeof(*req)); + if (!req) { + error_report("failed to load VMBus request from saved state"); + return NULL; + } + + hv_scsi_init_req(scsi, req); + scsi_req_ref(sreq); + req->sreq = sreq; + return req; +} + +static int complete_io(HvScsiReq *req, uint32_t status) +{ + VMBusChanReq *vmreq = &req->vmreq; + int res = 0; + + if (vmreq->comp) { + req->reply->operation = HV_STOR_OPERATION_COMPLETE_IO; + req->reply->flags = 0; + req->reply->status = status; + res = vmbus_chan_send_completion(vmreq); + } + + if (req->sreq) { + scsi_req_unref(req->sreq); + } + hv_scsi_free_req(req); + return res; +} + +static int hv_scsi_complete_req(HvScsiReq *req, uint8_t scsi_status, + uint32_t srb_status, size_t resid) +{ + hv_srb_packet *srb = &req->reply->srb; + + srb->scsi_status = scsi_status; + srb->srb_status = srb_status; + + assert(resid <= srb->transfer_length); + srb->transfer_length -= resid; + + return complete_io(req, 0); +} + +static void hv_scsi_request_cancelled(SCSIRequest *r) +{ + HvScsiReq *req = r->hba_private; + hv_scsi_complete_req(req, GOOD, HV_SRB_STATUS_ABORTED, 0); +} + +static QEMUSGList *hv_scsi_get_sg_list(SCSIRequest *r) +{ + HvScsiReq *req = r->hba_private; + return &req->vmreq.sgl; +} + +static void hv_scsi_command_complete(SCSIRequest *r, uint32_t status, + size_t resid) +{ + HvScsiReq *req = r->hba_private; + hv_srb_packet *srb = &req->reply->srb; + + trace_hvscsi_command_complete(r, status, resid); + + srb->sense_length = scsi_req_get_sense(r, srb->sense_data, + sizeof(srb->sense_data)); + hv_scsi_complete_req(req, status, HV_SRB_STATUS_SUCCESS, resid); +} + +static struct SCSIBusInfo hv_scsi_info = { + .tcq = true, + .max_channel = HV_SRB_MAX_CHANNELS - 1, + .max_target = HV_SRB_MAX_TARGETS - 1, + .max_lun = HV_SRB_MAX_LUNS_PER_TARGET - 1, + .complete = hv_scsi_command_complete, + .cancel = hv_scsi_request_cancelled, + .get_sg_list = hv_scsi_get_sg_list, + .save_request = hv_scsi_save_request, + .load_request = hv_scsi_load_request, +}; + +static void handle_missing_target(HvScsiReq *req) +{ + /* + * SRB_STATUS_INVALID_LUN should be enough and it works for windows guests + * However linux stor_vsc driver ignores any scsi and srb status errors + * for all INQUIRY and MODE_SENSE commands. + * So, specifically for those linux clients we also have to fake + * an INVALID_LUN sense response. + */ + size_t len = 0; + QEMUSGList *sgl = &req->vmreq.sgl; + hv_srb_packet *srb = &req->reply->srb; + struct iovec iov[4]; + int iov_cnt; + + iov_cnt = vmbus_map_sgl(sgl, DMA_DIRECTION_FROM_DEVICE, iov, + ARRAY_SIZE(iov), srb->transfer_length, 0); + + switch (srb->cdb[0]) { + case INQUIRY: { + /* Report invalid device type */ + uint8_t data = 0x7F; + len = iov_from_buf(iov, iov_cnt, 0, &data, sizeof(data)); + break; + } + + case REPORT_LUNS: { + /* Report 0 luns */ + uint32_t data = 0; + len = iov_from_buf(iov, iov_cnt, 0, &data, sizeof(data)); + break; + } + + default: + error_report("Don't know how to handle 0x%x for bad target", + srb->cdb[0]); + break; + } + + srb->sense_data[0] = 0x72; + srb->sense_data[1] = sense_code_LUN_NOT_SUPPORTED.key; + srb->sense_data[2] = sense_code_LUN_NOT_SUPPORTED.asc; + srb->sense_data[3] = sense_code_LUN_NOT_SUPPORTED.ascq; + srb->sense_length = 4; + + iov_memset(iov, iov_cnt, len, 0, -1); + vmbus_unmap_sgl(sgl, DMA_DIRECTION_FROM_DEVICE, iov, iov_cnt, -1); + + srb->scsi_status = CHECK_CONDITION; + srb->srb_status = HV_SRB_STATUS_INVALID_LUN | + HV_SRB_STATUS_AUTOSENSE_VALID; + complete_io(req, 0); +} + +static void hv_scsi_execute_srb(HvScsiReq *req) +{ + SCSIRequest *sreq; + SCSIDevice *d; + VMBusChanReq *vmreq = &req->vmreq; + hv_stor_packet *storpkt = req->reply; + hv_srb_packet *srb = &storpkt->srb; + + memcpy(storpkt, vmreq->msg, vmreq->msglen); + + trace_hvscsi_srb_packet(srb->length, srb->target, srb->lun, + srb->cdb_length, srb->transfer_length, srb->data_in); + + d = scsi_device_find(&req->s->bus, srb->channel, srb->target, srb->lun); + if (!d || (srb->lun && d->lun != srb->lun)) { + handle_missing_target(req); + return; + } + + req->sreq = sreq = scsi_req_new(d, srb->channel, srb->lun, srb->cdb, req); + assert(sreq); + + scsi_req_ref(sreq); + blk_io_plug(d->conf.blk); + if (scsi_req_enqueue(sreq)) { + scsi_req_continue(sreq); + } + blk_io_unplug(d->conf.blk); + scsi_req_unref(sreq); +} + +static void hv_scsi_handle_packet(HvScsiReq *req) +{ + HvScsi *scsi = req->s; + struct hv_stor_packet *msg = req->vmreq.msg; + uint32_t status = 0; + + trace_hvscsi_vstor_request(msg->operation, msg->flags); + + switch (msg->operation) { + case HV_STOR_OPERATION_EXECUTE_SRB: + if (scsi->state != HV_SCSI_INITIALIZED) { + error_report("%s: EXECUTE_SRB while not initialized", __func__); + status = 1; + break; + } + hv_scsi_execute_srb(req); + return; /* SRB packets are completed asynchronously */ + + case HV_STOR_OPERATION_BEGIN_INITIALIZATION: + scsi->state = HV_SCSI_INITIALIZING; + break; + + case HV_STOR_OPERATION_QUERY_PROTOCOL_VERSION: + scsi->protocol_major = msg->version.major_minor >> 8; + scsi->protocol_minor = msg->version.major_minor & 0xFF; + break; + + case HV_STOR_OPERATION_QUERY_PROPERTIES: + req->reply->properties.max_channel_count = scsi->num_queues; + req->reply->properties.flags = HV_STOR_PROPERTIES_MULTI_CHANNEL_FLAG; + req->reply->properties.max_transfer_bytes = HV_SCSI_MAX_TRANSFER_BYTES; + break; + + case HV_STOR_OPERATION_END_INITIALIZATION: + if (scsi->state != HV_SCSI_INITIALIZING) { + error_report("%s: END_INITIALIZATION srb while not initializing", + __func__); + status = 1; + break; + } + scsi->state = HV_SCSI_INITIALIZED; + break; + + default: + error_report("unknown vstor packet operation %d", msg->operation); + break; + } + + complete_io(req, status); +} + +static void hv_scsi_notify_cb(VMBusChannel *chan) +{ + HvScsi *scsi = HV_SCSI(vmbus_channel_device(chan)); + + for (;;) { + HvScsiReq *req = vmbus_channel_recv(chan, sizeof(*req)); + if (!req) { + break; + } + + hv_scsi_init_req(scsi, req); + hv_scsi_handle_packet(req); + } +} + +static void hv_scsi_reset(HvScsi *scsi) +{ + qbus_reset_all(&scsi->bus.qbus); + scsi->state = HV_SCSI_RESET; + scsi->protocol_major = 0; + scsi->protocol_minor = 0; +} + +static uint16_t hv_scsi_num_channels(VMBusDevice *dev) +{ + return HV_SCSI(dev)->num_queues; +} + +static void hv_scsi_close_channel(VMBusDevice *dev) +{ + HvScsi *scsi = HV_SCSI(dev); + hv_scsi_reset(scsi); +} + +static void hv_scsi_dev_realize(VMBusDevice *vdev, Error **errp) +{ + HvScsi *scsi = HV_SCSI(vdev); + + scsi_bus_new(&scsi->bus, sizeof(scsi->bus), DEVICE(scsi), + &hv_scsi_info, NULL); + return; +} + +static void hv_scsi_dev_reset(VMBusDevice *vdev) +{ + HvScsi *scsi = HV_SCSI(vdev); + hv_scsi_reset(scsi); +} + +static void hv_scsi_dev_unrealize(VMBusDevice *vdev, Error **errp) +{ + HvScsi *scsi = HV_SCSI(vdev); + hv_scsi_reset(scsi); +} + +static const VMStateDescription vmstate_hv_scsi = { + .name = TYPE_HV_SCSI, + .version_id = 0, + .minimum_version_id = 0, + .fields = (VMStateField[]) { + VMSTATE_STRUCT(parent, HvScsi, 0, vmstate_vmbus_dev, VMBusDevice), + VMSTATE_UINT32(state, HvScsi), + VMSTATE_UINT8(protocol_major, HvScsi), + VMSTATE_UINT8(protocol_minor, HvScsi), + VMSTATE_END_OF_LIST() + } +}; + +static Property hv_scsi_properties[] = { + DEFINE_PROP_UUID("instanceid", HvScsi, parent.instanceid), + DEFINE_PROP_UINT16("num_queues", HvScsi, num_queues, 1), + DEFINE_PROP_END_OF_LIST(), +}; + +static void hv_scsi_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VMBusDeviceClass *vdc = VMBUS_DEVICE_CLASS(klass); + + qemu_uuid_parse(HV_SCSI_GUID, &vdc->classid); + dc->props = hv_scsi_properties; + dc->fw_name = "scsi"; + dc->vmsd = &vmstate_hv_scsi; + set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); + vdc->vmdev_realize = hv_scsi_dev_realize; + vdc->vmdev_unrealize = hv_scsi_dev_unrealize; + vdc->vmdev_reset = hv_scsi_dev_reset; + vdc->num_channels = hv_scsi_num_channels; + vdc->close_channel = hv_scsi_close_channel; + vdc->chan_notify_cb = hv_scsi_notify_cb; +} + +static const TypeInfo hv_scsi_type_info = { + .name = TYPE_HV_SCSI, + .parent = TYPE_VMBUS_DEVICE, + .instance_size = sizeof(HvScsi), + .class_init = hv_scsi_class_init, +}; + +static void hv_scsi_register_types(void) +{ + type_register_static(&hv_scsi_type_info); +} + +type_init(hv_scsi_register_types) diff --git a/hw/scsi/Makefile.objs b/hw/scsi/Makefile.objs index b188f7242b..2630b3a756 100644 --- a/hw/scsi/Makefile.objs +++ b/hw/scsi/Makefile.objs @@ -13,3 +13,5 @@ obj-y += virtio-scsi.o virtio-scsi-dataplane.o obj-$(CONFIG_VHOST_SCSI) += vhost-scsi-common.o vhost-scsi.o obj-$(CONFIG_VHOST_USER_SCSI) += vhost-scsi-common.o vhost-user-scsi.o endif + +obj-$(CONFIG_VMBUS) += hv-scsi.o diff --git a/hw/scsi/trace-events b/hw/scsi/trace-events index 6e299d0338..eec9f2dfb0 100644 --- a/hw/scsi/trace-events +++ b/hw/scsi/trace-events @@ -229,3 +229,9 @@ spapr_vscsi_process_login(void) "Got login, sending response !" spapr_vscsi_queue_cmd_no_drive(uint64_t lun) "Command for lun 0x%08" PRIx64 " with no drive" spapr_vscsi_queue_cmd(uint32_t qtag, unsigned cdb, const char *cmd, int lun, int ret) "Queued command tag 0x%"PRIx32" CMD 0x%x=%s LUN %d ret: %d" spapr_vscsi_do_crq(unsigned c0, unsigned c1) "crq: %02x %02x ..." + +# hw/scsi/hv-scsi.c +hvscsi_vstor_request(int operation, uint32_t flags) "vstor packet: operation %d, flags 0x%x" +hvscsi_srb_packet(uint16_t length, uint8_t target_id, uint8_t lun, uint8_t cdb_length, uint32_t data_transfer_length, uint8_t data_in) "SRB packet: length %d, target %d, lun %d, cdb length %d, data transfer size %d, direction %d" +hvscsi_command_complete(void *r, int status, size_t resid) "scsi command complete: request %p, status %d, resid %zu" +hvscsi_missing_target(uint8_t target_id, uint8_t lun) "missing target %d, lun %d" From patchwork Tue Feb 6 20:30:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870122 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="FYfCVglt"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcq11qC0z9s7F for ; Wed, 7 Feb 2018 08:22:05 +1100 (AEDT) Received: from localhost ([::1]:35608 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAgl-00005P-BZ for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:22:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44995) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uF-0001GV-QR for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uE-0003LW-Bx for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:55 -0500 Received: from mail-db5eur01on0132.outbound.protection.outlook.com ([104.47.2.132]:39281 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uE-0003KQ-4C for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:54 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=jTiD4ss5ViomQ1odMmGb43F2UO0eyiLrXQ9m7F8cBM4=; b=FYfCVgltsrbLA+bmCVEhfvPGS2aQ8EN2Utdv2b100nqJldgRKiFEPQNvWVTO3GywSILt63x5QRY5iHOieybQwaLtf8NHERJGKCsXSyf+PW8n/WJBjrry1D4WBOnORN8hOG/TmAS3yWF0qh0ORRWN2pazWg/pELPbtsh9d96EeJY= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:51 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:40 +0300 Message-Id: <20180206203048.11096-27-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 86057c6a-cbf6-4619-8cd4-08d56da0a815 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:hInon0UOb5cXLjnMz77gj2Bq54GSvYktFG3ldJLxOn93LTphnFttplrPZhsDPCVIN2J8NAW+fObWEmmfgBSq/WtslsIEYoI+3DEI1mZq+vUhBFrNi1kY1pOdZGVrdHFaIhWEK6XlFN9DQe3v4rC7vMFmWsz+LSrP04DzTL/0s8U6hhW4OycUGszx6INilPf3iRW6JTwX/cOAb4M13ZRpWiPvCSR7Upsgyfbpv7qTgrshJp5SfV9agvGd3voxzFc7; 25:4/OUOS01H5YizhWdkNAkhaersgKS+p78ODHwfbzJ8tGrminmo7KKO1j/ISkZ0htnabbC43Uc54lNR7aRgoZmGeVEx61S4LtpLIVSeGhGN9wyPfLUzeZqL+N+Az7KC4eZ4+lxFBaIBstp7Und8ooKn9vYgp42qYnDHsY4kbbJtR102Dtb2/tU1sNmzooHpoKq/D2pM7egNUeEEIMgZ6q0XGMIonP1BzZEqV7U2j1q5XxxWm4IxU/ykd2xkAV+LSyHfVHea7UIV0fufnaq1a64df3OfV5bSX3R3+bCRboC5EkD3Wo1mxMPWhTJoPZkg3H2kYM6SBptQXU++i0/ST5RSg==; 31:UAvof2zQ3qaEZ2Ffikx6drw3PCPFb2+jRvdjlvsXx45ftqaLP+fAN1gyVBGryS3wpKAqAWh9KYT1muy2SUUmTxCARcKta5RZB3mbhhl89+qMxt4oEk8Uhb80wcMr4EgFG0AviEh+6/9zYHbegJCa24hoetVPFGTd7AO1QNH9MrhjO3KgISwEZS+kpXaZq1SdF0Iyp6APE2AsMfLlmG3mvRsjeWmUiOPICmXxllwRAMk= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:Cg4IU7m1Wnclu4Bje7OOCiaUg1Z5SZHUJkepBHguswZSI0Ig0CI5TZv+Q81nvgQNP5GasN+0nDUUoS+9O9eULiYAZsjqTq+bqGCON/2aSLS1hjJF1I35ziIxF5Fz9dxJcTC0OoZnRM7sM0CpuifBfrIF4B5Q0nYMBLvSFfmTAoPI5kq/DDy3l+z/BciJKlND3Re3zm9HcxvJp2v1kuD7e3ZCOGKytQSPpHOt36kLT0PuDOuWl0yZ6rVFfR4dR2Yx6NXsbuqaw5FJXMEDR6xl2OZEijLhj4BOTh/gYfk1q49EDqLoBUaIWJU7zWTfluQmzsrHHWCz1vl6fQauXoVFjFpE/wuVFoA+KaR63fnf8SV9QOZwmBhSWHbmkAKOoGzVXfiErdq8gtJPtZyXljik0pUfh5/56jCCEtvIa12JyII=; 4:rkxifuFLiV0He6wDMLH2wZWkZ/bLcb7fYGVXW1EUISKv1JDVEBJivFG8tNdo2US/dFs0EtcjWquw+WMpXiUELye9caX77PvlWIS1ZaSpqQfqvOiGsU4C4w9mxntAN71jLePt73eY4VmqGjhxg7fz/SR+bgMT4b5K1uZWmHmXL8HOWOligS4You68SMqjrhjlDwQk7QX1yqkNNvnXeebEm4E8B9vI5D9O6iaNAfburACNfShyvmb7cZfeMzPSBT33jszmuIYntsntihJKIQH/mA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:5Zbz19cCok334Yk/uOxewNMrIpJSXgHtArNxPuB?= JS6ao23sRdFFqyfWDvl6rzfEUcu1blS2tatCp0ZH40Oy1csWlGAKKoaxtYbscoz0hrgTOnyUOhnfpZ3KX2OXD0jiGWOsz4uECRWBr53dmFVkjoBvaNJPTWyH4os6ZeH6ElLFqUeRWPPVSTJcNkw2vpQWMs/q+lulmoV/GQxHtDQCfmAyy/8hKOIeOOTEKKbSVkP+JKXrgjIcZ4jLMU30w42FfZTXsQlB43cS7O+l+idBPqkbwP0GcdDQOuEXnfZwUOzLfstGWuMKNwTbgz8/4NU78Rx0H9696D727MjyEpS8x66ImLtEFCI8HjUd39FlS/wemEV2x6/mb3w+6s4pZvJ0G6HqEclKw4S1/ClCVknCcPbiCBmjFoc6Vblfz+jqMIC7zV2mz/m1dA3oSvmC0M09hTL7T1z+AL5pvOo+ti4iiNTN2vjajnvwFo6T2ZdylGMREzU+fVe83UIKJ1oxpcjlrVD/nNoAi5rnWF6x1ijXPE2Pqzc6zAnZ4pazEY6pn3bsS9kRneBXCZXjBxK1RHQiXNZmWLBUgq4/5QPjnUQrUWmMBEGka5uQGJCEI9iI7188Fhaf+nmoCyIDr7C6bYZSNrsUJxCT0irgT5GBzZt1uWTn7kv8yE1SqiZ2O5owVruhc7/2T3ehW/3++xox2z5sGO5WPdiw/K1+krRdult9fuPSobo/iP/rXm3vKTg8s+nR6Rx9Y+H9gos/VGQm+pha8Rg77RBn2DwcvAMs7gfWnHf6WNADwPuv00WzJKavtWloK6iacGU/h6ryyhdyt2KNb1nvPc2gsuBLY2dA9e/k/6H6S3iR9Gk5tP5mwo9Ibh+qKeuvCYcOJqoNFhbymksyPslKnxMRUJTJLeHfI2Dm/ZOe6eZhI8f+L+AHSABiwT/ibwqd4gRf1Qd3PS5Oc71xoVUmfwCS5UjdtY5o45JrVY/MpBhy4buOJaN/933NlduGnLFh1ojkEG5ewO+F2bd+rCCG4S0xVZhx8b9akUZGligni4w0CoTFSJQM38HJ1T7AwZmHOqRlm4ecud0SfnoNLeSnYtn9dRplqpLadjETUogJwM50n4bkuLO2aSBvFC12B5AZHDm92Tj+BZ1jYyVyt5+ESNqOM/SYRzdvAktHc8+0qaMO4Txvzn1zMaX8Wk13JmHrEskbfi6GAibcudo/nIEqyOpM5mp8pjsArH34LXPdGYjmwGZnZlgbaDrpz+qddyYPfsNc1ZHBrovFA4J9vwzbzMpTR6hz4/5wQ7oW6lnZyQDM8Ng+gB/nYIc/8VApf5hYX/OzirDQ9Yuf54k8wUfZFWqF9lvnhO2DW+pKxGA== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:+ZudJ8EFpW8a+W/LTpR3UIm1f/sp/2trgUE4MiLuQf/UmAhNAEObgP46Y/TNuyevi4vpV3b+yhRWXHl43iEUpc/put2bGZ9+0CYSkJOhKh0BgMLdnWkjM+XlZZKPKrEoOQ1CNURg7s1sxzDbVFey8knk/OaUOX50mFhc4ANBb/yDdvHyFuEEkH6HKWeKO/lCP+jxgjma25xmaYBI5qkHF9oE+s0OZ51lNRsiqPYPysel/m4vc/aFIlTW1vEvoQVCwgkPi4PHp8HKteop9KzCtfVlP0uYnG6k7y9IW79A0cXUuz7L2SgTAFZSCr/RkYwP/y7enFnqwNMCzP8RHDEnfeNCchZZzlq38Mq9/tjPAPw=; 5:7XPozzvzHJ7x/Cm8XF0Nk7MzHkLBJhfH/3+cRLJvRQuFFy0u9e13ZdRaTc4pWSVrEldOxOKBsCNlnZ9WCba5i76a+UevsIfDbNjAMrwHLzn8oya4M9yVHQEX270PQgyKfRpRHui0Mq6vEdy2TVUv9Oh1AM+Tlv842fk9GjE4Uww=; 24:2g6KbZqRXq6q6J+G+KNpOuF7SLmgVASFJqA2aoFKiiQC9dYQS4DpXvGMpZ6m4pnR99PY2j6gJRHaUrFTgsqxfxb68rFdk0iR2ccNUYCSnos=; 7:+RU07o+DTAn9TYmBw5iovCeWgRg4Vxk6a74KuqfxX986JcenCtx8egqjck39Dp7urgoIwg6141fhCqJWKuarK10s8jFvkvPeSvr8W49K/Y9gE742YD0xqQqNiKAjGl6EDDRtd/NuRhH2AKx9rHEdDOrmEHv9WwWQuJPSk6AOf0oGx7dNJZpccahFRSlhszmbchbqcz+x0FMcIpqWr8fNj5fvy6WnRxR0Fst89x6u/wmSjJKJe7Qg1m1vwS+fAL9F SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:v8s20bSCnKhpatXiGnLcE/cS8xuZl2fMtRfUZYgZDBhV/cRaohkt80kD1qskEn7Ura0E7JgWQfxIVtK5+VVjei0Le8BTooEAKHOKei7RS+irujKYf9HjxY+ybVo11clSyJCA0psdkp3SE5L3JGrSBVQjyiq9UD5UjwJio8zOtJg= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:51.3097 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 86057c6a-cbf6-4619-8cd4-08d56da0a815 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.132 Subject: [Qemu-devel] [RFC PATCH 26/34] hv-scsi: limit the number of requests per notification X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" There's a vague feeling that, if there are too many requests in the incoming ring buffer, processing and replying to them may usurp the event loop (main thread) and thus induce lags, soft lockups, etc. So ensure to yield the event loop at most every 1024 requests. TODO: do something smarter than this Signed-off-by: Roman Kagan --- hw/scsi/hv-scsi.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/scsi/hv-scsi.c b/hw/scsi/hv-scsi.c index bbfc26bf0a..aa055340ef 100644 --- a/hw/scsi/hv-scsi.c +++ b/hw/scsi/hv-scsi.c @@ -294,8 +294,9 @@ static void hv_scsi_handle_packet(HvScsiReq *req) static void hv_scsi_notify_cb(VMBusChannel *chan) { HvScsi *scsi = HV_SCSI(vmbus_channel_device(chan)); + int i; - for (;;) { + for (i = 1024; i; i--) { HvScsiReq *req = vmbus_channel_recv(chan, sizeof(*req)); if (!req) { break; @@ -304,6 +305,10 @@ static void hv_scsi_notify_cb(VMBusChannel *chan) hv_scsi_init_req(scsi, req); hv_scsi_handle_packet(req); } + + if (!i) { + vmbus_notify_channel(chan); + } } static void hv_scsi_reset(HvScsi *scsi) From patchwork Tue Feb 6 20:30:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870124 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="dPyMqwFm"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcx41N4jz9s7F for ; Wed, 7 Feb 2018 08:27:20 +1100 (AEDT) Received: from localhost ([::1]:36217 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAlq-0004gl-7D for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:27:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45049) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uL-0001R0-Gu for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uI-0003Nu-6Y for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:01 -0500 Received: from mail-eopbgr00094.outbound.protection.outlook.com ([40.107.0.94]:23680 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uH-0003NA-Sk for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:31:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=Fl11bCZpPiwu7+HJhLP03vgOF4uuDFJHRyi5RiVJqyY=; b=dPyMqwFmDQZiOQSflBCDBo/ljHcNJPYtGs0uva7h56MyObQDg8UpTFeM68uUjTKQZknZ9eMnVcFDvQote2dzGJXJwtd4QYva9LlsAEch6EA6kmxsDhm6QHaxFCIMPxgiFtHKk8NsS2PGOI5eoZAnvS++wpv5iRjkaG888XspeYg= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:52 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:41 +0300 Message-Id: <20180206203048.11096-28-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 561be001-9f6d-448e-7cfd-08d56da0a989 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:9iFxd3AM16EfgCzs96RbSUD1SkMWa1idvGIHAiCGQSiJBncTmQ993OTzIYk92LVJYJ8wc4kYI355HcACoaJaUvQBVOkb1t+aEY974F14Cih2xGjjX+fAeNeasZyshw/7qWiAj4HQGR86aMOtF078g6O1fKFxorUBGZWYQSN5Y3f0iilPxkq27mRSuyqhnwDRKRFCWLBVdKi0BUtAxk/vPHUVInSArYnalk+ovOhcL6byOJvSx98lcCdoW6d7dynM; 25:QsZ08XqUQcfghTFnGzAyj2smGZHMGfTm9nUClOcgUF8Fikumzd/eH8tUunJONycvqk3iAASBxld0l1cp3fVQAQL322DBOWuMlvmbpdv2/xUqeO1P77xz3NtosPC+VA5LOro0j3ABGLdt030aET+WS8UgrbvJeWolv+M0twnu5QQt+K5eJvUklnHMaHF6tEtIMbCFv3Gkb7lEjuQ+/fMOUZhBT24o24+KZbf+z6OHE+naNwdhxdnZdtORsljyEJLBmDEorJBJTAvp/juD3/t7FvaXYpfu2gCMEXv1H7pfXD/v4+LECdg0jsXlnr3d7Q3neret8gql7nK/LmvnOEQ/mw==; 31:N5ju7FbDx0xsAZxGwpQB8eNSKy+J3qwNaGOJLMoH1T5MS7z24gsA/dzkfwX6Epfa7e+xT7xZS8Q9eOwjhKt1B5Z2ZtQd3AOF0QTNclaC9Xp1nCFb+G5p9f9rknTFogbMYtVDXUVc1VF2b8JouPO1v8pNwOsM+RYSUHxnSINo8wvIrMWdURoX3qAP5eZbZFM4i5+/xcYYSyLDngCagG+rYYCqmwViOCdJCJEh4NTEhsk= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:dmsEC8ciSNaf/+nxDeS5siOssGpHONSt/7BsClriksspWADBmkQZHO3OO7dWkmiMpdS7Vqe2MuQZyyiFA5gKCdVEjh0NqybVkdwfFQmKuLrXAebCI4lJHSJAO/4h9/oYTedBnshh/R7dPrdhAoWxQMCJj/bcXZ7u3ePYrRjDuRGF6vvfWRVNX/lM4kfMU+svoSO8lsgca/+aYITm5XLDjaTNrhWn12ODEYnG7m+lCrkK+SP74rCTZQzbPz+iE+p15V7++xZdcLPlyoK5bzGWNI3EFlkeaDVF9TbMuzjYChpsUBfXonRpv0CBYHUkcU59/5AcscVjyZjaYkgLO9BeTQ4UlaahZDq+rLPAbnV3Pk3N3iGOxHaL+9pE7YFLAtp2zGdZswr12Qxj/DOsGt6kWMobcQvOm1Ig3ACJy/bN9Uk=; 4:sC3vqV7tyQ9KLUQaDk9zo8zMgqZioEV8tC+pdiJboHC2N+HO1lJE7suBWII+n3LrvjB+4TJIcXc6db3MVca1ofVArxCeL2u2IvAG81EtGAnyO9kvESML5WdL74OMC6/+TaJOHMyveYSByeir2yYN2RFXKcvLyf00F/CyQqSWnvio8DXvclgsCKXL09VIop76DljrSphOHHPsMpnjdjfDbUmp8HDsI9NU+/7nGgLb/w824n1JgqpGRSxk6O+lGE1jGkE7/wxSZ7vJxv5AGBQY1Q== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:2LzMnepwsirABPwMnyE8a/R+6bWojebxshvxsvP?= M9SGIb1lxviolYsEPtYehtZCunDupF1qK19gqYbeQENFFwD0FhnpzWMazK0GJpYX3espSf4Hav7xgxa07t2fanwgSz8E/fFbHyaPBxjFem5wpmVJrBzOmTeMzDvwi3Z8ioilK0ClGVqSQ1VYIGkqxggF/dAHvdBzVHGchEspeBJijVPZ1ugyb4Y4tFUEtZRi7A8fYVGhOrq/0y1m2agDq+3TqubBO9ME0puTMLS32o8bCQoZjeOKASix4ilHrGjaAAUNrcS9lZejgfUsee6jSWViDk9EajZk5RvQDuxH76h0Gv6HNprPFf/xf3gebnZbOXp4lZArIV7onievorX+YkSIY/cfCnPMNDTSMhaEZcNY/1FYpBJbWHWId+DF8j6FbhuXTUgTILxgl6CLDwCteuixQKkB23JJ09Z2d8TWlUlU9rPqGnHyT60ZAwXlADrHQMpQgX47aliJuhVPrh6ZQGhympgQt3jvKeE+2OZ3OTBjYi7R9ISKxpj3WIBo2btuIOuStZG/QLwfrPJHKbukgD9xWqqp2fdMmwsbalJo8Zhp2OIng+z9oA/0oiKC1Au9//osx6Rd1D+bDcOgo1l+BDFHWna+9Kan/4LitmVbb1wSk5lIBNiHtXgX9BeeFQ8gIzoTvQpu900yihI15GZDiGqNLvtVE6TKJxMzMg6Y3GLiiYMSJyqvF3iwf0CDXVmaiBgeTDlj8PaE4wXkuQUpipy3de2wb92HAxQkhAWW2pZPuQUkiFMIQTkfraoX92SN1sBA8u1p9FGonbyaN0YDoZS2DahXVXJbZUXpHB970ZkMiWJwoRKGMpNgnL3S7K9Jc9EgwOKXtyhrQq6FovfG+l7SKcyKB16HPb5sF8iU3bWQNki9ON5cbJ7OVYv7TI2S3yDqUZ+R+yVWBa6DxXs1ziyIvPQTgeQQWoMQGANn3PeJtUXmbgEGrWM6Jm6qHXBtXtci4k54JxYKdyz7a+roHURkBPXbCgHFDaHAYGc2z7A5hnoL5VQvavtvHfpcDY9GelurnEtqm8lM6FSbnQehsfZ/DLeuhCuKpFLzChX7sOPF58FnADzRmIvw3BisGQVuBymo5ircSXA6Oyx+Lhs7xCH+JNzR6GX/+IbzqHCjHfMqj7FWq0aiFojKhD8ZJRZEnPa7Llzf+5+0zdOjW7KIeYUV64fv+e+NDoodhs47oXUFDzke4KmZD+N6rANt0BDlWW+j4dK0Me6ZuddfZ/RI9+MDdhlkkC68zpATk+GNno+DNdMx9x+onpDFM7z/RkIzjW8RjJS2gR/npBF69RuDbdhg27Vu9iVzZubVOnHJA/HBxZA== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:aqbKL25CKQe/wbwqDpsyxKKMD3XxlqoqSiV22YzjgFGW2shPUsHi+r9oISYoxpoIyw0ZydA/8tkCzFcJptu/mMBRWfaIxDUN47oQ8fRJTYvxmdDk2K5GIw19K4MCalIbsi8tOs7pxrvOKdVArKcaK1aLBZnSLJJhzlY0E2DL83HQaZk1YB8xq/50621oi++aODtUoJrEar4rD3hMqn83q4mIah/MmYyBMYlamlj6Xo2PMrPAY4hdXxltmI/82rWe46ON95SrAo13k+EGq5NYPGDs3IlHb2aP2yL/ynLpUgitTBFbMoZSZv3ZVrP9O9qwDHn3eSEw/kDwTX/XIHotK7swW3S11Ak7q/pAAMP4bsI=; 5:OQqWkT0s2DSpKBkn7h5amDfABjHwECXVpUB2I1d/PwOdEHgctIghtjYu0qQiFn2M4XHXe8StUxjQWz0QZZTAiXv2JCRIu9y+zbhZGGqV9GDanKfzO3JPymjvXUsi1c5H0wI7LDqoIJZVbWHqfbSAPNUsPsG6tBLHHo0KLBjcYYI=; 24:V7vEj8GpIzh40g8DtprmYFRtFFiJ2fIionIGwuvUAm4s1XGKHoNCKkQAKVlEAawgNylDYix7ipXCya7wsMFt8bPAeYDX0ZLw82nIPM6/dts=; 7:cf228zrglb93hkATiV42X7qLcSxlrvqb4CHMKjNuKmkLPnUXi1yXHKg6u3VinhNYmNQDUHBEp29yYf26+LE35kuJPpJTfXzz1Jj6YORojw7Nx0w6hg002F4i91WwtEI2kktR6HfivpxBQlev9nqEWcc70tDgfBjgIVJxL0V43meLAvz/4gvy3igd3oTWdq2pOmGpjZ8naLXNNjcnYhOoxxYFfOH2rXWTmhAqET2Z6vigHg1nqhZ7/qIoi4EdlFjF SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:X/i3f3c8JlCwXLg2vsiOcirz4QT/eu0qzP2kzF9GHpZwRxGljaXsXfVampQN7ONKZ/0HkpEpmwg49RIDfJkq6kqkVlm4qSQwJ4mQ1Ba5o0xIg8qW8aLX/cfLBLM5lcdPGW/9mJjGHOKcmGKFCzdLBaweNYOvVw5AnGM68TtPf5U= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:52.8722 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 561be001-9f6d-448e-7cfd-08d56da0a989 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.94 Subject: [Qemu-devel] [RFC PATCH 27/34] tests: hv-scsi: add start-stop test X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" It's trivial and tests only a tiny fraction of the relevant code, but it's better than nothing. Signed-off-by: Roman Kagan --- tests/hv-scsi-test.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/Makefile.include | 3 +++ 2 files changed, 60 insertions(+) create mode 100644 tests/hv-scsi-test.c diff --git a/tests/hv-scsi-test.c b/tests/hv-scsi-test.c new file mode 100644 index 0000000000..9bff0df09c --- /dev/null +++ b/tests/hv-scsi-test.c @@ -0,0 +1,57 @@ +/* + * QTest testcase for Hyper-V/VMBus SCSI + * + * Copyright (c) 2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include +#include "qemu/osdep.h" +#include "libqtest.h" +#include "qemu/bswap.h" +#include "libqos/libqos-pc.h" + +static QOSState *qhv_scsi_start(const char *extra_opts) +{ + const char *arch = qtest_get_arch(); + const char *cmd = "-machine accel=kvm,vmbus " + "-cpu kvm64,hv_synic,hv_vpindex " + "-drive id=hd0,if=none,file=null-co://,format=raw " + "-device hv-scsi,id=scsi0 " + "-device scsi-hd,bus=scsi0.0,drive=hd0 %s"; + + if (strcmp(arch, "i386") && strcmp(arch, "x86_64")) { + g_printerr("Hyper-V / VMBus are only available on x86\n"); + exit(EXIT_FAILURE); + } + + if (access("/dev/kvm", R_OK | W_OK)) { + g_printerr("Hyper-V / VMBus can only be used with KVM\n"); + exit(EXIT_FAILURE); + } + + return qtest_pc_boot(cmd, extra_opts ? : ""); +} + +static void qhv_scsi_stop(QOSState *qs) +{ + qtest_shutdown(qs); +} + +static void start_stop(void) +{ + QOSState *qs; + + qs = qhv_scsi_start(NULL); + qhv_scsi_stop(qs); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + qtest_add_func("/hv-scsi/start-stop", start_stop); + + return g_test_run(); +} diff --git a/tests/Makefile.include b/tests/Makefile.include index ca82e0c0cc..800f9cca92 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -281,6 +281,8 @@ gcov-files-i386-y += hw/usb/hcd-xhci.c check-qtest-i386-y += tests/cpu-plug-test$(EXESUF) check-qtest-i386-y += tests/q35-test$(EXESUF) check-qtest-i386-y += tests/vmgenid-test$(EXESUF) +check-qtest-i386-y += tests/hv-scsi-test$(EXESUF) +gcov-files-i386-y += hw/scsi/hv-scsi.c gcov-files-i386-y += hw/pci-host/q35.c check-qtest-i386-$(CONFIG_VHOST_USER_NET_TEST_i386) += tests/vhost-user-test$(EXESUF) ifeq ($(CONFIG_VHOST_USER_NET_TEST_i386),) @@ -820,6 +822,7 @@ tests/test-arm-mptimer$(EXESUF): tests/test-arm-mptimer.o tests/test-qapi-util$(EXESUF): tests/test-qapi-util.o $(test-util-obj-y) tests/numa-test$(EXESUF): tests/numa-test.o tests/vmgenid-test$(EXESUF): tests/vmgenid-test.o tests/boot-sector.o tests/acpi-utils.o +tests/hv-scsi-test$(EXESUF): tests/hv-scsi-test.o $(libqos-pc-obj-y) tests/migration/stress$(EXESUF): tests/migration/stress.o $(call quiet-command, $(LINKPROG) -static -O3 $(PTHREAD_LIB) -o $@ $< ,"LINK","$(TARGET_DIR)$@") From patchwork Tue Feb 6 20:30:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870097 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="gF+hBULh"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcFD5qNfz9s7M for ; Wed, 7 Feb 2018 07:56:16 +1100 (AEDT) Received: from localhost ([::1]:60851 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAHm-0008Of-Kg for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:56:14 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45102) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uP-0001X5-R0 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uK-0003Oq-KA for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:05 -0500 Received: from mail-db5eur01on0100.outbound.protection.outlook.com ([104.47.2.100]:59777 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uK-0003OJ-66 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=4zf+f+4eOENSQTYfX41KkLuQO3OEoXOcFsePgltUjdc=; b=gF+hBULhcmsysnVsj8dL9sv7POMujPx9pHcOSSiS82A75vbitzKexxqFf3MmD+kH1jO+kQ6mSUw4o6wnB3wSgZT9wgkL4b+SWF1gjB4Kb71bBVeJ0jqv16a/iRa4JL6SL3zrREsUwWi9RfjkD6Ref2qERzDn6dMWYVZFYsrvzkA= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:55 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:42 +0300 Message-Id: <20180206203048.11096-29-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ef0ae3b8-080f-40e6-f933-08d56da0aac8 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:WnhKKCqpQZWqVngad4nI/z9UEngV+FQ+kuboMI4nc1Mj3++sgN/ajxq+4RMRcCvQgEvPx9nMPsZwjSB1jzXfNP/BicW976alk/PnhtYlQmovMndvOoQzvWIswx80aD66cSuslvRoJrgydETilDxjkJhq56z7VTOg3Yp9wZd9SQ09jj4RRVdwof7oUioSNHqSNcN5EpzS6KhoZeFKyESPTjNwl39mhxHL7X6DMVL77bgP8/gZH9j2iF63bkfU6kpF; 25:xeb5FGOraB5NPchl5aTZJDyWLMzVnrrpsG6UXOdF1YnljgNEaTrxj6NCslOUwfUmyrSlTZ7JyNn0RDygd1hCcGqCgcSmqrlX6orz9twT3OljS9/Fc8yka4QH2AgE3HIHFVLBpaFPPR65f6TzecNLix95NareqKa/botfCo2qHRv4YlPPXla7hRcUBIhLwSPlOys2UBrau2TgmqYRThPuEV0J0bMX0UOL5x7KBj3J9mLCUZNDXHE1YclGQhWmug6SzrxX0QsH184B6QFggjd9uZINOsIQ1sUzigW4Hg88QJXMqW6BbZQEdP9tsKUm6nvsfOaKrpngpyCWcUB70tBgAw==; 31:GUBNaStU5d+VXodZFLckEkvFMuKeOD8xx26KJVofmVPp6OmSfZ+dOnmdsWNFqb4PN+jjK3vDJEwGGb+l61wWy9pJBKF4NZr6UFgJKpnxuYioEPH3yxzMZ/paqPX+drudmy6ERf7TDv1fFhcLJVgi2UpeYX0gX2Zg5XmC5n+5S4y0rn3+QTxf2qOPzud+JTaT/TQrthVg2GnEFUKh/nYQgxaYyQEkP8n2eRXYPQ0oJf4= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:T4zLzrVEshCFmYfs8O7Ufhp6GGfeK1c09RJFxCeylv3OZSbMfeRX3cwdHP73sE2GCGK/K/Uiw4NjIznNs3qc5d8bPkvQgUDODUIb4CXMsK9HUAp8oMvOAScH12DhsoENodPFU+xkm5hWzT179BxI4Uwelg8S6lL0BBYvkMWaLxiaO2qhTjiX1AT84zNcwR5aPpuIkI8h8oaWUODyj5vIFxonLs+x4kwh6oT8ughgzLAdqsWfE7MDXE6EwqWJvdvYsCGDSY+j5/5ZG7+u3UplXp442SAC6UcmZfQ+N1kTny9VbMVpa4ZGlQsybXo5+X8AW3gbYFhFWrs1y/Ir622S9tTd1aEgXvKfhODbhxeJu/U2Py+W7si4Q79u/vGLEOxa6lQ3NMHcODS5CNF+lez4wClI8fR+AIjWhEY4Z/RRLbQ=; 4:f2HMEULYY3/Hu0Etmacq0N4/nSuK+7aPtueqxEpojdXbvWAk5DT7TnIac2xkASyWI1xoX8LZ42q4mrNSFdA03CZDE33keowfUgEJRjRtCm2VlcfxY2aIjCXg2/bbqdrHmXQvyZ/I9LKqkmn19xzcAM0FgCGVG5ImSD2wUG96mJazqO7THZsjNAuc/zNW/JcC7jayvwZ7A+heg9O3hPc1RHFOVYl6r5YU95jY7t5y62y+dohWb+vokeRKi3nVjGb/Y85HfDr0cEBjoSYHDts+IxN1NwNrgNYc7u7BdrveMG2LgZNLpdNQpNkDNXAfynsz X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(45080400002)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:HQY8lNMVHTq2QpKOvA6hjrCEHmDwVhRtYxsueGR?= UejkPAYFWwXtRl3AoOaHVBGkNX5d7bw6OypUTFEYYC7jYLSJdyM1HG3w4gQYFEIqUcdjPkKUVBenHu+v8oypn9xX34ZVLXey2EhaB//jYkPJZtVDdDxZKFbuPftRH1Qgvk/21NJAUzDJZgW6X5yHWmHlpIdIr265KVuPwl7xKOy4JSbzVv3HMyXjGpTjZrS4w5gJyRzqQuGh6qZGIIpn5QKpbSgEfoTqlyJnq8ia0cMaKDpiaGWPej/hJPNk/4EUzP+CKZeIE1Je/PyyQxJWri0H/O4hVwt42TVkt+cIfMIEZUJz+nIaBcUJvce95u9WkuFBoKffhuHk6Yqvl5+5ohxTeAc/5fIv9iU/FgsHM5i3AP1McjxTiEHAB/fe7YT3X803lCxHqlnqtPKpgBsuuEMznHEYBxRZe4B42Ccs8F1Hn0GISnZu9/HheqdA+GmN59Dp7b4XUOPqOb9GNxthdPaXhdHUa0SaFtvFpT4NU0hxbDNSvS0XKcRB7lONLTPbB0S/UGyqvx0viZVdOW5wVzONZCp5mTxQt8S8Aip9+4c19eMdfwVmW+5aRxW/d2jC7jIJQvYYjTMtRtJjQ+2CfZ8xt8CdiqeJP6RVmNyIbh+ss2ArYlHDAAWMcp3NJoD570M/0yTjiNm9+7kwEZ/jGvuje7J1/QAaPUgzQCFIjKV5vNArOA3bBDBBAEfznDuxD6I2+dfiDTxvs2kKHMJhd8wpzz1zcLeoxQost7JhxobPXfD6rl5MPtpeEYevEDd4vx/k5agA4RcP93Lk8fmcJIBm6p905FqPMt08y8kLRGcwrceihhNEQ8GUjTvNRbvUcGWOtI+IjWt60ZOljToO8iIuQdbLuxKccYjttVWGOp1a4CS9+50JJ1Etpsj9F0kHegOhWOe45gFXgG76Q92riT9gepnkdGRSs/ygXXM6vatHgNBr6f5weQbVdGgKAQfbOsxw+1RQQSsCeuypMZYdy+on8rzm7UwjEvyZFnRd8t06cYLfVWkoNhjO2GDA/sz/am9E2EjCtvKXEL2XMw1hptiUENqvlw/0qRBrqXl116vGTb2Xhuomdh0SCUVPdPfEHYM+LToPMfHxlEzAh6uBfAvO4NXIyLQCTQ86uHUl/VfIqR6PLuqTj0vGFoc8ZWvJHckuvX2djPo8Xbr2alumKkQDaUEpdApO64Z27Aus+Fro8t7Uk2L0svqvh6p+DCwm12otGXs2MTB+gOZSjyYNDZ+Ubn9t4MXsCMvrY1G8oLpACzzRh13aUurE5A1kMnOeK+rwfh4Y4kkGEDz1OCl3SMadNRJIKCW/+YN3QkXcp+O22okPD/nenCfIIyCDzPBx76nA= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:j3u6vU98qvZWsNGadYu0dwd06+/8ys3bIhawpu4zuKlKsCB7RDSWKiDlAqZjZPdFQck/jVl6LNPxbUjrYfqwgxco5P0eNzHEb+7diSAaR5VDTApKnH8P25hqm16ZKnEyPQfBKYxuNaumqJjwhdSEI53F4+8Sr4AaZ/1NHczRVc6rnTtEmb6vzNksmPUWK4bh4SPVkkqBSTYE/I+lABVDrg+ehJkAqXsrp/1O30as6gbX7+kNapslzyKo0MDzQ0raqka73WvNccqaujjoRFioSwgQUoubaZZkhD02QvzkqyYrYWyGylyVIXTO5dysIgrE68FGpdRBQAcn2ekgaAxuxSk5UAF3IOYRU7g/ZTKdTYA=; 5:59ZDyF1sCNrQNCZYhRwJ44K0mVhXHjKgr2PAMDyr/WxtkTBo2xRrdgrOKyETnL1dUTz0Ob03YBxKKsteYOqKBvKLTgUe54pGFIOsmNlijt0zV9DCqoE93xZncS+KWds9y1pmlD8gnMMJkcNYUDVUnIMfwW0pjPcnNrZsAoKW+3s=; 24:LBctdZQh5aqAS31+3im71WzXLO/6mlwhnUvgGKIhCSD3eFNVpYRLaCa789/AXsJDCeKYeK6np3TdyxVMkaZO/ylQY1X6xFEXlUfoERBlj4s=; 7:Az63boRgl8bn5lKTUnz0auD2GT8cJjglesAcmMwcWG8RxPWNM9Hio2WRDDgClaxT6C9N3R/Ym4hDadgrUcY3tg1mIwoSV+mutSoBymu43ovol6vl2B4PAmkVaWOaSZNJdnvSMsSRxpdW4HTCN0C6whY7Wnge6ifAY7gpHbhv6SgGrZSTgGcP2Ej0dcM+H35f4N+HkCX1bg/K3izXUtQjiynnhxJV0tudJUGWjVT+KZP/rxawSsWuEFtypyet5TUl SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:DsANFFrhpx5srmQxYI76rp8rVfR+yS1wEPyyBWtnhCy2xIpyALGsWdF1Zn//PTZY7T21cElgw7hppqlDbdCD5T3I8R49qIRIzLDyT3p4+ZFXgAiFoR1pwBw4u/KPJlELafjgO8q+89974/cuwVsVNzXXRCUEPtDtgH6XlvtPJ7I= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:55.5441 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ef0ae3b8-080f-40e6-f933-08d56da0aac8 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.100 Subject: [Qemu-devel] [RFC PATCH 28/34] net: add RNDIS definitions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add a header with constants used in Microsoft RNDIS protocol. The header is taken unchanged from the Linux kernel. TODO: reconcile with usb-net Signed-off-by: Roman Kagan --- hw/net/rndis.h | 391 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 391 insertions(+) create mode 100644 hw/net/rndis.h diff --git a/hw/net/rndis.h b/hw/net/rndis.h new file mode 100644 index 0000000000..93c0a64aef --- /dev/null +++ b/hw/net/rndis.h @@ -0,0 +1,391 @@ +/* + * Remote Network Driver Interface Specification (RNDIS) + * definitions of the magic numbers used by this protocol + */ + +/* Remote NDIS Versions */ +#define RNDIS_MAJOR_VERSION 0x00000001 +#define RNDIS_MINOR_VERSION 0x00000000 + +/* Device Flags */ +#define RNDIS_DF_CONNECTIONLESS 0x00000001U +#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002U +#define RNDIS_DF_RAW_DATA 0x00000004U + +/* + * Codes for "msg_type" field of rndis messages; + * only the data channel uses packet messages (maybe batched); + * everything else goes on the control channel. + */ +#define RNDIS_MSG_COMPLETION 0x80000000 +#define RNDIS_MSG_PACKET 0x00000001 /* 1-N packets */ +#define RNDIS_MSG_INIT 0x00000002 +#define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_HALT 0x00000003 +#define RNDIS_MSG_QUERY 0x00000004 +#define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_SET 0x00000005 +#define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_RESET 0x00000006 +#define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION) +#define RNDIS_MSG_INDICATE 0x00000007 +#define RNDIS_MSG_KEEPALIVE 0x00000008 +#define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION) +/* + * Reserved message type for private communication between lower-layer host + * driver and remote device, if necessary. + */ +#define RNDIS_MSG_BUS 0xff000001 + +/* codes for "status" field of completion messages */ +#define RNDIS_STATUS_SUCCESS 0x00000000 +#define RNDIS_STATUS_PENDING 0x00000103 + +/* Status codes */ +#define RNDIS_STATUS_NOT_RECOGNIZED 0x00010001 +#define RNDIS_STATUS_NOT_COPIED 0x00010002 +#define RNDIS_STATUS_NOT_ACCEPTED 0x00010003 +#define RNDIS_STATUS_CALL_ACTIVE 0x00010007 + +#define RNDIS_STATUS_ONLINE 0x40010003 +#define RNDIS_STATUS_RESET_START 0x40010004 +#define RNDIS_STATUS_RESET_END 0x40010005 +#define RNDIS_STATUS_RING_STATUS 0x40010006 +#define RNDIS_STATUS_CLOSED 0x40010007 +#define RNDIS_STATUS_WAN_LINE_UP 0x40010008 +#define RNDIS_STATUS_WAN_LINE_DOWN 0x40010009 +#define RNDIS_STATUS_WAN_FRAGMENT 0x4001000A +#define RNDIS_STATUS_MEDIA_CONNECT 0x4001000B +#define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000C +#define RNDIS_STATUS_HARDWARE_LINE_UP 0x4001000D +#define RNDIS_STATUS_HARDWARE_LINE_DOWN 0x4001000E +#define RNDIS_STATUS_INTERFACE_UP 0x4001000F +#define RNDIS_STATUS_INTERFACE_DOWN 0x40010010 +#define RNDIS_STATUS_MEDIA_BUSY 0x40010011 +#define RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION 0x40010012 +#define RNDIS_STATUS_WW_INDICATION RDIA_SPECIFIC_INDICATION +#define RNDIS_STATUS_LINK_SPEED_CHANGE 0x40010013L +#define RNDIS_STATUS_NETWORK_CHANGE 0x40010018 + +#define RNDIS_STATUS_NOT_RESETTABLE 0x80010001 +#define RNDIS_STATUS_SOFT_ERRORS 0x80010003 +#define RNDIS_STATUS_HARD_ERRORS 0x80010004 +#define RNDIS_STATUS_BUFFER_OVERFLOW 0x80000005 + +#define RNDIS_STATUS_FAILURE 0xC0000001 +#define RNDIS_STATUS_RESOURCES 0xC000009A +#define RNDIS_STATUS_NOT_SUPPORTED 0xc00000BB +#define RNDIS_STATUS_CLOSING 0xC0010002 +#define RNDIS_STATUS_BAD_VERSION 0xC0010004 +#define RNDIS_STATUS_BAD_CHARACTERISTICS 0xC0010005 +#define RNDIS_STATUS_ADAPTER_NOT_FOUND 0xC0010006 +#define RNDIS_STATUS_OPEN_FAILED 0xC0010007 +#define RNDIS_STATUS_DEVICE_FAILED 0xC0010008 +#define RNDIS_STATUS_MULTICAST_FULL 0xC0010009 +#define RNDIS_STATUS_MULTICAST_EXISTS 0xC001000A +#define RNDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B +#define RNDIS_STATUS_REQUEST_ABORTED 0xC001000C +#define RNDIS_STATUS_RESET_IN_PROGRESS 0xC001000D +#define RNDIS_STATUS_CLOSING_INDICATING 0xC001000E +#define RNDIS_STATUS_INVALID_PACKET 0xC001000F +#define RNDIS_STATUS_OPEN_LIST_FULL 0xC0010010 +#define RNDIS_STATUS_ADAPTER_NOT_READY 0xC0010011 +#define RNDIS_STATUS_ADAPTER_NOT_OPEN 0xC0010012 +#define RNDIS_STATUS_NOT_INDICATING 0xC0010013 +#define RNDIS_STATUS_INVALID_LENGTH 0xC0010014 +#define RNDIS_STATUS_INVALID_DATA 0xC0010015 +#define RNDIS_STATUS_BUFFER_TOO_SHORT 0xC0010016 +#define RNDIS_STATUS_INVALID_OID 0xC0010017 +#define RNDIS_STATUS_ADAPTER_REMOVED 0xC0010018 +#define RNDIS_STATUS_UNSUPPORTED_MEDIA 0xC0010019 +#define RNDIS_STATUS_GROUP_ADDRESS_IN_USE 0xC001001A +#define RNDIS_STATUS_FILE_NOT_FOUND 0xC001001B +#define RNDIS_STATUS_ERROR_READING_FILE 0xC001001C +#define RNDIS_STATUS_ALREADY_MAPPED 0xC001001D +#define RNDIS_STATUS_RESOURCE_CONFLICT 0xC001001E +#define RNDIS_STATUS_NO_CABLE 0xC001001F + +#define RNDIS_STATUS_INVALID_SAP 0xC0010020 +#define RNDIS_STATUS_SAP_IN_USE 0xC0010021 +#define RNDIS_STATUS_INVALID_ADDRESS 0xC0010022 +#define RNDIS_STATUS_VC_NOT_ACTIVATED 0xC0010023 +#define RNDIS_STATUS_DEST_OUT_OF_ORDER 0xC0010024 +#define RNDIS_STATUS_VC_NOT_AVAILABLE 0xC0010025 +#define RNDIS_STATUS_CELLRATE_NOT_AVAILABLE 0xC0010026 +#define RNDIS_STATUS_INCOMPATABLE_QOS 0xC0010027 +#define RNDIS_STATUS_AAL_PARAMS_UNSUPPORTED 0xC0010028 +#define RNDIS_STATUS_NO_ROUTE_TO_DESTINATION 0xC0010029 + +#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR 0xC0011000 + +/* codes for RNDIS_OID_GEN_PHYSICAL_MEDIUM */ +#define RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED 0x00000000 +#define RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN 0x00000001 +#define RNDIS_PHYSICAL_MEDIUM_CABLE_MODEM 0x00000002 +#define RNDIS_PHYSICAL_MEDIUM_PHONE_LINE 0x00000003 +#define RNDIS_PHYSICAL_MEDIUM_POWER_LINE 0x00000004 +#define RNDIS_PHYSICAL_MEDIUM_DSL 0x00000005 +#define RNDIS_PHYSICAL_MEDIUM_FIBRE_CHANNEL 0x00000006 +#define RNDIS_PHYSICAL_MEDIUM_1394 0x00000007 +#define RNDIS_PHYSICAL_MEDIUM_WIRELESS_WAN 0x00000008 +#define RNDIS_PHYSICAL_MEDIUM_MAX 0x00000009 + +/* Remote NDIS medium types. */ +#define RNDIS_MEDIUM_UNSPECIFIED 0x00000000 +#define RNDIS_MEDIUM_802_3 0x00000000 +#define RNDIS_MEDIUM_802_5 0x00000001 +#define RNDIS_MEDIUM_FDDI 0x00000002 +#define RNDIS_MEDIUM_WAN 0x00000003 +#define RNDIS_MEDIUM_LOCAL_TALK 0x00000004 +#define RNDIS_MEDIUM_ARCNET_RAW 0x00000006 +#define RNDIS_MEDIUM_ARCNET_878_2 0x00000007 +#define RNDIS_MEDIUM_ATM 0x00000008 +#define RNDIS_MEDIUM_WIRELESS_LAN 0x00000009 +#define RNDIS_MEDIUM_IRDA 0x0000000A +#define RNDIS_MEDIUM_BPC 0x0000000B +#define RNDIS_MEDIUM_CO_WAN 0x0000000C +#define RNDIS_MEDIUM_1394 0x0000000D +/* Not a real medium, defined as an upper-bound */ +#define RNDIS_MEDIUM_MAX 0x0000000E + +/* Remote NDIS medium connection states. */ +#define RNDIS_MEDIA_STATE_CONNECTED 0x00000000 +#define RNDIS_MEDIA_STATE_DISCONNECTED 0x00000001 + +/* packet filter bits used by RNDIS_OID_GEN_CURRENT_PACKET_FILTER */ +#define RNDIS_PACKET_TYPE_DIRECTED 0x00000001 +#define RNDIS_PACKET_TYPE_MULTICAST 0x00000002 +#define RNDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 +#define RNDIS_PACKET_TYPE_BROADCAST 0x00000008 +#define RNDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 +#define RNDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 +#define RNDIS_PACKET_TYPE_SMT 0x00000040 +#define RNDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 +#define RNDIS_PACKET_TYPE_GROUP 0x00001000 +#define RNDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00002000 +#define RNDIS_PACKET_TYPE_FUNCTIONAL 0x00004000 +#define RNDIS_PACKET_TYPE_MAC_FRAME 0x00008000 + +/* RNDIS_OID_GEN_MINIPORT_INFO constants */ +#define RNDIS_MINIPORT_BUS_MASTER 0x00000001 +#define RNDIS_MINIPORT_WDM_DRIVER 0x00000002 +#define RNDIS_MINIPORT_SG_LIST 0x00000004 +#define RNDIS_MINIPORT_SUPPORTS_MEDIA_QUERY 0x00000008 +#define RNDIS_MINIPORT_INDICATES_PACKETS 0x00000010 +#define RNDIS_MINIPORT_IGNORE_PACKET_QUEUE 0x00000020 +#define RNDIS_MINIPORT_IGNORE_REQUEST_QUEUE 0x00000040 +#define RNDIS_MINIPORT_IGNORE_TOKEN_RING_ERRORS 0x00000080 +#define RNDIS_MINIPORT_INTERMEDIATE_DRIVER 0x00000100 +#define RNDIS_MINIPORT_IS_NDIS_5 0x00000200 +#define RNDIS_MINIPORT_IS_CO 0x00000400 +#define RNDIS_MINIPORT_DESERIALIZE 0x00000800 +#define RNDIS_MINIPORT_REQUIRES_MEDIA_POLLING 0x00001000 +#define RNDIS_MINIPORT_SUPPORTS_MEDIA_SENSE 0x00002000 +#define RNDIS_MINIPORT_NETBOOT_CARD 0x00004000 +#define RNDIS_MINIPORT_PM_SUPPORTED 0x00008000 +#define RNDIS_MINIPORT_SUPPORTS_MAC_ADDRESS_OVERWRITE 0x00010000 +#define RNDIS_MINIPORT_USES_SAFE_BUFFER_APIS 0x00020000 +#define RNDIS_MINIPORT_HIDDEN 0x00040000 +#define RNDIS_MINIPORT_SWENUM 0x00080000 +#define RNDIS_MINIPORT_SURPRISE_REMOVE_OK 0x00100000 +#define RNDIS_MINIPORT_NO_HALT_ON_SUSPEND 0x00200000 +#define RNDIS_MINIPORT_HARDWARE_DEVICE 0x00400000 +#define RNDIS_MINIPORT_SUPPORTS_CANCEL_SEND_PACKETS 0x00800000 +#define RNDIS_MINIPORT_64BITS_DMA 0x01000000 + +#define RNDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001 +#define RNDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002 +#define RNDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004 +#define RNDIS_MAC_OPTION_NO_LOOPBACK 0x00000008 +#define RNDIS_MAC_OPTION_FULL_DUPLEX 0x00000010 +#define RNDIS_MAC_OPTION_EOTX_INDICATION 0x00000020 +#define RNDIS_MAC_OPTION_8021P_PRIORITY 0x00000040 +#define RNDIS_MAC_OPTION_RESERVED 0x80000000 + +/* Object Identifiers used by NdisRequest Query/Set Information */ +/* General (Required) Objects */ +#define RNDIS_OID_GEN_SUPPORTED_LIST 0x00010101 +#define RNDIS_OID_GEN_HARDWARE_STATUS 0x00010102 +#define RNDIS_OID_GEN_MEDIA_SUPPORTED 0x00010103 +#define RNDIS_OID_GEN_MEDIA_IN_USE 0x00010104 +#define RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105 +#define RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106 +#define RNDIS_OID_GEN_LINK_SPEED 0x00010107 +#define RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108 +#define RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109 +#define RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A +#define RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B +#define RNDIS_OID_GEN_VENDOR_ID 0x0001010C +#define RNDIS_OID_GEN_VENDOR_DESCRIPTION 0x0001010D +#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER 0x0001010E +#define RNDIS_OID_GEN_CURRENT_LOOKAHEAD 0x0001010F +#define RNDIS_OID_GEN_DRIVER_VERSION 0x00010110 +#define RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111 +#define RNDIS_OID_GEN_PROTOCOL_OPTIONS 0x00010112 +#define RNDIS_OID_GEN_MAC_OPTIONS 0x00010113 +#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS 0x00010114 +#define RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115 +#define RNDIS_OID_GEN_VENDOR_DRIVER_VERSION 0x00010116 +#define RNDIS_OID_GEN_SUPPORTED_GUIDS 0x00010117 +#define RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118 +#define RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119 +#define RNDIS_OID_GEN_PHYSICAL_MEDIUM 0x00010202 +#define RNDIS_OID_GEN_MACHINE_NAME 0x0001021A +#define RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B +#define RNDIS_OID_GEN_VLAN_ID 0x0001021C + +/* Optional OIDs */ +#define RNDIS_OID_GEN_MEDIA_CAPABILITIES 0x00010201 + +/* Required statistics OIDs */ +#define RNDIS_OID_GEN_XMIT_OK 0x00020101 +#define RNDIS_OID_GEN_RCV_OK 0x00020102 +#define RNDIS_OID_GEN_XMIT_ERROR 0x00020103 +#define RNDIS_OID_GEN_RCV_ERROR 0x00020104 +#define RNDIS_OID_GEN_RCV_NO_BUFFER 0x00020105 + +/* Optional statistics OIDs */ +#define RNDIS_OID_GEN_DIRECTED_BYTES_XMIT 0x00020201 +#define RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202 +#define RNDIS_OID_GEN_MULTICAST_BYTES_XMIT 0x00020203 +#define RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204 +#define RNDIS_OID_GEN_BROADCAST_BYTES_XMIT 0x00020205 +#define RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206 +#define RNDIS_OID_GEN_DIRECTED_BYTES_RCV 0x00020207 +#define RNDIS_OID_GEN_DIRECTED_FRAMES_RCV 0x00020208 +#define RNDIS_OID_GEN_MULTICAST_BYTES_RCV 0x00020209 +#define RNDIS_OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A +#define RNDIS_OID_GEN_BROADCAST_BYTES_RCV 0x0002020B +#define RNDIS_OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C + +#define RNDIS_OID_GEN_RCV_CRC_ERROR 0x0002020D +#define RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E + +#define RNDIS_OID_GEN_GET_TIME_CAPS 0x0002020F +#define RNDIS_OID_GEN_GET_NETCARD_TIME 0x00020210 + +#define RNDIS_OID_GEN_NETCARD_LOAD 0x00020211 +#define RNDIS_OID_GEN_DEVICE_PROFILE 0x00020212 +#define RNDIS_OID_GEN_INIT_TIME_MS 0x00020213 +#define RNDIS_OID_GEN_RESET_COUNTS 0x00020214 +#define RNDIS_OID_GEN_MEDIA_SENSE_COUNTS 0x00020215 +#define RNDIS_OID_GEN_FRIENDLY_NAME 0x00020216 +#define RNDIS_OID_GEN_MINIPORT_INFO 0x00020217 +#define RNDIS_OID_GEN_RESET_VERIFY_PARAMETERS 0x00020218 + +/* These are connection-oriented general OIDs. */ +/* These replace the above OIDs for connection-oriented media. */ +#define RNDIS_OID_GEN_CO_SUPPORTED_LIST 0x00010101 +#define RNDIS_OID_GEN_CO_HARDWARE_STATUS 0x00010102 +#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED 0x00010103 +#define RNDIS_OID_GEN_CO_MEDIA_IN_USE 0x00010104 +#define RNDIS_OID_GEN_CO_LINK_SPEED 0x00010105 +#define RNDIS_OID_GEN_CO_VENDOR_ID 0x00010106 +#define RNDIS_OID_GEN_CO_VENDOR_DESCRIPTION 0x00010107 +#define RNDIS_OID_GEN_CO_DRIVER_VERSION 0x00010108 +#define RNDIS_OID_GEN_CO_PROTOCOL_OPTIONS 0x00010109 +#define RNDIS_OID_GEN_CO_MAC_OPTIONS 0x0001010A +#define RNDIS_OID_GEN_CO_MEDIA_CONNECT_STATUS 0x0001010B +#define RNDIS_OID_GEN_CO_VENDOR_DRIVER_VERSION 0x0001010C +#define RNDIS_OID_GEN_CO_MINIMUM_LINK_SPEED 0x0001010D + +#define RNDIS_OID_GEN_CO_GET_TIME_CAPS 0x00010201 +#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME 0x00010202 + +/* These are connection-oriented statistics OIDs. */ +#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK 0x00020101 +#define RNDIS_OID_GEN_CO_RCV_PDUS_OK 0x00020102 +#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR 0x00020103 +#define RNDIS_OID_GEN_CO_RCV_PDUS_ERROR 0x00020104 +#define RNDIS_OID_GEN_CO_RCV_PDUS_NO_BUFFER 0x00020105 + + +#define RNDIS_OID_GEN_CO_RCV_CRC_ERROR 0x00020201 +#define RNDIS_OID_GEN_CO_TRANSMIT_QUEUE_LENGTH 0x00020202 +#define RNDIS_OID_GEN_CO_BYTES_XMIT 0x00020203 +#define RNDIS_OID_GEN_CO_BYTES_RCV 0x00020204 +#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205 +#define RNDIS_OID_GEN_CO_NETCARD_LOAD 0x00020206 + +/* These are objects for Connection-oriented media call-managers. */ +#define RNDIS_OID_CO_ADD_PVC 0xFF000001 +#define RNDIS_OID_CO_DELETE_PVC 0xFF000002 +#define RNDIS_OID_CO_GET_CALL_INFORMATION 0xFF000003 +#define RNDIS_OID_CO_ADD_ADDRESS 0xFF000004 +#define RNDIS_OID_CO_DELETE_ADDRESS 0xFF000005 +#define RNDIS_OID_CO_GET_ADDRESSES 0xFF000006 +#define RNDIS_OID_CO_ADDRESS_CHANGE 0xFF000007 +#define RNDIS_OID_CO_SIGNALING_ENABLED 0xFF000008 +#define RNDIS_OID_CO_SIGNALING_DISABLED 0xFF000009 + +/* 802.3 Objects (Ethernet) */ +#define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101 +#define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102 +#define RNDIS_OID_802_3_MULTICAST_LIST 0x01010103 +#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE 0x01010104 +#define RNDIS_OID_802_3_MAC_OPTIONS 0x01010105 + +#define RNDIS_802_3_MAC_OPTION_PRIORITY 0x00000001 + +#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101 +#define RNDIS_OID_802_3_XMIT_ONE_COLLISION 0x01020102 +#define RNDIS_OID_802_3_XMIT_MORE_COLLISIONS 0x01020103 + +#define RNDIS_OID_802_3_XMIT_DEFERRED 0x01020201 +#define RNDIS_OID_802_3_XMIT_MAX_COLLISIONS 0x01020202 +#define RNDIS_OID_802_3_RCV_OVERRUN 0x01020203 +#define RNDIS_OID_802_3_XMIT_UNDERRUN 0x01020204 +#define RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205 +#define RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206 +#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS 0x01020207 + +#define RNDIS_OID_802_11_BSSID 0x0d010101 +#define RNDIS_OID_802_11_SSID 0x0d010102 +#define RNDIS_OID_802_11_INFRASTRUCTURE_MODE 0x0d010108 +#define RNDIS_OID_802_11_ADD_WEP 0x0d010113 +#define RNDIS_OID_802_11_REMOVE_WEP 0x0d010114 +#define RNDIS_OID_802_11_DISASSOCIATE 0x0d010115 +#define RNDIS_OID_802_11_AUTHENTICATION_MODE 0x0d010118 +#define RNDIS_OID_802_11_PRIVACY_FILTER 0x0d010119 +#define RNDIS_OID_802_11_BSSID_LIST_SCAN 0x0d01011a +#define RNDIS_OID_802_11_ENCRYPTION_STATUS 0x0d01011b +#define RNDIS_OID_802_11_ADD_KEY 0x0d01011d +#define RNDIS_OID_802_11_REMOVE_KEY 0x0d01011e +#define RNDIS_OID_802_11_ASSOCIATION_INFORMATION 0x0d01011f +#define RNDIS_OID_802_11_CAPABILITY 0x0d010122 +#define RNDIS_OID_802_11_PMKID 0x0d010123 +#define RNDIS_OID_802_11_NETWORK_TYPES_SUPPORTED 0x0d010203 +#define RNDIS_OID_802_11_NETWORK_TYPE_IN_USE 0x0d010204 +#define RNDIS_OID_802_11_TX_POWER_LEVEL 0x0d010205 +#define RNDIS_OID_802_11_RSSI 0x0d010206 +#define RNDIS_OID_802_11_RSSI_TRIGGER 0x0d010207 +#define RNDIS_OID_802_11_FRAGMENTATION_THRESHOLD 0x0d010209 +#define RNDIS_OID_802_11_RTS_THRESHOLD 0x0d01020a +#define RNDIS_OID_802_11_SUPPORTED_RATES 0x0d01020e +#define RNDIS_OID_802_11_CONFIGURATION 0x0d010211 +#define RNDIS_OID_802_11_POWER_MODE 0x0d010216 +#define RNDIS_OID_802_11_BSSID_LIST 0x0d010217 + +/* Plug and Play capabilities */ +#define RNDIS_OID_PNP_CAPABILITIES 0xFD010100 +#define RNDIS_OID_PNP_SET_POWER 0xFD010101 +#define RNDIS_OID_PNP_QUERY_POWER 0xFD010102 +#define RNDIS_OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103 +#define RNDIS_OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104 +#define RNDIS_OID_PNP_ENABLE_WAKE_UP 0xFD010106 + +/* RNDIS_PNP_CAPABILITIES.Flags constants */ +#define RNDIS_DEVICE_WAKE_UP_ENABLE 0x00000001 +#define RNDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE 0x00000002 +#define RNDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE 0x00000004 + +#define REMOTE_CONDIS_MP_CREATE_VC_MSG 0x00008001 +#define REMOTE_CONDIS_MP_DELETE_VC_MSG 0x00008002 +#define REMOTE_CONDIS_MP_ACTIVATE_VC_MSG 0x00008005 +#define REMOTE_CONDIS_MP_DEACTIVATE_VC_MSG 0x00008006 +#define REMOTE_CONDIS_INDICATE_STATUS_MSG 0x00008007 + +#define REMOTE_CONDIS_MP_CREATE_VC_CMPLT 0x80008001 +#define REMOTE_CONDIS_MP_DELETE_VC_CMPLT 0x80008002 +#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT 0x80008005 +#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT 0x80008006 From patchwork Tue Feb 6 20:30:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870127 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="WvauEEuV"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbd2d43dtz9s7M for ; Wed, 7 Feb 2018 08:32:09 +1100 (AEDT) Received: from localhost ([::1]:37230 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAqV-0001IL-Nm for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:32:07 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45100) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uP-0001Wr-OP for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uM-0003Pb-8V for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:05 -0500 Received: from mail-db5eur01on0134.outbound.protection.outlook.com ([104.47.2.134]:31212 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uL-0003Oz-Nh for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=pE+JKNfdrttryv46Y2wRQBK+iwd6p+v/J467cNxbczU=; b=WvauEEuV4q3o6SkN278HngNkPQ3z2NNi3vicXNexwgf/MzC+rKfDvDfRHNjODm3A04ID9JoKa5UnjKk+q1F84IgVBdMOhPY9zLTyf8M0iF2Z/xTIHgOhp0FssranwFa/WTwfF6955bPqeK8Yib1odcDL52YfICKK/5XOiin7eLI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:57 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:43 +0300 Message-Id: <20180206203048.11096-30-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 31fc9a42-731e-4391-3cce-08d56da0abcf X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:nCOxD0ySiy1g82EGvbA5VHbnX3QPBf/GpibHOgnFGlEdScZ5317zHlPM/X5fQlQT6B3juuIayGozvmsrFNCbeDwlm6Kz4dia+TV0tMFWDyxKmfcVoB+E/zyOLRbN55p+yOsB1hs6M2oFAINJZnRfTbVB+sWDRKLG9WXkEl9EG3aUw2VibNp2dA0327ZcGG2Ri581/NN6LVMYibdE9GCRrEKdQiG+54YJbkim+tA7YqD2emORRCP/MV7DrkNsk0iB; 25:25d7suAVz4o/9Eimf63CcPzKZbyC4mVlwHkpM7vrCboajYDm6qcb0my4YL9QURQwlgiPW2MZTuM7w8rI+h+KHeMJhPQ1YPKbDikaOt9srF1ojJvSjvsXC1RAFTVVYxXTeS+UiyY6Z7yGIMcqX5TtDz+vJrUnU80UFhy86dip9Q3Uiq+k/tZdvrgMiKHDQe2qQKxE9pMNOoUMnUTGr7Naz/xanhl0pjROrEHl7g8wimVaDGgf1lZrccChcMcXK4r617BRi8UIjP1qZgDjs2mes7JWL5ZtHi9xsMIie4+BIxcO+CF/fl9/Z4eXiH5tMjgMBfjSeT0DgVI11uJgTWCd2g==; 31:YnYCJEU5riQpXhj0fLOUbu0TJ8CBkOxrjC3rH/3Z/9cBXanUZIXCMbvR1OF/FSIbDd4WQ4CFQT64++deO8wCK43Ms1vmBOaKJs2ovCMDl6nfGTNvK8BqChKJEbt3fR+ELCW70bSnmRZweGISRPyWSRRG37MomNdwV+R6OK/KpuGAvzG152BH6YrtiKyo0PE9oxGsld+mkZZ18pWjfqRKKAMWZ2QWGBHdY92Dj001/yo= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:t1RkyPGL3sArf019dogGbBb3fUsYxevh+QZTDwd6HwyMgrKb8Mat55ffuUEOs02sZ5fQ6Cb09lZUYY4ZVO3VjliBP+rLNnsQReNhIG/RVKNO1A2F32Ql/OztJT6W0acOItKuJLfm2PJBKJAsD3XSF5/RxSlJE1D41e7GYJL0kxsoUdeTPJ0oxNkMM2f+3/2VMvg3FG5ayFR2nCYbLWCFmCAw7ARcUsoup4v83I4dZiBrvAjFL+t+76CS3nhw5aiykh/VUhR+DaH/ihVMiFDtvvENuzZIEgzLqJc0giTI9hDBFfPq9DQRiaXz/hJ8WGrgzx1ZgJXYP7zevZZOl2gJOgpUIHMZrZp/OmDdl7kKOLB0PVhiDYJeUbYCV2VV+uynsCi6wJCQ61WiliARNXUq9idjhMys1RHKtfHHB/2OOEg=; 4:iGLgW8hhnUjQIFOBkZqtbm6cXeVdQLZ/pRBs6dRgxHQVc06I7SFzDhEknvkf3f4djdqFxIdty5TNw2j+kpHF+Ym+G/k9QKlJFMyId7aLvXVmGEz2TEmH8KVdPb5//0VxbexYVOvMRTBVjMAbVNzfjhCSdeYZ5d3k1Zf7cnMmmXL9PUsKa1D3iNgZRebh98s8Kdz1fgfHWMrMx73tJAOrDF4BIBpkjczc1cNHjjhMXq75ffhkwR2YdKpyKNUdShdvsIoJ6RPL/OxH8eNFryEHuw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(40224003)(189003)(199004)(16586007)(53936002)(305945005)(53946003)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(551934003)(6916009)(76176011)(86362001)(68736007)(66066001)(45080400002)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:byDyth1TYVXvaCwZkueJkOT+Ax7ECyz27bcEwxY?= sUgw/S4MaMS9P4j+vrTo5OJsSMqqVd2GuKW+rWBOQ1awN7fCz+wVZKI3/5RIF2k2KDRDq9sOnjh0VpfVq9BpKRIrHJIc2zQQl1jy82kUvqPr/JIij9VLuD8SCfjoITaJVvn59syrkjHoPnE1Glbn1qgufEVK219nZOfkQYAM1wFTNaiCKc81zfImkrMCRhAtfyPzoSIB527cLBMdol8TnPwfUkhJLlYxR/Ra/EMe2XLPnastM0bL1uvWLnRqMxO6jE8+Zz6AW6IeF1F15Eaxk8kEqjHUaW+cNS1CgUsE3r8jGr78RwiDp1urJO7mrMnG4uGnJBEAVahCe5YJDKk6ICmVjsy07/qvX3FncziYDwRp7oFQSRTChF2+f7QP1tzRUI2uGiIvcpffW0WlB5Ia5ITOMJLhBCtAWoZCvW7Ju3UD/x1z8ZIJ4ZActKRb9vkZcy/0i5ERhvc+JiJk766TQbKFA2sa8Lj7VazhPZHHhB8jrPDyccztAKNrvXMRb8HH9lY5ppzo1DO5dLQI9OZ2CPEQUDcxKh6kW7UuLV6EAeQ2coJ2K2Wg5Kp3JunlOjtzxmBXuuua++sDW0ga6jh3zj9ZqfxSvsD+KwwwHQqzUwNuPnNqUkmiK6mCGV/cpIIXdzdehcdSydD/MEF6SO17gnuymUn6BnPcDK7EYx/hhcbZJ9tQRJcO7PZYe2mI53QzlbuFiYukKd9O9TjfzS1G7om5SIcHU+5koj6egFf9G/gdiwkVQBFmWPRxqHyh/KEzEU1Q1FgtvU6jkq3M+0um2GXn47OScfuUusfDl7sH9tv/SmyL5EBnK4rBrU6/M1Xod7w4P8vnFANwC0so3ccHmWHuIVouWK6EacQDe8FrsQp1bNV7BNWBQcKWcauLl/WuaFjHp736ovaX93s6fsZfMNIJvt+lHC6vRbZNWS9miIzyz+Sh4hy6lEbAFWSUin9RZlteO09EuCSBp7pjqcnJ/xeRcc5cE5YmiYM/40gFfQFzn5ClJSXPu8mOydRJ4WdORtNEuBJvQHS//mRdJLWtk7bDBOrqOybwcRkad9g3y8wnsfTS+k+aNLUbmHeIjmvX+aeqUioajZLNgHqmreraO/HXb26hvIpJZKN0ZbgGO5XKGGLqxPitKSucxOeKvOUEm9M8I6LoaqasN7OXRFMSlzxcZTwBFUn0T0jCixxIbtdCkzaJ9j2k0mD3IOrZxh15lMQRPG3edJRo2oljVG7UNzFveaW18DdVIv+u19+8WnmC+vivtCRZfxSvtAkngixPNSy4cEVf33CQSr3nK++ellZKuPhlXqbal0r++AiGR4L5czzFzO32ZfFk0/qPufv9prqyYL1osT4D7uj55NErsSxDAE0AjBTOj+IJYe3zya5C5cQ== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:neyeYaPz/uEYWOlhvCzI3qq1OSvXDwQFPf0iwWtCb6iZknuYdwuJtROiCbVi52b+UQBdoRV3W1BUzEhI4piEL9bgLMWwdcCqRSF1jQg6/dME5QZb74AgKQYfRACmArezelptWij+e0V+/1dc2k3YOkVm3hY40+9hm0UY+jg2k/7sdu4wVz2wVLYo+BPXqc0aXqWEIBOxfgC0FQci0ywIVq9wvXWrFjLkel/4CXboFTPhNEodUdw1FbKR3+q1p+cO1f/CX1JapEhKmT/HpjAxbtFJTpXIrLzdORG5mMJYiHq3CVtALRzRqxtPDaWf+/sEJZQe9SnFvZEEXbHZ3PRHR0erpYX1f9eI2p2eQ6+FR+Y=; 5:Abzfq4ClQbZX+xWEOliNdkL8joth5yoTGJsyWF+C3F3LMm+IY6FwiZE73uD1Uax54SfykMYhveLEWCmT82aZmemDxQgKezn/gCdT6Gf0IQ6WRFz8dqKefWxpT03Dy38t8bmc+VnyiIcbArrOV1WiM3IiAoK8X5jVdQ3uLp7FD30=; 24:MfxRA77n5l2BRwZw/SWEPIUxOfRH3oXFA2fMabcyFLZFPuJljN+B1qtr97d5h7xBd7yEVPO1E1gQMzxRa5pLL1lMsDMijB77X7xtRKfZttY=; 7:sCOt9AX5IPwuTt0n3/N4obfC8eJcej2rL64yNSzIjbNQKCbv03aiP3g+3sdp5mdqGxBsQSbvsgYJhf+rt+u36LfIqKx7TFov3JuUj6zzV9EdRuWVULIsRCTQj2ImpIECL5YpgeMnoGL9Z84jkKF6bqExmzFPwzJQ/sK6Lhc2glxC4AxBwPTiWLQpiUmoWIEYpT4tzrrGAvs3Mbw+BKGHnPIZ8YQkh8yfoS/k2mRhR7vQUD0zvWoY2es6rlLdOP21 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:Qt/68CYRYpmx8o3uGnsRSyJC2XAseeJD4SnadWregCusMMuzSvXCvY6YxILqU+mbLK0pQmudw3+r2L/WMox3z93rg3tqW354sncCz1SEYhvl5QJeff/1noiUTtX50etPP2DclMSleRinrkkBxNXNHtxTFccU/LQBjM1doVbPY74= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:57.8098 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 31fc9a42-731e-4391-3cce-08d56da0abcf X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.134 Subject: [Qemu-devel] [RFC PATCH 29/34] net: add Hyper-V/VMBus network protocol definitions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add a header with data structures and constants defining the protocol for communication between the guest and the hypervisor implementing the Hyper-V/VMBus network adapter. Mostly taken from the corresponding definitions in the Linux kernel. TODO: move RNDIS stuff to rndis.h Signed-off-by: Roman Kagan --- hw/net/hvnet-proto.h | 1161 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1161 insertions(+) create mode 100644 hw/net/hvnet-proto.h diff --git a/hw/net/hvnet-proto.h b/hw/net/hvnet-proto.h new file mode 100644 index 0000000000..1582c7e5a2 --- /dev/null +++ b/hw/net/hvnet-proto.h @@ -0,0 +1,1161 @@ +/* + * Hyper-V network device protocol definitions + * + * Copyright (c) 2011, Microsoft Corporation. + * Copyright (c) 2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#ifndef _HVNET_PROTO_H_ +#define _HVNET_PROTO_H_ + +/**** + * c&p from linux drivers/net/hyperv/hyperv_net.h + ****/ + +/* RSS related */ +#define OID_GEN_RECEIVE_SCALE_CAPABILITIES 0x00010203 /* query only */ +#define OID_GEN_RECEIVE_SCALE_PARAMETERS 0x00010204 /* query and set */ + +#define NDIS_OBJECT_TYPE_RSS_CAPABILITIES 0x88 +#define NDIS_OBJECT_TYPE_RSS_PARAMETERS 0x89 +#define NDIS_OBJECT_TYPE_OFFLOAD 0xa7 + +#define NDIS_RECEIVE_SCALE_CAPABILITIES_REVISION_2 2 +#define NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_2 2 + +struct ndis_obj_header { + uint8_t type; + uint8_t rev; + uint16_t size; +} QEMU_PACKED; + +/* ndis_recv_scale_cap/cap_flag */ +#define NDIS_RSS_CAPS_MESSAGE_SIGNALED_INTERRUPTS 0x01000000 +#define NDIS_RSS_CAPS_CLASSIFICATION_AT_ISR 0x02000000 +#define NDIS_RSS_CAPS_CLASSIFICATION_AT_DPC 0x04000000 +#define NDIS_RSS_CAPS_USING_MSI_X 0x08000000 +#define NDIS_RSS_CAPS_RSS_AVAILABLE_ON_PORTS 0x10000000 +#define NDIS_RSS_CAPS_SUPPORTS_MSI_X 0x20000000 +#define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV4 0x00000100 +#define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6 0x00000200 +#define NDIS_RSS_CAPS_HASH_TYPE_TCP_IPV6_EX 0x00000400 + +struct ndis_recv_scale_cap { /* NDIS_RECEIVE_SCALE_CAPABILITIES */ + struct ndis_obj_header hdr; + uint32_t cap_flag; + uint32_t num_int_msg; + uint32_t num_recv_que; + uint16_t num_indirect_tabent; +} QEMU_PACKED; + + +/* ndis_recv_scale_param flags */ +#define NDIS_RSS_PARAM_FLAG_BASE_CPU_UNCHANGED 0x0001 +#define NDIS_RSS_PARAM_FLAG_HASH_INFO_UNCHANGED 0x0002 +#define NDIS_RSS_PARAM_FLAG_ITABLE_UNCHANGED 0x0004 +#define NDIS_RSS_PARAM_FLAG_HASH_KEY_UNCHANGED 0x0008 +#define NDIS_RSS_PARAM_FLAG_DISABLE_RSS 0x0010 + +/* Hash info bits */ +#define NDIS_HASH_FUNC_TOEPLITZ 0x00000001 +#define NDIS_HASH_IPV4 0x00000100 +#define NDIS_HASH_TCP_IPV4 0x00000200 +#define NDIS_HASH_IPV6 0x00000400 +#define NDIS_HASH_IPV6_EX 0x00000800 +#define NDIS_HASH_TCP_IPV6 0x00001000 +#define NDIS_HASH_TCP_IPV6_EX 0x00002000 + +#define NDIS_RSS_INDIRECTION_TABLE_MAX_SIZE_REVISION_2 (128 * 4) +#define NDIS_RSS_HASH_SECRET_KEY_MAX_SIZE_REVISION_2 40 + +#define ITAB_NUM 128 + +struct ndis_recv_scale_param { /* NDIS_RECEIVE_SCALE_PARAMETERS */ + struct ndis_obj_header hdr; + + /* Qualifies the rest of the information */ + uint16_t flag; + + /* The base CPU number to do receive processing. not used */ + uint16_t base_cpu_number; + + /* This describes the hash function and type being enabled */ + uint32_t hashinfo; + + /* The size of indirection table array */ + uint16_t indirect_tabsize; + + /* The offset of the indirection table from the beginning of this + * structure + */ + uint32_t indirect_taboffset; + + /* The size of the hash secret key */ + uint16_t hashkey_size; + + /* The offset of the secret key from the beginning of this structure */ + uint32_t kashkey_offset; + + uint32_t processor_masks_offset; + uint32_t num_processor_masks; + uint32_t processor_masks_entry_size; +}; + +/* Fwd declaration */ +struct ndis_tcp_ip_checksum_info; +struct ndis_pkt_8021q_info; + +/* + * Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame + * within the RNDIS + * + * The size of this structure is less than 48 bytes and we can now + * place this structure in the skb->cb field. + */ +struct hv_netvsc_packet { + /* Bookkeeping stuff */ + uint8_t cp_partial; /* partial copy into send buffer */ + + uint8_t rmsg_size; /* RNDIS header and PPI size */ + uint8_t rmsg_pgcnt; /* page count of RNDIS header and PPI */ + uint8_t page_buf_cnt; + + uint16_t q_idx; + uint16_t total_packets; + + uint32_t total_bytes; + uint32_t send_buf_index; + uint32_t total_data_buflen; +}; + +enum rndis_device_state { + RNDIS_DEV_UNINITIALIZED = 0, + RNDIS_DEV_INITIALIZING, + RNDIS_DEV_INITIALIZED, + RNDIS_DEV_DATAINITIALIZED, +}; + +#define NETVSC_HASH_KEYLEN 40 + +#define NVSP_INVALID_PROTOCOL_VERSION ((uint32_t)0xFFFFFFFF) + +#define NVSP_PROTOCOL_VERSION_1 2 +#define NVSP_PROTOCOL_VERSION_2 0x30002 +#define NVSP_PROTOCOL_VERSION_4 0x40000 +#define NVSP_PROTOCOL_VERSION_5 0x50000 + +enum { + NVSP_MSG_TYPE_NONE = 0, + + /* Init Messages */ + NVSP_MSG_TYPE_INIT = 1, + NVSP_MSG_TYPE_INIT_COMPLETE = 2, + + NVSP_VERSION_MSG_START = 100, + + /* Version 1 Messages */ + NVSP_MSG1_TYPE_SEND_NDIS_VER = NVSP_VERSION_MSG_START, + + NVSP_MSG1_TYPE_SEND_RECV_BUF, + NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE, + NVSP_MSG1_TYPE_REVOKE_RECV_BUF, + + NVSP_MSG1_TYPE_SEND_SEND_BUF, + NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE, + NVSP_MSG1_TYPE_REVOKE_SEND_BUF, + + NVSP_MSG1_TYPE_SEND_RNDIS_PKT, + NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE, + + /* Version 2 messages */ + NVSP_MSG2_TYPE_SEND_CHIMNEY_DELEGATED_BUF, + NVSP_MSG2_TYPE_SEND_CHIMNEY_DELEGATED_BUF_COMP, + NVSP_MSG2_TYPE_REVOKE_CHIMNEY_DELEGATED_BUF, + + NVSP_MSG2_TYPE_RESUME_CHIMNEY_RX_INDICATION, + + NVSP_MSG2_TYPE_TERMINATE_CHIMNEY, + NVSP_MSG2_TYPE_TERMINATE_CHIMNEY_COMP, + + NVSP_MSG2_TYPE_INDICATE_CHIMNEY_EVENT, + + NVSP_MSG2_TYPE_SEND_CHIMNEY_PKT, + NVSP_MSG2_TYPE_SEND_CHIMNEY_PKT_COMP, + + NVSP_MSG2_TYPE_POST_CHIMNEY_RECV_REQ, + NVSP_MSG2_TYPE_POST_CHIMNEY_RECV_REQ_COMP, + + NVSP_MSG2_TYPE_ALLOC_RXBUF, + NVSP_MSG2_TYPE_ALLOC_RXBUF_COMP, + + NVSP_MSG2_TYPE_FREE_RXBUF, + + NVSP_MSG2_TYPE_SEND_VMQ_RNDIS_PKT, + NVSP_MSG2_TYPE_SEND_VMQ_RNDIS_PKT_COMP, + + NVSP_MSG2_TYPE_SEND_NDIS_CONFIG, + + NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE, + NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP, + + NVSP_MSG2_MAX = NVSP_MSG2_TYPE_ALLOC_CHIMNEY_HANDLE_COMP, + + /* Version 4 messages */ + NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION, + NVSP_MSG4_TYPE_SWITCH_DATA_PATH, + NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED, + + NVSP_MSG4_MAX = NVSP_MSG4_TYPE_UPLINK_CONNECT_STATE_DEPRECATED, + + /* Version 5 messages */ + NVSP_MSG5_TYPE_OID_QUERY_EX, + NVSP_MSG5_TYPE_OID_QUERY_EX_COMP, + NVSP_MSG5_TYPE_SUBCHANNEL, + NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE, + + NVSP_MSG5_MAX = NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE, +}; + +enum { + NVSP_STAT_NONE = 0, + NVSP_STAT_SUCCESS, + NVSP_STAT_FAIL, + NVSP_STAT_PROTOCOL_TOO_NEW, + NVSP_STAT_PROTOCOL_TOO_OLD, + NVSP_STAT_INVALID_RNDIS_PKT, + NVSP_STAT_BUSY, + NVSP_STAT_PROTOCOL_UNSUPPORTED, + NVSP_STAT_MAX, +}; + +struct nvsp_msg_header { + uint32_t msg_type; +}; + +/* Init Messages */ + +/* + * This message is used by the VSC to initialize the channel after the channels + * has been opened. This message should never include anything other then + * versioning (i.e. this message will be the same for ever). + */ +struct nvsp_msg_init { + uint32_t min_protocol_ver; + uint32_t max_protocol_ver; +} QEMU_PACKED; + +/* + * This message is used by the VSP to complete the initialization of the + * channel. This message should never include anything other then versioning + * (i.e. this message will be the same for ever). + */ +struct nvsp_msg_init_complete { + uint32_t negotiated_protocol_ver; + uint32_t max_mdl_chain_len; + uint32_t status; +}; + +/* Version 1 Messages */ + +/* + * This message is used by the VSC to send the NDIS version to the VSP. The VSP + * can use this information when handling OIDs sent by the VSC. + */ +struct nvsp1_msg_ndis_ver { + uint32_t ndis_major_ver; + uint32_t ndis_minor_ver; +} QEMU_PACKED; + +/* + * This message is used by the VSC to send a receive buffer to the VSP. The VSP + * can then use the receive buffer to send data to the VSC. + */ +struct nvsp1_msg_rcvbuf { + uint32_t gpadl_handle; + uint16_t id; +} QEMU_PACKED; + +struct nvsp1_rcvbuf_section { + uint32_t offset; + uint32_t sub_alloc_size; + uint32_t num_sub_allocs; + uint32_t end_offset; +} QEMU_PACKED; + +/* + * This message is used by the VSP to acknowledge a receive buffer send by the + * VSC. This message must be sent by the VSP before the VSP uses the receive + * buffer. + */ +struct nvsp1_msg_rcvbuf_complete { + uint32_t status; + uint32_t num_sections; + + /* + * The receive buffer is split into two parts, a large suballocation + * section and a small suballocation section. These sections are then + * suballocated by a certain size. + */ + + /* + * For example, the following break up of the receive buffer has 6 + * large suballocations and 10 small suballocations. + */ + + /* + * | Large Section | | Small Section | + * ------------------------------------------------------------ + * | | | | | | | | | | | | | | | | | | + * | | + * LargeOffset SmallOffset + */ + + struct nvsp1_rcvbuf_section sections[1]; +} QEMU_PACKED; + +/* + * This message is sent by the VSC to revoke the receive buffer. After the VSP + * completes this transaction, the vsp should never use the receive buffer + * again. + */ +struct nvsp1_msg_revoke_rcvbuf { + uint16_t id; +}; + +/* + * This message is used by the VSC to send a send buffer to the VSP. The VSC + * can then use the send buffer to send data to the VSP. + */ +struct nvsp1_msg_sndbuf { + uint32_t gpadl_handle; + uint16_t id; +} QEMU_PACKED; + +/* + * This message is used by the VSP to acknowledge a send buffer sent by the + * VSC. This message must be sent by the VSP before the VSP uses the sent + * buffer. + */ +struct nvsp1_msg_sndbuf_complete { + uint32_t status; + + /* + * The VSC gets to choose the size of the send buffer and the VSP gets + * to choose the sections size of the buffer. This was done to enable + * dynamic reconfigurations when the cost of GPA-direct buffers + * decreases. + */ + uint32_t section_size; +} QEMU_PACKED; + +/* + * This message is sent by the VSC to revoke the send buffer. After the VSP + * completes this transaction, the vsp should never use the send buffer again. + */ +struct nvsp1_msg_revoke_sndbuf { + uint16_t id; +}; + +/* + * This message is used by both the VSP and the VSC to send a RNDIS message to + * the opposite channel endpoint. + */ +struct nvsp1_msg_rndis_pkt { + /* + * This field is specified by RNDIS. They assume there's two different + * channels of communication. However, the Network VSP only has one. + * Therefore, the channel travels with the RNDIS packet. + */ + uint32_t channel_type; + + /* + * This field is used to send part or all of the data through a send + * buffer. This values specifies an index into the send buffer. If the + * index is 0xFFFFFFFF, then the send buffer is not being used and all + * of the data was sent through other VMBus mechanisms. + */ + uint32_t send_buf_section_index; + uint32_t send_buf_section_size; +} QEMU_PACKED; + +/* + * This message is used by both the VSP and the VSC to complete a RNDIS message + * to the opposite channel endpoint. At this point, the initiator of this + * message cannot use any resources associated with the original RNDIS packet. + */ +struct nvsp1_msg_rndis_pkt_complete { + uint32_t status; +}; + +/* + * Network VSP protocol version 2 messages: + */ +struct nvsp2_vsc_capability { + union { + uint64_t data; + struct { + uint64_t vmq:1; + uint64_t chimney:1; + uint64_t sriov:1; + uint64_t ieee8021q:1; + uint64_t correlation_id:1; + uint64_t teaming:1; + }; + }; +} QEMU_PACKED; + +struct nvsp2_send_ndis_config { + uint32_t mtu; + uint32_t reserved; + struct nvsp2_vsc_capability capability; +} QEMU_PACKED; + +/* Allocate receive buffer */ +struct nvsp2_alloc_rxbuf { + /* Allocation ID to match the allocation request and response */ + uint32_t alloc_id; + + /* Length of the VM shared memory receive buffer that needs to + * be allocated + */ + uint32_t len; +} QEMU_PACKED; + +/* Allocate receive buffer complete */ +struct nvsp2_alloc_rxbuf_comp { + /* The NDIS_STATUS code for buffer allocation */ + uint32_t status; + + uint32_t alloc_id; + + /* GPADL handle for the allocated receive buffer */ + uint32_t gpadl_handle; + + /* Receive buffer ID */ + uint64_t recv_buf_id; +} QEMU_PACKED; + +struct nvsp2_free_rxbuf { + uint64_t recv_buf_id; +} QEMU_PACKED; + +struct nvsp4_send_vf_association { + /* 1: allocated, serial number is valid. 0: not allocated */ + uint32_t allocated; + + /* Serial number of the VF to team with */ + uint32_t serial; +} QEMU_PACKED; + +enum nvsp_vm_datapath { + NVSP_DATAPATH_SYNTHETIC = 0, + NVSP_DATAPATH_VF, + NVSP_DATAPATH_MAX +}; + +struct nvsp4_sw_datapath { + uint32_t active_datapath; /* active data path in VM */ +} QEMU_PACKED; + +enum nvsp_subchannel_operation { + NVSP_SUBCHANNEL_NONE = 0, + NVSP_SUBCHANNEL_ALLOCATE, + NVSP_SUBCHANNEL_MAX +}; + +struct nvsp5_subchannel_request { + uint32_t op; + uint32_t num_subchannels; +} QEMU_PACKED; + +struct nvsp5_subchannel_complete { + uint32_t status; + uint32_t num_subchannels; /* Actual number of subchannels allocated */ +} QEMU_PACKED; + +struct nvsp5_send_indirect_table { + /* The number of entries in the send indirection table */ + uint32_t count; + + /* The offset of the send indirection table from top of this struct. + * The send indirection table tells which channel to put the send + * traffic on. Each entry is a channel number. + */ + uint32_t offset; +} QEMU_PACKED; + +union nvsp_all_messages { + struct nvsp_msg_init init; + struct nvsp_msg_init_complete init_complete; + + struct nvsp1_msg_ndis_ver send_ndis_ver; + struct nvsp1_msg_rcvbuf send_recv_buf; + struct nvsp1_msg_rcvbuf_complete send_recv_buf_complete; + struct nvsp1_msg_revoke_rcvbuf revoke_recv_buf; + struct nvsp1_msg_sndbuf send_send_buf; + struct nvsp1_msg_sndbuf_complete send_send_buf_complete; + struct nvsp1_msg_revoke_sndbuf revoke_send_buf; + struct nvsp1_msg_rndis_pkt send_rndis_pkt; + struct nvsp1_msg_rndis_pkt_complete send_rndis_pkt_complete; + + struct nvsp2_send_ndis_config send_ndis_config; + struct nvsp2_alloc_rxbuf alloc_rxbuf; + struct nvsp2_alloc_rxbuf_comp alloc_rxbuf_comp; + struct nvsp2_free_rxbuf free_rxbuf; + + struct nvsp4_send_vf_association vf_assoc; + struct nvsp4_sw_datapath active_dp; + + struct nvsp5_subchannel_request subchn_req; + struct nvsp5_subchannel_complete subchn_comp; + struct nvsp5_send_indirect_table send_table; +} QEMU_PACKED; + +/* ALL Messages */ +struct nvsp_msg { + struct nvsp_msg_header hdr; + union nvsp_all_messages msg; +} QEMU_PACKED; + + +#define NETVSC_MTU 65535 +#define NETVSC_MTU_MIN ETH_MIN_MTU + +#define NETVSC_RECEIVE_BUFFER_SIZE (1024*1024*16) /* 16MB */ +#define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY (1024*1024*15) /* 15MB */ +#define NETVSC_SEND_BUFFER_SIZE (1024 * 1024 * 15) /* 15MB */ +#define NETVSC_INVALID_INDEX -1 + + +#define NETVSC_RECEIVE_BUFFER_ID 0xcafe +#define NETVSC_SEND_BUFFER_ID 0 + +#define NETVSC_PACKET_SIZE 4096 + +#define VRSS_SEND_TAB_SIZE 16 /* must be power of 2 */ +#define VRSS_CHANNEL_MAX 64 +#define VRSS_CHANNEL_DEFAULT 8 + +#define RNDIS_MAX_PKT_DEFAULT 8 +#define RNDIS_PKT_ALIGN_DEFAULT 8 + +/* Netvsc Receive Slots Max */ +#define NETVSC_RECVSLOT_MAX (NETVSC_RECEIVE_BUFFER_SIZE / ETH_DATA_LEN + 1) + +/* NdisInitialize message */ +struct rndis_initialize_request { + uint32_t req_id; + uint32_t major_ver; + uint32_t minor_ver; + uint32_t max_xfer_size; +}; + +/* Response to NdisInitialize */ +struct rndis_initialize_complete { + uint32_t req_id; + uint32_t status; + uint32_t major_ver; + uint32_t minor_ver; + uint32_t dev_flags; + uint32_t medium; + uint32_t max_pkt_per_msg; + uint32_t max_xfer_size; + uint32_t pkt_alignment_factor; + uint32_t af_list_offset; + uint32_t af_list_size; +}; + +/* Call manager devices only: Information about an address family */ +/* supported by the device is appended to the response to NdisInitialize. */ +struct rndis_co_address_family { + uint32_t address_family; + uint32_t major_ver; + uint32_t minor_ver; +}; + +/* NdisHalt message */ +struct rndis_halt_request { + uint32_t req_id; +}; + +/* NdisQueryRequest message */ +struct rndis_query_request { + uint32_t req_id; + uint32_t oid; + uint32_t info_buflen; + uint32_t info_buf_offset; + uint32_t dev_vc_handle; +}; + +/* Response to NdisQueryRequest */ +struct rndis_query_complete { + uint32_t req_id; + uint32_t status; + uint32_t info_buflen; + uint32_t info_buf_offset; +}; + +/* NdisSetRequest message */ +struct rndis_set_request { + uint32_t req_id; + uint32_t oid; + uint32_t info_buflen; + uint32_t info_buf_offset; + uint32_t dev_vc_handle; +}; + +/* Response to NdisSetRequest */ +struct rndis_set_complete { + uint32_t req_id; + uint32_t status; +}; + +/* NdisReset message */ +struct rndis_reset_request { + uint32_t reserved; +}; + +/* Response to NdisReset */ +struct rndis_reset_complete { + uint32_t status; + uint32_t addressing_reset; +}; + +/* NdisMIndicateStatus message */ +struct rndis_indicate_status { + uint32_t status; + uint32_t status_buflen; + uint32_t status_buf_offset; +}; + +/* Diagnostic information passed as the status buffer in */ +/* struct rndis_indicate_status messages signifying error conditions. */ +struct rndis_diagnostic_info { + uint32_t diag_status; + uint32_t error_offset; +}; + +/* NdisKeepAlive message */ +struct rndis_keepalive_request { + uint32_t req_id; +}; + +/* Response to NdisKeepAlive */ +struct rndis_keepalive_complete { + uint32_t req_id; + uint32_t status; +}; + +/* + * Data message. All Offset fields contain byte offsets from the beginning of + * struct rndis_packet. All Length fields are in bytes. VcHandle is set + * to 0 for connectionless data, otherwise it contains the VC handle. + */ +struct rndis_packet { + uint32_t data_offset; + uint32_t data_len; + uint32_t oob_data_offset; + uint32_t oob_data_len; + uint32_t num_oob_data_elements; + uint32_t per_pkt_info_offset; + uint32_t per_pkt_info_len; + uint32_t vc_handle; + uint32_t reserved; +}; + +/* Optional Out of Band data associated with a Data message. */ +struct rndis_oobd { + uint32_t size; + uint32_t type; + uint32_t class_info_offset; +}; + +/* Packet extension field contents associated with a Data message. */ +struct rndis_per_packet_info { + uint32_t size; + uint32_t type; + uint32_t ppi_offset; +}; + +enum ndis_per_pkt_info_type { + TCPIP_CHKSUM_PKTINFO, + IPSEC_PKTINFO, + TCP_LARGESEND_PKTINFO, + CLASSIFICATION_HANDLE_PKTINFO, + NDIS_RESERVED, + SG_LIST_PKTINFO, + IEEE_8021Q_INFO, + ORIGINAL_PKTINFO, + PACKET_CANCEL_ID, + NBL_HASH_VALUE = PACKET_CANCEL_ID, + ORIGINAL_NET_BUFLIST, + CACHED_NET_BUFLIST, + SHORT_PKT_PADINFO, + MAX_PER_PKT_INFO +}; + +struct ndis_pkt_8021q_info { + union { + struct { + uint32_t pri:3; /* User Priority */ + uint32_t cfi:1; /* Canonical Format ID */ + uint32_t vlanid:12; /* VLAN ID */ + uint32_t reserved:16; + }; + uint32_t value; + }; +}; + +struct ndis_object_header { + uint8_t type; + uint8_t revision; + uint16_t size; +}; + +#define NDIS_OBJECT_TYPE_DEFAULT 0x80 +#define NDIS_OFFLOAD_PARAMETERS_REVISION_3 3 +#define NDIS_OFFLOAD_PARAMETERS_REVISION_2 2 +#define NDIS_OFFLOAD_PARAMETERS_REVISION_1 1 + +#define NDIS_OFFLOAD_PARAMETERS_NO_CHANGE 0 +#define NDIS_OFFLOAD_PARAMETERS_LSOV2_DISABLED 1 +#define NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED 2 +#define NDIS_OFFLOAD_PARAMETERS_LSOV1_ENABLED 2 +#define NDIS_OFFLOAD_PARAMETERS_RSC_DISABLED 1 +#define NDIS_OFFLOAD_PARAMETERS_RSC_ENABLED 2 +#define NDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED 1 +#define NDIS_OFFLOAD_PARAMETERS_TX_ENABLED_RX_DISABLED 2 +#define NDIS_OFFLOAD_PARAMETERS_RX_ENABLED_TX_DISABLED 3 +#define NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED 4 + +#define NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE 1 +#define NDIS_TCP_LARGE_SEND_OFFLOAD_IPV4 0 +#define NDIS_TCP_LARGE_SEND_OFFLOAD_IPV6 1 + +#define VERSION_4_OFFLOAD_SIZE 22 +/* + * New offload OIDs for NDIS 6 + */ +#define OID_TCP_OFFLOAD_CURRENT_CONFIG 0xFC01020B /* query only */ +#define OID_TCP_OFFLOAD_PARAMETERS 0xFC01020C /* set only */ +#define OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020D/* query only */ +#define OID_TCP_CONNECTION_OFFLOAD_CURRENT_CONFIG 0xFC01020E /* query only */ +#define OID_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES 0xFC01020F /* query */ +#define OID_OFFLOAD_ENCAPSULATION 0x0101010A /* set/query */ + +/* + * OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES + * ndis_type: NDIS_OBJTYPE_OFFLOAD + */ + +#define NDIS_OFFLOAD_ENCAP_NONE 0x0000 +#define NDIS_OFFLOAD_ENCAP_NULL 0x0001 +#define NDIS_OFFLOAD_ENCAP_8023 0x0002 +#define NDIS_OFFLOAD_ENCAP_8023PQ 0x0004 +#define NDIS_OFFLOAD_ENCAP_8023PQ_OOB 0x0008 +#define NDIS_OFFLOAD_ENCAP_RFC1483 0x0010 + +struct ndis_csum_offload { + uint32_t ip4_txenc; + uint32_t ip4_txcsum; +#define NDIS_TXCSUM_CAP_IP4OPT 0x001 +#define NDIS_TXCSUM_CAP_TCP4OPT 0x004 +#define NDIS_TXCSUM_CAP_TCP4 0x010 +#define NDIS_TXCSUM_CAP_UDP4 0x040 +#define NDIS_TXCSUM_CAP_IP4 0x100 + +#define NDIS_TXCSUM_ALL_TCP4 (NDIS_TXCSUM_CAP_TCP4 | NDIS_TXCSUM_CAP_TCP4OPT) + + uint32_t ip4_rxenc; + uint32_t ip4_rxcsum; +#define NDIS_RXCSUM_CAP_IP4OPT 0x001 +#define NDIS_RXCSUM_CAP_TCP4OPT 0x004 +#define NDIS_RXCSUM_CAP_TCP4 0x010 +#define NDIS_RXCSUM_CAP_UDP4 0x040 +#define NDIS_RXCSUM_CAP_IP4 0x100 + uint32_t ip6_txenc; + uint32_t ip6_txcsum; +#define NDIS_TXCSUM_CAP_IP6EXT 0x001 +#define NDIS_TXCSUM_CAP_TCP6OPT 0x004 +#define NDIS_TXCSUM_CAP_TCP6 0x010 +#define NDIS_TXCSUM_CAP_UDP6 0x040 + uint32_t ip6_rxenc; + uint32_t ip6_rxcsum; +#define NDIS_RXCSUM_CAP_IP6EXT 0x001 +#define NDIS_RXCSUM_CAP_TCP6OPT 0x004 +#define NDIS_RXCSUM_CAP_TCP6 0x010 +#define NDIS_RXCSUM_CAP_UDP6 0x040 + +#define NDIS_TXCSUM_ALL_TCP6 (NDIS_TXCSUM_CAP_TCP6 | \ + NDIS_TXCSUM_CAP_TCP6OPT | \ + NDIS_TXCSUM_CAP_IP6EXT) +}; + +struct ndis_lsov1_offload { + uint32_t encap; + uint32_t maxsize; + uint32_t minsegs; + uint32_t opts; +}; + +struct ndis_ipsecv1_offload { + uint32_t encap; + uint32_t ah_esp; + uint32_t xport_tun; + uint32_t ip4_opts; + uint32_t flags; + uint32_t ip4_ah; + uint32_t ip4_esp; +}; + +struct ndis_lsov2_offload { + uint32_t ip4_encap; + uint32_t ip4_maxsz; + uint32_t ip4_minsg; + uint32_t ip6_encap; + uint32_t ip6_maxsz; + uint32_t ip6_minsg; + uint32_t ip6_opts; +#define NDIS_LSOV2_CAP_IP6EXT 0x001 +#define NDIS_LSOV2_CAP_TCP6OPT 0x004 + +#define NDIS_LSOV2_CAP_IP6 (NDIS_LSOV2_CAP_IP6EXT | \ + NDIS_LSOV2_CAP_TCP6OPT) +}; + +struct ndis_ipsecv2_offload { + uint32_t encap; + uint16_t ip6; + uint16_t ip4opt; + uint16_t ip6ext; + uint16_t ah; + uint16_t esp; + uint16_t ah_esp; + uint16_t xport; + uint16_t tun; + uint16_t xport_tun; + uint16_t lso; + uint16_t extseq; + uint32_t udp_esp; + uint32_t auth; + uint32_t crypto; + uint32_t sa_caps; +}; + +struct ndis_rsc_offload { + uint16_t ip4; + uint16_t ip6; +}; + +struct ndis_encap_offload { + uint32_t flags; + uint32_t maxhdr; +}; + +struct ndis_offload { + struct ndis_object_header header; + struct ndis_csum_offload csum; + struct ndis_lsov1_offload lsov1; + struct ndis_ipsecv1_offload ipsecv1; + struct ndis_lsov2_offload lsov2; + uint32_t flags; + /* NDIS >= 6.1 */ + struct ndis_ipsecv2_offload ipsecv2; + /* NDIS >= 6.30 */ + struct ndis_rsc_offload rsc; + struct ndis_encap_offload encap_gre; +}; + +#define NDIS_OFFLOAD_SIZE sizeof(struct ndis_offload) +#define NDIS_OFFLOAD_SIZE_6_0 offsetof(struct ndis_offload, ipsecv2) +#define NDIS_OFFLOAD_SIZE_6_1 offsetof(struct ndis_offload, rsc) + +struct ndis_offload_params { + struct ndis_object_header header; + uint8_t ip_v4_csum; + uint8_t tcp_ip_v4_csum; + uint8_t udp_ip_v4_csum; + uint8_t tcp_ip_v6_csum; + uint8_t udp_ip_v6_csum; + uint8_t lso_v1; + uint8_t ip_sec_v1; + uint8_t lso_v2_ipv4; + uint8_t lso_v2_ipv6; + uint8_t tcp_connection_ip_v4; + uint8_t tcp_connection_ip_v6; + uint32_t flags; + uint8_t ip_sec_v2; + uint8_t ip_sec_v2_ip_v4; + struct { + uint8_t rsc_ip_v4; + uint8_t rsc_ip_v6; + }; + struct { + uint8_t encapsulated_packet_task_offload; + uint8_t encapsulation_types; + }; +}; + +struct ndis_tcp_ip_checksum_info { + union { + struct { + uint32_t is_ipv4:1; + uint32_t is_ipv6:1; + uint32_t tcp_checksum:1; + uint32_t udp_checksum:1; + uint32_t ip_header_checksum:1; + uint32_t reserved:11; + uint32_t tcp_header_offset:10; + } transmit; + struct { + uint32_t tcp_checksum_failed:1; + uint32_t udp_checksum_failed:1; + uint32_t ip_checksum_failed:1; + uint32_t tcp_checksum_succeeded:1; + uint32_t udp_checksum_succeeded:1; + uint32_t ip_checksum_succeeded:1; + uint32_t loopback:1; + uint32_t tcp_checksum_value_invalid:1; + uint32_t ip_checksum_value_invalid:1; + } receive; + uint32_t value; + }; +}; + +struct ndis_tcp_lso_info { + union { + struct { + uint32_t unused:30; + uint32_t type:1; + uint32_t reserved2:1; + } transmit; + struct { + uint32_t mss:20; + uint32_t tcp_header_offset:10; + uint32_t type:1; + uint32_t reserved2:1; + } lso_v1_transmit; + struct { + uint32_t tcp_payload:30; + uint32_t type:1; + uint32_t reserved2:1; + } lso_v1_transmit_complete; + struct { + uint32_t mss:20; + uint32_t tcp_header_offset:10; + uint32_t type:1; + uint32_t ip_version:1; + } lso_v2_transmit; + struct { + uint32_t reserved:30; + uint32_t type:1; + uint32_t reserved2:1; + } lso_v2_transmit_complete; + uint32_t value; + }; +}; + +#define NDIS_VLAN_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ + sizeof(struct ndis_pkt_8021q_info)) + +#define NDIS_CSUM_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ + sizeof(struct ndis_tcp_ip_checksum_info)) + +#define NDIS_LSO_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ + sizeof(struct ndis_tcp_lso_info)) + +#define NDIS_HASH_PPI_SIZE (sizeof(struct rndis_per_packet_info) + \ + sizeof(uint32_t)) + +/* Total size of all PPI data */ +#define NDIS_ALL_PPI_SIZE (NDIS_VLAN_PPI_SIZE + NDIS_CSUM_PPI_SIZE + \ + NDIS_LSO_PPI_SIZE + NDIS_HASH_PPI_SIZE) + +/* Format of Information buffer passed in a SetRequest for the OID */ +/* OID_GEN_RNDIS_CONFIG_PARAMETER. */ +struct rndis_config_parameter_info { + uint32_t parameter_name_offset; + uint32_t parameter_name_length; + uint32_t parameter_type; + uint32_t parameter_value_offset; + uint32_t parameter_value_length; +}; + +/* Values for ParameterType in struct rndis_config_parameter_info */ +#define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0 +#define RNDIS_CONFIG_PARAM_TYPE_STRING 2 + +/* CONDIS Miniport messages for connection oriented devices */ +/* that do not implement a call manager. */ + +/* CoNdisMiniportCreateVc message */ +struct rcondis_mp_create_vc { + uint32_t req_id; + uint32_t ndis_vc_handle; +}; + +/* Response to CoNdisMiniportCreateVc */ +struct rcondis_mp_create_vc_complete { + uint32_t req_id; + uint32_t dev_vc_handle; + uint32_t status; +}; + +/* CoNdisMiniportDeleteVc message */ +struct rcondis_mp_delete_vc { + uint32_t req_id; + uint32_t dev_vc_handle; +}; + +/* Response to CoNdisMiniportDeleteVc */ +struct rcondis_mp_delete_vc_complete { + uint32_t req_id; + uint32_t status; +}; + +/* CoNdisMiniportQueryRequest message */ +struct rcondis_mp_query_request { + uint32_t req_id; + uint32_t request_type; + uint32_t oid; + uint32_t dev_vc_handle; + uint32_t info_buflen; + uint32_t info_buf_offset; +}; + +/* CoNdisMiniportSetRequest message */ +struct rcondis_mp_set_request { + uint32_t req_id; + uint32_t request_type; + uint32_t oid; + uint32_t dev_vc_handle; + uint32_t info_buflen; + uint32_t info_buf_offset; +}; + +/* CoNdisIndicateStatus message */ +struct rcondis_indicate_status { + uint32_t ndis_vc_handle; + uint32_t status; + uint32_t status_buflen; + uint32_t status_buf_offset; +}; + +/* CONDIS Call/VC parameters */ +struct rcondis_specific_parameters { + uint32_t parameter_type; + uint32_t parameter_length; + uint32_t parameter_lffset; +}; + +struct rcondis_media_parameters { + uint32_t flags; + uint32_t reserved1; + uint32_t reserved2; + struct rcondis_specific_parameters media_specific; +}; + +struct rndis_flowspec { + uint32_t token_rate; + uint32_t token_bucket_size; + uint32_t peak_bandwidth; + uint32_t latency; + uint32_t delay_variation; + uint32_t service_type; + uint32_t max_sdu_size; + uint32_t minimum_policed_size; +}; + +struct rcondis_call_manager_parameters { + struct rndis_flowspec transmit; + struct rndis_flowspec receive; + struct rcondis_specific_parameters call_mgr_specific; +}; + +/* CoNdisMiniportActivateVc message */ +struct rcondis_mp_activate_vc_request { + uint32_t req_id; + uint32_t flags; + uint32_t dev_vc_handle; + uint32_t media_params_offset; + uint32_t media_params_length; + uint32_t call_mgr_params_offset; + uint32_t call_mgr_params_length; +}; + +/* Response to CoNdisMiniportActivateVc */ +struct rcondis_mp_activate_vc_complete { + uint32_t req_id; + uint32_t status; +}; + +/* CoNdisMiniportDeactivateVc message */ +struct rcondis_mp_deactivate_vc_request { + uint32_t req_id; + uint32_t flags; + uint32_t dev_vc_handle; +}; + +/* Response to CoNdisMiniportDeactivateVc */ +struct rcondis_mp_deactivate_vc_complete { + uint32_t req_id; + uint32_t status; +}; + + +/* union with all of the RNDIS messages */ +union rndis_message_container { + struct rndis_packet pkt; + struct rndis_initialize_request init_req; + struct rndis_halt_request halt_req; + struct rndis_query_request query_req; + struct rndis_set_request set_req; + struct rndis_reset_request reset_req; + struct rndis_keepalive_request keep_alive_req; + struct rndis_indicate_status indicate_status; + struct rndis_initialize_complete init_complete; + struct rndis_query_complete query_complete; + struct rndis_set_complete set_complete; + struct rndis_reset_complete reset_complete; + struct rndis_keepalive_complete keep_alive_complete; + struct rcondis_mp_create_vc co_miniport_create_vc; + struct rcondis_mp_delete_vc co_miniport_delete_vc; + struct rcondis_indicate_status co_indicate_status; + struct rcondis_mp_activate_vc_request co_miniport_activate_vc; + struct rcondis_mp_deactivate_vc_request co_miniport_deactivate_vc; + struct rcondis_mp_create_vc_complete co_miniport_create_vc_complete; + struct rcondis_mp_delete_vc_complete co_miniport_delete_vc_complete; + struct rcondis_mp_activate_vc_complete co_miniport_activate_vc_complete; + struct rcondis_mp_deactivate_vc_complete + co_miniport_deactivate_vc_complete; +}; + +/* Remote NDIS message format */ +struct rndis_msg_hdr { + uint32_t msg_type; + uint32_t msg_len; +}; + +#define NDIS_PACKET_TYPE_DIRECTED 0x00000001 +#define NDIS_PACKET_TYPE_MULTICAST 0x00000002 +#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x00000004 +#define NDIS_PACKET_TYPE_BROADCAST 0x00000008 +#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x00000010 +#define NDIS_PACKET_TYPE_PROMISCUOUS 0x00000020 +#define NDIS_PACKET_TYPE_SMT 0x00000040 +#define NDIS_PACKET_TYPE_ALL_LOCAL 0x00000080 +#define NDIS_PACKET_TYPE_GROUP 0x00000100 +#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x00000200 +#define NDIS_PACKET_TYPE_FUNCTIONAL 0x00000400 +#define NDIS_PACKET_TYPE_MAC_FRAME 0x00000800 + +#define TRANSPORT_INFO_NOT_IP 0 +#define TRANSPORT_INFO_IPV4_TCP 0x01 +#define TRANSPORT_INFO_IPV4_UDP 0x02 +#define TRANSPORT_INFO_IPV6_TCP 0x10 +#define TRANSPORT_INFO_IPV6_UDP 0x20 + +#endif From patchwork Tue Feb 6 20:30:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870117 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="LI8NWe55"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbch72ct5z9s7F for ; Wed, 7 Feb 2018 08:16:07 +1100 (AEDT) Received: from localhost ([::1]:35027 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAaz-0003Cb-Cs for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:16:05 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45150) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uS-0001aX-5m for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uO-0003R4-74 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:08 -0500 Received: from mail-db5eur01on0100.outbound.protection.outlook.com ([104.47.2.100]:53152 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uN-0003QP-Lk for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=LcdFfFUZ4rTospOAE8bQmMmR5H2CI0BjeCgg775qWfo=; b=LI8NWe55BhmBFFMNEIqMlViHSAaxXqOSSjDT0vuT529mgkljROGPrmcbzzw6YlqLnF09R7lu+MgfsP5SMd6hOl4QNG1ghxKdpgNTdKG4a6B6JfFHb4p/eRXAa+lLI0wwDyqP6WZx7oCUwjuqw9FPjIHmxzi6fR4snZcWXXuEQR0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:31:59 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:44 +0300 Message-Id: <20180206203048.11096-31-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 31bb5081-f324-40b4-1cc0-08d56da0acf2 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:sCcTRzXy+YuSHvkdutJq3cBLKZ1Z7vg7PCohwC5paKJTP1nhvtYt3+u/sSN38I++rB1hhTDYcBIiy3yuLxl/Mfj4nLcybVZs8G8W8ORwMM+Q6z8gYD/sxnFlrRvxBh64wCMqRjZgoaoDSLNp1IWKkND8bMHeBkKFekdfK5REs6yzF7Cyh7df0EUvB3AwIwyilikgg3Y5cWobHr9V2g+6Dwo6x62/pdn9+DxF+OSG0/Hf0y5E5bnKqILdRUBYRksx; 25:AALrGBoYbdydzyzHdQAQHWSBDjoHDH7EIgvqQImAoj3sOCoR1DL08PqOBOAJ7RonI+Ez1l5u/TicxmZFvBa78P8O5y3d7keVywz9Dkwd2cO/K48DqMRZYKWwCt+AbEhmukuUaOGUsgPCIlJO6q5GvG9sgwaK1JgcJQRlvRJ71pDWulPexi0cRlh6ZgOL3O2gW7AP8BeNJxT1FVHKQojuaMErkwVQm/RK8ebldY29KFYdg8w3MMIX5Qx99aSTjAGN+a63Duz3bGug8IhxGHCp/Xti2gDRCC9sRKenUVwTyzIaWVVGcN6UXxgnvoDORdu/V1C7JWwv9CJS7ceEPUT85w==; 31:FecEUH4GJLmLa0+6rXJ5huVN0o8lgfahEdeLkyyZes7hDDqIzceLS/VHOEKuCuxihzJOHzWbHo5j+NJELX6oaxyfG/np0V8gD25m9edsflGxzJpiZwX1UVuKv0tj+rre//scRW3FGxAzqZhUyq52ZODgZ8JZxGPXEIrFzX5qVAwLP8JsPqbA+6O3WIbEWRFWuTNWIk7MsfEaF9wQXh3Pk+KDFpiGO89f3HzPMsjCfyo= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:2UptpJDTMxWGmKc40G8oZ3yTBzd/E3i/gSzFMM6f4CU9qIONxAaFVVpVD457nEdryEqSRN8MtR6HmQfrpQO0K+BOvwLmkCBl+E2tYc+P301a8wSVw1OCjFVbd1bF07HEoxw2HcPrd0b7bbisBSg8oKtnywfC+0Csq+DyQg2hiYNyX2e3hHzIhUYH0kEFp7QotMl/CQcyrycJXyNSYsR9cgFYsnu0ONq/UBuug5ZvX8a1ktwAgcBUVjaQxo/hUEZv0qzHhx69ATXVkFKr49je8mpFq0Sn9lbt3upzkGu+5GWlU7FOa1bu3rUckP3f7VUDmwen+7HM5RNvKckMfar42DdYTJjfIvBlvnAvRNHNxzh2QNgUaHLxJ2Lb1JHhDUjdT3/iZfeX1ttuWcVirDJd6jM/7c66+UNlKIOriiVM7eY=; 4:SOTX5QLd9nRSrFb7Lse1PPK0OFav3YRod99lvQ1jdHKhT55BuAjCQocDe0jJkeQkR5XpIm5EakOMuin5iXELZvC2e4QaTYn5DvPY9idJ6za2WDJClbT7XcemL0kxKA4s3YDY3MbGEjcc6yyis+LX0FPQ3j2dilwm2HlcTWd5KnHUEssLu+1u7bmxjw9drnH0gYR02SUiSMSDHXoAuDlNr7MT/d+72kezFXxfBrJtxfC19BffYFTWKJrg42obL3XGCfXf41b0KeiNXRWcgLNcoQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(53946003)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(551934003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001)(579004); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:FpRIBJRG1T2vO8VrVVQiIxBcXJrQ4cmTxvTYYBU?= m4OH1UcHVgWSP05KfKaQtuxqAkRQEXu7tAOU7oM0s/sve4Jwx4v3XARS4RA1nioDXwZl0JM9MVDY2rrMUtBRxUcOIHSnFYhWn+4uOfSLvO2mkZl/9ua7Tiw+eATygbxLc9x5zhTErLD8kUtOBcJ/Fk8kTqnXRyEoEPpIKFSKKVeNcYijT8HRgjQ++UJaBGQlujKwDX7YJZp7wUrTJWC9KD1NBMpOa5w6nuQbzdxZWRnjceqMs6yZEQJRmsHzwHBaPpryGjRu3BqM2YV0UW91nTncgnWhYAXnJReFzroCTKZIJK3Zppad5m97YIErHzCrx9O5xJjrwy4wu+Cc4w9FZcaOmOCk+uzwDUNoXC2BOjDhwmS6jpafworqjUDhbmw4ZdoYvg23TR/0F35ZM4ycZ2RFRS9DdAYVQx5v/wBhF8ieI8LZ6YKANKpK8b5q6mwI6yPVSZFR5bLeRJ9sN0GmRh/ukAvS4ONFs442cUme1J49t8NzFX4g0WKRuTr7/QjoW0saSCs1YYvNyd/8d+RVNm2Ig6sU0mtY+TV8oWSpAoHdgzEdT9WmBs/ONY7grxLWrI06raBsO3lfCqdWB0albqyceKhSVcKnCPXeIG2Agn5HxHGvcqyS+T8LILhvXRiI2ho4zlERZA4MWwsWOW4LPqU9yfv3BchXFETos10+gUbCrgr87QzofX2WcPBam8tbKLSoor/jBxgd341ZkJmCNfejErdkytdpBGH8KMDmAwOe0xVl2lhgJrCd9JLUnwTLf7dq5jhCB4ba8Kr/croVNOJPB8w/8/FJtXpXyHhIwQIWOX8Nlmi+/ivejp8NnsT6P1MbbHCYnBGV/eENzVAUGmgzZpdMMC9wxu6zFXNrxgDezXiEu4O2YaHSqHxDPh3XFHTo88a61QOzYeQJ3G/Z/PrmrLjg5EVp5/90oQp92rrZiAbBr6ve8c3hcjxj1dcP0GOrdWUOzJ1ltFX7Mn2aiPHjZxJe6bfN8P8aJ1vEO2H/jXGYcSrY7DKK9UNljS1jEC3IxOtBaw8Ik7XsDT5fYERC4d5hzCNXPTEFqrs0HsgFgT3he6i+UuPNCi7ifE1tEgO9e0anFPCjb8p/k7KXHCqQuHh00qku8Y4SI3Gct0kDCHgbBIaqx7q4igRTiCPZ6ioVc3EJATACuTQY6cqH2+GekmvJVXHr4szsQ5wR6o2afXdadeiZwQUjW4dMd7ovwUEL5d2zBz6W2JUDOrJap4nI+is02YgZ+7BMiD/QvAAxT2ByZod7Mx/UeXxXIoBoqVpmxN+FrX7YAXLM8DgwQaDKseZpzVoWGCfeYE/R0jlMoJSkUWg+TgeuRdI6cy5o/qG8YaSCG3QRcXafcI1mezYp9vcRZetLLed5LHTOE6RCNuQ== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:ZkEGtmKGuAlBf+1KjMvdrSRNjHyIzPph3c/+PfS+QgTFeu5N6BxZZ3OCKbYZ/KcmIvpclmZZjUaHMJIYnQOQ3Ui50UJR2oLeXKGBr5mZVv8SKOsqNdId0X1WT4TD++lwtWfxJRZlmGrFH5bxvS4eE6tBnGi4zkXcy9akhWmhj9TVJMeD0gOyYTJEqyZTtdwYomnh6GrXELlxm4G6ahfvdQLm5X310pD7yRcBKLrBW/EbDdmq2cDY1o4bRWI0kH/zfHkZTRAGuGQnDbRYrujQ1x501jbDd1vDf7667Jndjx5ZmVsu1E/YLoIQWDctiEbxwj2uT+9cGulRmmgQFol4MXAsLKsA6rigyyU+ZygCzVE=; 5:EjiiuSP6NiX9Wc4B1RfQCi+JtlObWF1CT+P7JZSWrSgx3BxfIioqd+zcyyvxh5FT5OVDE0qZtXqpIasnoprI/cRsX1YCTfajfvuZQ9DWY0MXOUrGHj/axOjXBTk8QMBOb5J9XtU3G4egM15G6nNYcJLIBOwkhS+A0CqF7h3/ii4=; 24:Ritglsp61Ykte5LxtXskkBtLO0XpeU8qi3LVa4TaQupbTe3LFgKoCohFWN4VpnsfRCdwsYETLybv57RLDGWL31Yu4gukmJfAyBQiT0P8s84=; 7:2qy7HMK8aeoJ+Zko2YAPjucmFPI7K/lkzIvhj43cdeCB3J+BZPeGJzeLA3YSNnJKUaHAgxaYrX/cU4EUxg0GDLZDTwa3lJriBupEqTsMpBDajMG6WLPhz//ygqMW4rGUOHn86GAjHNgKGABpBiL/qiKKCbaqG1scRAqwQbYsDHnCVfAiC070zgEYdsERXOIO3uotsl5sHA00ehyBunpRb0a0LC9n/PvkaYyg+OeZ4YDF29sgqE6inYW/8JhwuOXf SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:0G673/SMNpELY8Szbq9qT2uzCVQQ7KqsUYhVERMMjNn3sMk2+Xrm3BGDPoxzBVl9WfPX27HZaeqnkdlzFfSYuH+jCjlu30RslN9TgEfQRY+GETtnti3QV72p15VCYGzSP5Xy88dDDrQdcn9XvgW9qiAklNfCh87TBfusLRFqnj0= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:31:59.4036 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 31bb5081-f324-40b4-1cc0-08d56da0acf2 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.100 Subject: [Qemu-devel] [RFC PATCH 30/34] net: add Hyper-V/VMBus net adapter X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" TODO: - add MAC filtering - add offloads - perf tuning Signed-off-by: Roman Kagan --- hw/net/hv-net.c | 1440 ++++++++++++++++++++++++++++++++++++++++++++++++++ hw/net/Makefile.objs | 2 + 2 files changed, 1442 insertions(+) create mode 100644 hw/net/hv-net.c diff --git a/hw/net/hv-net.c b/hw/net/hv-net.c new file mode 100644 index 0000000000..614922c0fb --- /dev/null +++ b/hw/net/hv-net.c @@ -0,0 +1,1440 @@ +/* + * QEMU Hyper-V network device support + * + * Copyright (c) 2018 Virtuozzo International GmbH. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qemu/error-report.h" +#include "qemu/iov.h" +#include "hw/vmbus/vmbus.h" +#include "net/net.h" +#include "rndis.h" +#include "hvnet-proto.h" + +#define TYPE_HV_NET "hv-net" +#define HV_NET_GUID "f8615163-df3e-46c5-913f-f2d2f965ed0e" + +/* FIXME: generalize to vmbus.c? */ +typedef struct HvNetRcvPkt { + QTAILQ_ENTRY(HvNetRcvPkt) link; + uint32_t off; + uint32_t len; +} HvNetRcvPkt; + +typedef enum HvNetState { + HV_NET_RESET, + HV_NET_INITIALIZING, + HV_NET_INITIALIZED, +} HvNetState; + +typedef struct HvNet { + VMBusDevice parent; + + NICConf conf; + NICState *nic; + + HvNetState state; + + uint16_t sndbuf_id; + uint32_t sndbuf_gpadl_id; + VMBusGpadl *sndbuf_gpadl; + + uint16_t rcvbuf_id; + uint32_t rcvbuf_gpadl_id; + VMBusGpadl *rcvbuf_gpadl; + int32_t rcvbuf_slot_num; /* int32_t for VMSTATE_STRUCT_VARRAY_ALLOC */ + uint16_t rcvbuf_slot_len; + unsigned long *rcvbuf_slot_map; + HvNetRcvPkt *rcvpkts; + QTAILQ_HEAD(, HvNetRcvPkt) rcvpkts_free; + + struct {} reset_start; + + uint32_t protocol_ver; + uint32_t ndis_maj_ver; + uint32_t ndis_min_ver; + uint32_t rndis_ctl; + uint32_t rndis_req_id; + uint32_t rndis_maj; + uint32_t rndis_min; + uint32_t max_xfer_size; + uint32_t rndis_query_oid; +#define RNDIS_QUERY_INFO_LEN 32 + uint64_t rndis_query_info[RNDIS_QUERY_INFO_LEN]; + uint32_t rndis_query_info_len; + uint32_t rndis_set_status; + uint32_t rndis_packet_filter; + + bool link_down; + + uint32_t rx_pkts; + uint32_t tx_pkts; +} HvNet; + +#define HV_NET(obj) OBJECT_CHECK(HvNet, (obj), TYPE_HV_NET) + +typedef struct HvNetReq +{ + VMBusChanReq vmreq; + HvNet *net; + unsigned iov_cnt; + struct iovec iov[64]; +} HvNetReq; + +static int hv_net_init_req(HvNet *net, HvNetReq *req) +{ + int ret; + QEMUSGList *sgl = &req->vmreq.sgl; + + req->net = net; + + if (!sgl->dev) { + return 0; + } + + ret = vmbus_map_sgl(sgl, DMA_DIRECTION_TO_DEVICE, req->iov, + ARRAY_SIZE(req->iov), -1, 0); + if (ret >= 0) { + req->iov_cnt = ret; + } else { + error_report("%s: failed to map SGL: %d", __func__, ret); + } + return ret; +} + +static void hv_net_free_req(HvNetReq *req) +{ + vmbus_unmap_sgl(&req->vmreq.sgl, DMA_DIRECTION_TO_DEVICE, req->iov, + req->iov_cnt, 0); + vmbus_release_req(req); +} + +static int complete_req(HvNetReq *req) +{ + int ret = 0; +#if 0 + VMBusChanReq *vmreq = &req->vmreq; + struct nvsp_msg_header *nhdr = vmreq->msg; + + error_report("%s >>>> msg: %x %lx", __func__, + vmreq->msglen ? nhdr->msg_type : -1, vmreq->transaction_id); +#endif + if (req->vmreq.comp) { + ret = vmbus_chan_send_completion(&req->vmreq); + } + + hv_net_free_req(req); + return ret; +} + +static HvNetRcvPkt *get_rcv_pkt(HvNet *net, size_t len) +{ + uint32_t nr, start; + HvNetRcvPkt *pkt; + + if (!len) { + return NULL; + } + + nr = DIV_ROUND_UP(len, net->rcvbuf_slot_len); + start = bitmap_find_next_zero_area(net->rcvbuf_slot_map, + net->rcvbuf_slot_num, 0, nr, 0); + if (start >= net->rcvbuf_slot_num) { + return NULL; + } + + bitmap_set(net->rcvbuf_slot_map, start, nr); + pkt = QTAILQ_FIRST(&net->rcvpkts_free); + assert(pkt); + QTAILQ_REMOVE(&net->rcvpkts_free, pkt, link); + pkt->off = start * net->rcvbuf_slot_len; + pkt->len = len; + return pkt; +} + +static void put_rcv_pkt(HvNet *net, HvNetRcvPkt *pkt) +{ + uint32_t nr, start; + + start = pkt->off / net->rcvbuf_slot_len; + nr = DIV_ROUND_UP(pkt->len, net->rcvbuf_slot_len); + bitmap_clear(net->rcvbuf_slot_map, start, nr); + QTAILQ_INSERT_TAIL(&net->rcvpkts_free, pkt, link); + pkt->len = 0; +} + +static void put_rcv_pkt_by_tr_id(HvNet *net, uint64_t tr_id) +{ + /* transaction id comes from the guest and can't be trusted blindly */ + HvNetRcvPkt *pkt; + + if (tr_id >= net->rcvbuf_slot_num) { + return; + } + pkt = &net->rcvpkts[tr_id]; + if (!pkt->len) { + return; + } + put_rcv_pkt(net, pkt); +} + +static void create_rcvbuf(HvNet *net) +{ + uint32_t gpadl_len; + int i; + + gpadl_len = vmbus_gpadl_len(net->rcvbuf_gpadl); + net->rcvbuf_slot_num = gpadl_len / net->rcvbuf_slot_len; + net->rcvbuf_slot_map = bitmap_new(net->rcvbuf_slot_num); + net->rcvpkts = g_new0(HvNetRcvPkt, net->rcvbuf_slot_num); + QTAILQ_INIT(&net->rcvpkts_free); + for (i = 0; i < net->rcvbuf_slot_num; i++) { + QTAILQ_INSERT_TAIL(&net->rcvpkts_free, &net->rcvpkts[i], link); + } +} + +static void destroy_rcvbuf(HvNet *net) +{ + int i; + + if (!net->rcvbuf_gpadl) { + return; + } + + for (i = 0; i < net->rcvbuf_slot_num; i++) { + if (!QTAILQ_IN_USE(&net->rcvpkts[i], link)) { + put_rcv_pkt(net, &net->rcvpkts[i]); + } + } + + assert(bitmap_empty(net->rcvbuf_slot_map, net->rcvbuf_slot_num)); + g_free(net->rcvbuf_slot_map); + g_free(net->rcvpkts); + + vmbus_put_gpadl(net->rcvbuf_gpadl); + net->rcvbuf_gpadl = NULL; +} + +static void destroy_sndbuf(HvNet *net) +{ + if (!net->sndbuf_gpadl) { + return; + } + + vmbus_put_gpadl(net->sndbuf_gpadl); + net->sndbuf_gpadl = NULL; +} + +static void handle_init(HvNetReq *req, struct nvsp_msg_init *msg_in, + uint32_t len, struct nvsp_msg_header *hdr_out) +{ + struct nvsp_msg_init_complete *msg_out; + + if (len < sizeof(*msg_in) || len < sizeof(*msg_out)) { + return; + } + if (!hdr_out) { + return; + } + + hdr_out->msg_type = NVSP_MSG_TYPE_INIT_COMPLETE; + msg_out = (struct nvsp_msg_init_complete *)(hdr_out + 1); + + if (msg_in->min_protocol_ver > msg_in->max_protocol_ver || + msg_in->min_protocol_ver > NVSP_PROTOCOL_VERSION_5 || + msg_in->max_protocol_ver < NVSP_PROTOCOL_VERSION_1) { + msg_out->status = NVSP_STAT_FAIL; + return; + } + + req->net->protocol_ver = msg_out->negotiated_protocol_ver = + msg_in->max_protocol_ver; + msg_out->status = NVSP_STAT_SUCCESS; +} + +static void handle_ndis_ver(HvNetReq *req, struct nvsp1_msg_ndis_ver *msg_in, + uint32_t len) +{ + if (len < sizeof(*msg_in)) { + return; + } + + req->net->ndis_maj_ver = msg_in->ndis_major_ver; + req->net->ndis_min_ver = msg_in->ndis_minor_ver; +} + +static void handle_rcv_buf(HvNetReq *req, struct nvsp1_msg_rcvbuf *msg_in, + uint32_t len, struct nvsp_msg_header *hdr_out) +{ + HvNet *net = req->net; + struct nvsp1_msg_rcvbuf_complete *msg_out; + + if (len < sizeof(*msg_in) || len < sizeof(*msg_out)) { + error_report("%s: bogus msg_size: %u", __func__, len); + return; + } + if (!hdr_out) { + error_report("%s: no reply msg", __func__); + return; + } + + hdr_out->msg_type = NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE; + msg_out = (struct nvsp1_msg_rcvbuf_complete *)(hdr_out + 1); + + net->rcvbuf_gpadl_id = msg_in->gpadl_handle; + net->rcvbuf_id = msg_in->id; + net->rcvbuf_gpadl = vmbus_get_gpadl(req->vmreq.chan, net->rcvbuf_gpadl_id); + if (!net->rcvbuf_gpadl) { + msg_out->status = NVSP_STAT_FAIL; + error_report("%s: failed to get gpadl %u", __func__, net->rcvbuf_gpadl_id); + return; + } + + create_rcvbuf(net); + + msg_out->status = NVSP_STAT_SUCCESS; + msg_out->num_sections = 1; + msg_out->sections[0].offset = 0; + msg_out->sections[0].sub_alloc_size = net->rcvbuf_slot_len; + msg_out->sections[0].num_sub_allocs = net->rcvbuf_slot_num; + msg_out->sections[0].end_offset = net->rcvbuf_slot_len * + net->rcvbuf_slot_num; +} + +static void handle_revoke_rcv_buf(HvNetReq *req, + struct nvsp1_msg_revoke_rcvbuf *msg_in, + uint32_t len) +{ + if (len < sizeof(*msg_in)) { + return; + } + + destroy_rcvbuf(req->net); +} + +static void handle_snd_buf(HvNetReq *req, struct nvsp1_msg_sndbuf *msg_in, + uint32_t len, struct nvsp_msg_header *hdr_out) +{ + HvNet *net = req->net; + struct nvsp1_msg_sndbuf_complete *msg_out; + + if (len < sizeof(*msg_in) || len < sizeof(*msg_out)) { + return; + } + if (!hdr_out) { + return; + } + + hdr_out->msg_type = NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE; + msg_out = (struct nvsp1_msg_sndbuf_complete *)(hdr_out + 1); + + net->sndbuf_gpadl_id = msg_in->gpadl_handle; + net->sndbuf_id = msg_in->id; + net->sndbuf_gpadl = vmbus_get_gpadl(req->vmreq.chan, net->sndbuf_gpadl_id); + if (!net->sndbuf_gpadl) { + msg_out->status = NVSP_STAT_FAIL; + return; + } + + msg_out->status = NVSP_STAT_SUCCESS; + /* FIXME: effectively prohibit guest from using send buffer for now */ + msg_out->section_size = 1; //vmbus_gpadl_len(net->sndbuf_gpadl); +} + +static void handle_revoke_snd_buf(HvNetReq *req, + struct nvsp1_msg_revoke_sndbuf *msg_in, + uint32_t len) +{ + if (len < sizeof(*msg_in)) { + return; + } + + destroy_sndbuf(req->net); +} + +static uint32_t handle_rndis_data(HvNetReq *req, struct rndis_msg_hdr *hdr) +{ + ssize_t ret; + HvNet *net = req->net; + uint32_t chan_idx = vmbus_channel_idx(req->vmreq.chan); + struct iovec *iov = req->iov; + uint32_t num = req->iov_cnt, i; + uint32_t doff, dlen; + uint32_t plen = hdr->msg_len - sizeof(*hdr); + struct rndis_packet pkt; + + if (hdr->msg_type != RNDIS_MSG_PACKET) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + if (plen < sizeof(pkt)) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + if (iov_to_buf(iov, num, sizeof(*hdr), &pkt, sizeof(pkt)) != sizeof(pkt)) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + doff = sizeof(*hdr) + pkt.data_offset; + dlen = pkt.data_len; + if (doff + dlen > hdr->msg_len) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } +#if 0 + error_report("%s: doff:%u dlen:%u", __func__, doff, dlen); +#endif +#if 0 + iov_hexdump(iov, num, stderr, "original pkt", -1); +#endif + + /* patch iovec to contain only data */ + for (; num; iov++, num--) { + if (iov->iov_len > doff) { + iov->iov_len -= doff; + iov->iov_base += doff; + break; + } + doff -= iov->iov_len; + } + for (i = 0; i < num; i++) { + if (iov[i].iov_len >= dlen) { + iov[i].iov_len = dlen; + break; + } + dlen -= iov[i].iov_len; + } + i = num; +#if 0 + iov_hexdump(iov, i, stderr, "sent pkt", -1); +#endif + + ret = qemu_sendv_packet(qemu_get_subqueue(net->nic, chan_idx), iov, i); + if (ret == 0) { + return NVSP_STAT_BUSY; + } + if (ret < 0) { + return NVSP_STAT_FAIL; + } + net->tx_pkts++; + return NVSP_STAT_SUCCESS; +} + +static ssize_t receive_iov(HvNet *net, VMBusChannel *chan, bool is_ctrl, + const struct iovec *iov, int iovcnt) +{ + size_t len = iov_size(iov, iovcnt); + HvNetRcvPkt *pkt; + struct { + vmbus_pkt_xferpg hdr; + vmbus_xferpg_range range; + } desc; + struct nvsp_msg msg; + + if (!net->rcvbuf_gpadl) { + return 0; + } + if (!len) { + return 0; + } + + pkt = get_rcv_pkt(net, len); + if (!pkt) { + return 0; + } + + if (vmbus_channel_reserve(chan, sizeof(desc), sizeof(msg))) { + goto err_reserve; + } + + desc.hdr.buffer_id = net->rcvbuf_id; + // desc.hdr.sender_owns_set = ?; + desc.hdr.rangecount = 1; + desc.range.byte_count = pkt->len; + desc.range.byte_offset = pkt->off; + msg.hdr.msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT; + msg.msg.send_rndis_pkt.channel_type = is_ctrl; + msg.msg.send_rndis_pkt.send_buf_section_index = 0; + msg.msg.send_rndis_pkt.send_buf_section_size = net->rcvbuf_slot_len * + net->rcvbuf_slot_num; + +#if 0 + iov_hexdump(iov, iovcnt, stderr, __func__, -1); +#endif + + vmbus_iov_to_gpadl(chan, net->rcvbuf_gpadl, pkt->off, iov, iovcnt); + + vmbus_channel_send(chan, VMBUS_PACKET_DATA_USING_XFER_PAGES, + &desc, sizeof(desc), + &msg, sizeof(msg), true, pkt - net->rcvpkts); + return len; + +err_reserve: + put_rcv_pkt(net, pkt); + return 0; +} + +static uint32_t send_rndis_init(HvNet *net, + struct rndis_initialize_complete *msg, + uint32_t len) +{ + int i; + + assert(len >= sizeof(*msg)); + msg->req_id = net->rndis_req_id; + msg->status = RNDIS_STATUS_SUCCESS; + msg->major_ver = net->rndis_maj; + msg->minor_ver = net->rndis_min; + msg->dev_flags = 1; + msg->medium = RNDIS_MEDIUM_802_3; + msg->max_pkt_per_msg = 8; + msg->max_xfer_size = net->rcvbuf_slot_len * net->rcvbuf_slot_num; + msg->pkt_alignment_factor = 0; + msg->af_list_offset = 0; + msg->af_list_size = 0; + net->state = HV_NET_INITIALIZED; + + for (i = 0; i < net->conf.peers.queues; i++) { + qemu_flush_queued_packets(qemu_get_subqueue(net->nic, i)); + } + + return sizeof(*msg); +} + +static uint32_t query_hwstatus(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = 0; + return sizeof(*ret); +} + +static uint32_t query_media(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = RNDIS_MEDIUM_802_3; + return sizeof(*ret); +} + +static uint32_t query_mtu(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + /* FIXME: is this available anywhere generically? */ + *ret = 1500; + return sizeof(*ret); +} + +static uint32_t query_max_tot(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + /* FIXME: is this available anywhere generically? */ + *ret = 1540; + return sizeof(*ret); +} + +static uint32_t query_speed(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + if (net->link_down) { + *ret = 0; + } else { + /* FIXME: is this available anywhere generically? */ + *ret = 100000000; /* in 100bps units */ + } + return sizeof(*ret); +} + +static uint32_t query_link_status(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = net->link_down ? RNDIS_MEDIA_STATE_DISCONNECTED : + RNDIS_MEDIA_STATE_CONNECTED; + return sizeof(*ret); +} + +static uint32_t query_drv_ver(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + /* FIXME: what's this? */ + *ret = 1; + return sizeof(*ret); +} + +static uint32_t query_mac(HvNet *net, void *info, uint32_t len) +{ + uint8_t *ret = info; + assert(len >= sizeof(net->conf.macaddr)); + memcpy(ret, &net->conf.macaddr, sizeof(net->conf.macaddr)); + return sizeof(net->conf.macaddr); +} + +static uint32_t query_maclist(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + /* FIXME: support multicast */ + *ret = 0; + return sizeof(*ret); +} + +static uint32_t query_offload_hw(HvNet *net, void *info, uint32_t len) +{ + struct ndis_offload *ret = info; + assert(len >= sizeof(*ret)); + *ret = (struct ndis_offload) { + .header = { + .type = NDIS_OBJECT_TYPE_OFFLOAD, + .revision = NDIS_OFFLOAD_PARAMETERS_REVISION_1, + .size = NDIS_OFFLOAD_SIZE_6_0, + }, + }; + return ret->header.size; +} + +static uint32_t query_xmit_ok(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = net->tx_pkts; + return sizeof(*ret); +} + +static uint32_t query_rcv_ok(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = net->rx_pkts; + return sizeof(*ret); +} + +static uint32_t query_xmit_err(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = 0; + return sizeof(*ret); +} + +static uint32_t query_rcv_err(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = 0; + return sizeof(*ret); +} + +static uint32_t query_rcv_nobuff(HvNet *net, void *info, uint32_t len) +{ + uint32_t *ret = info; + assert(len >= sizeof(*ret)); + *ret = 0; + return sizeof(*ret); +} + +static uint32_t set_packet_filter(HvNet *net, void *info, uint32_t len) +{ + uint32_t *val = info; + if (len < sizeof(*val)) { + return RNDIS_STATUS_INVALID_LENGTH; + } + /* FIXME: support rx filter */ + if (*val != RNDIS_PACKET_TYPE_PROMISCUOUS && + *val != (RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_ALL_MULTICAST | + RNDIS_PACKET_TYPE_BROADCAST)) { + error_report("%s: %x unsupported", __func__, *val); + // return RNDIS_STATUS_NOT_SUPPORTED; + } + error_report("%s: %x", __func__, *val); + net->rndis_packet_filter = *val; + return RNDIS_STATUS_SUCCESS; +} + +#if 0 +static uint32_t set_net_addr(HvNet *net, void *info, uint32_t len) +{ + qemu_hexdump(info, stderr, __func__, len); + return RNDIS_STATUS_SUCCESS; +} +#endif + +static uint32_t set_machine_name(HvNet *net, void *info, uint32_t len) +{ + char *n; + n = g_utf16_to_utf8(info, len / 2, NULL, NULL, NULL); + error_report("%s: \"%s\"", __func__, n); + g_free(n); + return RNDIS_STATUS_SUCCESS; +} + +static uint32_t set_conf_param(HvNet *net, void *info, uint32_t len) +{ + struct rndis_config_parameter_info *val = info; + char *n; + if (len < sizeof(*val)) { + return RNDIS_STATUS_INVALID_LENGTH; + } + if (val->parameter_name_offset + val->parameter_name_length > len || + val->parameter_value_offset + val->parameter_value_length > len || + (val->parameter_type == 0 && + val->parameter_value_length != sizeof(uint32_t))) { + error_report("%s: malformed config parameter", __func__); + return RNDIS_STATUS_INVALID_LENGTH; + } + + n = g_utf16_to_utf8(info + val->parameter_name_offset, + val->parameter_name_length / 2, NULL, NULL, NULL); + if (val->parameter_type == 2) { + char *v = g_utf16_to_utf8(info + val->parameter_value_offset, + val->parameter_value_length / 2, + NULL, NULL, NULL); + error_report("%s: \"%s\" = \"%s\"", __func__, n, v); + g_free(v); + } else { + uint32_t v = *(uint32_t *)(info + val->parameter_value_offset); + error_report("%s: \"%s\" = %u", __func__, n, v); + } + g_free(n); + return RNDIS_STATUS_SUCCESS; +} +static uint32_t set_offload(HvNet *net, void *info, uint32_t len) +{ + /* FIXME */ + return RNDIS_STATUS_SUCCESS; +} + +static uint32_t query_oids(HvNet *net, void *info, uint32_t len); + +static const struct { + uint32_t oid; + uint32_t (*query)(HvNet *net, void *info, uint32_t len); + uint32_t (*set)(HvNet *net, void *info, uint32_t len); +} rndis_oid_handlers[] = { + {.oid = RNDIS_OID_GEN_SUPPORTED_LIST, .query = query_oids}, + {.oid = RNDIS_OID_GEN_HARDWARE_STATUS, .query = query_hwstatus}, + {.oid = RNDIS_OID_GEN_MEDIA_SUPPORTED, .query = query_media}, + {.oid = RNDIS_OID_GEN_MEDIA_IN_USE, .query = query_media}, + // {.oid = RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD}, + {.oid = RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE, .query = query_mtu}, + {.oid = RNDIS_OID_GEN_LINK_SPEED, .query = query_speed}, + {.oid = RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE}, + {.oid = RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE}, + {.oid = RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE}, + {.oid = RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE}, + {.oid = RNDIS_OID_GEN_VENDOR_ID}, + {.oid = RNDIS_OID_GEN_VENDOR_DESCRIPTION}, + {.oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER, .set = set_packet_filter}, + {.oid = RNDIS_OID_GEN_CURRENT_LOOKAHEAD}, + {.oid = RNDIS_OID_GEN_DRIVER_VERSION}, + {.oid = RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE, .query = query_max_tot}, + {.oid = RNDIS_OID_GEN_PROTOCOL_OPTIONS}, + {.oid = RNDIS_OID_GEN_MAC_OPTIONS}, + {.oid = RNDIS_OID_GEN_MEDIA_CONNECT_STATUS, .query = query_link_status}, + {.oid = RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS}, + {.oid = RNDIS_OID_GEN_VENDOR_DRIVER_VERSION, .query = query_drv_ver}, + // {.oid = RNDIS_OID_GEN_SUPPORTED_GUIDS}, + // {.oid = RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES, .set = set_net_addr}, + {.oid = RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET}, + {.oid = RNDIS_OID_GEN_PHYSICAL_MEDIUM, .query = query_media}, + {.oid = RNDIS_OID_GEN_MACHINE_NAME, .set = set_machine_name}, + {.oid = RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER, .set = set_conf_param}, + {.oid = RNDIS_OID_GEN_VLAN_ID}, + {.oid = RNDIS_OID_802_3_PERMANENT_ADDRESS, .query = query_mac}, + {.oid = RNDIS_OID_802_3_CURRENT_ADDRESS, .query = query_mac}, + {.oid = RNDIS_OID_802_3_MAXIMUM_LIST_SIZE, .query = query_maclist}, + {.oid = OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES, .query = query_offload_hw}, + {.oid = OID_TCP_OFFLOAD_PARAMETERS, .set = set_offload}, + {.oid = RNDIS_OID_GEN_XMIT_OK, .query = query_xmit_ok}, + {.oid = RNDIS_OID_GEN_RCV_OK, .query = query_rcv_ok}, + {.oid = RNDIS_OID_GEN_XMIT_ERROR, .query = query_xmit_err}, + {.oid = RNDIS_OID_GEN_RCV_ERROR, .query = query_rcv_err}, + {.oid = RNDIS_OID_GEN_RCV_NO_BUFFER, .query = query_rcv_nobuff}, +}; + +static uint32_t query_oids(HvNet *net, void *info, uint32_t len) +{ + int i; + uint32_t *ret = info; + assert(len >= ARRAY_SIZE(rndis_oid_handlers) * sizeof(uint32_t)); + for (i = 0; i < ARRAY_SIZE(rndis_oid_handlers); i++) { + ret[i] = rndis_oid_handlers[i].oid; + } + return i * sizeof(uint32_t); +} + +static uint32_t send_rndis_query(HvNet *net, struct rndis_query_complete *msg, + uint32_t len) +{ + int i; + void *info; + assert(len >= sizeof(*msg)); + + msg->req_id = net->rndis_req_id; + msg->info_buf_offset = sizeof(*msg); + msg->info_buflen = 0; + msg->status = RNDIS_STATUS_SUCCESS; + info = msg + 1; + len -= sizeof(*msg); + + for (i = 0; i < ARRAY_SIZE(rndis_oid_handlers); i++) { + if (rndis_oid_handlers[i].oid == net->rndis_query_oid) { + if (rndis_oid_handlers[i].query) { + msg->info_buflen = rndis_oid_handlers[i].query(net, info, len); + goto out; + } + break; + } + } + + error_report("%s: +++++++++ unknown query: %#x", __func__, net->rndis_query_oid); + msg->status = RNDIS_STATUS_NOT_RECOGNIZED; +out: +#if 0 + error_report("%s: +++++++++ query complete: %#x %u", __func__, + net->rndis_query_oid, msg->info_buflen); +#endif + return msg->info_buf_offset + msg->info_buflen; +} + +static uint32_t send_rndis_set(HvNet *net, struct rndis_set_complete *msg, + uint32_t len) +{ + assert(len >= sizeof(*msg)); + msg->req_id = net->rndis_req_id; + msg->status = net->rndis_set_status; + return sizeof(*msg); +} + +static uint32_t send_rndis_keepalive(HvNet *net, + struct rndis_keepalive_complete *msg, + uint32_t len) +{ + assert(len >= sizeof(*msg)); + msg->req_id = net->rndis_req_id; + msg->status = RNDIS_STATUS_SUCCESS; +#if 0 + error_report("%s: %u", __func__, msg->req_id); +#endif + return sizeof(*msg); +} + +static bool send_rndis_ctrl(HvNet *net, VMBusChannel *chan) +{ + struct rndis_msg_hdr hdr; + struct iovec iov[2]; + uint32_t len = 0; + uint64_t msgbuf[32]; + void *msg = msgbuf; + +#if 0 + error_report("%s >>>>: %x", __func__, net->rndis_ctl); +#endif + + memset(msgbuf, 0, sizeof(msgbuf)); + + switch (net->rndis_ctl) { + case 0: + return true; + case RNDIS_MSG_INIT_C: + len = send_rndis_init(net, msg, sizeof(msgbuf)); + break; + case RNDIS_MSG_QUERY_C: + len = send_rndis_query(net, msg, sizeof(msgbuf)); + break; + case RNDIS_MSG_SET_C: + len = send_rndis_set(net, msg, sizeof(msgbuf)); + break; + case RNDIS_MSG_RESET_C: + error_report("%s: RESET unsupported", __func__); + break; + case RNDIS_MSG_KEEPALIVE_C: + len = send_rndis_keepalive(net, msg, sizeof(msgbuf)); + break; + default: + error_report("%s: +++++ unrecognized rndis ctrl: %#x", __func__, net->rndis_ctl); + } + + hdr.msg_type = net->rndis_ctl; + hdr.msg_len = sizeof(hdr) + len; + iov[0].iov_base = &hdr; + iov[0].iov_len = sizeof(hdr); + iov[1].iov_base = msg; + iov[1].iov_len = len; + if (receive_iov(net, chan, true, iov, 2) == hdr.msg_len) { + /* message sent to guest, clear pending rndis response */ + net->rndis_ctl = 0; + } + return !net->rndis_ctl; +} + +static uint32_t handle_rndis_init(HvNet *net, + struct rndis_initialize_request *msg, + uint32_t len) +{ + if (net->state != HV_NET_RESET) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + if (len != sizeof(*msg)) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + net->rndis_req_id = msg->req_id; + net->rndis_maj = msg->major_ver; + net->rndis_min = msg->minor_ver; + return NVSP_STAT_SUCCESS; +} + +static uint32_t handle_rndis_query(HvNet *net, struct rndis_query_request *msg, + uint32_t len) +{ + if (net->state != HV_NET_INITIALIZED) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + if (len < sizeof(*msg)) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + if (msg->info_buflen > sizeof(net->rndis_query_info)) { + error_report("%s: too big RNDIS query info: %u", __func__, msg->info_buflen); + return NVSP_STAT_INVALID_RNDIS_PKT; + } + if (msg->info_buf_offset + msg->info_buflen > len) { + error_report("%s: malformed RNDIS query: %u + %u > %u", __func__, + msg->info_buf_offset, msg->info_buflen, len); + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + net->rndis_req_id = msg->req_id; + net->rndis_query_oid = msg->oid; + memcpy(net->rndis_query_info, (void *)msg + msg->info_buf_offset, + msg->info_buflen); + /* msg->dev_vc_handle */ + return NVSP_STAT_SUCCESS; +} + +static uint32_t handle_rndis_set(HvNet *net, struct rndis_set_request *msg, + uint32_t len) +{ + int i; + void *info; + + if (net->state != HV_NET_INITIALIZED) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + if (len < sizeof(*msg)) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + if (msg->info_buf_offset + msg->info_buflen > len) { + error_report("%s: malformed RNDIS set: %u + %u > %u", __func__, + msg->info_buf_offset, msg->info_buflen, len); + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + net->rndis_req_id = msg->req_id; + info = (void *)msg + msg->info_buf_offset; + + for (i = 0; i < ARRAY_SIZE(rndis_oid_handlers); i++) { + if (rndis_oid_handlers[i].oid == msg->oid) { + if (rndis_oid_handlers[i].set) { + net->rndis_set_status = + rndis_oid_handlers[i].set(net, info, msg->info_buflen); + return NVSP_STAT_SUCCESS; + } + break; + } + } + + error_report("%s: +++++ unknown set: %#x", __func__, msg->oid); + net->rndis_set_status = RNDIS_STATUS_NOT_RECOGNIZED; + return NVSP_STAT_SUCCESS; +} + +static uint32_t handle_rndis_keepalive(HvNet *net, + struct rndis_keepalive_request *msg, + uint32_t len) +{ + if (net->state != HV_NET_INITIALIZED) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + if (len < sizeof(*msg)) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + +#if 0 + error_report("%s: %u", __func__, msg->req_id); +#endif + net->rndis_req_id = msg->req_id; + return NVSP_STAT_SUCCESS; +} + +static uint32_t handle_rndis_ctrl(HvNetReq *req, struct rndis_msg_hdr *hdr) +{ + HvNet *net = req->net; + uint32_t len = hdr->msg_len - sizeof(*hdr); + uint64_t msgbuf[32]; + void *msg = msgbuf; + uint32_t ret; + +#if 0 + error_report("%s >>>>", __func__); +#endif + + if (!net->rcvbuf_gpadl) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + if (len > sizeof(msgbuf)) { + error_report("%s: msgbuf too small: %u", __func__, len); + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + if (iov_to_buf(req->iov, req->iov_cnt, sizeof(*hdr), msg, len) != len) { + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + switch(hdr->msg_type) { + case RNDIS_MSG_INIT: + ret = handle_rndis_init(net, msg, len); + break; + case RNDIS_MSG_QUERY: + ret = handle_rndis_query(net, msg, len); + break; + case RNDIS_MSG_SET: + ret = handle_rndis_set(net, msg, len); + break; + case RNDIS_MSG_HALT: + error_report("%s: HALT unsupported", __func__); + return NVSP_STAT_INVALID_RNDIS_PKT; + case RNDIS_MSG_RESET: + error_report("%s: RESET unsupported", __func__); + return NVSP_STAT_INVALID_RNDIS_PKT; + case RNDIS_MSG_KEEPALIVE: + ret = handle_rndis_keepalive(net, msg, len); + break; + default: + error_report("%s: +++++ unrecognised rndis msg: %#x", __func__, + hdr->msg_type); + return NVSP_STAT_INVALID_RNDIS_PKT; + } + + if (ret == NVSP_STAT_SUCCESS) { + net->rndis_ctl = hdr->msg_type | RNDIS_MSG_COMPLETION; + } + return ret; +} + +static void handle_rndis_pkt(HvNetReq *req, struct nvsp1_msg_rndis_pkt *msg_in, + uint32_t len, struct nvsp_msg_header *hdr_out) +{ + struct nvsp1_msg_rndis_pkt_complete *msg_out; + struct rndis_msg_hdr rhdr; + +#if 0 + error_report("%s >>>> iov:%p num:%u secidx:%u secsz:%u", __func__, vmreq->iov, vmreq->num, msg_in->send_buf_section_index, msg_in->send_buf_section_size); +#endif + + if (len < sizeof(*msg_in) || len < sizeof(*msg_out)) { + return; + } + if (!hdr_out) { + return; + } + + hdr_out->msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE; + msg_out = (struct nvsp1_msg_rndis_pkt_complete *)(hdr_out + 1); + msg_out->status = NVSP_STAT_INVALID_RNDIS_PKT; + + /* FIXME: support send buffer - is it worth while? */ + if (msg_in->send_buf_section_index != NETVSC_INVALID_INDEX) { + return; + } + + if (iov_to_buf(req->iov, req->iov_cnt, 0, &rhdr, sizeof(rhdr)) != + sizeof(rhdr)) { + return; + } + + if (rhdr.msg_len < sizeof(rhdr)) { + return; + } + + switch (msg_in->channel_type) { + case 0: + msg_out->status = handle_rndis_data(req, &rhdr); + break; + case 1: + msg_out->status = handle_rndis_ctrl(req, &rhdr); + break; + default: + error_report("%s: unexpected RNDIS packet channel: %u", __func__, msg_in->channel_type); + } +} + +static void hv_net_handle_req(HvNetReq *req) +{ + VMBusChanReq *vmreq = &req->vmreq; + void *msg = vmreq->msg; + void *reply = vmreq->comp; + uint32_t len = vmreq->msglen; + struct nvsp_msg_header *nhdr = msg; + +#if 0 + error_report("%s >>>>", __func__); +#endif + + if (vmreq->pkt_type == VMBUS_PACKET_COMP) { + put_rcv_pkt_by_tr_id(req->net, vmreq->transaction_id); + goto complete; + } + + if (len < sizeof(*nhdr)) { + goto complete; + } + len -= sizeof(*nhdr); + msg += sizeof(*nhdr); + +#if 0 + error_report("%s >>>> msg: %u", __func__, nhdr->msg_type); +#endif + switch (nhdr->msg_type) { + case NVSP_MSG_TYPE_INIT: + handle_init(req, msg, len, reply); + break; + case NVSP_MSG1_TYPE_SEND_NDIS_VER: + handle_ndis_ver(req, msg, len); + break; + case NVSP_MSG1_TYPE_SEND_RECV_BUF: + handle_rcv_buf(req, msg, len, reply); + break; + case NVSP_MSG1_TYPE_REVOKE_RECV_BUF: + handle_revoke_rcv_buf(req, msg, len); + break; + case NVSP_MSG1_TYPE_SEND_SEND_BUF: + handle_snd_buf(req, msg, len, reply); + break; + case NVSP_MSG1_TYPE_REVOKE_SEND_BUF: + handle_revoke_snd_buf(req, msg, len); + break; + case NVSP_MSG1_TYPE_SEND_RNDIS_PKT: + handle_rndis_pkt(req, msg, len, reply); + break; + case NVSP_MSG2_TYPE_SEND_NDIS_CONFIG: + break; + default: + error_report("%s: unexpected message type: %u", __func__, + nhdr->msg_type); + break; + } + +complete: + complete_req(req); +} + +static bool send_link_status(HvNet *net, VMBusChannel *chan) +{ + NetClientState *nc = net->nic->ncs; + struct rndis_msg_hdr hdr; + struct rndis_indicate_status msg = {0}; + struct iovec iov[2]; + +#if 0 + error_report("%s >>>>", __func__); +#endif + + if (net->state != HV_NET_INITIALIZED) { + return true; + } + if (net->link_down == nc->link_down) { + return true; + } + + msg.status = nc->link_down ? RNDIS_STATUS_MEDIA_DISCONNECT : + RNDIS_STATUS_MEDIA_CONNECT; + hdr.msg_type = RNDIS_MSG_INDICATE; + hdr.msg_len = sizeof(hdr) + sizeof(msg); + iov[0].iov_base = &hdr; + iov[0].iov_len = sizeof(hdr); + iov[1].iov_base = &msg; + iov[1].iov_len = sizeof(msg); + if (receive_iov(net, chan, true, iov, 2) == hdr.msg_len) { + /* message sent to guest, clear pending status update */ + net->link_down = nc->link_down; + } + + return net->link_down == nc->link_down; +} + +static void hv_net_notify_cb(VMBusChannel *chan) +{ + HvNet *net = HV_NET(vmbus_channel_device(chan)); + + for (;;) { + HvNetReq *req; + + if (!send_rndis_ctrl(net, chan)) { + return; + } + + if (!send_link_status(net, chan)) { + return; + } + + req = vmbus_channel_recv(chan, sizeof(*req)); + if (!req) { + return; + } + + if (hv_net_init_req(net, req) < 0) { + vmbus_release_req(req); + return; + } + hv_net_handle_req(req); + } +} + +static int hv_net_can_receive(NetClientState *nc) +{ + HvNet *n = qemu_get_nic_opaque(nc); + return n->state == HV_NET_INITIALIZED && n->rcvbuf_gpadl; +} + +static ssize_t hv_net_receive(NetClientState *nc, + const struct iovec *iov, int iovcnt) +{ + HvNet *n = qemu_get_nic_opaque(nc); + VMBusChannel *chan = vmbus_device_channel(VMBUS_DEVICE(n), + nc->queue_index); + struct rndis_packet pkt = { + .data_offset = sizeof(pkt), + .data_len = iov_size(iov, iovcnt), + }; + struct rndis_msg_hdr hdr = { + .msg_type = RNDIS_MSG_PACKET, + .msg_len = sizeof(hdr) + pkt.data_offset + pkt.data_len, + }; + struct iovec rndis_iov[64]; + unsigned hiovcnt, piovcnt; + + rndis_iov[0].iov_base = &hdr; + rndis_iov[0].iov_len = sizeof(hdr); + rndis_iov[1].iov_base = &pkt; + rndis_iov[1].iov_len = sizeof(pkt); + hiovcnt = 2; + + piovcnt = iov_copy(rndis_iov + hiovcnt, ARRAY_SIZE(rndis_iov) - hiovcnt, + iov, iovcnt, 0, -1); + if (piovcnt != iovcnt) { + error_report("%s: packet too big: %u", __func__, iovcnt); + } + + n->rx_pkts++; + return receive_iov(n, chan, false, rndis_iov, hiovcnt + piovcnt); +} + +static void hv_net_set_link_status(NetClientState *nc) +{ + HvNet *n = qemu_get_nic_opaque(nc); + VMBusChannel *chan = vmbus_device_channel(VMBUS_DEVICE(n), + nc->queue_index); + if (n->link_down != nc->link_down) { + vmbus_notify_channel(chan); + } +} + +static NetClientInfo hv_net_info = { + .type = NET_CLIENT_DRIVER_NIC, + .size = sizeof(NICState), + .can_receive = hv_net_can_receive, + .receive_iov = hv_net_receive, + .link_status_changed = hv_net_set_link_status, +#if 0 + .query_rx_filter = hv_net_query_rxfilter, +#endif +}; + +static void hv_net_dev_realize(VMBusDevice *vdev, Error **errp) +{ + HvNet *net = HV_NET(vdev); + + net->nic = qemu_new_nic(&hv_net_info, &net->conf, + object_get_typename(OBJECT(net)), + DEVICE(net)->id, net); + return; +} + +static void hv_net_reset(HvNet *net) +{ + destroy_rcvbuf(net); + destroy_sndbuf(net); + net->state = HV_NET_RESET; + + memset(&net->reset_start, 0, sizeof(HvNet) - offsetof(HvNet, reset_start)); +} + +static void hv_net_dev_reset(VMBusDevice *vdev) +{ + HvNet *net = HV_NET(vdev); + hv_net_reset(net); +} + +static uint16_t hv_net_num_channels(VMBusDevice *dev) +{ + return HV_NET(dev)->conf.peers.queues; +} + +static void hv_net_close_channel(VMBusDevice *vdev) +{ + HvNet *net = HV_NET(vdev); + hv_net_reset(net); +} + +static void hv_net_dev_unrealize(VMBusDevice *vdev, Error **errp) +{ + HvNet *net = HV_NET(vdev); + hv_net_reset(net); + qemu_del_nic(net->nic); +} + +static int hv_net_dev_post_load(void *opaque, int version_id) +{ + HvNet *net = opaque; + VMBusDevice *vdev = VMBUS_DEVICE(net); + VMBusChannel *chan = vdev->channels; /* channel #0 is ok */ + + if (net->rcvbuf_gpadl_id) { + uint32_t gpadl_len; + int i; + + net->rcvbuf_gpadl = vmbus_get_gpadl(chan, net->rcvbuf_gpadl_id); + if (!net->rcvbuf_gpadl) { + error_report("%s: rcv gpadl %u not found", __func__, + net->rcvbuf_gpadl_id); + return -1; + } + + gpadl_len = vmbus_gpadl_len(net->rcvbuf_gpadl); + if (net->rcvbuf_slot_num != gpadl_len / net->rcvbuf_slot_len) { + error_report("%s: rcv gpadl %u: unexpected length %u != %u / %u", + __func__, net->rcvbuf_gpadl_id, net->rcvbuf_slot_num, + gpadl_len, net->rcvbuf_slot_len); + return -1; + } + net->rcvbuf_slot_map = bitmap_new(net->rcvbuf_slot_num); + QTAILQ_INIT(&net->rcvpkts_free); + for (i = 0; i < net->rcvbuf_slot_num; i++) { + HvNetRcvPkt *pkt = &net->rcvpkts[i]; + if (!pkt->len) { + QTAILQ_INSERT_TAIL(&net->rcvpkts_free, pkt, link); + } else { + uint32_t start = pkt->off / net->rcvbuf_slot_len; + uint32_t nr = DIV_ROUND_UP(pkt->len, net->rcvbuf_slot_len); + bitmap_set(net->rcvbuf_slot_map, start, nr); + } + } + } + + if (net->sndbuf_gpadl_id) { + net->sndbuf_gpadl = vmbus_get_gpadl(chan, net->sndbuf_gpadl_id); + if (!net->sndbuf_gpadl) { + error_report("%s: snd gpadl %u not found", __func__, + net->rcvbuf_gpadl_id); + return -1; + } + } + + return 0; +} + +static const VMStateDescription vmstate_hv_net_rcvpkt = { + .name = TYPE_HV_NET "/rcvpkt", + .version_id = 0, + .minimum_version_id = 0, + .fields = (VMStateField[]) { + VMSTATE_UINT32(off, HvNetRcvPkt), + VMSTATE_UINT32(len, HvNetRcvPkt), + VMSTATE_END_OF_LIST() + } +}; + +static const VMStateDescription vmstate_hv_net = { + .name = TYPE_HV_NET, + .version_id = 0, + .minimum_version_id = 0, + .post_load = hv_net_dev_post_load, + .fields = (VMStateField[]) { + VMSTATE_STRUCT(parent, HvNet, 0, vmstate_vmbus_dev, VMBusDevice), + VMSTATE_UINT32(state, HvNet), + VMSTATE_UINT16(sndbuf_id, HvNet), + VMSTATE_UINT32(sndbuf_gpadl_id, HvNet), + VMSTATE_UINT16(rcvbuf_id, HvNet), + VMSTATE_UINT32(rcvbuf_gpadl_id, HvNet), + VMSTATE_INT32(rcvbuf_slot_num, HvNet), + VMSTATE_UINT16(rcvbuf_slot_len, HvNet), + VMSTATE_STRUCT_VARRAY_ALLOC(rcvpkts, HvNet, rcvbuf_slot_num, 0, + vmstate_hv_net_rcvpkt, HvNetRcvPkt), + VMSTATE_UINT32(protocol_ver, HvNet), + VMSTATE_UINT32(ndis_maj_ver, HvNet), + VMSTATE_UINT32(ndis_min_ver, HvNet), + VMSTATE_UINT32(rndis_ctl, HvNet), + VMSTATE_UINT32(rndis_req_id, HvNet), + VMSTATE_UINT32(rndis_maj, HvNet), + VMSTATE_UINT32(rndis_min, HvNet), + VMSTATE_UINT32(max_xfer_size, HvNet), + VMSTATE_UINT32(rndis_query_oid, HvNet), + VMSTATE_UINT64_ARRAY(rndis_query_info, HvNet, RNDIS_QUERY_INFO_LEN), + VMSTATE_UINT32(rndis_query_info_len, HvNet), + VMSTATE_UINT32(rndis_set_status, HvNet), + VMSTATE_UINT32(rndis_packet_filter, HvNet), + VMSTATE_BOOL(link_down, HvNet), + VMSTATE_UINT32(rx_pkts, HvNet), + VMSTATE_UINT32(tx_pkts, HvNet), + VMSTATE_END_OF_LIST() + } +}; + +static Property hv_net_properties[] = { + DEFINE_PROP_UUID("instanceid", HvNet, parent.instanceid), + DEFINE_NIC_PROPERTIES(HvNet, conf), + DEFINE_PROP_UINT16("rcvbuf-slot-len", HvNet, rcvbuf_slot_len, 0x6c0), + DEFINE_PROP_END_OF_LIST(), +}; + +static void hv_net_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VMBusDeviceClass *vdc = VMBUS_DEVICE_CLASS(klass); + + qemu_uuid_parse(HV_NET_GUID, &vdc->classid); + dc->props = hv_net_properties; + dc->fw_name = "ethernet"; + dc->vmsd = &vmstate_hv_net; + set_bit(DEVICE_CATEGORY_NETWORK, dc->categories); + vdc->channel_flags = VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES | + VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS; + vdc->vmdev_realize = hv_net_dev_realize; + vdc->vmdev_unrealize = hv_net_dev_unrealize; + vdc->vmdev_reset = hv_net_dev_reset; + vdc->num_channels = hv_net_num_channels; + vdc->close_channel = hv_net_close_channel; + vdc->chan_notify_cb = hv_net_notify_cb; +} + +static const TypeInfo hv_net_type_info = { + .name = TYPE_HV_NET, + .parent = TYPE_VMBUS_DEVICE, + .instance_size = sizeof(HvNet), + .class_init = hv_net_class_init, +}; + +static void hv_net_register_types(void) +{ + type_register_static(&hv_net_type_info); +} + +type_init(hv_net_register_types) diff --git a/hw/net/Makefile.objs b/hw/net/Makefile.objs index 4171af0b5d..9ccf8348fb 100644 --- a/hw/net/Makefile.objs +++ b/hw/net/Makefile.objs @@ -46,3 +46,5 @@ common-obj-$(CONFIG_ROCKER) += rocker/rocker.o rocker/rocker_fp.o \ rocker/rocker_desc.o rocker/rocker_world.o \ rocker/rocker_of_dpa.o obj-$(call lnot,$(CONFIG_ROCKER)) += rocker/qmp-norocker.o + +obj-$(CONFIG_VMBUS) += hv-net.o From patchwork Tue Feb 6 20:30:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870095 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="OaiZd1U7"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbc813f8bz9s8J for ; Wed, 7 Feb 2018 07:51:45 +1100 (AEDT) Received: from localhost ([::1]:60686 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejADP-0003fT-Im for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:51:43 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45097) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uP-0001Wd-H1 for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uO-0003RK-LU for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:05 -0500 Received: from mail-db5eur01on0100.outbound.protection.outlook.com ([104.47.2.100]:53152 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uO-0003QP-EB for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=lhgOeHfP1mjtP2JIsBtwF3VqAADonTi1eCatS5VHrbo=; b=OaiZd1U7Zfi4tRVHx+cfq35UcPcfK88le3eKnM0TPARU2pHIJPlirNl3dc46eaX9qbadBEYybpJjiRiXVLdPEDLAiqWNKsSA7eFHX3PmIE1UtX0GeXO7oc1bWxLiiDC8joNF8HeGoSZTsmh+XdIX9YWVJKUhUlSehY7sxrTMdKw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:32:01 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:45 +0300 Message-Id: <20180206203048.11096-32-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: dbbdc4d5-0ce7-47e3-c553-08d56da0adbc X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:BnoqvZAUtp0adNutNUWj7ETs8X5JHRKio68jen3Nv4NfQa/LPbPktIxapBWDgIyVCloyM5TFa6ic4DskTvJTES5Ql3zhq4yk9km+jta7zy48igzNZWT4X0KVgxg/inXWj2u2fH/90NkbeuuOo3P84BN7D+waLkKxj3wtlfukOaoWrvWcDMK87C6157A0UVrGhLkE2LJo0cT7C/hhX6DEk2sJgkWRIRtr18OhICGPifaIRpXV64qmljiqMiQbR2JW; 25:bqOoCNr12DorSHpBPDS/4IHaxpAaAjW5HfC5WzFa0E9dIFwOiXM90yLncRpO2s45ZtyxPfpr5L199vf6aNyzVqfKx+O1pb2vcR7vJEt1ITsqJypOqhb8OoexjhAOWuZGOzBhsTZjZ4+kpqQq03tfTkS/OBS4DINLb3NtyyhjdXrTe28Yf2RLyyG42uhp4AbrfXjAZzIgD5Epfcb66ch1fWvixSmHI+5MTLlctEII1qnR+0g5stuGY0ahaOaJzMEpPAqW7w3cE546Kl2/2s/Z9NfTjCym4uYXFBZeRAerEgFVIw805MofcMxkLwt4KhetBLZWiRb/qr5UHXtreWqhfQ==; 31:x/SSlY6JccKxJ+/xejcwLXfkMaOqg77axxaBtrmy403nva12t1JCvZbxAlGpUPYCz/j82ZMyD2AUvqxzJ3X0poTAuFikFkJjInlzgISyrsdiUFpuoU+nzzabyLwdB0rd6XC5ctwjPjiQCIBh9gLFoPXPe3rYmYYgRshXJy0JVavXHjwVcq5Yc7sZcDyHUT/ez+3aJHW71601jnPFJphAiSySExJc2axSEXmgMPWjcTA= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:Z9LFfNnle4XKZR74B7HZsoPdYhFeYoWquj9R6x7c6t8DZhKOT3LGh35PTOGz9kbopUBMzS+FRkkFjOctwPsHA1AXWXXAw5LU+x+PmHDHigxypVwPrQ3UTtt8Qj8ABeDo4YvzVfMfFosN7xcrK3lNRAOy6jq80f3nhEyEUKWlMZhQC3k6xtNm2NIdFUtfdmArAeghH5P33F91YufIlcxg1Z8oFKXUCn5paUu0DJ78O9b/iZKS/B6G6xf/pcaCnwK/2udWlFkvwG50iPpC8SnzMsz2nkrWKYxSpwPpaoNBtqhP/VpjMaezIP2KnRfB5+SH/QbENAWJFgnGUh8hEt8VfA3InaYAmTIefGJexNf6qt8m3s9kuENT4BuPgOeaw7K5NRmocOOqmKBCkY/Kalfte21YvQFrxSejM3L1zBfnJdQ=; 4:l7P/kXNkU94r7cU1gVgqWB68AHlvk76o0Yb+mocD/lqjOkr3HB0L8gvACCRGlyv3XXHU/T0pPE45CxL6GMwNs8DuDNaUbzR8pc4MVbCUfd98d5eHpEK2JgUSqZFC3kBsGXk62FQit9GDoxvexUw9cO+dL5X4eJYKLL6YmjqeyufN9nQg9Y8jCFpv7QzUbFhXV2iIArOE1LHcFnICoj7aCd1KNtysCnjZosyKDquj9zzpzNnti0k5JZgwg4YuCII9rhR0MnYJkhE4LsVNd6Ticg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(142923001)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:AesVhcoxyZYnnjql6VBc67ZQH2X2OaDWKBZiDx/?= +NqqgXj3fVqV0PNc96D5rd5JUNZS3UPWzNQTLOMAlzsJjG3M1dgLBOwuAWs8ta4sD0iQ1BbYyBGjZMV0R+GYaOuYiZZ1K/02kWLhxF6tfzGMiVsBWCHUjDCIsqCgRHJd60oqC9cNfR9G0qQVCtA0FrqjX+TbIPZfUESteQNaueqYuZlAeh6DR1zcKpexsFf1zgHLTdaziSLfwo/ZyYxbrt/ECqP8eZ/AB3JbO1mTavza1wlkaq7DgjfsXFLlJ3wiYnq/2APtNWEeUSf+ZO2//OMd8hT9zYY3BE329boUMunOsXOKSPlvbw9RJP152iGWZn62SrIm4IWhMUo5uIESboJE9O3Jee92/n5SRUSxK2NSFfrvpNtkPgz8BKfNP73kYBS4ERI+ajVzavplEhbrJbZUQwxkAEJZePyfyoeqhTv7drUdOGjUm2FNxs6VywktH49Nu+qghKFRcZyr9v9Se7aIzyGaKqkUgoSxCZDbeFyptLUYfr8gJx89l+l4Jv42gAnP3W80/Z9fO2PPPwvnjW0sAB+TdNcbRfFzGhZ6cE0p0hOpzXfcsflx0vkpEjCko2FsxcyGas7840P9fSOEm3ks3dK+nCHZuD6GakMA7cNjAxcoxkh8mF+Sj0xhxQXSaEyHostfU+Po5Bn0V8LTohQadGspicz89AhpvQZdPOgCHBqZbBYCG86h0wrt7eYRR9mF3UNvWvsBZVb1wO56iAeT9T8m8cUCJWysQSmSXBcDp4WlKX5wjRA1I7C8zR4PLEF6WfOFisPpWHkNijbCZVBlVEvZljidnH6o2mk+nKTAlo5BAn49oQfxldJ2e3PJ0Tk9waPLqxsvNYjjmq9wEEY/UciDRsbyOikwHgXeSbjy0CVLSbUyxO96Z0O+4/OSi4+ARZi90H6GmB9YrZ9qOKeo4fvMfuwoS8czjuZ5a65Vak7wBuh9GIxRiHbgMEXoRDTL9l8Ef2eXgTqUC/gh6bsA6K6bBv/V/TiTTJQ2dP40RWwZMCDrOxVKyp8GgO3xt6i/o9B0vFHDiQ+fyu6OOLFT9AxLCceCEHXA8h9T9sFaEKxt5xUfCdKkThRyUJ/SWaftFU9at5HPLK/hlUVXq1jZg1a5ZgEnjDB9r6d/PHsFFp2J7wMHObm3byvs7LlMMNGIE1lQ7cPGVlaUcKd5Ly7Z5PDZDvBkTzrO4XvkOynTFANZZqU9rMcNFaAuwfT3Dtt0BnJqwVKlOD2PUyHyTcnhGj8+uu/GjN5kC2ZmFQJNX6xU+06bpWw2B+PP5bT+6sHYWSai4htb1RVBjEcClKg/99KLc4kh1RqB7d4AHmsFUqYq2/r9dLNB8VbpIYjeWEeM= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:ogqI3w4taVnJEy8JaaD5WrplQhzpxyYmjrXRwtj8IBlEoliYZsCDq4m+0nmGqLyncXtSVV6OVgaHCjjwDZNcfw+0YaY3o04rXW5N9+1XwkO6uEetFHv2qve2v/4lJTxAf1ytGAPgoRzol4ttvy5vPHPZCk6CC3dUX0TBGgm9STaOR1iE/6mF4vRv4ihwbGsrKqiHpgpMohc4+oufDskNyZf3/TTa5LCTzWOG6CU4Zi+1Mbj31mJNnSubqKhJbCotbhjfIywGjfYacmjccdZ2OGp5tKR2TnrwheWc6YvwbNPX+H69ma7t7AvWWojCa0BBpAhXJVUhXMF7c+6iYtd47Ch8hI7jjNSjFmdOA+r207Q=; 5:rEEJlFSwbhT/g6p5NRQ3cMBncy3lq9hewBwKJIg1IthG4zv9fzAe3jwYx0CM2h7qFpr/YHCtEalS0UFfKBLYpTzRWy2bnsGsoZBvncstyd0udqmFSdApDd0GqqEFA4aBZ8vyblJKGXrbM2AsvSCzm7GfNZ6u1Smm1lQCZKWCB/0=; 24:bCI3ABGLxA+OE/m+y4qjAPIUmRT4Z9R1uZp0PmbPzNrxPBFEOfc7yFBE/QydEkbtBK2mNfvRou3if+RN8uvndnnUIzz1nFQEmFQrEYvDeZA=; 7:oilUXXEwr03uoY1jxw+oJEdP4eSl9pSvXnaxX5/4R6eTCd9Mep5zv11mxlCA5g8vgSaWNEbS+rKtcJN23eVU0JxrZs1YxXIGaWyK29U8OFfJuXcQdvAxZFHtkQ2VnSktxeSCyweiF8x0KV+yd4siLoz3/nRqFj6Oukw2RSOmYqXoP6JKGKPFU00Tw0NzPrVQWvLqv38lA1qCGcsduDJF6sTY1KUZ46ZZsUrMEDIikGB3MahcQRYfKyPD2ALQwBBt SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:xPFgQqCPSfcpGlOk4pSjPqixkStxZkdQJT9Awij+AfSBU5Yjd/T3asktgoLCKhRiyUJV3UAceDhQFz65qKWyNCTo2HMWGbQaQLJ3dW9ORPJGv/Un+aCcS3KyXclPvvEhB93yiVK249eAT1Y8VnEXq0LGaCxCsJYyRdf3/TvViCs= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:32:01.0442 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dbbdc4d5-0ce7-47e3-c553-08d56da0adbc X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.100 Subject: [Qemu-devel] [RFC PATCH 31/34] hv-net: add .bootindex support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add support for .bootindex property in hv-net. This results in a corresponding entry appearing in fw_cfg "bootorder". In order to actually boot off a hv-net device (via PXE) the firmware needs also a driver for it (either built-in or supplied via ROM). Signed-off-by: Roman Kagan --- hw/net/hv-net.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hw/net/hv-net.c b/hw/net/hv-net.c index 614922c0fb..3d719458ea 100644 --- a/hw/net/hv-net.c +++ b/hw/net/hv-net.c @@ -1425,11 +1425,20 @@ static void hv_net_class_init(ObjectClass *klass, void *data) vdc->chan_notify_cb = hv_net_notify_cb; } +static void hv_net_instance_init(Object *obj) +{ + HvNet *s = HV_NET(obj); + device_add_bootindex_property(obj, &s->conf.bootindex, + "bootindex", "/ethernet-phy@0", + DEVICE(obj), NULL); +} + static const TypeInfo hv_net_type_info = { .name = TYPE_HV_NET, .parent = TYPE_VMBUS_DEVICE, .instance_size = sizeof(HvNet), .class_init = hv_net_class_init, + .instance_init = hv_net_instance_init, }; static void hv_net_register_types(void) From patchwork Tue Feb 6 20:30:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870125 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="TmKwczHr"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbczb4ptbz9s7M for ; Wed, 7 Feb 2018 08:29:31 +1100 (AEDT) Received: from localhost ([::1]:36460 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAnx-0006jB-PX for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:29:29 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45176) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uT-0001c5-QQ for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:11 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uQ-0003Sb-FE for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:09 -0500 Received: from mail-db5eur01on0121.outbound.protection.outlook.com ([104.47.2.121]:11584 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uQ-0003RX-2e for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=rOacPbvJtrX3vWh/Pafe5jWYNm31oERxcLKkwmJiyjM=; b=TmKwczHrku82TokWFIOja1/ww+jWeLcS0k6NxQB2DkgFVOZKIEooidF2Ch4d2vSRRY4puDpx4G2HamKSEHTpKZj4dfInioWy/UfRanhfNQ4pOPVfMQP3qe3E8AkETCmaviubHdjx9xgRA6UH1A6zO3Z+1YCgU/SJ05twVzV6+sQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:32:02 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:46 +0300 Message-Id: <20180206203048.11096-33-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0bc6b1e3-1f28-4087-5872-08d56da0aeb2 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:0+NI36iKkZBamS8mpSgRkH0ugAwZDqyLt1toUZLRgpPtzKVWtfWJAXL4Pa52IdL59Rf5gBqWPfwfJBOUixndbhaWtP4C5XlneNrYD+bNQDV8AzUvqjnQn71Lrvpnn45BLm1KM1mM82j/rwArwXOdbd8f7eNiWKR7miR+Ujvy5GCiSEgPIYnMbB9erWlwghrH9h10xcRLenCuea0PxatrMMVt5txDFYvuMTNYwqE9VGGZKOBRyPduASzIe0iUBP2L; 25:IBge94C7Uk/6DcjzILwFIrZSTb0OgTRUQJBOm5JV9bM4lwjZtk/3f+jcConzzQDHEZyyramaPh35qwOZE5uZRhtgIAauHqbgSRzTE5289UI7q6qcxTGbJzQUiRRbVjoWvDB09Vp7R21C8IaSAXHu6Sexrr2tG1UmK9qTisXJBz9TjhPa5ENZUCRQhJBoefZp3Xwr8HeKoW+4izL0Vk9x4MnMbuD2CM6S7oqn3yepJ2G/p4DIGT0wU7lEuw+WfmmgQF9Voj0slCJA5qbn284VHYgIVYgFTeHqufRtQUek/pfxWMu3Socheg3kJrgIoCg25oOnJ+wk0JD0J4RJA9PGXA==; 31:3s3+cMYF7rabS/hYamZqHg5xDctbDHueO2aO090TsA0rMOaVVRnyzW5J0V1wWV/UtcksLPikbKCQa55gs4rhBNi1DJYfnrRtj33MDZmCuKR1qI3at3aytnehm4YIazx1aezBFVPr4hirjvgnzjgeOzhtlA77nTuCSmv88zIQqoQtBgK82GB1sTM4y0XD/PI2sM7opgPVr1pZILk+0PP5ewA788YG6K2oQd50QNT7RzE= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:ufjS0htNFSt1AgZKQrPK9VtmbCOUNBoTFF0ZEdvtsWi2rUJE0T+op8tkoCYZtaBkA9+CvHY1ThxW6nVGcpX8oNcI5zDKv3fl65Hr0/fH9YCOoqSYp6+XGUi2bEDAoN8KIT0K9WGbEVsLYpeHx+AiXAhzkx0vaytgso43MtPBIoP/gjJYbj/LN6x+OVyQwiDQzZjOqkQ0vA7ZDiRguVX8mkBWRvXZcn7ETEQhRcjsIa/JxnEcnETBUoJ/uyjfbAsyGViHs7sNkJuhVirqjunEievW1By1KgIThC8oPmFDXvmht0AdhhLNNz972rKWxMvZHC0XKbM1bx4C9AVu3xosWkdC1LkhSs57GuzaOuIWLrr2VK7bz0o4EyGTWwWf6R705UFlr6pgzyDkuAnuA5YPOb2fAFkFt6xKe0EEpbIurxE=; 4:b2kdvUvfqGyn1l0PT7bWCffQbFcuNSvEA/2gVxb6aW26AUY5TDlmB18mFL3ENlO/Rp74wtK4hmgbwgCyUF/NI3Q0ka2xM7VTtqP6iJ1pqbeyBQX/Mk48CRToem3LfGB24/5TCrfpM+tYbyDWHwpe0+DuuphPrdpW/zw6go0w0fQC7Jr5jnQHKOVaMGACzRad+3yusqkqu7LQYdlU168Hxy2ETxRA4btJA6AgzNtCd1GKPHN5hEjTaXzC/eWft85ui9pLcQ5akao/YC53ICNqow== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:Tp12tQ407/aQnwQ26mdODE6uQi6lxUoQpSn1Ftk?= uQcCWiF9t2JvPG9dTCzaLP5REjCFX98pkNwCyBlEw3KTZFq8muExsijaiZFXMIzj8Ln5RPOUhYQGAvkPHLfQZK/GWBCHQO6z4kKJsLvsY8z0LC1v+mvoyX7sSZwJBbVnp0MLyazBh721vO36MxbrDavxMmwjI0TYuZQPR+u6dUoTi5y0tcK0ona3kvUl8zm3pFzXi8+IP1Kn901VAdmZVX90YLwGe7Gp+MtkPCl2YW0sg1FB2ugAMI/m1CajaRrfap5n/A+nAG+rc77UcXFeukcEfNYCJeP+1ceqmBIO4M0U+wX2X0imaMa6W1X4Mkx+kzl+shXsX9JpbUYDp5d6HZ0OQMPVWeVt+N00GPy4YVrFoHIiJNLO7T4NMQ9rwoRYFBXaLHDSnTvtX6V20S+Wog66rp+IhmaWCSRQDdLyEj9xU1iVkz+DtMvL3EsVcSTi0YxizGy5cH5k/HUOMIqyHqTODqAl6xvignaJPmlt5v9XMCQWy1zajUINuwlnlPAc574DEm6BVpfrRSco7M7sDWFTw0B8PjLw88knxi8qOmj4R2kI99ffnvmyPh4GkkAGlH6fY8FX/CvZDfsiDWSvjvM7+dABKu0JsDuhFc/8q8jt5Ci+eyicYAdKw4kZVgp3jCRoNQZxoq6MzvGOv7CiYM0KTSauvJUWw3a06LlGS3qi9acYYNLQD1giyiFKYMKq0oN7DVP65wZ8qVmy3jP1Tyajj6LXbyZvljjVwYRUifeTDkEd9XcSlI84vsuGJSq4LimhVIeHUybei7YGuD52k/ODIlebZC5FjT3XWbPdgxgF+r4NdYchlvHD9WbXT+I3jqHjFFn2WtxVJH3YlQH/DmpJlfDsxGdMP+BwSymgFbpXTvbhgbIgGUR+jsboRQ3Ub1EqctFT99z9OriUae0+QDDmSoQctuAZ1wCJSmu+bI9eFC0mqXTd63iNlsezAtsGei8tTgs3p6JTG3nCrjewJsqiAmSsAWoAPMhZ43nPo/MbSmnp5RXV3jfA6to6ADlWIWYjMsFqvBSStZYshQSbi7VXEU7mN8tDflfdTjnXekpl3uGZEtJLS5tHo/0ZFe9dnZ8fy/WR7DJ887DdTDWsRZHySRT2cpJgZzQnZV07CXtcYkkLBry8c7yeFd3iQ6DSt2MSPaQet/uMxzXpgL6NOGmPDI0plS+ftEoSR2+TFasdt8DInSmpo9fgpbClnsOa5MJ+a3Iatz3FvP1x8uegcfneZz/euIbesKZthcArcLlf5rWR4yANkD1sqRCJsui8T6xA3lSIkKtjYBnx5PkCJRGTDeDWbuo9BibvvIo2xDtM2SA== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:jAnObX01pP5AtXzJ9nHPU+lUe9vBWLXsmefSDWwor1o5pZO1B23V70E0s5md97smi/c4v+jUDyBzLdH4scwflh8CEeKapHlKlanofcZJaL7SWmpsg/D++McXGqUhHOVv4p3ChwAMpI7lCRx+imaThqAoeJeGB3XemSG+qVhKonaSwFUxj9F1kHc280dUik4ApOuXgtlEhjKeqn8NOaMdUKr96eLP53xvY84H+yioAd27owMhcurYw6jXsJS3q8oYQ2qRv9eju0W9AvppNVhLxUFkPp2oS+FRAxcczltEBVxMBr0eLTJJipHRMOm9fVozAFscpVhBSMjyYuZ4dDZFRu1Zl+Ux/Als0Iuj1S2nU98=; 5:93n2rKuppn4oCnG1CRv2PxogsSP0+5aY7P881UYX6SHZXfotK8EjsAC/1HhTEwgFQuGbGywLNmgFghp/IcR+l1Haygl0qoAOt0iuXAOkxxgvQrirj7X6Jrw72zTiNJKINb+sFRhzhySLEEEeacIcLHg06bL/9qIgTznoA6Cb55E=; 24:5BuK14owPXhLf4n1DzSsFPnDhe8GtC2v62PNOinsRQX0KsYgWi1P8tFLo/9/2mKTEcYV0J2qsC8ck8Oodd7+ZXf+AA6eaaTc9Yp16I6qkoY=; 7:AQAqWZ0gBRU46AAGubSZZpv9Sx40HCGnvnEZrpSw+H9BelB1mAxttfzwwnBRocqlFKLkSEAaz3k7lp5kQLsVSUOsWtkcyU/SazNFgtLPIazVqzAhscQm8SfQHbt1KXimDtZySLl5jKMuTIPqfzaAYBX9hjSMtJF6Q5/ekGUmeFgXz1A2SDx7RSMaUB5qhtDVQYeaceWeNPHLiNIRkZ+C7THKOEBDxCKHm7UZW9AW+SWmNsrN6LRuqaeCaoZ35Mfk SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:fkWi1Ne+h2E1alj3nl+ZQcM0vRPN651k+JySP0z3feJixaM/LEcEblKKGC1/C/lQedaXBkPWZ2n7b27XCmu925gzuWiTtS8snqeSPiRlS+KjLjdfZxzXpkk+iWxQNezUFIDzYsz22Im4ppuDTUghkliVEY26SWUvo3bqEHH+Wxc= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:32:02.3724 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0bc6b1e3-1f28-4087-5872-08d56da0aeb2 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.121 Subject: [Qemu-devel] [RFC PATCH 32/34] loader: allow arbitrary basename for fw_cfg file roms X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" rom_add_file assumes that the basename of the file roms in fw_cfg should be the same as the original basename of the rom file on the filesystem. However, this is not always convenient: the rom basename may bear certain meaning in the guest firmware context, e.g. contain device ids, while the the filename on the host filesystem may be something more human-readable. [In particular, this is how I'm planning to supply roms for Hyper-V VMBus devices, which don't have a spec-defined way of doing this.] To cater to such usecases, interpret the corresponding argument of rom_add_file as a path which, if ends with a slash, is interpreted as a "directory" to which the basename of the rom file is appended; otherwise this argument is treated as a full fw_cfg path. TODO: it may be a better idea to use separate arguments for "directory" and "filename" instead of interpreting the trailing dash. Signed-off-by: Roman Kagan --- include/hw/loader.h | 2 +- hw/core/loader.c | 43 +++++++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/include/hw/loader.h b/include/hw/loader.h index 355fe0f5a2..a309662fa8 100644 --- a/include/hw/loader.h +++ b/include/hw/loader.h @@ -186,7 +186,7 @@ void pstrcpy_targphys(const char *name, extern bool option_rom_has_mr; extern bool rom_file_has_mr; -int rom_add_file(const char *file, const char *fw_dir, +int rom_add_file(const char *file, const char *fw_path, hwaddr addr, int32_t bootindex, bool option_rom, MemoryRegion *mr, AddressSpace *as); MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len, diff --git a/hw/core/loader.c b/hw/core/loader.c index 91669d65aa..436154de48 100644 --- a/hw/core/loader.c +++ b/hw/core/loader.c @@ -817,7 +817,6 @@ struct Rom { MemoryRegion *mr; AddressSpace *as; int isrom; - char *fw_dir; char *fw_file; hwaddr addr; @@ -882,7 +881,7 @@ static void *rom_set_mr(Rom *rom, Object *owner, const char *name, bool ro) return data; } -int rom_add_file(const char *file, const char *fw_dir, +int rom_add_file(const char *file, const char *fw_path, hwaddr addr, int32_t bootindex, bool option_rom, MemoryRegion *mr, AddressSpace *as) @@ -914,10 +913,6 @@ int rom_add_file(const char *file, const char *fw_dir, goto err; } - if (fw_dir) { - rom->fw_dir = g_strdup(fw_dir); - rom->fw_file = g_strdup(file); - } rom->addr = addr; rom->romsize = lseek(fd, 0, SEEK_END); if (rom->romsize == -1) { @@ -937,20 +932,26 @@ int rom_add_file(const char *file, const char *fw_dir, } close(fd); rom_insert(rom); - if (rom->fw_file && fw_cfg) { + if (fw_path && fw_cfg) { const char *basename; - char fw_file_name[FW_CFG_MAX_FILE_PATH]; void *data; - basename = strrchr(rom->fw_file, '/'); - if (basename) { - basename++; + basename = strrchr(fw_path, '/'); + if (basename && basename[1] == '\0') { + /* given path terminates with '/', append basename(file) */ + basename = strrchr(file, '/'); + if (basename) { + basename++; + } else { + basename = file; + } + + rom->fw_file = g_strdup_printf("%s%s", fw_path, basename); } else { - basename = rom->fw_file; + rom->fw_file = g_strdup(fw_path); } - snprintf(fw_file_name, sizeof(fw_file_name), "%s/%s", rom->fw_dir, - basename); - snprintf(devpath, sizeof(devpath), "/rom@%s", fw_file_name); + + snprintf(devpath, sizeof(devpath), "/rom@%s", rom->fw_file); if ((!option_rom || mc->option_rom_has_mr) && mc->rom_file_has_mr) { data = rom_set_mr(rom, OBJECT(fw_cfg), devpath, true); @@ -958,7 +959,7 @@ int rom_add_file(const char *file, const char *fw_dir, data = rom->data; } - fw_cfg_add_file(fw_cfg, fw_file_name, data, rom->romsize); + fw_cfg_add_file(fw_cfg, rom->fw_file, data, rom->romsize); } else { if (mr) { rom->mr = mr; @@ -978,8 +979,7 @@ err: g_free(rom->data); g_free(rom->path); g_free(rom->name); - if (fw_dir) { - g_free(rom->fw_dir); + if (fw_path) { g_free(rom->fw_file); } g_free(rom); @@ -1052,12 +1052,12 @@ int rom_add_elf_program(const char *name, void *data, size_t datasize, int rom_add_vga(const char *file) { - return rom_add_file(file, "vgaroms", 0, -1, true, NULL, NULL); + return rom_add_file(file, "vgaroms/", 0, -1, true, NULL, NULL); } int rom_add_option(const char *file, int32_t bootindex) { - return rom_add_file(file, "genroms", 0, bootindex, true, NULL, NULL); + return rom_add_file(file, "genroms/", 0, bootindex, true, NULL, NULL); } static void rom_reset(void *unused) @@ -1255,9 +1255,8 @@ void hmp_info_roms(Monitor *mon, const QDict *qdict) rom->isrom ? "rom" : "ram", rom->name); } else { - monitor_printf(mon, "fw=%s/%s" + monitor_printf(mon, "fw=%s" " size=0x%06zx name=\"%s\"\n", - rom->fw_dir, rom->fw_file, rom->romsize, rom->name); From patchwork Tue Feb 6 20:30:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870128 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="dSsOjP3z"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbd4l5WPcz9s7M for ; Wed, 7 Feb 2018 08:33:59 +1100 (AEDT) Received: from localhost ([::1]:37380 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAsH-0002q9-R5 for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 16:33:57 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45198) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uW-0001eS-1j for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uS-0003Vb-Mw for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:12 -0500 Received: from mail-db5eur01on0138.outbound.protection.outlook.com ([104.47.2.138]:6562 helo=EUR01-DB5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uS-0003T5-DT for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:08 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=CbtOpK8aBvq9zMNKMIECWEhiKCQL8vnhJzxbIv2vchM=; b=dSsOjP3zF0wxLCljXjcZfZ861lOsbCspUJqBwRvSBQ5sqLRCfoL6dR+zKiQTix0knlDSz+UMD9prbLn3Jv/hm/ykR7M8CFHdskrgp/Cun/ZhxWCehK/SDECHq6SfdWZ4lgWn35xX332gLrzS6eDOiHo55RF5ucgz2oUTejlFh7s= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:32:03 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:47 +0300 Message-Id: <20180206203048.11096-34-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5c19f384-2ed8-446f-aedd-08d56da0afcb X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:gxdg4+bbhrGFDR57tR9xiAY+i8qf369uoISNj7CVViw9qeYSVMSxNtl5yn4m1ekCkPLYqaue8cGS0LtC9Tgs2BVeaUjTQRsuSPVDaZmjkS/ppQPRMeYmVhZKEqh8kOE2sX4Fwq8pkQytsKfz0qu4mqHHTm0IHhrEHXpGT3/kwlE58lOugrk3bOrsS4Sv642ztAgu+8s+mjLDISyKKX82nUrG7IhojhFPRGZ4/zbDMxqjRciE695Tt5zshYPpcEM3; 25:QmwPKgoQt4s2vEH5hIM31Uews47Fdp13qXsZ+Vtl5d1zCjn2C79wDvNJITg397kkPfytboPigYzTiHgaz+oSnvqVS9zaEIfhEXcQEIyZ4SuyCXlq1wkMMnqi+3Ioi7tEsMwD07F4SZ1gedwU+nZzvLdsvLF9vqjJItDBbLregdEPPrvyFcQLN0xWVltzH5uCO7FcNPsqSryoNzTQUfbzJXZ6L+AGveJOagfBJB0lif4vW2CGxIZx1agvmiL8p12SeUBD/CXOEGVktJ9bVysN9Oe4kxPIXiI7S3+MlFGguw1NflcnDYglWXNc4dRyFpiD1MxJ61IrnB0U3EpP/GU2yA==; 31:1CqO6eZ6D344/ChXVRzX10AfrdVN6DztYQvQ8XeBSQV2lN9sUelQvg68Jievsgae8c25/6Ef/N/k9ZUsH3uH4cjXiX6D8VuHjPbSJATaUbcl+LXXpUxftH3UGIsleC5uOlH5KfVZ2XP5+0+jlTe1kY3veUtgE3XR6QP6oJKUA3xfzltjSeEtKheI/vXvVEbKXKiiC7Vs+mWWGWiv38L1jdJkpHlEzVw+KKbXAQmD8fY= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:FdwoUxz6LdSNjdojB+zun7EAApsKjEq1jqjKC9cpfEJtFi7PJDB6rbkB60dvhVa6EXELMbvkF7IJ0Awgxr4oubEAqdzEhHT6Evl+JHiaJNglTLb5EDwJsVNnhdOM+qOpeViFZfhYbHtVp+Ce+oClQEYiwUUoVoJCAffkAgr9/CvAkOxTr05EYu6zU8ZueCXvDxTXVN5JnW5cZbz3Fdb/JUq9fXczb90bDqrjQ8ov5MyI1QcE5q41UUOwd4mc11NZs3IJjl1IQ2rDJdj9qOIkaMVIzADyoFnuUD3B6yy36pTA1EFh5nf7FVbGJ5HCYmNarAKOVJhkbcjgN0WzA70KoR5dedL/4qH3cUsW+iDeOLKn0qsQx3vf/k7A4B6keT+ABFb7I9SwRuUK7wbUx6ICxiOxDfPDa3iVH0emOKdZ9Tc=; 4:lu97hZgx4zhqyATWjhsALIJjTQ9OukGPcX4SK0iIxM1wqhnJdxzC6D68fkKdY6hP5YlBZMU24Bqa7nHvEWGhxQ4CuP3x/ggLnWXlStPVIE5APOYkY6OHyIeLuw3MkFzmSC1nwihpsRf8wjV1U4q4F0mQZT9BgzINiP2PwcyvC8VgHtd7pKwmWHwpU5NVviD5sSBxQaFigGNHMorhPdMjMF36xZG8qBNBneOz7RbEtDE40IxXeAj50TgfWr5DGdTYgYjN61yK+3oj/UjD2apmsw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(21314002)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:tRGh8iPymaHlReyz6KI8t4elGdQzb+0SdS+EMst?= HAl8OalQ1pvkSztkdncADglr638iQiBDv4yFKQT0czybRsKDEWObiWPz/Kb7WWZ9r6HFqSbtfyjbgiPHtXQp8v+hQe15h1bYpIU/9g3ZPlGsU0SNsKfp3w4eVS2EuP/EBPMha8qMB0LmbQ8058I/cBuV6LgqrGU8t/Kqg7CUt5AEXSAeAkBXbl/kk6mLIHV3/8Hk9TA4MJP25xQnRqrL/MUfCypKjuQ74eyhyOWwAGNqa0PGAFg5zR8Bi1MvBl1+1e+RSFLJieFXECZQ6bVIZiZ0CTorsipGRi64U6bFZZM+o1c24xS7Ki+ne5hEaZpXERX39YBnaGCEeo7dvAL/eTfCzSMdYAehWj/gUPaUN/6fB3IVcQ4KtB0tD6hhvAKOf6APGN76eBONFdGgQY4KTlm2CDUdJlLTttPo21IFaiUPEi9VN6LfsG3mWH0kBw4GjNX9oncap+AI1neQ0RLrQRQO0GkrIF6IsJZKRfJ7Ki5Wnyo6C6ECufmpO311tSAF7bpCPJP9aNT4y7K+ofq6QxQBCSo73M91TR9zQaV2mnOp8OikmeDsQyS2AA8FkQI0RA39TUjGEfmAXEKOERcj3Fm2e2q3DsquBrejoi9H+Q2ufMIldDH1lDpIC3rxhW9ormnn+QGQe88zeOTJ8WFKR0lzTyfjR2GXHgY0gxi+8Lt8JZc4gj3CRSDarFrtehIFyP6dLwJbNAlUCWU7T/+O7tBgTuKwDUxDs+fUKpmIMw+yB+MD4PVnoa09/cbZiWctmOCWQXHUoyi3KB8w8RzVScCpjnvis7j+DudeqMlJ00zVzNpmb9zM/WC0cumSuTm9eJWJWIPo/DuenNMQbBFoPd7C0RrWlMw7FoBz04jTfg8Gb9NwZoufHuAE+Tq7E+xsY6/59ozsZDOPdza852VZSLkq15haJllywV7wnc3IvlA/NAYq1W3Tre1mR/T/4gWKGTWwz4vcW5N5PBESWH6Fi0RGxGC4KqaE5elXx/Mu1Aa0nt5EQTM25l3erer3/LpVCu+m3/eqHOvlyX+r1YCf78MJWcNMUAE9zFRj/kgrNY8ZvU7Oh25zc7rpiAh/rnelVwYYJxi7NTvTQFCxSiGq2ud/1/zjfjv1ThfE/vaTBe7D45sJvc0U5swMXl+vPOS/3vV5YBrh0rkyoQ9KF3roPiTYYnDXjyZ9SHY0HhinzaujBA6CWJyfRSDEQ++4ymkZhuk93Pvqj93fE0Ga3pMUyQ8zCqWmMQqtWt7Fe7CaEBaz680d5mRQG9WT19+uC1P9DNafx+zjJdAYiZGCSUdoNHCan6A5Ox99V4qKK3o0C6jMMVA== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:C0HX4AZDVI3H7Sz3zx50WuZAcoGLOHi5+vKBsz0rDBSbIJEafFDMGxIpXrcl/P3qhw9+jdaZoFArQMjrElPkdwZ5gY/BOIFRixPqujlJHHudYmoPCOkuCt1ESyXxaH0O3Dn5jiN0Fee/V/PxK6SQ5dIXtNnBXr7oqXKNmZh5W+BeIGnNMcequbNZU7JaZY76aFcb74k/E6VSc0zRQH+Z7nVdGuM+sw1Jn2EBSNeNmwukEPKnkc3RgeajZGO0NYYoTAfiZDU8WwChM57TDWxp+mpCxcxwA8ds1x4gFgW5uutOlYLHsHCHtqZwGF3eX2Mtd215YSA7Js81EcDxdcsrf9C/xcnJ6FsU8TlaBo2mD+w=; 5:DycI9ijEvtH92IA8vhtuxmG9ywc/mly6x8K3PQ9ybxufp71WUu7mGsUJIs6WfRAHUkGvpDYgD9vnw78IN5WIS/FTlD+8mOHslEFKtp9sKS/29mp1+jqV7UcL6DFyRuX/kaCrw1ZNPKeitWbNUygDHN7Uo+5f05GQxELnT0oxH6Y=; 24:5dwMe51yw/jpP4gBceLDCdlsMrAQ00hgVNr6zmjioSxhGMYHUBRMJu6X7MvwKbanUI+MSH660/kPLv+tSaLHBITiB0flQ4h9Iv8+ER6+WgM=; 7:clnsaii/T2gr0wPJrubBBAYEdM6S3ttAIi+GbkoxNpUUEc18WnxaHL47P0cHGPISsCxeZv9+zyKy9Do4ZpDBEYCi+HdSJCv0mM21BAObINO3jaUFLhZaJPX1RPD7vmhk3FOVrdX/YMcaHgZN0tLyxEDX2kP29A41QjKhUtxLDHeENFRtS4O6sZGHWHStNP2+5/ncFeyBm4BAl1xdov96bjs3ZiNGkUvXLEJQRiyajC+fW8LUuCXHwmQfsO/og1Rg SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:hYSamrwm93IjLmrTyZO5ZIwdfcnBnyL7YMs7QV8qjxqrSjbs5bUSnCEcIvjc45Y68bI42b3DgMYrabO5JEy1Lmn+MRvtKlb7O9gM/WTUZ07Ee6nLLuDDshjyMtMas9IIuwGuihOn/dQtczdD9sH/OHGmw98GrTgkdVpfE8rR1Gw= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:32:03.9193 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5c19f384-2ed8-446f-aedd-08d56da0afcb X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.138 Subject: [Qemu-devel] [RFC PATCH 33/34] vmbus: add support for rom files X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" In order to leverage third-party drivers for VMBus devices in firmware (in particular, there's a case with iPXE driver for hv-net in SeaBIOS and OVMF), introduce an infrastructure to supply such drivers as option ROMs. To make it easy for the firmware to locate such ROMs, they are stored in fw_cfg with names "vmbus/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.rom" for default class ROMs (where xxx... is the class GUID) and "vmbus/dev/yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy.rom" for per-device (i.e. specified via .romfile property) ROMs (where yyy... is the device instance GUID). The format and the calling convention for the ROMs is out of scope for this patch: QEMU doesn't try to interpret them. Signed-off-by: Roman Kagan --- include/hw/vmbus/vmbus.h | 3 +++ hw/vmbus/vmbus.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/include/hw/vmbus/vmbus.h b/include/hw/vmbus/vmbus.h index cdb5180796..847edc08d7 100644 --- a/include/hw/vmbus/vmbus.h +++ b/include/hw/vmbus/vmbus.h @@ -49,6 +49,8 @@ typedef struct VMBusDeviceClass { int (*open_channel) (VMBusDevice *vdev); void (*close_channel) (VMBusDevice *vdev); VMBusChannelNotifyCb chan_notify_cb; + + const char *romfile; } VMBusDeviceClass; typedef struct VMBusDevice { @@ -57,6 +59,7 @@ typedef struct VMBusDevice { uint16_t num_channels; VMBusChannel *channels; AddressSpace *dma_as; + char *romfile; } VMBusDevice; extern const VMStateDescription vmstate_vmbus_dev; diff --git a/hw/vmbus/vmbus.c b/hw/vmbus/vmbus.c index 42d12dfdf6..c2aec004e7 100644 --- a/hw/vmbus/vmbus.c +++ b/hw/vmbus/vmbus.c @@ -12,6 +12,7 @@ #include "qapi/error.h" #include "hw/vmbus/vmbus.h" #include "hw/sysbus.h" +#include "hw/loader.h" #include "trace.h" #define TYPE_VMBUS "vmbus" @@ -2061,6 +2062,36 @@ unmap: cpu_physical_memory_unmap(int_map, len, 1, is_dirty); } +static void vmbus_install_rom(VMBusDevice *vdev) +{ + VMBusDeviceClass *vdc = VMBUS_DEVICE_GET_CLASS(vdev); + VMBus *vmbus = VMBUS(qdev_get_parent_bus(DEVICE(vdev))); + BusChild *child; + char uuid[UUID_FMT_LEN + 1]; + char romname[10 + UUID_FMT_LEN + 4 + 1]; + + if (vdev->romfile) { + /* device-specific rom */ + qemu_uuid_unparse(&vdc->instanceid, uuid); + snprintf(romname, sizeof(romname), "vmbus/dev/%s.rom", uuid); + rom_add_file(vdev->romfile, romname, 0, -1, true, NULL, NULL); + } else if (vdc->romfile) { + /* class-wide rom */ + QTAILQ_FOREACH(child, &BUS(vmbus)->children, sibling) { + VMBusDevice *chlddev = VMBUS_DEVICE(child->child); + + /* another device of the same class has already installed it */ + if (chlddev != vdev && !chlddev->romfile && + VMBUS_DEVICE_GET_CLASS(chlddev) == vdc) { + return; + } + } + qemu_uuid_unparse(&vdc->classid, uuid); + snprintf(romname, sizeof(romname), "vmbus/%s.rom", uuid); + rom_add_file(vdc->romfile, romname, 0, -1, true, NULL, NULL); + } +} + static void vmbus_dev_realize(DeviceState *dev, Error **errp) { VMBusDevice *vdev = VMBUS_DEVICE(dev); @@ -2098,6 +2129,8 @@ static void vmbus_dev_realize(DeviceState *dev, Error **errp) goto error_out; } + vmbus_install_rom(vdev); + if (vdc->vmdev_realize) { vdc->vmdev_realize(vdev, &err); if (err) { @@ -2145,6 +2178,11 @@ static void vmbus_dev_unrealize(DeviceState *dev, Error **errp) free_channels(vmbus, vdev); } +static Property vmbus_dev_props[] = { + DEFINE_PROP_STRING("romfile", VMBusDevice, romfile), + DEFINE_PROP_END_OF_LIST() +}; + static void vmbus_dev_class_init(ObjectClass *klass, void *data) { DeviceClass *kdev = DEVICE_CLASS(klass); @@ -2152,6 +2190,7 @@ static void vmbus_dev_class_init(ObjectClass *klass, void *data) kdev->realize = vmbus_dev_realize; kdev->unrealize = vmbus_dev_unrealize; kdev->reset = vmbus_dev_reset; + kdev->props = vmbus_dev_props; } static int vmbus_dev_post_load(void *opaque, int version_id) From patchwork Tue Feb 6 20:30:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 870100 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="LImhMGLp"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zbcK55pxjz9s7F for ; Wed, 7 Feb 2018 07:59:37 +1100 (AEDT) Received: from localhost ([::1]:33409 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ejAL1-0003aQ-UA for incoming@patchwork.ozlabs.org; Tue, 06 Feb 2018 15:59:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45208) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ej9uY-0001hc-7D for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ej9uU-0003Y1-Tv for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:14 -0500 Received: from mail-eopbgr00091.outbound.protection.outlook.com ([40.107.0.91]:41696 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ej9uU-0003Wi-KP for qemu-devel@nongnu.org; Tue, 06 Feb 2018 15:32:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=cDLzVFITMYZ2raPboW6IDGmYL8x5iyQhr7ieM7+yRMU=; b=LImhMGLp+v7Mlc8Fr17oL5Fs0dUKBifnPKwTS9DpzoYliN5fnC8QqFTh1Nnobs8HnF0GpBTwgbwfUJlC/Exnor0d1k084sdSoMuWUnbGBQzKz/637m4Uf3K1ZpP3UI68NrNDTpHCybcw+L0s5w8qWnIt31W81m9cDe23vdbDE7I= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.464.11; Tue, 6 Feb 2018 20:32:06 +0000 From: Roman Kagan To: qemu-devel@nongnu.org Date: Tue, 6 Feb 2018 23:30:48 +0300 Message-Id: <20180206203048.11096-35-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180206203048.11096-1-rkagan@virtuozzo.com> References: <20180206203048.11096-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0301CA0008.eurprd03.prod.outlook.com (2603:10a6:3:76::18) To VI1PR0801MB1983.eurprd08.prod.outlook.com (2603:10a6:800:8a::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: e7424443-6fc5-4d6a-d8f3-08d56da0b159 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(7168020)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0801MB1983; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 3:s5/yAK7DIQEORoZwUNY/EcdIT6bJs4Yry088QImQ/DPuiP00k3OvT+LQrEj2CsorXQLdFvaUodjAeDGCqxrlKzhR8WxZBDNmXv/grps2jglR5V1ptMc2S+Yq8T4v917846wvs3upvkIIaGO5sr+bd6IssGVUhYpHLgd4xjxdr7uWe2B8VCli7IvLDWO8gUr+jGpQAXoJKjy2nOQuXoYny9EDP1+9p6iywDO5OIB01VFm9TvWKnNxEzbQY176xzSY; 25:cAeoyZFpqSikrSSKbVE7Qdhi6NRl8FghdXsnJRRl8CeUklOAl6nHzkFVOmbJ1n8T6k5hZOL9h1nSKaeaIFHaNIJrYgyDtIEiT3M8WNJtLj0LViOfMcerOwRBPv343VUx56Sqn8ayWOBuToMlkaFFrFaJi7FHgB/xaxmV5L3VBnTlI7gtZRkolnT9CceyPQ91clXwtGTto+qLQME/26P813Fbq+vwFvVbY295II1uxQa49y9JmdknQYNzUov3XS2SenXs0VvH/XrLDLzgjPwoZ0DlNxecIXZ+pYjHhAPOFybPD8wEhH5AQi9cI5s3geuDRbRSav2CLN9KTXMzAUTovw==; 31:vJ3/sePPhogxSFHEKkqcsefGOr3BsT69dDOtjwL/zabiJQbPq3rtpDuluZyumsfixp1esKjblCwIqRXRxTqLO+7SK4EgBTukGiG52Sy3jcb3fDYDjjTSU24YYjvhvDPsaZ8p2BCC0h2ykj7Pw+BkC8paUvg4lh0Oma7y4bU5wEB+zZBpHAbZxvbtfReO5ElzoWM1iJZfqMUaOacO8sSt8w7HZtztRTpB0E97Tfc5CKw= X-MS-TrafficTypeDiagnostic: VI1PR0801MB1983: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:3tpVu3WdBnsWgUzG/0Q97NHsaXNIP8UMA+etbv2Ph8+OmSnv8/IpQu0oX8eqGal6TNQAW18FMC3dFnA3JU8W8h15HQaMMgITv/eBpTSIx36xmSRebX+d8+Feh/hn0K4+CazM11WZmtOmkbWywDUmNZd31QSt5YyTZTt7aqCgTBKscgWGaqD19V/8S0J99Pd9F9oulzOgG4jF+duv5zyJF7KnPCeX7UdXRHhSKAok5WHM97IyxOt048mHApFsHHs25zu00G9hEhegw7Ju3/x/Lu15jFQ9plp9a11OpK0Gln8U2RjqtC7rikmThV1HEBsJh6uGHDdGGND15DuWsAGNAUMtVvL20Csw+Xk9FzLm7gXV0BaWV/AwhjYeIHbSI1IZyrK58UVKZBXVDQKFX0eXwxGNa4iVcYF8ci8gh1Vq6L0=; 4:UCEb8dRNfM6jNm0Fa1OkUjFYmPoFetuw3Yf3dUnBJiNuPzJdZjjp1C9geoYomwx3ul+EESI/UZdgul60DjLMQLhT+sRFWJtiw/nFcI2XAp0TfnrukbbXHGtNTIlifWjCSNo8Mqkg8AVaNOr5C0E4YJMEIErqA1ni/P0UEkLcps8iaDZHo3l6a7CmaqHgTIg7y8bv4wBgASeh3TFIL71PFBNCBiTEXV3kObUJ73JqGAq0RuEdgNjKvrr1ceTdvjLt04kdzZJFkSS3l04WyuKCRw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(5005006)(8121501046)(3002001)(93006095)(93001095)(3231101)(2400082)(944501161)(10201501046)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(20161123562045)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0801MB1983; BCL:0; PCL:0; RULEID:; SRVR:VI1PR0801MB1983; X-Forefront-PRVS: 0575F81B58 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(1496009)(396003)(366004)(376002)(39380400002)(39850400004)(346002)(189003)(199004)(16586007)(53936002)(305945005)(54906003)(7736002)(3846002)(316002)(105586002)(2361001)(106356001)(2351001)(6116002)(1076002)(50226002)(8936002)(81156014)(5660300001)(8676002)(81166006)(7416002)(2950100002)(6666003)(6916009)(76176011)(575784001)(86362001)(68736007)(66066001)(16526019)(47776003)(50466002)(4326008)(97736004)(26005)(6512007)(51416003)(2906002)(52116002)(386003)(6506007)(59450400001)(48376002)(55236004)(36756003)(53416004)(69596002)(6486002)(478600001)(186003)(25786009)(217873001); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0801MB1983; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0801MB1983; 23:VUpObUO+lf34vay3rLmKDwtX5ppEIfII9wrzDdz?= 28p5X/2yvtZVIRmgPhHfT+o9moum/mcDHKEeWsfjsJIFhyPMefo3n05V1b08BjiHPTAOU4/mq1YkcsHpfK6UtaKqy1GzVl/W20f75KqKkpIB2Iq7u44c3e2s4FEnQxr6HEq1xWeJS9pofEtkiBFxnnimPNNKZpG0Kyb8Des3O+UnTt4S/WYRVIKu/vgUgDf0YH6a/lZVLZ1ULL7VC6aBBNXQyXgARb3TNhQa8lPBKLz1ifW39VQKmFo4vVqzZZGi8eA2aegxMbY7FfFnVUg9dOX3AcLxTfxtdTdaRWRiMPt3ACJ3WFiVQh8hzVyANV8QqFC8TPHjF5G/wMJ1SFiVZuiB8UZe2TUDpFNkTsHyCkVaXhfadNoYEJdF9kUn/+ZIRSAGy9ZPamq/xgA83z2kQ6gxWSW3iDEvvHYfWyY831z+fkZU4+uAGmHVZpdIidza44iyhnDY8ZoeTas8diMnTzorzN+O269lfmSA9PltkmUjhimb0x1iJ4lzCQtuX5kaLCcoXCjPSBvN9OTMs7pHEJvcYZvEykLZRJS7m4z55WwaCdxO2GXFXqVmSHd9yKD5qZlYYa9EeLigKwNTM1G1hLxDeUYDgke1qJYxOD3cgCYmyUhzFnqfrR4zv6FUz6Sd88BUwhDQAH1Ae+G/IjuH7dxrbLMBNjs8E+bx6x3EZR0MdyHHdpwJGtPXARaJXIw49CDXWvYnfGaMBK59qFiPDdh/K8a/Ducs0FgoP3BQAYrnRGvshVTemb8ZMxuktkfuoXWjYZ1W8KRZ+qVrMN3YRggIRCX7jv/5bnK9fWWjwC3hqeMehLvcJadWr8R1pqgU8qxHvuVTn14M+rGActhyAqO2l47/vWi+p6xZu1WyGop2+2jIO0vzeEY+amCnlGECmsIgVu1nlsZwMVLnwXUOMqn2wIfO7OZOjXuij0z9OoZyicdFHduy0bHYUwfCB9WMu42RsmzQmPyakuks/MNlg6YDFGDXUbKyBjVrmI8k7EvCS3kixPnnXTXOwSIuA18L/OVZNhSVgFA5+9OKK//ZyL1dy3IZGOD4y0LERI3Xsa8M8a3M9Cbhlc7M6m//Kwr5qFhcRxLhQGy5Led+ZUXdIMtyLEvyfgAGgH7GD4cGh5mJ4Q3lqVzwUvs9Qv43sM0E+mK9kHZPK2STrULqn8L0EC2vuLSchxrqm+7QDOXfaoPgEpNDICVaqDDdeh5p8dJ1WozSlSHiqNramrY/w+UEII1sTTD8llmHWL6VcKrg+NPPdiUYcsRvucaoMfcsvAarKW6FNCAsXlj5P6F+mksTUDCsJAZvpl2r1zEu6xi0kNNyF6A== X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 6:kMmbhkVvfORTkLzX1NEnTEwUhRmUx9Q0DFsw3wNmXU+vPWdchV+jGkiLb/O9FHPDxO+/laUpsIxSCke2xhG8s1HMu5UuKhicS2ReiwQXadK0D+S/SxEJACajXcq4YpjPNSWPCSKH+YQzZXwD8JRFIxdRek9PPwJnVpkhD4fVCbNK8MLVA6buQkDpLAav61GwkKGmLRMKbTfVG96LYx5BRB9PhtBEJ2bAXUoRvxPR2ThtJ4+nt8TDp22CVt0U/xYgQA0zUJGTL5vBdJ8hznmg28nHNs1QV1q+c/fEknUADgiKKdLxCrd6Pv+2bRimFk1RoytOWiTxsefGzLrs2CPmLzTHRDgKMbGy2QCYSZ6cyCo=; 5:wKMxPKg3/A4hOoRWqvc9d6afFDm8WbyWp5A39+PPFxeV3GFxs9jgSLFzAQVsoHAQRkr7TiuKFnGffE9RMC5f4IlC/NoKZF96AjFnmR4C2LC29Oy/v1v5nuiF4Pdi/stWOiMNxFL+H5x30UToi8l2oG03UUwY9u9UY+yWTXTbfrY=; 24:7WgcxtRe22wdeVqft4W6/09/wSsMykg2x5HfOAKbRys8OZErxSO3j7AsTznoedzRNbN4bol2SeEAsPsPCyZxUt/AFhaQuXAGSSmVe48H8As=; 7:yePA7LnhVGNUjjFJI0g4y7U4CU03DWXooZtix2B+tyIxhX0tMqtB6LL3FKi5ajmLQZTmweFpx8H5QxScuWv03e3ufpuffCbE5hqckoGbSr7NuOQj8QsHoeadqdRzRF3b8kpRLBZYFO0ByUcTBhHCpLCvJQAWZuNsVLArFV+arVyEcW7e/byfQZ4iPY9I0WE1u1AmjeQBhLre51fghiGhHl3LF1+jkNRhCCt0Z0yDZS3jJ5yPW939Sjop2Kh9yB/F SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0801MB1983; 20:dLC2PjiHY5GCpI7r4mk2xa6bwist49yQjHOejP1zUqzHhsQhVorIZ1C1TpsGZ4Ae1MPHnD3RWTZWbzQTo5/1txvQNPXrh+sypGK2SqHIc576w1JK/qHNQViH4QRCtGkOdMpSQpOyuEwX45cPDKOzuBnQRBUNTUKUM87HmU9Z2qo= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Feb 2018 20:32:06.1693 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e7424443-6fc5-4d6a-d8f3-08d56da0b159 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB1983 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.91 Subject: [Qemu-devel] [RFC PATCH 34/34] hv-net: define default rom file name X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ben Warren , Konrad Rzeszutek Wilk , Krish Sadhukhan , "Marcos E. Matsunaga" , Jan Dakinevich , Vadim Rozenfeld , "Denis V. Lunev" , si-wei liu , Paolo Bonzini , Vitaly Kuznetsov , Cathy Avery Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Roman Kagan --- hw/net/hv-net.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/net/hv-net.c b/hw/net/hv-net.c index 3d719458ea..b44ab20b0f 100644 --- a/hw/net/hv-net.c +++ b/hw/net/hv-net.c @@ -1423,6 +1423,7 @@ static void hv_net_class_init(ObjectClass *klass, void *data) vdc->num_channels = hv_net_num_channels; vdc->close_channel = hv_net_close_channel; vdc->chan_notify_cb = hv_net_notify_cb; + vdc->romfile = "efi-hyperv.rom"; } static void hv_net_instance_init(Object *obj)