From patchwork Wed Mar 7 21:28:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Swapnil Paratey X-Patchwork-Id: 10265367 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id B740A60247 for ; Wed, 7 Mar 2018 21:28:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AD0ED290D6 for ; Wed, 7 Mar 2018 21:28:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9FBAF29416; Wed, 7 Mar 2018 21:28:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DF085290D6 for ; Wed, 7 Mar 2018 21:28:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754696AbeCGV2k (ORCPT ); Wed, 7 Mar 2018 16:28:40 -0500 Received: from mail-bl2nam02on0066.outbound.protection.outlook.com ([104.47.38.66]:9024 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754389AbeCGV2j (ORCPT ); Wed, 7 Mar 2018 16:28:39 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=jH30YDsn7Hgs6amlUtRWP5QoO18oNmtoxg1ZnenC5Cc=; b=lywK4DHmCr8cEVIFvKSMeOj8dmi//CIkJCxVJz/D2d3+q05ho7vSuSOBqEJN2/16h2NJ60e846yILnvymfIVh2IYfV1Bx1oBE/COtv4oRETXpPLkGvaXOfINe9NSED2C3YY+xDYtWEckn2v73yvOEvnhwoAx8fGJyUZQew/reOo= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Swapnil.Paratey@amd.com; Received: from avocado-client.amd.com (165.204.77.1) by CY4PR12MB1862.namprd12.prod.outlook.com (2603:10b6:903:11f::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.548.13; Wed, 7 Mar 2018 21:28:36 +0000 From: Swapnil Paratey To: kvm@vger.kernel.org Cc: Swapnil Paratey Subject: [kvm-unit-tests PATCH 1/2] x86: SVM: Add tests for SVM msr bit settings combinations in MSR_EFER and MSR_VM_CR Date: Wed, 7 Mar 2018 15:28:24 -0600 Message-Id: <20180307212824.16557-1-Swapnil.Paratey@amd.com> X-Mailer: git-send-email 2.14.3 MIME-Version: 1.0 X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: DM5PR19CA0011.namprd19.prod.outlook.com (2603:10b6:3:151::21) To CY4PR12MB1862.namprd12.prod.outlook.com (2603:10b6:903:11f::23) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 94e04cb6-0eaa-49a4-cfd1-08d58472635f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:CY4PR12MB1862; X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1862; 3:Lg5bFpKhnIDffpAxCHwe+LMU1RnWbzmKMT4JCUPNgxdqpSN2AvnRGF6cmrtXy1LLGN5YOeIiIp4ERIQSO0VUv2qlwsQIdKS8dz1rFEz8KBiy/JwHeXt42yy0ttXNVRq4A+VbZrwQQEc7kUJl2fF0bwK4kJWIN/3wL0VP5bUJ5mULYLKJ1yEgK+Jopcc0IxhxjXgiSMb+EVdF7ON2u2OQaBRGKdh7Efb2lYFszIV49CIP1dFOKg+N2RyizuMZgEH5; 25:u8zqa7mBefj0qrfDkGjx4fNotPRbMF5TUJbrnCbn6JluT8yQBmQjPEGiuumF4L47qCKQZB+FyuixYJ17MWaA9sw69WkbpqE7DU+aRZE8dfTgLAKQOSyLwP65t/MjY11be+yRo0ILcmct025f+GGYC6NRAg+yRQZTIokqGtyREmqM67uKbX5JJxMAvKbwASK2kDaL14wiTT+J9IqgTdoHYpu1NQuZkxdXfoEtCc6rEoStcE7oxPwIHvCNt+FjmicdpukJQcgy26Ro5n5lchVWrjGLPgCYPbaE64fYoyL4+RWVclZV+HO4NYgq2IJfo/Z8pet/8fCWRXH4nB6yejVGFQ==; 31:U5i1gQ83NPW9Xd/3G6FiddrrbOKO8djX8SGrdF9KSx7vcRzEIf+g0zdJRIjC6daiqsQ9eVb3Tx778e6Nsh0GbyTpoK0traSqnP+gmkGnuMs2PQij5oaVfa/Li6yUD4qUeaWpip4pA5mxi9/sv/ZQ1oVj0kDxuQkfMhLuE+cI1rHnKAbplN+DoWXtWiao2zvQUsD3C53Yyr4PVOmzhXQJ5mo+F4RGFJM/iLV1N0zY44w= X-MS-TrafficTypeDiagnostic: CY4PR12MB1862: X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1862; 20:mXIv3rQ7ARF8xqIWAhvLBEkkWMRYUYh22aou9WjtcuVq3f92ggOvzxstoCMkBu1a2+tzuyc2IFPiZbQ1BK4Dadhbag7jR9/DYeLXnym5EmWAvraVgb39qvUkmhua0ATui2OknR+3O2LjZa74GKPr6ieG7fSaJZ826RNBcMcQ3AkV5SUHlCl3OT22KxQzoVpsoj7t8z3npyqzr2tpRphzAxdrsaqxWKzNelZByv/8bmszs4ZHt2uyN1QVN5dyLjkOaBIzjaBDH2nD0nbgPmqiwsDSwGv3FY2Isvgsf+2QW6IjF2BSfSmzxJYdf8YiAbYi/VvtacBjb8/FRUr5URF9+ISbkHTyZtZIEUoTMWfd7+1pkLY8BdxUeaMZ9qmuUU+O9qT5sP0/BCfUueYnfzGccFwiMnE17xj6TLZ6DbVSMZ4bhFD47iuL/8GeYQtwLEm01zRZqOWycHE6dgm9R8CBAA0ivUGz3E4apvcYxZYgKgFzEkvPoMsBpPKhcuKOdvSv; 4:PybkY6BezQeDq5MgzxMsG+Qn1Et4djaHi4wPSV5o/N2pfut3PV9ZpTTOLbmams2LuVqpVjltR/vtwbExmRWT5JxIbRdBqgbS7noccUJO3lYuOzbSPRsjoWnhzcU/toyXhuL0RgXpuG45faa/ubBRtkYPtHCYF8ERTVesVRudnog5pHbXjXmlmf30V9YUVmLcTdkp6RwmLEqHb1+hiCqUUBlZYiDfV7HlKOmWxH5pp9eX8O9UFeVZN6Q8Ddud2RApgzAtX4Xfs+GMYF/h78AIy4QqE1bhSuxBwGKu9Hz6MAFrScR+1H4yqOFTwaKnJLFl6crTf33DfGyX4Ti8DLoFsA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110)(788757137089); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040501)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3231220)(944501244)(52105095)(3002001)(6055026)(6041288)(20161123560045)(20161123564045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(6072148)(201708071742011); SRVR:CY4PR12MB1862; BCL:0; PCL:0; RULEID:; SRVR:CY4PR12MB1862; X-Forefront-PRVS: 0604AFA86B X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39380400002)(346002)(376002)(366004)(39860400002)(396003)(189003)(199004)(47776003)(72206003)(6486002)(66066001)(2351001)(106356001)(2361001)(305945005)(7736002)(86362001)(53416004)(105586002)(68736007)(53936002)(478600001)(97736004)(50226002)(81156014)(81166006)(51416003)(8676002)(8936002)(36756003)(16526019)(52116002)(7696005)(6916009)(4326008)(6666003)(1076002)(26005)(50466002)(5660300001)(48376002)(25786009)(16586007)(59450400001)(386003)(2906002)(6116002)(3846002)(186003)(316002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY4PR12MB1862; H:avocado-client.amd.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR12MB1862; 23:htZLf6eAxKuc9xNft3fcxBuSl5EOZ+gBoCxL5v3oq?= =?us-ascii?Q?vYzQByx7pRYxA7ecfV22ajgtKioFEh7+Mz4G19E0FDL4er1Tv3IEgl9b1goK?= =?us-ascii?Q?4oUaEmIFF76JNXnkfyipVFqaRaWZqMWfhs4ZyE1qqhfnpQlhfrr43r3Jfyhj?= =?us-ascii?Q?63yi9fXZm37d2NJRZCRwFwkkaqKPKWPLCQi8/8DHAa/6vC/b39jTD1lLQKxa?= =?us-ascii?Q?za9H8s4xliJ11reRS/34w3TIM2vv3bNGsiv5A5Ocsu7XLGlA+Pm7oA2xU1MO?= =?us-ascii?Q?mdyzz1ppxy8uwc++8Fy/66y0mJ3P0env+XYYoY8h27mzilGHLLfKYQwBHCjQ?= =?us-ascii?Q?8qRg20rJ8JrV46pwCka39cYlNexc250cwMFxeCXnzWLcMw/l4XCM8kR8TtXf?= =?us-ascii?Q?QlGQlVm74IefVxU5txPCHC37FzrC7nsVOtnFlcwAQHyQo1uDGwcYvYsWtSPl?= =?us-ascii?Q?a4DgbgSn/I75nxUyO51E809gsKJmNDrMR+poK51irJuWm8a2zaPeOaoGtXiw?= =?us-ascii?Q?z+kCumYZ+V2HyadesItF0Ej5nbnNVStF2hZIo4uxoxxMnmVRx4a2szQ+Fj7d?= =?us-ascii?Q?sNtfD52QWXtIZMGPX7o0i2QS9Wl5XtoDFl7J2ZINrkYRdTT0Xlq4niUE7d0A?= =?us-ascii?Q?Xs0bfoJINfzQN/3nSgRbMPmygmDGJxg7/7CdItU6txrrDWwjG2S/M4f1f2BV?= =?us-ascii?Q?9Rb2fSxO1yi92eq+eco/+a5CRr9PIxkVzx3KfdR5SHbpKfQ0YXUxwSkLiWWU?= =?us-ascii?Q?vvsVj5YwdKiFDqUiSXsfvPGm88CwXftODg748I4hu5KsTjcZILfpeuqE1w/e?= =?us-ascii?Q?V53RSTdcnr01Ykeu5EU7jWSoboFUTwcEc/Z1bFUZapDozUjF7gGKcH9Ohy/L?= =?us-ascii?Q?mrUjjUE8gQYYkoFh3REB98tXmEZomJm5AxW2eHrgbtE8bu/CqdZzLByG/xgh?= =?us-ascii?Q?TuqR9Y8Gyjhl1JtpAjOU5P0zD8tWL6TULc9WtqwgOA88CtJk3hOoMCa0IAEj?= =?us-ascii?Q?TXoLoo+8vgGJj+/goVMeXzgZ/8uMgJVBdTQdzcJ01uGaMxN1+7EJtlSoUITn?= =?us-ascii?Q?tMEivbpa94KJEBUui+YXDK2EZqqOUxxAL6sSmu8kRQSCx4zhOcrVaca4Ke8W?= =?us-ascii?Q?zW69kr7KCom6mu9pxyCXjLB4tt/NxGtndtReqC18zKiUU/Fx2DJKw=3D=3D?= X-Microsoft-Antispam-Message-Info: l9Y9ZzxgP3xW6NGhU4GsybztKtxayp4FNoUtqoxYV7piERdZ/o3y2z3cGIOHRoldzqnZKzYkMhkbk0g7PK0MbQXH9bmbSzjT9htpSdRMRVY1K9HOYegBUNBuOzQda6QF2pgA6f6fU7OU5Av6U8e8F8xscww2Xcmm8GwOicA0PZNBex2KRkjd+sq4I3FTb979 X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1862; 6:0lmet2JuEBQMGcBJuqIgLWnHIrYyeqkPH8qFgfmjDUgVnb8UCmlPSw2XzrKFzgM19Z6qsvh7Ds/NBrX68aa0uDQMtfa+qQNJ74KLcaFsfV1m3TaVolPQ3ZoIP0MmgTriIR0VOhid+iyUQ/7YdlAb39MOoaOCfCQ6TKVKCuhIEyF0M08LY8iEBSgEe/eTNk2qAHk8fWu/vj9t84rPnf/ZKvxjiB0K/84Cc+b9zr60xYu6uGClAIM8VKjcw/Nzvn8c4FpziHjz0USkzxEstwMOdj4LrsnUwfkMcNtJSg41rA/eygpjMOJTWR0QSV9XxxInjL0wqwrJYLopPf71hEwG1IECYztAtMgUhCPAqhm+e4g=; 5:0jUMJK/6ApBg40QNlxWu4WN0Ee5Oitb+8e9iMEv0y30n4CwDhfYPFE0M/L8S8QP6so1qMC1icHTjuE/ss681RJ1Lm6YeffDM7KE4BQN/VATzF5T7Q6aVnM7kxuC1A5ZjDtNecXhqDS5OzJOrundBYWN3pbfGYG72qRbYmkYGeW0=; 24:/FKV4S5GIxZfyT2frbsX8LrCozmv3WJE7ihn+1RwftOlOdzYc7YBFJbVumU0nuN91VsQ6S9UKlnKEH/J887TZ+EFsMY61LX6dSmE8pMHaZ8=; 7:YxfP3OeqWeqo7OGIg9sRqUFDVNUO0RKJiqSxV2VzyOY5V1LOdaa9hQ9NU3AnlAT4m7YFlyk+83Ik3cDQgMdA7WwMiXW/m1a3GdTYCX6MVVT5AXiZUMo5gQrkE5ZeODjlARuvZGSQfgVkjFkH1QZrAPxILjRcsXH08tYOs5qYey1lEGQZckXlY1dHrdV0sVw1v/rUbEikmcw8MWA5v5srRiMxgn1nHLnP7ZNdDKa+NBStEy7ZtbxRxPHmKE8qjAHV SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY4PR12MB1862; 20:JQgyO12GBYERbVvINrtyx+kfFI7cViGnRqJr2Ojrnvgmx4/z2G8MQGhad+geCoPR29kqwcymFGz953/aQni/xoOtGxwGL+ja8JOxKttB0y1kNUYBpHg2djZa0LLFIQJxJmiLABIXZ6KT4h/cDd2cTrWEtoP3O7FP3G9+dC/ET1tfiyM167KTLVylwVx2/vOZn8W/OnGnIZPVUk45YEtUJnuRXhMmNNey8uzSzbHufknxNE09ftl2AdcNbptPd4Rh X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Mar 2018 21:28:36.9592 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 94e04cb6-0eaa-49a4-cfd1-08d58472635f X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR12MB1862 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Swapnil Paratey 1) Exercise the SVM rules for the various bit settings of the controlling SVM MSRs 2) Spelling correction of "available" --- x86/svm.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++- x86/unittests.cfg | 5 +++ 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/x86/svm.c b/x86/svm.c index 162632c..b71178a 100644 --- a/x86/svm.c +++ b/x86/svm.c @@ -40,6 +40,8 @@ u64 runs; u8 *io_bitmap; u8 io_bitmap_area[16384]; +static int matched; + static bool npt_supported(void) { return cpuid(0x8000000A).d & 1; @@ -1008,6 +1010,85 @@ static bool lat_svm_insn_check(struct test *test) latclgi_min, clgi_sum / LATENCY_RUNS); return true; } + +static void set_msr_vm_cr(void *data) +{ + u64 msr_value; + msr_value = *((u64 *)(data)); + wrmsr(MSR_VM_CR, msr_value); +} + +static void set_msr_efer(void *data) +{ + u64 msr_value; + msr_value = *((u64 *)(data)); + wrmsr(MSR_EFER, msr_value); +} + +static void test_svm_virtual_machine_control() +{ + bool svm_enabled, svme_disabled; + u64 msr_value; + + svm_enabled = ((rdmsr(MSR_EFER) & 0x1000) == 0x1000); + svme_disabled = ((rdmsr(MSR_VM_CR) & 0x10) == 0x10); + + if(svm_enabled == false) { + wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_SVME); + report("test enable SVM if EFER_SVME bit is disabled", + ((rdmsr(MSR_EFER) & EFER_SVME) == EFER_SVME)); + } + + if(svme_disabled == true) { + report("test MSR_VM_CR SVMe Disable bit is set", svme_disabled); + return ; + } + + /* Test MSR_VM_CR bit-sets when EFER_SVME bit is set */ + msr_value = 0x00; + report("test MSR_VM_CR reset when EFER_SVME bit is set - no #GP", + !test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + msr_value = 0x10; + report("test MSR_VM_CR SVMeDisable bit set when EFER_SVME bit is set - #GP", + test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + msr_value = 0x08; + report("test MSR_VM_CR control lock bit set when EFER_SVME set - #GP", + test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + msr_value = 0x00; + report("test MSR_VM_CR reset when EFER_SVME bit is set - #GP", + test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + + /* MSR_VM_CR SVMe Disable bit once set does not unset - cannot be cleared on KVM + * Host behavior is different than KVM behavior - host allows setting VM_CR_SVMEDIS on EFER_SVME being unset + * If there's no BIOS lock bit set, and no SVM Key, the VMCR can be cleared on the host + * KVM implements a soft-lock without implementing the SVM Key though + * KVM/SVM does not implement lock bits and gives #GP for reset instead */ + + /* Clear the EFER_SVME and test for #GP on VM_CR_SVMEDIS bit sets */ + msr_value = rdmsr(MSR_EFER); + msr_value &= ~EFER_SVME; + wrmsr(MSR_EFER, msr_value); + + msr_value = 0x00; + report("test MSR_VM_CR reset when EFER_SVME bit is clear - no #GP", + !test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + msr_value = 0x10; + report("test MSR_VM_CR SVMeDis bit set when EFER_SVME bit clear - no #GP", + !test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + msr_value = 0x08; + report("test MSR_VM_CR control lock bit set when EFER_SVME clear - no #GP", + !test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + msr_value = 0x00; + report("test MSR_VM_CR reset when EFER_SVME bit is clear - no #GP", + !test_for_exception(GP_VECTOR, &set_msr_vm_cr, (void*)(&msr_value))); + + /* VM_CR_SVMEDIS is set at this point, test EFER #GP behaviors */ + msr_value = 0x1000; + report("test Setting EFER_SVME bit when VM_CR_SVMEDIS is set - #GP", + test_for_exception(GP_VECTOR, &set_msr_efer, (void*)(&msr_value))); +} + + static struct test tests[] = { { "null", default_supported, default_prepare, null_test, default_finished, null_check }, @@ -1054,7 +1135,42 @@ static struct test tests[] = { lat_svm_insn_finished, lat_svm_insn_check }, }; -int main(int ac, char **av) +static bool test_wanted(const char *name, const char *filters[], int filter_count) +{ + int i; + bool positive = false; + bool match = false; + char clean_name[strlen(name) + 1]; + char *c; + const char *n; + + /* Replace spaces with underscores. */ + n = name; + c = &clean_name[0]; + do *c++ = (*n == ' ') ? '_' : *n; + while (*n++); + + for (i = 0; i < filter_count; i++) { + const char *filter = filters[i]; + + if (filter[0] == '-') { + if (simple_glob(clean_name, filter + 1)) + return false; + } else { + positive = true; + match |= simple_glob(clean_name, filter); + } + } + + if (!positive || match) { + matched++; + return true; + } else { + return false; + } +} + +int main(int ac, const char **av) { int i, nr; struct vmcb *vmcb; @@ -1063,12 +1179,17 @@ int main(int ac, char **av) smp_init(); if (!(cpuid(0x80000001).c & 4)) { - printf("SVM not availble\n"); + printf("SVM not available\n"); return report_summary(); } setup_svm(); + if(test_wanted("test_svm_virtual_machine_control", av, ac)) { + test_svm_virtual_machine_control(); + return report_summary(); + } + vmcb = alloc_page(); nr = ARRAY_SIZE(tests); diff --git a/x86/unittests.cfg b/x86/unittests.cfg index 22c62d5..19407af 100644 --- a/x86/unittests.cfg +++ b/x86/unittests.cfg @@ -194,6 +194,11 @@ smp = 2 extra_params = -cpu qemu64,+svm arch = x86_64 +[svm_test_virtual_machine_control] +file = svm.flat +extra_params = -cpu host,+svm -append test_svm_virtual_machine_control +arch = x86_64 + [taskswitch] file = taskswitch.flat arch = i386