From patchwork Sun Oct 31 05:56:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zixuan Wang X-Patchwork-Id: 12594949 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 412BAC433F5 for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 0EB0B60EBB for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229877AbhJaF7L (ORCPT ); Sun, 31 Oct 2021 01:59:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52838 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229851AbhJaF7K (ORCPT ); Sun, 31 Oct 2021 01:59:10 -0400 Received: from mail-pf1-x42b.google.com (mail-pf1-x42b.google.com [IPv6:2607:f8b0:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7A6E6C061570 for ; Sat, 30 Oct 2021 22:56:39 -0700 (PDT) Received: by mail-pf1-x42b.google.com with SMTP id g11so1919658pfv.7 for ; Sat, 30 Oct 2021 22:56:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=NWDKpsQFk5mN1jQnrTsnd6C8/vgl4oVD+4bLDzSVTA4=; b=JSsw0ms06SHHSeKWgvkZWXXDzdj5SVZCpQJ/TFP2CZZyk6yEb5zK0Z8HJ+KjWAt5BA 2P1LYDKXl7yCpoyG6jnXeiCU1G+hYzW8Rte3UeMuEE3rf4pOEfLQ7F6bMb8Lx/Htpv+W 1oDwtMxvm+q9XQkuwHTKEjbV4eOvDJJ15Y1xSUTi5C+NdO7AV8m9CNyy9JHVJLbmJECF hIUcmYepUmlyz3pwxQjGjX/TUDq7hKtbD6rrSp+PTdNt9bPDHob3FPogq8xeles0npCN mYs9oY8ojs0O+hLPQqMO8m4d2X1tks2pc8klcgVL4ygtlUvQA2W0NVFoIb7nTHCgJRjg GZbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=NWDKpsQFk5mN1jQnrTsnd6C8/vgl4oVD+4bLDzSVTA4=; b=v3ThcnaOWrsuh/VfC78xDO2cNlug39cevrRWSfVpuIrpNMcnZ3If1UfrZnXFAiVY42 Fdyru91BfECw1SvtS6XDuvrXCrbeHxL5gSp6CEf8NALjK6dhElV/Ve91ffwjdyrQ94G/ CMNdQKdJ63RilcXjSXF7OnFLyAKemc1+MS5vRm8kV6FB+aTuo07ckw5hg/ia40Cgf/bi PYvHZGMY67g4vvjsGvjV2XFR2WYRBzEtBrPG+EPVCgt2Bv5N+EwpTccoFmpSWTVv1D+N vMT0msUMtlfMeNkuMhFlKVoEE36mB55bQUv5RFiHm5fWgpwUTZkIt60Dotg0zzw3fCy4 hNmw== X-Gm-Message-State: AOAM533OpeXTdQzAMAyybO80rmHLBHP7Hpj/Sz8FIWKd5iF6DrbckW04 49MWjVqSMWEbur7biu4wwuoZKBIXSpRUtQ== X-Google-Smtp-Source: ABdhPJz0kW32yXobgsRM1QEeGYMt3MP5wp24vI+FYz2meZEpmDb6mzxeNiMnJGy7Cuti85ZacCOvyw== X-Received: by 2002:a63:f11:: with SMTP id e17mr2640996pgl.448.1635659798658; Sat, 30 Oct 2021 22:56:38 -0700 (PDT) Received: from localhost.localdomain (netadmin.ucsd.edu. [137.110.160.224]) by smtp.gmail.com with ESMTPSA id j19sm11403179pfj.127.2021.10.30.22.56.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Oct 2021 22:56:38 -0700 (PDT) From: Zixuan Wang To: kvm@vger.kernel.org, pbonzini@redhat.com, drjones@redhat.com Cc: marcorr@google.com, erdemaktas@google.com, rientjes@google.com, seanjc@google.com, brijesh.singh@amd.com, Thomas.Lendacky@amd.com, varad.gautam@suse.com, jroedel@suse.de, bp@suse.de Subject: [kvm-unit-tests PATCH v1 1/7] x86 UEFI: Remove mixed_mode Date: Sat, 30 Oct 2021 22:56:28 -0700 Message-Id: <20211031055634.894263-2-zxwang42@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211031055634.894263-1-zxwang42@gmail.com> References: <20211031055634.894263-1-zxwang42@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Zixuan Wang Remove the mixed_mode code from efi.h as we are not supporting i386 UEFI for now. Signed-off-by: Zixuan Wang --- lib/linux/efi.h | 317 +++++++++++++++--------------------------------- 1 file changed, 100 insertions(+), 217 deletions(-) diff --git a/lib/linux/efi.h b/lib/linux/efi.h index 7ac1082..455625a 100644 --- a/lib/linux/efi.h +++ b/lib/linux/efi.h @@ -62,15 +62,7 @@ typedef guid_t efi_guid_t; typedef struct { efi_guid_t guid; - u32 table; -} efi_config_table_32_t; - -typedef union { - struct { - efi_guid_t guid; - void *table; - }; - efi_config_table_32_t mixed_mode; + void *table; } efi_config_table_t; /* @@ -251,127 +243,76 @@ typedef struct efi_generic_dev_path efi_device_path_protocol_t; /* * EFI Boot Services table */ -union efi_boot_services { - struct { - efi_table_hdr_t hdr; - void *raise_tpl; - void *restore_tpl; - efi_status_t (__efiapi *allocate_pages)(int, int, unsigned long, - efi_physical_addr_t *); - efi_status_t (__efiapi *free_pages)(efi_physical_addr_t, - unsigned long); - efi_status_t (__efiapi *get_memory_map)(unsigned long *, void *, - unsigned long *, - unsigned long *, u32 *); - efi_status_t (__efiapi *allocate_pool)(int, unsigned long, - void **); - efi_status_t (__efiapi *free_pool)(void *); - efi_status_t (__efiapi *create_event)(u32, unsigned long, - efi_event_notify_t, void *, - efi_event_t *); - efi_status_t (__efiapi *set_timer)(efi_event_t, - EFI_TIMER_DELAY, u64); - efi_status_t (__efiapi *wait_for_event)(unsigned long, - efi_event_t *, - unsigned long *); - void *signal_event; - efi_status_t (__efiapi *close_event)(efi_event_t); - void *check_event; - void *install_protocol_interface; - void *reinstall_protocol_interface; - void *uninstall_protocol_interface; - efi_status_t (__efiapi *handle_protocol)(efi_handle_t, - efi_guid_t *, void **); - void *__reserved; - void *register_protocol_notify; - efi_status_t (__efiapi *locate_handle)(int, efi_guid_t *, - void *, unsigned long *, - efi_handle_t *); - efi_status_t (__efiapi *locate_device_path)(efi_guid_t *, - efi_device_path_protocol_t **, - efi_handle_t *); - efi_status_t (__efiapi *install_configuration_table)(efi_guid_t *, - void *); - void *load_image; - void *start_image; - efi_status_t (__efiapi *exit)(efi_handle_t, - efi_status_t, - unsigned long, - efi_char16_t *); - void *unload_image; - efi_status_t (__efiapi *exit_boot_services)(efi_handle_t, - unsigned long); - void *get_next_monotonic_count; - efi_status_t (__efiapi *stall)(unsigned long); - void *set_watchdog_timer; - void *connect_controller; - efi_status_t (__efiapi *disconnect_controller)(efi_handle_t, - efi_handle_t, - efi_handle_t); - void *open_protocol; - void *close_protocol; - void *open_protocol_information; - void *protocols_per_handle; - void *locate_handle_buffer; - efi_status_t (__efiapi *locate_protocol)(efi_guid_t *, void *, - void **); - void *install_multiple_protocol_interfaces; - void *uninstall_multiple_protocol_interfaces; - void *calculate_crc32; - void *copy_mem; - void *set_mem; - void *create_event_ex; - }; - struct { - efi_table_hdr_t hdr; - u32 raise_tpl; - u32 restore_tpl; - u32 allocate_pages; - u32 free_pages; - u32 get_memory_map; - u32 allocate_pool; - u32 free_pool; - u32 create_event; - u32 set_timer; - u32 wait_for_event; - u32 signal_event; - u32 close_event; - u32 check_event; - u32 install_protocol_interface; - u32 reinstall_protocol_interface; - u32 uninstall_protocol_interface; - u32 handle_protocol; - u32 __reserved; - u32 register_protocol_notify; - u32 locate_handle; - u32 locate_device_path; - u32 install_configuration_table; - u32 load_image; - u32 start_image; - u32 exit; - u32 unload_image; - u32 exit_boot_services; - u32 get_next_monotonic_count; - u32 stall; - u32 set_watchdog_timer; - u32 connect_controller; - u32 disconnect_controller; - u32 open_protocol; - u32 close_protocol; - u32 open_protocol_information; - u32 protocols_per_handle; - u32 locate_handle_buffer; - u32 locate_protocol; - u32 install_multiple_protocol_interfaces; - u32 uninstall_multiple_protocol_interfaces; - u32 calculate_crc32; - u32 copy_mem; - u32 set_mem; - u32 create_event_ex; - } mixed_mode; -}; - -typedef union efi_boot_services efi_boot_services_t; +typedef struct { + efi_table_hdr_t hdr; + void *raise_tpl; + void *restore_tpl; + efi_status_t(__efiapi *allocate_pages)(int, int, unsigned long, + efi_physical_addr_t *); + efi_status_t(__efiapi *free_pages)(efi_physical_addr_t, + unsigned long); + efi_status_t(__efiapi *get_memory_map)(unsigned long *, void *, + unsigned long *, + unsigned long *, u32 *); + efi_status_t(__efiapi *allocate_pool)(int, unsigned long, + void **); + efi_status_t(__efiapi *free_pool)(void *); + efi_status_t(__efiapi *create_event)(u32, unsigned long, + efi_event_notify_t, void *, + efi_event_t *); + efi_status_t(__efiapi *set_timer)(efi_event_t, + EFI_TIMER_DELAY, u64); + efi_status_t(__efiapi *wait_for_event)(unsigned long, + efi_event_t *, + unsigned long *); + void *signal_event; + efi_status_t(__efiapi *close_event)(efi_event_t); + void *check_event; + void *install_protocol_interface; + void *reinstall_protocol_interface; + void *uninstall_protocol_interface; + efi_status_t(__efiapi *handle_protocol)(efi_handle_t, + efi_guid_t *, void **); + void *__reserved; + void *register_protocol_notify; + efi_status_t(__efiapi *locate_handle)(int, efi_guid_t *, + void *, unsigned long *, + efi_handle_t *); + efi_status_t(__efiapi *locate_device_path)(efi_guid_t *, + efi_device_path_protocol_t **, + efi_handle_t *); + efi_status_t(__efiapi *install_configuration_table)(efi_guid_t *, + void *); + void *load_image; + void *start_image; + efi_status_t(__efiapi *exit)(efi_handle_t, + efi_status_t, + unsigned long, + efi_char16_t *); + void *unload_image; + efi_status_t(__efiapi *exit_boot_services)(efi_handle_t, + unsigned long); + void *get_next_monotonic_count; + efi_status_t(__efiapi *stall)(unsigned long); + void *set_watchdog_timer; + void *connect_controller; + efi_status_t(__efiapi *disconnect_controller)(efi_handle_t, + efi_handle_t, + efi_handle_t); + void *open_protocol; + void *close_protocol; + void *open_protocol_information; + void *protocols_per_handle; + void *locate_handle_buffer; + efi_status_t(__efiapi *locate_protocol)(efi_guid_t *, void *, + void **); + void *install_multiple_protocol_interfaces; + void *uninstall_multiple_protocol_interfaces; + void *calculate_crc32; + void *copy_mem; + void *set_mem; + void *create_event_ex; +} efi_boot_services_t; /* * Types and defines for EFI ResetSystem @@ -386,24 +327,6 @@ typedef union efi_boot_services efi_boot_services_t; #define EFI_RUNTIME_SERVICES_SIGNATURE ((u64)0x5652453544e5552ULL) #define EFI_RUNTIME_SERVICES_REVISION 0x00010000 -typedef struct { - efi_table_hdr_t hdr; - u32 get_time; - u32 set_time; - u32 get_wakeup_time; - u32 set_wakeup_time; - u32 set_virtual_address_map; - u32 convert_pointer; - u32 get_variable; - u32 get_next_variable; - u32 set_variable; - u32 get_next_high_mono_count; - u32 reset_system; - u32 update_capsule; - u32 query_capsule_caps; - u32 query_variable_info; -} efi_runtime_services_32_t; - typedef efi_status_t efi_get_time_t (efi_time_t *tm, efi_time_cap_t *tc); typedef efi_status_t efi_set_time_t (efi_time_t *tm); typedef efi_status_t efi_get_wakeup_time_t (efi_bool_t *enabled, efi_bool_t *pending, @@ -438,25 +361,22 @@ typedef efi_status_t efi_query_variable_store_t(u32 attributes, unsigned long size, bool nonblocking); -typedef union { - struct { - efi_table_hdr_t hdr; - efi_get_time_t __efiapi *get_time; - efi_set_time_t __efiapi *set_time; - efi_get_wakeup_time_t __efiapi *get_wakeup_time; - efi_set_wakeup_time_t __efiapi *set_wakeup_time; - efi_set_virtual_address_map_t __efiapi *set_virtual_address_map; - void *convert_pointer; - efi_get_variable_t __efiapi *get_variable; - efi_get_next_variable_t __efiapi *get_next_variable; - efi_set_variable_t __efiapi *set_variable; - efi_get_next_high_mono_count_t __efiapi *get_next_high_mono_count; - efi_reset_system_t __efiapi *reset_system; - efi_update_capsule_t __efiapi *update_capsule; - efi_query_capsule_caps_t __efiapi *query_capsule_caps; - efi_query_variable_info_t __efiapi *query_variable_info; - }; - efi_runtime_services_32_t mixed_mode; +typedef struct { + efi_table_hdr_t hdr; + efi_get_time_t __efiapi *get_time; + efi_set_time_t __efiapi *set_time; + efi_get_wakeup_time_t __efiapi *get_wakeup_time; + efi_set_wakeup_time_t __efiapi *set_wakeup_time; + efi_set_virtual_address_map_t __efiapi *set_virtual_address_map; + void *convert_pointer; + efi_get_variable_t __efiapi *get_variable; + efi_get_next_variable_t __efiapi *get_next_variable; + efi_set_variable_t __efiapi *set_variable; + efi_get_next_high_mono_count_t __efiapi *get_next_high_mono_count; + efi_reset_system_t __efiapi *reset_system; + efi_update_capsule_t __efiapi *update_capsule; + efi_query_capsule_caps_t __efiapi *query_capsule_caps; + efi_query_variable_info_t __efiapi *query_variable_info; } efi_runtime_services_t; #define EFI_SYSTEM_TABLE_SIGNATURE ((u64)0x5453595320494249ULL) @@ -468,60 +388,23 @@ typedef union { #define EFI_1_10_SYSTEM_TABLE_REVISION ((1 << 16) | (10)) #define EFI_1_02_SYSTEM_TABLE_REVISION ((1 << 16) | (02)) -typedef struct { - efi_table_hdr_t hdr; - u64 fw_vendor; /* physical addr of CHAR16 vendor string */ - u32 fw_revision; - u32 __pad1; - u64 con_in_handle; - u64 con_in; - u64 con_out_handle; - u64 con_out; - u64 stderr_handle; - u64 stderr; - u64 runtime; - u64 boottime; - u32 nr_tables; - u32 __pad2; - u64 tables; -} efi_system_table_64_t; +typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; +typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; typedef struct { efi_table_hdr_t hdr; - u32 fw_vendor; /* physical addr of CHAR16 vendor string */ + unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ u32 fw_revision; - u32 con_in_handle; - u32 con_in; - u32 con_out_handle; - u32 con_out; - u32 stderr_handle; - u32 stderr; - u32 runtime; - u32 boottime; - u32 nr_tables; - u32 tables; -} efi_system_table_32_t; - -typedef union efi_simple_text_input_protocol efi_simple_text_input_protocol_t; -typedef union efi_simple_text_output_protocol efi_simple_text_output_protocol_t; - -typedef union { - struct { - efi_table_hdr_t hdr; - unsigned long fw_vendor; /* physical addr of CHAR16 vendor string */ - u32 fw_revision; - unsigned long con_in_handle; - efi_simple_text_input_protocol_t *con_in; - unsigned long con_out_handle; - efi_simple_text_output_protocol_t *con_out; - unsigned long stderr_handle; - unsigned long stderr; - efi_runtime_services_t *runtime; - efi_boot_services_t *boottime; - unsigned long nr_tables; - unsigned long tables; - }; - efi_system_table_32_t mixed_mode; + unsigned long con_in_handle; + efi_simple_text_input_protocol_t *con_in; + unsigned long con_out_handle; + efi_simple_text_output_protocol_t *con_out; + unsigned long stderr_handle; + unsigned long stderr; + efi_runtime_services_t *runtime; + efi_boot_services_t *boottime; + unsigned long nr_tables; + unsigned long tables; } efi_system_table_t; struct efi_boot_memmap { From patchwork Sun Oct 31 05:56:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zixuan Wang X-Patchwork-Id: 12594951 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4CB27C433EF for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2711460F4A for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229945AbhJaF7N (ORCPT ); Sun, 31 Oct 2021 01:59:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52848 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229851AbhJaF7M (ORCPT ); Sun, 31 Oct 2021 01:59:12 -0400 Received: from mail-pg1-x532.google.com (mail-pg1-x532.google.com [IPv6:2607:f8b0:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1FCDCC061570 for ; Sat, 30 Oct 2021 22:56:41 -0700 (PDT) Received: by mail-pg1-x532.google.com with SMTP id m21so14077850pgu.13 for ; Sat, 30 Oct 2021 22:56:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=3D97zzbRhx50B9t+KHBT6Rfou057pYqpsgXTZNmmL2Q=; b=OLjLxsupgr1lisX8eIyWTJICGMf9XtnbC04jm66olJktBl74sNSJf+HzGk/JDyWSFm s57iymHolC/ashRWoMR0C8Drm7fSqg4AAjZtJTUIQR7lOeH6ayuqKI2dTi9i9MLTenzv +ZetMO/DtZw4aPKKdPhX+LzkMMEhK4621JYHnQANVko81V8/KW9B9pYppbo2UOcdiUsa 51EeNu+aFyjWKdxapU6GjczKJ2W5TCZrvLpPug2YBAMl7XLSNKwOr2WCl9pzDxuNVLmg vl04z9xlvLpnwKKBx3djjnCK9D8yvQYiOsvsSjlQO1BSaJCFqMm3yXCCFtkDkDjwRKW9 tkJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=3D97zzbRhx50B9t+KHBT6Rfou057pYqpsgXTZNmmL2Q=; b=kFO1sv3egEyQwsO4KUv1i24O3TZqVCqowy6HQgcGWJw4PN/f2av44X6hznkDVXGe9t CMmuh/i1663PMQh91YTGTa9mJdP9sLxllp/H9CrE7Xhs5Lzwpy5TnPwTtYfsNhdVhOQL 7kpG2Ltihhl67qhPgayyzU/2Q0DbRB8/xi2gpmwnmfCqcqrAO61CLPTmDHDv9adv0iqC p5d6M0S68pQbYV/e6/VxI4d4i6UfCFfAMU0umzrjQef15ISeNAN0vGkfh0oS6479z6oz PLGu6YDvdGxSMghiQSP1rZZ34ChsMC9SY+9uINVTp6ib9m0cFunuCq0PpUgHggWl7sW6 7KtA== X-Gm-Message-State: AOAM5311kNPE7wNlOoIACJNv18fWwIs8v3YfnczkFs0+rhDvwVfDRp31 +bwCdMNKRhxM/ZjqjTL2+rBNjORE/NMpNA== X-Google-Smtp-Source: ABdhPJya9OXLr1Rzx23+ZSUXNnK2CEHpZ+2Rdg2nFjW9FK+thUTgjr2DXtLj7da3kJQzvFvDkEtbVg== X-Received: by 2002:a63:2248:: with SMTP id t8mr5633610pgm.223.1635659800110; Sat, 30 Oct 2021 22:56:40 -0700 (PDT) Received: from localhost.localdomain (netadmin.ucsd.edu. [137.110.160.224]) by smtp.gmail.com with ESMTPSA id j19sm11403179pfj.127.2021.10.30.22.56.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Oct 2021 22:56:39 -0700 (PDT) From: Zixuan Wang To: kvm@vger.kernel.org, pbonzini@redhat.com, drjones@redhat.com Cc: marcorr@google.com, erdemaktas@google.com, rientjes@google.com, seanjc@google.com, brijesh.singh@amd.com, Thomas.Lendacky@amd.com, varad.gautam@suse.com, jroedel@suse.de, bp@suse.de Subject: [kvm-unit-tests PATCH v1 2/7] x86 UEFI: Refactor set up process Date: Sat, 30 Oct 2021 22:56:29 -0700 Message-Id: <20211031055634.894263-3-zxwang42@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211031055634.894263-1-zxwang42@gmail.com> References: <20211031055634.894263-1-zxwang42@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Zixuan Wang Refactor the EFI set up process. The previous set up process calls multiple arch-specific functions, now it's simplified to call only one arch-specific function: 1. (Arch neutral ) Extract EFI data structures, e.g., memory maps 2. (Arch neutral ) Exit EFI boot services 3. (Arch specific) Parse EFI data structures and set up arch-specific resources 4. (Arch neutral ) Run test cases' main functions Signed-off-by: Zixuan Wang --- lib/efi.c | 50 ++++++++++++--- lib/efi.h | 19 ++++-- lib/x86/acpi.c | 36 ++++++----- lib/x86/acpi.h | 5 +- lib/x86/asm/setup.h | 16 +---- lib/x86/setup.c | 153 +++++++++++++++++++++----------------------- 6 files changed, 149 insertions(+), 130 deletions(-) diff --git a/lib/efi.c b/lib/efi.c index 9506830..99eb00c 100644 --- a/lib/efi.c +++ b/lib/efi.c @@ -65,9 +65,9 @@ out: return status; } -efi_status_t efi_exit_boot_services(void *handle, unsigned long mapkey) +efi_status_t efi_exit_boot_services(void *handle, struct efi_boot_memmap *map) { - return efi_bs_call(exit_boot_services, handle, mapkey); + return efi_bs_call(exit_boot_services, handle, *map->key_ptr); } efi_status_t efi_get_system_config_table(efi_guid_t table_guid, void **table) @@ -88,31 +88,61 @@ efi_status_t efi_get_system_config_table(efi_guid_t table_guid, void **table) efi_status_t efi_main(efi_handle_t handle, efi_system_table_t *sys_tab) { int ret; - unsigned long mapkey = 0; efi_status_t status; efi_bootinfo_t efi_bootinfo; efi_system_table = sys_tab; - setup_efi_bootinfo(&efi_bootinfo); - status = setup_efi_pre_boot(&mapkey, &efi_bootinfo); + /* Memory map struct values */ + efi_memory_desc_t *map = NULL; + unsigned long map_size = 0, desc_size = 0, key = 0, buff_size = 0; + u32 desc_ver; + + /* Set up efi_bootinfo */ + efi_bootinfo.mem_map.map = ↦ + efi_bootinfo.mem_map.map_size = &map_size; + efi_bootinfo.mem_map.desc_size = &desc_size; + efi_bootinfo.mem_map.desc_ver = &desc_ver; + efi_bootinfo.mem_map.key_ptr = &key; + efi_bootinfo.mem_map.buff_size = &buff_size; + + /* Get EFI memory map */ + status = efi_get_memory_map(&efi_bootinfo.mem_map); if (status != EFI_SUCCESS) { - printf("Failed to set up before ExitBootServices, exiting.\n"); - return status; + printf("Failed to get memory map\n"); + goto efi_main_error; } - status = efi_exit_boot_services(handle, mapkey); + /* + * Exit EFI boot services, let kvm-unit-tests take full control of the + * guest + */ + status = efi_exit_boot_services(handle, &efi_bootinfo.mem_map); if (status != EFI_SUCCESS) { printf("Failed to exit boot services\n"); - return status; + goto efi_main_error; } - setup_efi(&efi_bootinfo); + /* Set up arch-specific resources */ + status = setup_efi(&efi_bootinfo); + if (status != EFI_SUCCESS) { + printf("Failed to set up arch-specific resources\n"); + goto efi_main_error; + } + + /* Run the test case */ ret = main(__argc, __argv, __environ); /* Shutdown the guest VM */ efi_rs_call(reset_system, EFI_RESET_SHUTDOWN, ret, 0, NULL); + /* Unreachable */ + return EFI_UNSUPPORTED; + +efi_main_error: + /* Shutdown the guest with error EFI status */ + efi_rs_call(reset_system, EFI_RESET_SHUTDOWN, status, 0, NULL); + /* Unreachable */ return EFI_UNSUPPORTED; } diff --git a/lib/efi.h b/lib/efi.h index 1b3abd0..ce8b74d 100644 --- a/lib/efi.h +++ b/lib/efi.h @@ -2,9 +2,7 @@ #define _EFI_H_ /* - * EFI-related functions in . This file's name "efi.h" is in - * conflict with GNU-EFI library's "efi.h", but does not include - * GNU-EFI headers or links against GNU-EFI. + * EFI-related functions. * * Copyright (c) 2021, Google Inc, Zixuan Wang * @@ -13,9 +11,20 @@ #include "linux/efi.h" #include -efi_status_t _relocate(long ldbase, Elf64_Dyn *dyn, efi_handle_t handle, efi_system_table_t *sys_tab); +/* + * efi_bootinfo_t: stores EFI-related machine info retrieved before exiting EFI + * boot services, and is then used by setup_efi(). setup_efi() cannot retrieve + * this info as it is called after ExitBootServices and thus some EFI resources + * and functions are not available. + */ +typedef struct { + struct efi_boot_memmap mem_map; +} efi_bootinfo_t; + +efi_status_t _relocate(long ldbase, Elf64_Dyn *dyn, efi_handle_t handle, + efi_system_table_t *sys_tab); efi_status_t efi_get_memory_map(struct efi_boot_memmap *map); -efi_status_t efi_exit_boot_services(void *handle, unsigned long mapkey); +efi_status_t efi_exit_boot_services(void *handle, struct efi_boot_memmap *map); efi_status_t efi_get_system_config_table(efi_guid_t table_guid, void **table); efi_status_t efi_main(efi_handle_t handle, efi_system_table_t *sys_tab); diff --git a/lib/x86/acpi.c b/lib/x86/acpi.c index 0f75d79..c523dac 100644 --- a/lib/x86/acpi.c +++ b/lib/x86/acpi.c @@ -4,29 +4,35 @@ #ifdef TARGET_EFI struct rsdp_descriptor *efi_rsdp = NULL; -void setup_efi_rsdp(struct rsdp_descriptor *rsdp) { +void set_efi_rsdp(struct rsdp_descriptor *rsdp) +{ efi_rsdp = rsdp; } -static struct rsdp_descriptor *get_rsdp(void) { +static struct rsdp_descriptor *get_rsdp(void) +{ if (efi_rsdp == NULL) { - printf("Can't find RSDP from UEFI, maybe setup_efi_rsdp() was not called\n"); + printf("Can't find RSDP from UEFI, maybe set_efi_rsdp() was not called\n"); } return efi_rsdp; } #else -static struct rsdp_descriptor *get_rsdp(void) { - struct rsdp_descriptor *rsdp; - unsigned long addr; - for(addr = 0xf0000; addr < 0x100000; addr += 16) { - rsdp = (void*)addr; - if (rsdp->signature == RSDP_SIGNATURE_8BYTE) - break; - } - if (addr == 0x100000) { - return NULL; - } - return rsdp; +static struct rsdp_descriptor *get_rsdp(void) +{ + struct rsdp_descriptor *rsdp; + unsigned long addr; + + for (addr = 0xf0000; addr < 0x100000; addr += 16) { + rsdp = (void *)addr; + if (rsdp->signature == RSDP_SIGNATURE_8BYTE) + break; + } + + if (addr == 0x100000) { + return NULL; + } + + return rsdp; } #endif /* TARGET_EFI */ diff --git a/lib/x86/acpi.h b/lib/x86/acpi.h index db8ee56..67ba389 100644 --- a/lib/x86/acpi.h +++ b/lib/x86/acpi.h @@ -106,10 +106,7 @@ struct facs_descriptor_rev1 u8 reserved3 [40]; /* Reserved - must be zero */ }; +void set_efi_rsdp(struct rsdp_descriptor *rsdp); void* find_acpi_table_addr(u32 sig); -#ifdef TARGET_EFI -void setup_efi_rsdp(struct rsdp_descriptor *rsdp); -#endif /* TARGET_EFI */ - #endif diff --git a/lib/x86/asm/setup.h b/lib/x86/asm/setup.h index 73ff4a3..dbfb2a2 100644 --- a/lib/x86/asm/setup.h +++ b/lib/x86/asm/setup.h @@ -12,21 +12,7 @@ unsigned long setup_tss(u8 *stacktop); #include "efi.h" #include "x86/amd_sev.h" -/* - * efi_bootinfo_t: stores EFI-related machine info retrieved by - * setup_efi_pre_boot(), and is then used by setup_efi(). setup_efi() cannot - * retrieve this info as it is called after ExitBootServices and thus some EFI - * resources are not available. - */ -typedef struct { - phys_addr_t free_mem_start; - phys_addr_t free_mem_size; - struct rsdp_descriptor *rsdp; -} efi_bootinfo_t; - -void setup_efi_bootinfo(efi_bootinfo_t *efi_bootinfo); -void setup_efi(efi_bootinfo_t *efi_bootinfo); -efi_status_t setup_efi_pre_boot(unsigned long *mapkey, efi_bootinfo_t *efi_bootinfo); +efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo); void setup_5level_page_table(void); #endif /* TARGET_EFI */ diff --git a/lib/x86/setup.c b/lib/x86/setup.c index 24fe74e..57b9b5e 100644 --- a/lib/x86/setup.c +++ b/lib/x86/setup.c @@ -173,34 +173,14 @@ void setup_multiboot(struct mbi_bootinfo *bi) extern void load_idt(void); extern void load_gdt_tss(size_t tss_offset); -void setup_efi_bootinfo(efi_bootinfo_t *efi_bootinfo) -{ - efi_bootinfo->free_mem_size = 0; - efi_bootinfo->free_mem_start = 0; - efi_bootinfo->rsdp = NULL; -} - -static efi_status_t setup_pre_boot_memory(unsigned long *mapkey, efi_bootinfo_t *efi_bootinfo) +static efi_status_t setup_memory_allocator(efi_bootinfo_t *efi_bootinfo) { int i; - unsigned long free_mem_total_pages; - efi_status_t status; - struct efi_boot_memmap map; - efi_memory_desc_t *buffer, *d; - unsigned long map_size, desc_size, buff_size; - u32 desc_ver; - - map.map = &buffer; - map.map_size = &map_size; - map.desc_size = &desc_size; - map.desc_ver = &desc_ver; - map.buff_size = &buff_size; - map.key_ptr = mapkey; - - status = efi_get_memory_map(&map); - if (status != EFI_SUCCESS) { - return status; - } + unsigned long free_mem_pages = 0; + unsigned long free_mem_start = 0; + struct efi_boot_memmap *map = &(efi_bootinfo->mem_map); + efi_memory_desc_t *buffer = *map->map; + efi_memory_desc_t *d = NULL; /* * The 'buffer' contains multiple descriptors that describe memory @@ -209,77 +189,42 @@ static efi_status_t setup_pre_boot_memory(unsigned long *mapkey, efi_bootinfo_t * memory allocator, so that the memory allocator can work in the * largest free continuous memory region. */ - free_mem_total_pages = 0; - for (i = 0; i < map_size; i += desc_size) { + for (i = 0; i < *(map->map_size); i += *(map->desc_size)) { d = (efi_memory_desc_t *)(&((u8 *)buffer)[i]); if (d->type == EFI_CONVENTIONAL_MEMORY) { - if (free_mem_total_pages < d->num_pages) { - free_mem_total_pages = d->num_pages; - efi_bootinfo->free_mem_size = free_mem_total_pages << EFI_PAGE_SHIFT; - efi_bootinfo->free_mem_start = d->phys_addr; + if (free_mem_pages < d->num_pages) { + free_mem_pages = d->num_pages; + free_mem_start = d->phys_addr; } } } - if (efi_bootinfo->free_mem_size == 0) { + if (free_mem_pages == 0) { return EFI_OUT_OF_RESOURCES; } - return EFI_SUCCESS; -} + phys_alloc_init(free_mem_start, free_mem_pages << EFI_PAGE_SHIFT); -static efi_status_t setup_pre_boot_rsdp(efi_bootinfo_t *efi_bootinfo) -{ - return efi_get_system_config_table(ACPI_TABLE_GUID, (void **)&efi_bootinfo->rsdp); + return EFI_SUCCESS; } -efi_status_t setup_efi_pre_boot(unsigned long *mapkey, efi_bootinfo_t *efi_bootinfo) +static efi_status_t setup_rsdp(efi_bootinfo_t *efi_bootinfo) { efi_status_t status; + struct rsdp_descriptor *rsdp; - status = setup_pre_boot_memory(mapkey, efi_bootinfo); - if (status != EFI_SUCCESS) { - printf("setup_pre_boot_memory() failed: "); - switch (status) { - case EFI_OUT_OF_RESOURCES: - printf("No free memory region\n"); - break; - default: - printf("Unknown error\n"); - break; - } - return status; - } - - status = setup_pre_boot_rsdp(efi_bootinfo); + /* + * RSDP resides in an EFI_ACPI_RECLAIM_MEMORY region, which is not used + * by kvm-unit-tests x86's memory allocator. So it is not necessary to + * copy the data structure to another memory region to prevent + * unintentional overwrite. + */ + status = efi_get_system_config_table(ACPI_TABLE_GUID, (void **)&rsdp); if (status != EFI_SUCCESS) { - printf("Cannot find RSDP in EFI system table\n"); return status; } - status = setup_amd_sev(); - if (status != EFI_SUCCESS) { - switch (status) { - case EFI_UNSUPPORTED: - /* Continue if AMD SEV is not supported */ - break; - default: - printf("Set up AMD SEV failed\n"); - return status; - } - } - - status = setup_amd_sev_es(); - if (status != EFI_SUCCESS) { - switch (status) { - case EFI_UNSUPPORTED: - /* Continue if AMD SEV-ES is not supported */ - break; - default: - printf("Set up AMD SEV-ES failed\n"); - return status; - } - } + set_efi_rsdp(rsdp); return EFI_SUCCESS; } @@ -333,8 +278,54 @@ static void setup_gdt_tss(void) load_gdt_tss(tss_offset); } -void setup_efi(efi_bootinfo_t *efi_bootinfo) +efi_status_t setup_efi(efi_bootinfo_t *efi_bootinfo) { + efi_status_t status; + + status = setup_memory_allocator(efi_bootinfo); + if (status != EFI_SUCCESS) { + printf("Failed to set up memory allocator: "); + switch (status) { + case EFI_OUT_OF_RESOURCES: + printf("No free memory region\n"); + break; + default: + printf("Unknown error\n"); + break; + } + return status; + } + + status = setup_rsdp(efi_bootinfo); + if (status != EFI_SUCCESS) { + printf("Cannot find RSDP in EFI system table\n"); + return status; + } + + status = setup_amd_sev(); + if (status != EFI_SUCCESS) { + switch (status) { + case EFI_UNSUPPORTED: + /* Continue if AMD SEV is not supported */ + break; + default: + printf("Set up AMD SEV failed\n"); + return status; + } + } + + status = setup_amd_sev_es(); + if (status != EFI_SUCCESS) { + switch (status) { + case EFI_UNSUPPORTED: + /* Continue if AMD SEV-ES is not supported */ + break; + default: + printf("Set up AMD SEV-ES failed\n"); + return status; + } + } + reset_apic(); setup_gdt_tss(); setup_idt(); @@ -343,9 +334,9 @@ void setup_efi(efi_bootinfo_t *efi_bootinfo) enable_apic(); enable_x2apic(); smp_init(); - phys_alloc_init(efi_bootinfo->free_mem_start, efi_bootinfo->free_mem_size); - setup_efi_rsdp(efi_bootinfo->rsdp); setup_page_table(); + + return EFI_SUCCESS; } #endif /* TARGET_EFI */ From patchwork Sun Oct 31 05:56:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zixuan Wang X-Patchwork-Id: 12594957 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6751EC433FE for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 401B460FBF for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229974AbhJaF7O (ORCPT ); Sun, 31 Oct 2021 01:59:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52854 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229951AbhJaF7N (ORCPT ); Sun, 31 Oct 2021 01:59:13 -0400 Received: from mail-pf1-x42e.google.com (mail-pf1-x42e.google.com [IPv6:2607:f8b0:4864:20::42e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5CC5CC061570 for ; Sat, 30 Oct 2021 22:56:42 -0700 (PDT) Received: by mail-pf1-x42e.google.com with SMTP id 187so13276945pfc.10 for ; Sat, 30 Oct 2021 22:56:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=wLq/o3L9faxzjpO4dTXlYCgSvE5SKd/tnXGve6D6V/0=; b=P5W5463ujMqLbqTdTsh6I3VL9pCBV8tIT3v/NLXCTtRqmaznF7avGTytQsy4oG2jH5 N9WLQEYZl7c9rbMZQ58PKwbYtiM6+dpNv9szJl5VIW1LyEW2HW0Ch+EeCw3z7jXCg0rI sktvw3F4+KynwTzBpnikPL+hvUKC/6oY5/j1YDCfQyZrdjcVOW8fEou2u5knGYVfXlv4 T3ZWgjfsfFcn53fRfBCaIjFl0god7dtqsgvZfutyCga1zxsUVgAKIAYVNxKMfQ0q0I9k YsLCtB5+fhYNuA613J0/23x2l6KHatz+wkP6a9MYI9RycZVI3x9QqrdFOqfWURsFeNi1 zEyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=wLq/o3L9faxzjpO4dTXlYCgSvE5SKd/tnXGve6D6V/0=; b=HeK/NbEenJw1oL3V3yxiuosvyW+gmFv8z0WTEyyV60iVAX3AUIM8hxnYqEn46NyQcT kqicB6rq4xHjmg8EQCTKrlLzaDHmEbCYoSCZwU/2JVZGZq6KYKz2D/qiw4CzZtH3gbE5 qmtnM+Y3O7u+/bQXpgnOKQAPtpR0teDDpFFhm72S61/htR4TjKVcPlOkTc4g37/vTdl8 a/u1QBH4D4ogkmCV/hU7slHRFyP6R6zy+1dcVoS/EYc67KJkboktybS7Fhhfs0D7Kvly eRmW5AIVYBgkB06PqhelZ34aYF44yVynT2MQT4GluaHlvgr1n5mnU7GVZZh7nuwzUz1H Mq/A== X-Gm-Message-State: AOAM5330o5Q859xYG2D47Zz3qaT6W+OfBKr1XL4l12SReCyLrBDO9Zpv pQ56q9F3gmXONhBRyDmldXb+xe2dwY7Y6Q== X-Google-Smtp-Source: ABdhPJyimAb0kRY/FqJkvUBJmMCWxwSmjqMemC/rr5UuAIvKndP9p7eWePXujkcXwcUSljIqqBBWGw== X-Received: by 2002:a63:6e03:: with SMTP id j3mr15820405pgc.465.1635659801476; Sat, 30 Oct 2021 22:56:41 -0700 (PDT) Received: from localhost.localdomain (netadmin.ucsd.edu. [137.110.160.224]) by smtp.gmail.com with ESMTPSA id j19sm11403179pfj.127.2021.10.30.22.56.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Oct 2021 22:56:41 -0700 (PDT) From: Zixuan Wang To: kvm@vger.kernel.org, pbonzini@redhat.com, drjones@redhat.com Cc: marcorr@google.com, erdemaktas@google.com, rientjes@google.com, seanjc@google.com, brijesh.singh@amd.com, Thomas.Lendacky@amd.com, varad.gautam@suse.com, jroedel@suse.de, bp@suse.de Subject: [kvm-unit-tests PATCH v1 3/7] x86 UEFI: Convert x86 test cases to PIC Date: Sat, 30 Oct 2021 22:56:30 -0700 Message-Id: <20211031055634.894263-4-zxwang42@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211031055634.894263-1-zxwang42@gmail.com> References: <20211031055634.894263-1-zxwang42@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Zixuan Wang UEFI loads EFI applications to dynamic runtime addresses, so it requires all applications to be compiled as PIC (position independent code). PIC does not allow the usage of compile time absolute address. This commit converts multiple x86 test cases to PIC so they can compile and run in UEFI: - x86/cet.efi - x86/emulator.c: x86/emulator.c depends on lib/x86/usermode.c. But usermode.c contains non-PIC inline assembly code. This commit converts lib/x86/usermode.c and x86/emulator.c to PIC, so x86/emulator.c can compile and run in UEFI. - x86/vmware_backdoors.c: it depends on lib/x86/usermode.c and now works without modifications - x86/eventinj.c - x86/smap.c - x86/access.c - x86/umip.c Signed-off-by: Zixuan Wang --- lib/x86/usermode.c | 3 ++- x86/Makefile.common | 10 +++++----- x86/Makefile.x86_64 | 7 ++++--- x86/access.c | 9 +++++---- x86/cet.c | 8 +++++--- x86/emulator.c | 5 +++-- x86/eventinj.c | 8 ++++++++ x86/smap.c | 13 +++++++++---- x86/umip.c | 26 +++++++++++++++++++++++--- 9 files changed, 64 insertions(+), 25 deletions(-) diff --git a/lib/x86/usermode.c b/lib/x86/usermode.c index 2e77831..5b657fd 100644 --- a/lib/x86/usermode.c +++ b/lib/x86/usermode.c @@ -58,7 +58,8 @@ uint64_t run_in_user(usermode_func func, unsigned int fault_vector, "pushq %[user_stack_top]\n\t" "pushfq\n\t" "pushq %[user_cs]\n\t" - "pushq $user_mode\n\t" + "lea user_mode(%%rip), %%rdx\n\t" + "pushq %%rdx\n\t" "iretq\n" "user_mode:\n\t" diff --git a/x86/Makefile.common b/x86/Makefile.common index deaa386..119f4b2 100644 --- a/x86/Makefile.common +++ b/x86/Makefile.common @@ -81,16 +81,16 @@ tests-common = $(TEST_DIR)/vmexit.$(exe) $(TEST_DIR)/tsc.$(exe) \ $(TEST_DIR)/init.$(exe) \ $(TEST_DIR)/hyperv_synic.$(exe) $(TEST_DIR)/hyperv_stimer.$(exe) \ $(TEST_DIR)/hyperv_connections.$(exe) \ - $(TEST_DIR)/tsx-ctrl.$(exe) + $(TEST_DIR)/tsx-ctrl.$(exe) \ + $(TEST_DIR)/eventinj.$(exe) \ + $(TEST_DIR)/umip.$(exe) # The following test cases are disabled when building EFI tests because they # use absolute addresses in their inline assembly code, which cannot compile # with the '-fPIC' flag ifneq ($(TARGET_EFI),y) -tests-common += $(TEST_DIR)/eventinj.$(exe) \ - $(TEST_DIR)/smap.$(exe) \ - $(TEST_DIR)/realmode.$(exe) \ - $(TEST_DIR)/umip.$(exe) +tests-common += $(TEST_DIR)/smap.$(exe) \ + $(TEST_DIR)/realmode.$(exe) endif test_cases: $(tests-common) $(tests) diff --git a/x86/Makefile.x86_64 b/x86/Makefile.x86_64 index fe6457c..3963840 100644 --- a/x86/Makefile.x86_64 +++ b/x86/Makefile.x86_64 @@ -30,6 +30,8 @@ tests += $(TEST_DIR)/intel-iommu.$(exe) tests += $(TEST_DIR)/rdpru.$(exe) tests += $(TEST_DIR)/pks.$(exe) tests += $(TEST_DIR)/pmu_lbr.$(exe) +tests += $(TEST_DIR)/emulator.$(exe) +tests += $(TEST_DIR)/vmware_backdoors.$(exe) ifeq ($(TARGET_EFI),y) tests += $(TEST_DIR)/amd_sev.$(exe) @@ -40,14 +42,13 @@ endif # with the '-fPIC' flag ifneq ($(TARGET_EFI),y) tests += $(TEST_DIR)/access.$(exe) -tests += $(TEST_DIR)/emulator.$(exe) tests += $(TEST_DIR)/svm.$(exe) tests += $(TEST_DIR)/vmx.$(exe) -tests += $(TEST_DIR)/vmware_backdoors.$(exe) +endif + ifneq ($(fcf_protection_full),) tests += $(TEST_DIR)/cet.$(exe) endif -endif include $(SRCDIR)/$(TEST_DIR)/Makefile.common diff --git a/x86/access.c b/x86/access.c index 911f0e3..a2ec049 100644 --- a/x86/access.c +++ b/x86/access.c @@ -700,7 +700,7 @@ static int ac_test_do_access(ac_test_t *at) if (F(AC_ACCESS_TWICE)) { asm volatile ( - "mov $fixed2, %%rsi \n\t" + "lea fixed2(%%rip), %%rsi \n\t" "mov (%[addr]), %[reg] \n\t" "fixed2:" : [reg]"=r"(r), [fault]"=a"(fault), "=b"(e) @@ -710,7 +710,7 @@ static int ac_test_do_access(ac_test_t *at) fault = 0; } - asm volatile ("mov $fixed1, %%rsi \n\t" + asm volatile ("lea fixed1(%%rip), %%rsi \n\t" "mov %%rsp, %[rsp0] \n\t" "cmp $0, %[user] \n\t" "jz do_access \n\t" @@ -719,7 +719,8 @@ static int ac_test_do_access(ac_test_t *at) "pushq %[user_stack_top] \n\t" "pushfq \n\t" "pushq %[user_cs] \n\t" - "pushq $do_access \n\t" + "lea do_access(%%rip), %%r8\n\t" + "pushq %%r8\n\t" "iretq \n" "do_access: \n\t" "cmp $0, %[fetch] \n\t" @@ -750,7 +751,7 @@ static int ac_test_do_access(ac_test_t *at) [user_cs]"i"(USER_CS), [user_stack_top]"r"(user_stack + sizeof user_stack), [kernel_entry_vector]"i"(0x20) - : "rsi"); + : "rsi", "r8"); asm volatile (".section .text.pf \n\t" "page_fault: \n\t" diff --git a/x86/cet.c b/x86/cet.c index a21577a..a4b79cb 100644 --- a/x86/cet.c +++ b/x86/cet.c @@ -52,7 +52,7 @@ static u64 cet_ibt_func(void) printf("No endbr64 instruction at jmp target, this triggers #CP...\n"); asm volatile ("movq $2, %rcx\n" "dec %rcx\n" - "leaq 2f, %rax\n" + "leaq 2f(%rip), %rax\n" "jmp *%rax \n" "2:\n" "dec %rcx\n"); @@ -67,7 +67,8 @@ void test_func(void) { "pushq %[user_stack_top]\n\t" "pushfq\n\t" "pushq %[user_cs]\n\t" - "pushq $user_mode\n\t" + "lea user_mode(%%rip), %%rax\n\t" + "pushq %%rax\n\t" "iretq\n" "user_mode:\n\t" @@ -77,7 +78,8 @@ void test_func(void) { [user_ds]"i"(USER_DS), [user_cs]"i"(USER_CS), [user_stack_top]"r"(user_stack + - sizeof(user_stack))); + sizeof(user_stack)) + : "rax"); } #define SAVE_REGS() \ diff --git a/x86/emulator.c b/x86/emulator.c index c5f584a..22a518f 100644 --- a/x86/emulator.c +++ b/x86/emulator.c @@ -262,12 +262,13 @@ static void test_pop(void *mem) asm volatile("mov %%rsp, %[tmp] \n\t" "mov %[stack_top], %%rsp \n\t" - "push $1f \n\t" + "lea 1f(%%rip), %%rax \n\t" + "push %%rax \n\t" "ret \n\t" "2: jmp 2b \n\t" "1: mov %[tmp], %%rsp" : [tmp]"=&r"(tmp) : [stack_top]"r"(stack_top) - : "memory"); + : "memory", "rax"); report_pass("ret"); stack_top[-1] = 0x778899; diff --git a/x86/eventinj.c b/x86/eventinj.c index 46593c9..3c0db56 100644 --- a/x86/eventinj.c +++ b/x86/eventinj.c @@ -155,9 +155,17 @@ asm("do_iret:" "pushf"W" \n\t" "mov %cs, %ecx \n\t" "push"W" %"R "cx \n\t" +#ifndef __x86_64__ "push"W" $2f \n\t" "cmpb $0, no_test_device\n\t" // see if need to flush +#else + "leaq 2f(%rip), %rbx \n\t" + "pushq %rbx \n\t" + + "mov no_test_device(%rip), %bl \n\t" + "cmpb $0, %bl\n\t" // see if need to flush +#endif "jnz 1f\n\t" "outl %eax, $0xe4 \n\t" // flush page "1: \n\t" diff --git a/x86/smap.c b/x86/smap.c index c6ddf38..0994c29 100644 --- a/x86/smap.c +++ b/x86/smap.c @@ -159,12 +159,17 @@ int main(int ac, char **av) init_test(i); stac(); test = -1; +#ifndef __x86_64__ + #define TEST "test" +#else + #define TEST "test(%rip)" +#endif asm("or $(" xstr(USER_BASE) "), %"R "sp \n" "push $44 \n " - "decl test\n" + "decl " TEST "\n" "and $~(" xstr(USER_BASE) "), %"R "sp \n" "pop %"R "ax\n" - "movl %eax, test"); + "movl %eax, " TEST "\n"); report(pf_count == 0 && test == 44, "write to user stack with AC=1"); @@ -173,10 +178,10 @@ int main(int ac, char **av) test = -1; asm("or $(" xstr(USER_BASE) "), %"R "sp \n" "push $45 \n " - "decl test\n" + "decl " TEST "\n" "and $~(" xstr(USER_BASE) "), %"R "sp \n" "pop %"R "ax\n" - "movl %eax, test"); + "movl %eax, " TEST "\n"); report(pf_count == 1 && test == 45 && save == -1, "write to user stack with AC=0"); diff --git a/x86/umip.c b/x86/umip.c index af8db59..fccdedc 100644 --- a/x86/umip.c +++ b/x86/umip.c @@ -20,10 +20,20 @@ static void gp_handler(struct ex_regs *regs) } } +#ifndef __x86_64__ +#define GP_ASM_MOVE_TO_RIP \ + "mov" W " $1f, %[expected_rip]\n\t" +#else +#define GP_ASM_MOVE_TO_RIP \ + "pushq %%rax\n\t" \ + "lea 1f(%%rip), %%rax\n\t" \ + "mov %%rax, %[expected_rip]\n\t" \ + "popq %%rax\n\t" +#endif #define GP_ASM(stmt, in, clobber) \ asm volatile ( \ - "mov" W " $1f, %[expected_rip]\n\t" \ + GP_ASM_MOVE_TO_RIP \ "movl $2f-1f, %[skip_count]\n\t" \ "1: " stmt "\n\t" \ "2: " \ @@ -125,12 +135,18 @@ static noinline int do_ring3(void (*fn)(const char *), const char *arg) "mov %%dx, %%fs\n\t" "mov %%dx, %%gs\n\t" "mov %%" R "sp, %[sp0]\n\t" /* kernel sp for exception handlers */ + "mov %[sp0], %%" R "bx\n\t" /* ebx/rbx is preserved before and after 'call' instruction */ "push" W " %%" R "dx \n\t" "lea %[user_stack_top], %%" R "dx \n\t" "push" W " %%" R "dx \n\t" "pushf" W "\n\t" "push" W " %[user_cs] \n\t" +#ifndef __x86_64__ "push" W " $1f \n\t" +#else + "lea 1f(%%rip), %%rdx \n\t" + "pushq %%rdx \n\t" +#endif "iret" W "\n" "1: \n\t" #ifndef __x86_64__ @@ -140,12 +156,16 @@ static noinline int do_ring3(void (*fn)(const char *), const char *arg) #ifndef __x86_64__ "pop %%ecx\n\t" #endif +#ifndef __x86_64__ "mov $1f, %%" R "dx\n\t" +#else + "lea 1f(%%" R "ip), %%" R "dx\n\t" +#endif "int %[kernel_entry_vector]\n\t" ".section .text.entry \n\t" "kernel_entry: \n\t" #ifdef __x86_64__ - "mov %[sp0], %%" R "sp\n\t" + "mov %%rbx, %%rsp\n\t" #else "add $(5 * " S "), %%esp\n\t" #endif @@ -171,7 +191,7 @@ static noinline int do_ring3(void (*fn)(const char *), const char *arg) [arg]"D"(arg), [kernel_ds]"i"(KERNEL_DS), [kernel_entry_vector]"i"(0x20) - : "rcx", "rdx"); + : "rcx", "rdx", "rbx"); return ret; } From patchwork Sun Oct 31 05:56:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zixuan Wang X-Patchwork-Id: 12594953 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6CCE2C4332F for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5158260EBB for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230076AbhJaF7P (ORCPT ); Sun, 31 Oct 2021 01:59:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52862 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229951AbhJaF7P (ORCPT ); Sun, 31 Oct 2021 01:59:15 -0400 Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7018C061570 for ; Sat, 30 Oct 2021 22:56:43 -0700 (PDT) Received: by mail-pl1-x62f.google.com with SMTP id t11so9520159plq.11 for ; Sat, 30 Oct 2021 22:56:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1AE+HQrLi6BxdLK3n3GfzMpS9PYJGXdqFTYhG0I5PN4=; b=EitNloUirz5xkSxpOfPQgKhb7+FYdDgIJYKwSCxEsV3JPxip1IXQG4RCxJXZJndYVN QMT1i5AGrNZABQveJKIUR7g5jOgLRChARixFdNp5btHnvAETBd63DnRrS1b2FTLJ6/Th k5gWtH3dmOQWXYbdMUNdxA1v3YiDN9Tjp0rnsnG29NRQT7C0/xO5aHfWEiDwsCqQYO3n eBhPWWWP1BYDrR9aezpjx5/rpwcTjqltmBjN+/dEYi31lOHzKYlyOwrv4f3xs7r+0vqm tIe3xO4egIbt6NUt5QMdivKPjlUsKCsRSSExcqVplXTyoCsW3fPd1ayABL3RWt9qssNd uMsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1AE+HQrLi6BxdLK3n3GfzMpS9PYJGXdqFTYhG0I5PN4=; b=Y7CA7Q9lJywPiJb1AhP8j2my0+rHvr73sP/ERrlaIHZCg0DASS5ajJ4Kzq7xsB44T7 8HSDWmzvwP3ngRK0tl4BAt4oHEyHzAoHMV7J09qFDCouaD1VjSnlVZoUh2FhgzOJbIg5 Oey02bkZPeQa3RMLEarAuBqPxuG+DU5xoWopav63qrntHWNx/9BdMWlfDGE32bagcuCy PENm4nrjUHBO+aFKCmhL3AWk+65lkbNNbqg6DyduG6qS41lh9vWLkilCRpq/FL1SARdL 5xs0e4FnVp9EpR2267++SUFx++vrVK0Ev1ggA9keXDEkZv9uS9Riun8opzmmBsI1iSB1 awgA== X-Gm-Message-State: AOAM530i2bKTT09sLoKDEQnzTz2k/M8dznclgmBPs7Zv3/mb0LhKmG4i Z05waSNYE1OD1Ljv6h2Zy8vvOSSNk8jhOg== X-Google-Smtp-Source: ABdhPJznpFPaJYmMSiHP9U9DR8docdU1O/2t+o09yBuH6RsBPLh0XqvnlXqJ+YLxVa5KbQqq9J3J/Q== X-Received: by 2002:a17:90a:bd04:: with SMTP id y4mr21692293pjr.99.1635659802909; Sat, 30 Oct 2021 22:56:42 -0700 (PDT) Received: from localhost.localdomain (netadmin.ucsd.edu. [137.110.160.224]) by smtp.gmail.com with ESMTPSA id j19sm11403179pfj.127.2021.10.30.22.56.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Oct 2021 22:56:42 -0700 (PDT) From: Zixuan Wang To: kvm@vger.kernel.org, pbonzini@redhat.com, drjones@redhat.com Cc: marcorr@google.com, erdemaktas@google.com, rientjes@google.com, seanjc@google.com, brijesh.singh@amd.com, Thomas.Lendacky@amd.com, varad.gautam@suse.com, jroedel@suse.de, bp@suse.de Subject: [kvm-unit-tests PATCH v1 4/7] x86 UEFI: Set UEFI OVMF as readonly Date: Sat, 30 Oct 2021 22:56:31 -0700 Message-Id: <20211031055634.894263-5-zxwang42@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211031055634.894263-1-zxwang42@gmail.com> References: <20211031055634.894263-1-zxwang42@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Zixuan Wang Set readonly for UEFI OVMF image. Signed-off-by: Zixuan Wang --- x86/efi/run | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x86/efi/run b/x86/efi/run index a47c0d5..922b266 100755 --- a/x86/efi/run +++ b/x86/efi/run @@ -54,7 +54,7 @@ popd || exit 2 # UEFI's largest allocatable memory region is large enough. EFI_RUN=y \ "$TEST_DIR/run" \ - -drive file="$EFI_UEFI",format=raw,if=pflash \ + -drive file="$EFI_UEFI",format=raw,if=pflash,readonly=on \ -drive file.dir="$EFI_TEST/$EFI_CASE/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \ -net none \ -nographic \ From patchwork Sun Oct 31 05:56:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zixuan Wang X-Patchwork-Id: 12594955 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B467C43219 for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 64B5D60FD9 for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230196AbhJaF7S (ORCPT ); Sun, 31 Oct 2021 01:59:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52870 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230289AbhJaF7Q (ORCPT ); Sun, 31 Oct 2021 01:59:16 -0400 Received: from mail-pg1-x52b.google.com (mail-pg1-x52b.google.com [IPv6:2607:f8b0:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 34EEEC061714 for ; Sat, 30 Oct 2021 22:56:45 -0700 (PDT) Received: by mail-pg1-x52b.google.com with SMTP id g184so14116368pgc.6 for ; Sat, 30 Oct 2021 22:56:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sNcO4ibyEoUEN8Dd5WdiBof8ChwMLkTeLNeAxVmxfok=; b=qsOi42wzaB6RWKrjOyfTKcs1obiU7gL0Y7FdgLPVkYX5d7T8yl0B+KkwEt9EgVABHG aJ5vp9x6l6Xst5x/W3Q3ntuOzQqSQXED4PLBkxRXT/WM67UtzBEJHKYGisJuJufsVIC4 Y1a0rOUTIyFPnsENakwX6uT57VESOXLaY4OUSVhWGDU3dYtWFv7TissQgoBObc3VgtXK 1MsfEIjIEjOY2LGZ81cCiTCh0mvFSJLeODeEFzhntRpvMKMaXpC10gt+dSyPCNJoNcGl d/gXHcBg0M+jTXdrHLawdOc+Mpl9fSxJ/XtswrXq22YhilFel4aYRa9tOC0IrGFChd8s 9yKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=sNcO4ibyEoUEN8Dd5WdiBof8ChwMLkTeLNeAxVmxfok=; b=gxBym+Qq4TLilzqM55Xq85ALshR3OjcWLVXLGx0Iq8UMjl3QEktIoXP3pmst8cFTQ2 vw31FiLL+aOPZP6jtoGfbiFSdmrYKeGw3aVkUxv2Hcex5Ih3Wv7HOfAuX4jwWj6yRqYi vhn1H03k1ySeZ4QziZGpj81UHkXkwGAU/is4qYaoI0G0WvX4RHb2vBEpNwAeyni/NCw0 SEXZTYvRENhNAmweOPPO7lMgs0faUd0itXFxSD2gW/fkkoced6EDL41eqoxLVLiBt8lF vS0Ff2pzGZKLlSLsB23eARdgC5jOA+ERSIHjSh+pfnGCQEIf0D6mle7YUsMD4HXy/ykp Juag== X-Gm-Message-State: AOAM530ZzTx4rbs5GJ0dKYj3t0eoh8NGYBRUW5OiiL0DXZbfyn0zoywV Of7qzaE2Hwcj40w6OtV6HcSFx1CzsCPPwQ== X-Google-Smtp-Source: ABdhPJwCWyvcFXfMMwAO40D+5pJ5OV3GqEzWvWjuHWZ1V1uhM9CLPfkyvVqZ+wd1drYOsEP7fZTBIA== X-Received: by 2002:a62:e901:0:b0:47b:f1bc:55e4 with SMTP id j1-20020a62e901000000b0047bf1bc55e4mr21252575pfh.0.1635659804346; Sat, 30 Oct 2021 22:56:44 -0700 (PDT) Received: from localhost.localdomain (netadmin.ucsd.edu. [137.110.160.224]) by smtp.gmail.com with ESMTPSA id j19sm11403179pfj.127.2021.10.30.22.56.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Oct 2021 22:56:43 -0700 (PDT) From: Zixuan Wang To: kvm@vger.kernel.org, pbonzini@redhat.com, drjones@redhat.com Cc: marcorr@google.com, erdemaktas@google.com, rientjes@google.com, seanjc@google.com, brijesh.singh@amd.com, Thomas.Lendacky@amd.com, varad.gautam@suse.com, jroedel@suse.de, bp@suse.de Subject: [kvm-unit-tests PATCH v1 5/7] x86 UEFI: Exit QEMU with return code Date: Sat, 30 Oct 2021 22:56:32 -0700 Message-Id: <20211031055634.894263-6-zxwang42@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211031055634.894263-1-zxwang42@gmail.com> References: <20211031055634.894263-1-zxwang42@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Zixuan Wang kvm-unit-tests runner scripts parse QEMU exit code to determine if a test case runs successfully. But the UEFI 'reset_system' function always exits QEMU with code 0, even if the test case returns a non-zero code. This commit fixes this issue by replacing the 'reset_system' call with an 'exit' call, which ensures QEMU exit with the correct code. Signed-off-by: Zixuan Wang --- lib/efi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/efi.c b/lib/efi.c index 99eb00c..cc0386c 100644 --- a/lib/efi.c +++ b/lib/efi.c @@ -87,7 +87,7 @@ efi_status_t efi_get_system_config_table(efi_guid_t table_guid, void **table) efi_status_t efi_main(efi_handle_t handle, efi_system_table_t *sys_tab) { - int ret; + unsigned long ret; efi_status_t status; efi_bootinfo_t efi_bootinfo; @@ -134,14 +134,14 @@ efi_status_t efi_main(efi_handle_t handle, efi_system_table_t *sys_tab) ret = main(__argc, __argv, __environ); /* Shutdown the guest VM */ - efi_rs_call(reset_system, EFI_RESET_SHUTDOWN, ret, 0, NULL); + exit(ret); /* Unreachable */ return EFI_UNSUPPORTED; efi_main_error: /* Shutdown the guest with error EFI status */ - efi_rs_call(reset_system, EFI_RESET_SHUTDOWN, status, 0, NULL); + exit(status); /* Unreachable */ return EFI_UNSUPPORTED; From patchwork Sun Oct 31 05:56:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zixuan Wang X-Patchwork-Id: 12594959 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9E245C43217 for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7FF3360FBF for ; Sun, 31 Oct 2021 05:56:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230110AbhJaF7T (ORCPT ); Sun, 31 Oct 2021 01:59:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52878 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230312AbhJaF7R (ORCPT ); Sun, 31 Oct 2021 01:59:17 -0400 Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9B1B0C061570 for ; Sat, 30 Oct 2021 22:56:46 -0700 (PDT) Received: by mail-pl1-x636.google.com with SMTP id n18so9550318plc.2 for ; Sat, 30 Oct 2021 22:56:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bO1N9Zxka8xPPjy7oAD9PdbIBCgxedCv6giVOzcBrEo=; b=j28CygT/ZpQn9InIn1/xNT6zmecpXfZ1dT/Oy91/kUTkbsSGmZKH3gh5CmpHs7FbgO 3rwpdhWYlV+T+G08NZIRHfWsY9dIsVyvZhzg1A2Vf1+ouzEFAF9aYhjD1rCsB1TZuHSX D0sMuBBqAQIHwNgzZ7jiM8xf/Fr2pnvN2Ln6p+AYEbIPbOuIi1UBOdu6xpFhjBnKvyFZ PuSYcSvOav+qHqC4P9CzW6duIVmGUuuY8hOzMPxub/a4ue4Egzus9crLT3uOz71uifut 83GxfqtDm2qVNz99j4TNm6SeRKc+lYpqDTwfa/4JPhkKM+u9SCFJ2DNNQORF2/GKT7Ki bxfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bO1N9Zxka8xPPjy7oAD9PdbIBCgxedCv6giVOzcBrEo=; b=YEXzsjiz+gdjV4G0mXzphWekYVM4CkhQD/FDSWl7CbjWuC1YDWHVjqGThlpyDS2Fmt ZA1DxFkAmI+2AAb1HoSKI+h5uByXQIXmvvuh19RTLEN3ecHkvYrAJv3jpQ9OZt52Z6YM QqmZbTiqMyl4c+84YQxWaULISYbe/hFkOSQ0bkMhTuiSi0tGfNEaMBv4stw0u3hT9kfi jutGTjlZKPQmMc3lsdlNYDswsO4FydfVAPjqC75+h2lfPbk0erPH+KIOz0UNjkjx4M5J RG0S2kYExdtWBn9CytQEb1Nb86GpEN93/PlqnxKbVHl+8OcnDEJMB2OTYUkSf6p7o3+t FCVw== X-Gm-Message-State: AOAM533EnvWL245z5O7TgTYGzbg8PXXwNjXMBZBsaJIqR4ypcqNKNy8h ESJGfWNd9evzWAPFHWQOFTFpEGTZlXzxeQ== X-Google-Smtp-Source: ABdhPJxbNfV9ix53yVOMFyoGQQXpL5lukS4AaLgTqtSFhXZHwpHR3BB0cZc2GhAvNdC/legwTEwIjg== X-Received: by 2002:a17:90a:1649:: with SMTP id x9mr29964507pje.70.1635659805805; Sat, 30 Oct 2021 22:56:45 -0700 (PDT) Received: from localhost.localdomain (netadmin.ucsd.edu. [137.110.160.224]) by smtp.gmail.com with ESMTPSA id j19sm11403179pfj.127.2021.10.30.22.56.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Oct 2021 22:56:45 -0700 (PDT) From: Zixuan Wang To: kvm@vger.kernel.org, pbonzini@redhat.com, drjones@redhat.com Cc: marcorr@google.com, erdemaktas@google.com, rientjes@google.com, seanjc@google.com, brijesh.singh@amd.com, Thomas.Lendacky@amd.com, varad.gautam@suse.com, jroedel@suse.de, bp@suse.de Subject: [kvm-unit-tests PATCH v1 6/7] scripts: Generalize EFI check Date: Sat, 30 Oct 2021 22:56:33 -0700 Message-Id: <20211031055634.894263-7-zxwang42@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211031055634.894263-1-zxwang42@gmail.com> References: <20211031055634.894263-1-zxwang42@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Marc Orr Previously, the scripts distinguish between seabios and UEFI via a hard-coded env var in the EFI run script, `arch/x86/efi/run`. Furthermore, this var is passed to the x86 run script, `arch/x86/run`, and then not available in other scripts (or to other architectures). Replace the previous approach with a common helper function to check whether the repo has been configured to run under EFI. The helper does this by probing the `config.mak` file generated by `configure`. Signed-off-by: Marc Orr --- scripts/common.bash | 5 +++++ x86/efi/run | 1 - x86/run | 6 ++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/common.bash b/scripts/common.bash index 7b983f7..6f45843 100644 --- a/scripts/common.bash +++ b/scripts/common.bash @@ -1,5 +1,10 @@ source config.mak +function running_under_efi() +{ + [[ ${TARGET_EFI} == "y" ]] && echo "y" || echo "" +} + function for_each_unittest() { local unittests="$1" diff --git a/x86/efi/run b/x86/efi/run index 922b266..aacc691 100755 --- a/x86/efi/run +++ b/x86/efi/run @@ -52,7 +52,6 @@ popd || exit 2 # run in UEFI, some test cases, e.g. `x86/pmu.c`, require more free memory. A # simple fix is to increase the QEMU default memory size to 256MiB so that # UEFI's largest allocatable memory region is large enough. -EFI_RUN=y \ "$TEST_DIR/run" \ -drive file="$EFI_UEFI",format=raw,if=pflash,readonly=on \ -drive file.dir="$EFI_TEST/$EFI_CASE/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \ diff --git a/x86/run b/x86/run index 4eba2b9..95b56b6 100755 --- a/x86/run +++ b/x86/run @@ -1,5 +1,7 @@ #!/usr/bin/env bash +source scripts/common.bash + if [ -z "$STANDALONE" ]; then if [ ! -f config.mak ]; then echo "run ./configure && make first. See ./configure -h" @@ -39,12 +41,12 @@ fi command="${qemu} --no-reboot -nodefaults $pc_testdev -vnc none -serial stdio $pci_testdev" command+=" -machine accel=$ACCEL" -if ! [ "$EFI_RUN" ]; then +if ! [ "$(running_under_efi)" ]; then command+=" -kernel" fi command="$(timeout_cmd) $command" -if [ "$EFI_RUN" ]; then +if [ "$(running_under_efi)" ]; then # Set ENVIRON_DEFAULT=n to remove '-initrd' flag for QEMU (see # 'scripts/arch-run.bash' for more details). This is because when using # UEFI, the test case binaries are passed to QEMU through the disk From patchwork Sun Oct 31 05:56:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zixuan Wang X-Patchwork-Id: 12594961 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42D98C4321E for ; Sun, 31 Oct 2021 05:56:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 20AAB60FD9 for ; Sun, 31 Oct 2021 05:56:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231352AbhJaF7V (ORCPT ); Sun, 31 Oct 2021 01:59:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52892 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230225AbhJaF7T (ORCPT ); Sun, 31 Oct 2021 01:59:19 -0400 Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 22FCFC061766 for ; Sat, 30 Oct 2021 22:56:48 -0700 (PDT) Received: by mail-pj1-x1033.google.com with SMTP id lx5-20020a17090b4b0500b001a262880e99so10228173pjb.5 for ; Sat, 30 Oct 2021 22:56:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=+Sq10DMKJ5WN+LTaoM/Zmnq+qjjXucA5gBS0UWruO3o=; b=Rmxz/XXDLVdgVSnWj2tOR8C+5VMDhvXcRt4a2j4Wr+nUkj0ilBNUje1Ryote+6Yw4j R7BOMyvy7i21bnYRKnbfvimoY/rITiKe9f9pGhrYyAOqyR+gr5W3ocTqucmx885tHI7j Gu2NLBfUr0K7XmudJtawsvxPnFJ4tEHWVL7RMD9Jtycq7+yUGM7ZnLoLQtqX9Vrr6ir2 +LXdPvkY7WjUY64vfwxFcc8PxsEAy2tKNeKIokhos/2+sDHMHov3eeeaPl4CmKH8lhTa iyDLsOO8768rOTf8uOhIn/dcFxedAs5SNvs9avZNX4wZxtiVbyaEnEXObdUxYVbOs9/h 45XQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+Sq10DMKJ5WN+LTaoM/Zmnq+qjjXucA5gBS0UWruO3o=; b=1PWplWxAHdx5mrZSItxIKO1ApKSXB3QR14oJPoeM9ZqZ71s2rbC283guo07PWzQ+bq pojSi7BWcsmlkOnNKBk6ahsosSybC/rTQvbKFuNaYF0GMFy8p2WtbEL58ef50A0SjamJ PiZfSN5GqB8vm/hu7skKJgv0vsOgwTHxPmb+l3p+xrM8Svf6jOEZVu+Rk0GUMvAjgINc K/KJMSjuzZd5Z2+o2mCsiNTlLOR92ms4efrZXjfHl4OIscf7eV67lLAEYYPDY7sq0rKX CkETakLqrWCZm8bFZYCNgJJlnQtsxZhER39zNH1fD3IbRVyaNDnKI5OEeeClU84UTcAk HlUw== X-Gm-Message-State: AOAM532TzQonFwxzXiSNHNcBphQ0qfk+4LrrwdOM+tbp2g7lXFqwl2bQ 4QCCNNYKETtopBEhsjYZDX/UADmveUnEHQ== X-Google-Smtp-Source: ABdhPJxZJF0i6bKHNRyqpQEFxhyzm9joPXcheHSYeVf2xiyTSWN07QvP414UGfXH89ulgQxGv/4IqQ== X-Received: by 2002:a17:902:758b:b0:13e:8b1:e49f with SMTP id j11-20020a170902758b00b0013e08b1e49fmr18463874pll.6.1635659807249; Sat, 30 Oct 2021 22:56:47 -0700 (PDT) Received: from localhost.localdomain (netadmin.ucsd.edu. [137.110.160.224]) by smtp.gmail.com with ESMTPSA id j19sm11403179pfj.127.2021.10.30.22.56.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 30 Oct 2021 22:56:46 -0700 (PDT) From: Zixuan Wang To: kvm@vger.kernel.org, pbonzini@redhat.com, drjones@redhat.com Cc: marcorr@google.com, erdemaktas@google.com, rientjes@google.com, seanjc@google.com, brijesh.singh@amd.com, Thomas.Lendacky@amd.com, varad.gautam@suse.com, jroedel@suse.de, bp@suse.de Subject: [kvm-unit-tests PATCH v1 7/7] x86 UEFI: Make run_tests.sh (mostly) work under UEFI Date: Sat, 30 Oct 2021 22:56:34 -0700 Message-Id: <20211031055634.894263-8-zxwang42@gmail.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211031055634.894263-1-zxwang42@gmail.com> References: <20211031055634.894263-1-zxwang42@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Marc Orr Make several fixes so that run_tests.sh can run the test cases when the repo is configured to run under UEFI. Specifically: 1. The scripts are enlighted to run the .efi test cases rather than the .flat test cases. 2. The scripts are enlighted to run an empty file, _NO_FILE_4Uhere_, which is used to sanity check QEMU and QEMU flags. 3. The scripts are updated to always run with `-smp 1`, since SMP is not yet supported under UEFI. Notably, QEMU's `-append` flag still does not work. This will need to be fixed in future commits. For now, test cases that use `-append` are marked `SKIP`. Signed-off-by: Marc Orr --- scripts/common.bash | 4 ++-- scripts/runtime.bash | 15 +++++++++++++-- x86/efi/run | 24 ++++++++++++++++++++---- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/scripts/common.bash b/scripts/common.bash index 6f45843..c42df95 100644 --- a/scripts/common.bash +++ b/scripts/common.bash @@ -26,7 +26,7 @@ function for_each_unittest() if [[ "$line" =~ ^\[(.*)\]$ ]]; then rematch=${BASH_REMATCH[1]} if [ -n "${testname}" ]; then - $(arch_cmd) "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check" "$accel" "$timeout" + $(arch_cmd) "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check" "$accel" "$timeout" "$(running_under_efi)" fi testname=$rematch smp=1 @@ -56,7 +56,7 @@ function for_each_unittest() fi done if [ -n "${testname}" ]; then - $(arch_cmd) "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check" "$accel" "$timeout" + $(arch_cmd) "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check" "$accel" "$timeout" "$(running_under_efi)" fi exec {fd}<&- } diff --git a/scripts/runtime.bash b/scripts/runtime.bash index 132389c..9c89a74 100644 --- a/scripts/runtime.bash +++ b/scripts/runtime.bash @@ -81,6 +81,11 @@ function run() local check="${CHECK:-$7}" local accel="$8" local timeout="${9:-$TIMEOUT}" # unittests.cfg overrides the default + local running_under_efi="${10}" + + if [ "$running_under_efi" ]; then + kernel=$(basename $kernel .flat) + fi if [ -z "$testname" ]; then return @@ -127,8 +132,14 @@ function run() fi last_line=$(premature_failure > >(tail -1)) && { - print_result "SKIP" $testname "" "$last_line" - return 77 + skip=true + if [ "${running_under_efi}" ] && [[ "${last_line}" =~ "Reset" ]]; then + skip=false + fi + if [ ${skip} == true ]; then + print_result "SKIP" $testname "" "$last_line" + return 77 + fi } cmdline=$(get_cmdline $kernel) diff --git a/x86/efi/run b/x86/efi/run index aacc691..e6486ed 100755 --- a/x86/efi/run +++ b/x86/efi/run @@ -34,16 +34,27 @@ shift 1 # This host dir will be loaded by QEMU as a FAT32 image # - Make UEFI startup script that runs the .efi on boot mkdir -p "$EFI_TEST/$EFI_CASE/" -cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_TEST/$EFI_CASE/" +if [ $EFI_CASE != "_NO_FILE_4Uhere_" ]; then + cp "$EFI_SRC/$EFI_CASE.efi" "$EFI_TEST/$EFI_CASE/" +else + touch "$EFI_TEST/$EFI_CASE/$EFI_CASE.efi" +fi pushd "$EFI_TEST/$EFI_CASE" || exit 2 # 'startup.nsh' is the default script executed by UEFI on boot # Use this script to run the test binary automatically -cat << EOF >startup.nsh +if [ $EFI_CASE != "_NO_FILE_4Uhere_" ]; then + cat << EOF >startup.nsh @echo -off fs0: "$EFI_CASE.efi" EOF +else + cat << EOF >startup.nsh +@echo -off +reset -s +EOF +fi popd || exit 2 # Run test case with 256MiB QEMU memory. QEMU default memory size is 128MiB. @@ -52,11 +63,16 @@ popd || exit 2 # run in UEFI, some test cases, e.g. `x86/pmu.c`, require more free memory. A # simple fix is to increase the QEMU default memory size to 256MiB so that # UEFI's largest allocatable memory region is large enough. +# +# Also, pass in an EFI-specific smp count (i.e., `-smp 1`) as the last argument +# to x86/run. This `smp` flag overrides any previous `smp` flags (e.g., +# `-smp 4`). This is necessary because KVM-Unit-Tests do not currently support +# SMP under UEFI. This last flag should be removed when this issue is resolved. "$TEST_DIR/run" \ -drive file="$EFI_UEFI",format=raw,if=pflash,readonly=on \ -drive file.dir="$EFI_TEST/$EFI_CASE/",file.driver=vvfat,file.rw=on,format=raw,if=virtio \ -net none \ -nographic \ - -smp "$EFI_SMP" \ -m 256 \ - "$@" + "$@" \ + -smp "$EFI_SMP"