From patchwork Mon Feb 19 15:48:23 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 875179 X-Patchwork-Delegate: agraf@suse.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="Jv/GYLAd"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3zlT1D3FZpz9s0W for ; Tue, 20 Feb 2018 02:58:08 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 13B64C21E70; Mon, 19 Feb 2018 15:53:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 04671C21E70; Mon, 19 Feb 2018 15:49:47 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 5D3D5C21F1A; Mon, 19 Feb 2018 15:49:29 +0000 (UTC) Received: from mail-ot0-f195.google.com (mail-ot0-f195.google.com [74.125.82.195]) by lists.denx.de (Postfix) with ESMTPS id 80E62C21F2F for ; Mon, 19 Feb 2018 15:49:25 +0000 (UTC) Received: by mail-ot0-f195.google.com with SMTP id p8so5991213otf.2 for ; Mon, 19 Feb 2018 07:49:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=r5PseM+ONGb/dGlDtsURTheGJ8Egq/RwwsB9sLIXU68=; b=Jv/GYLAdHZXF2YU4+mNBiCIMIdWVPoXyyOlOXqYzGJFRo3ei1QffNP4DNBCXGn5Umr K2tsa33kFm8KOQgBFbe4hi73fj+djVIdtoLFNJjSjtJ5WHB5cjC1RS9opqI4NNFjykFG XIYB9Njvy3BsAlgIHkTEIFgP+hU9x7I84PcSSFXxiiU/k3fq4JmPA8MuR3vdbRHvV+OA cAKlxkuN0N8aCVklQYu4uTlKd1xFPvO+6JRH1jkK3oRhusW3HmC8Y9pO7Wm3Q/X6A51o 0PXS2zkr6q897ALGNPiokNf5EaVwpVuYYfvK35Cn+DOE6dEm7H6MLyY0WS69cfOz9vRB akYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=r5PseM+ONGb/dGlDtsURTheGJ8Egq/RwwsB9sLIXU68=; b=cA6diwInd7HLw8fuk6PFrULISITGtjXrjM9HtFKyRVdXy/m+0U+Jr4rl0etA3IyDjE snaAukiSLKfQ2EJ3uZBeiNzqVYEt7KGD8DJoRmwVXnDnFd1meQU7BLJi5Mm+oEYok5Fu /ZfWFKLPTuhp2x9bGTV1Dx9xR00glqrPzxxYPHBi/w8kCNDDHgqGpnlfc8TuUPofRh9d 0YFBzl045OM3IXPoQY+z3+A0dHXg1rWTAnd3sBgNv1nHQglpVXRCuQHbcjLvO2hG+2Id SbXRwfPUG1rHuVHw9t4GSiad29v1uJ0DBLeJ6yG5BV0iq/UiGy5hYaJIhcuBDDd1nxyD tbLQ== X-Gm-Message-State: APf1xPDQ1v0nKzDTWL21N2h9sGr1wcgQUDQQWYOuWmqkOEGMC2OWbmkH FSaOVPsfcqQkqrreABTe0+PlNQ== X-Google-Smtp-Source: AH8x226II6+iPwQ80YS5JI7ymtq0s2k43clNAH0imohUKV6fOh4LgT2+maORXoUWl0ocepOMx6ocbQ== X-Received: by 10.157.44.2 with SMTP id f2mr11825569otb.180.1519055363809; Mon, 19 Feb 2018 07:49:23 -0800 (PST) Received: from kiwi.bld.corp.google.com ([100.67.80.24]) by smtp.gmail.com with ESMTPSA id 9sm2672487otd.2.2018.02.19.07.49.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Feb 2018 07:49:22 -0800 (PST) Received: by kiwi.bld.corp.google.com (Postfix, from userid 121222) id 284D0140386; Mon, 19 Feb 2018 08:49:21 -0700 (MST) From: Simon Glass To: U-Boot Mailing List Date: Mon, 19 Feb 2018 08:48:23 -0700 Message-Id: <20180219154827.215990-18-sjg@chromium.org> X-Mailer: git-send-email 2.16.1.291.g4437f3f132-goog In-Reply-To: <20180219154827.215990-1-sjg@chromium.org> References: <20180219154827.215990-1-sjg@chromium.org> Cc: Andy Shevchenko , Heinrich Schuchardt , Alexander Graf Subject: [U-Boot] [PATCH v3 17/21] efi: Split out test init/uninit into functions X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" We plan to run more than one EFI test. In order to avoid duplicating code, create functions which handle preparing for running the test and cleaning up afterwards. Also shorten the awfully long variable names here. Signed-off-by: Simon Glass --- Changes in v3: - Add new patch to split out test init/uninit into functions Changes in v2: None cmd/bootefi.c | 92 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 26 deletions(-) diff --git a/cmd/bootefi.c b/cmd/bootefi.c index d670a541eb..2a5d66e798 100644 --- a/cmd/bootefi.c +++ b/cmd/bootefi.c @@ -297,6 +297,64 @@ exit: return ret; } +#ifdef CONFIG_CMD_BOOTEFI_SELFTEST +/** + * bootefi_test_prepare() - prepare to run an EFI test + * + * This sets things up so we can call EFI functions. This involves preparing + * the 'gd' pointer and setting up the load ed image data structures. + * + * @image: Pointer to a struct which will hold the loaded image info + * @obj: Pointer to a struct which will hold the loaded image object + * @path: File path to the test being run (often just the test name with a + * backslash before it + * @test_func: Address of the test function that is being run + * @return 0 if OK, -ve on error + */ +static efi_status_t bootefi_test_prepare(struct efi_loaded_image *image, + struct efi_object *obj, + const char *path, ulong test_func) +{ + efi_status_t ret; + + memset(image, '\0', sizeof(*image)); + memset(obj, '\0', sizeof(*obj)); + /* Construct a dummy device path */ + bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE, + test_func, test_func); + bootefi_image_path = efi_dp_from_file(NULL, 0, path); + efi_setup_loaded_image(image, obj, bootefi_device_path, + bootefi_image_path); + /* + * gd lives in a fixed register which may get clobbered while we execute + * the payload. So save it here and restore it on every callback entry + */ + efi_save_gd(); + /* Initialize and populate our EFI object list */ + ret = efi_init_obj_list(); + if (ret) + return ret; + /* Transfer environment variable efi_selftest as load options */ + set_load_options(image, "efi_selftest"); + + return 0; +} + +/** + * bootefi_test_finish() - finish up after running an EFI test + * + * @image: Pointer to a struct which holds the loaded image info + * @obj: Pointer to a struct which holds the loaded image object + */ +static void bootefi_test_finish(struct efi_loaded_image *image, + struct efi_object *obj) +{ + efi_restore_gd(); + free(image->load_options); + list_del(&obj->link); +} +#endif /* CONFIG_CMD_BOOTEFI_SELFTEST */ + static int do_bootefi_bootmgr_exec(unsigned long fdt_addr) { struct efi_device_path *device_path, *file_path; @@ -350,34 +408,16 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #endif #ifdef CONFIG_CMD_BOOTEFI_SELFTEST if (!strcmp(argv[1], "selftest")) { - struct efi_loaded_image loaded_image_info = {}; - struct efi_object loaded_image_info_obj = {}; - - /* Construct a dummy device path. */ - bootefi_device_path = efi_dp_from_mem(EFI_RESERVED_MEMORY_TYPE, - (uintptr_t)&efi_selftest, - (uintptr_t)&efi_selftest); - bootefi_image_path = efi_dp_from_file(NULL, 0, "\\selftest"); - - efi_setup_loaded_image(&loaded_image_info, - &loaded_image_info_obj, - bootefi_device_path, bootefi_image_path); - /* - * gd lives in a fixed register which may get clobbered while we - * execute the payload. So save it here and restore it on every - * callback entry - */ - efi_save_gd(); - /* Initialize and populate EFI object list */ - if (efi_init_obj_list()) + struct efi_loaded_image image; + struct efi_object obj; + + if (bootefi_test_prepare(&image, &obj, "\\test", + (uintptr_t)&efi_selftest)) return CMD_RET_FAILURE; - /* Transfer environment variable efi_selftest as load options */ - set_load_options(&loaded_image_info, "efi_selftest"); + /* Execute the test */ - r = efi_selftest(loaded_image_info_obj.handle, &systab); - efi_restore_gd(); - free(loaded_image_info.load_options); - list_del(&loaded_image_info_obj.link); + r = efi_selftest(obj.handle, &systab); + bootefi_test_finish(&image, &obj); return r != EFI_SUCCESS; } else #endif