From patchwork Wed Jun 29 01:02:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Paul Barbieri X-Patchwork-Id: 1650291 X-Patchwork-Delegate: xypron.glpk@gmx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=hRNIh5HM; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4LY71v4gY6z9sFs for ; Thu, 30 Jun 2022 02:57:53 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 4BB28843B6; Wed, 29 Jun 2022 18:57:46 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="hRNIh5HM"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id BFDC883EF0; Wed, 29 Jun 2022 03:02:53 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-qv1-xf29.google.com (mail-qv1-xf29.google.com [IPv6:2607:f8b0:4864:20::f29]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0399083B74 for ; Wed, 29 Jun 2022 03:02:51 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=plb365@gmail.com Received: by mail-qv1-xf29.google.com with SMTP id 59so22671390qvb.3 for ; Tue, 28 Jun 2022 18:02:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:date:mime-version:user-agent:content-language:to:cc:from :subject:content-transfer-encoding; bh=IJhtbdy2n+TzKyJad4DjFRUct9wXj1EOJjBKOIyLWAg=; b=hRNIh5HMyUilLZZWteOjbc19mnyAEvjsA6i8bcYpQDsOnrA+lJqoBENT+X1SX7u4uu NyzUtCdVIoYkTko61XTEwUh3gIM9Ej4kiFqJKOI8EpDKZD2YBg7sDXgn/QRjhP2erH5C /q8Hrt/r2hTE69/H6XM6hMmBPkrFgoYsL4yyFrojzX5HKa0RsAm9CCJeargVVUPnj0v+ PWulyln+wjNHXO6Mo+EYYyAGQH9U615pA/TF9aUP/oz3tKsC/hU26KoIye8Kp5RR8gnt /9MlHi2KvWc5opMsduvgNvZ0zgU0m310l5ddfnunYDRt/1agDhdQzR5+9oT/zQ4meG3i WPdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent :content-language:to:cc:from:subject:content-transfer-encoding; bh=IJhtbdy2n+TzKyJad4DjFRUct9wXj1EOJjBKOIyLWAg=; b=K0qgkJYfJ56SVs0JjTsNM8sJHhFdIEoltVNuyLS4dXBMwZPEvofnbp9vkf91RP5K8n rnQblzrEuxkS38rRpuocRZG+kqPq/WLhB4dkzRk0bn/Qvry0vECuD9yR2Prw/BZgJffO N90gut/BppK4LjNdtj4iZlls7E4wC5ABu9LkSXuLPUoTfX/+C6a7yxrB7VGcXai4EDjY k/IV//p7RFiKkprFJzfp6HzORBZ6S/5pTW7EQGPG6d9AUwYxnUkfUsmMVOu5TfQpbUjN rs2QUDIJ2swhWmavz2YYgV/Aqhn6wD/vnpQd62nTWRRxEuN4ZO+2i5fBd5LoSOXraaUZ 8nsA== X-Gm-Message-State: AJIora9UtmYeLlwdnXGO/oOVok3koxsodvu4mp2s/h4MxFRlHB8RUR5Z JIsOjFKM67k9+yUJ0B7YladKhjbisY4oGA== X-Google-Smtp-Source: AGRyM1tbG1wTXwhHyz5sR+X0hCpI0rWRGWzkH80ECOqBIqI3A8r6wKS7HhT/PZnlAHYYHgrstQg3yw== X-Received: by 2002:a05:622a:1825:b0:318:6035:24e1 with SMTP id t37-20020a05622a182500b00318603524e1mr600055qtc.251.1656464569218; Tue, 28 Jun 2022 18:02:49 -0700 (PDT) Received: from [10.0.0.250] (pool-70-109-56-67.clppva.fios.verizon.net. [70.109.56.67]) by smtp.gmail.com with ESMTPSA id c21-20020ac87d95000000b003172da668desm10874739qtd.50.2022.06.28.18.02.48 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 28 Jun 2022 18:02:48 -0700 (PDT) Message-ID: <748f33b0-c77f-2c8f-48d1-6ca595420d0d@gmail.com> Date: Tue, 28 Jun 2022 21:02:47 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Content-Language: en-US To: u-boot@lists.denx.de Cc: xypron.glpk@gmx.de, takahiro.akashi@linaro.org From: Paul Barbieri Subject: [PATCH] EFI: Fix ReadBlocks API reading incorrect sector for, UCLASS_PARTITION devices X-Mailman-Approved-At: Wed, 29 Jun 2022 18:57:45 +0200 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean From 7a7dd7f16352fc916279cca05a3fa617f8bbef64 Mon Sep 17 00:00:00 2001 From: Paul Barbieri Date: Tue, 28 Jun 2022 20:24:33 -0400 Subject: [PATCH] EFI: Fix ReadBlocks API reading incorrect sector for UCLASS_PARTITION devices The requested partition disk sector incorrectly has the partition start sector added in twice for UCLASS_PARTITION devices. The efi_disk_rw_blocks() routine adds the diskobj->offset to the requested lba. When the device is a UCLASS_PARTITION, the dev_read() or dev_write() routine is called which adds part-gpt_part_info.start. This causes I/O to the wrong sector. Takahiro Akashi suggested removing the offset field from the efi_disk_obj structure since disk-uclass.c handles the partition start biasing. Device types other than UCLASS_PARTITION set the diskobj->offset field to zero which makes the field unnecessary. This change removes the offset field from the structure and removes all references from the code which is isolated to the lib/efi_loader/efi_disk.c module. This change also adds a test for the EFI ReadBlocks() API in the EFI selftest code. There is already a test for reading a FAT file. The new test uses ReadBlocks() to read the same "disk" block and compare it to the data read from the file system API. Signed-Off-by: Paul Barbieri Cc: Heinrich Schuchardt Cc: AKASHI Takahiro ---  lib/efi_loader/efi_disk.c                    |  8 +-------  lib/efi_selftest/efi_selftest_block_device.c | 19 +++++++++++++++++++  2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c index 1e82f52dc0..1d700b2a6b 100644 --- a/lib/efi_loader/efi_disk.c +++ b/lib/efi_loader/efi_disk.c @@ -35,7 +35,6 @@ const efi_guid_t efi_system_partition_guid = PARTITION_SYSTEM_GUID;   * @dp:                device path to the block device   * @part:      partition   * @volume:    simple file system protocol of the partition - * @offset:    offset into disk for simple partition   * @dev:       associated DM device   */  struct efi_disk_obj { @@ -47,7 +46,6 @@ struct efi_disk_obj {         struct efi_device_path *dp;         unsigned int part;         struct efi_simple_file_system_protocol *volume; -       lbaint_t offset;         struct udevice *dev; /* TODO: move it to efi_object */  }; @@ -117,7 +115,6 @@ static efi_status_t efi_disk_rw_blocks(struct efi_block_io *this,         diskobj = container_of(this, struct efi_disk_obj, ops);         blksz = diskobj->media.block_size;         blocks = buffer_size / blksz; -       lba += diskobj->offset;         EFI_PRINT("blocks=%x lba=%llx blksz=%x dir=%d\n",                   blocks, lba, blksz, direction); @@ -440,13 +437,11 @@ static efi_status_t efi_disk_add_dev(                 diskobj->dp = efi_dp_append_node(dp_parent, node);                 efi_free_pool(node); -               diskobj->offset = part_info->start;                 diskobj->media.last_block = part_info->size - 1;                 if (part_info->bootable & PART_EFI_SYSTEM_PARTITION)                         guid = &efi_system_partition_guid;         } else {                 diskobj->dp = efi_dp_from_part(desc, part); -               diskobj->offset = 0;                 diskobj->media.last_block = desc->lba - 1;         }         diskobj->part = part; @@ -501,12 +496,11 @@ static efi_status_t efi_disk_add_dev(                 *disk = diskobj;         EFI_PRINT("BlockIO: part %u, present %d, logical %d, removable %d" -                 ", offset " LBAF ", last_block %llu\n", +                 ", last_block %llu\n",                   diskobj->part,                   diskobj->media.media_present,                   diskobj->media.logical_partition,                   diskobj->media.removable_media, -                 diskobj->offset,                   diskobj->media.last_block);         /* Store first EFI system partition */ diff --git a/lib/efi_selftest/efi_selftest_block_device.c b/lib/efi_selftest/efi_selftest_block_device.c index 60fa655766..ef6bdafe2e 100644 --- a/lib/efi_selftest/efi_selftest_block_device.c +++ b/lib/efi_selftest/efi_selftest_block_device.c @@ -11,6 +11,7 @@   * ConnectController is used to setup partitions and to install the simple   * file protocol.   * A known file is read from the file system and verified. + * Test that the read_blocks API correctly reads a block from the device.   */  #include @@ -312,6 +313,7 @@ static int execute(void)         char buf[16] __aligned(ARCH_DMA_MINALIGN);         u32 part1_size;         u64 pos; +       char block[512];         /* Connect controller to virtual disk */         ret = boottime->connect_controller(disk_handle, NULL, NULL, 1); @@ -449,6 +451,23 @@ static int execute(void)                 return EFI_ST_FAILURE;         } +       /* Test read_blocks() can read same file data. */ +       boottime->set_mem(block, block_io_protocol->media->block_size, 0); +       ret = block_io_protocol->read_blocks(block_io_protocol, + block_io_protocol->media->media_id, +                                     (0x5000 >> LB_BLOCK_SIZE) - 1, + block_io_protocol->media->block_size, +                                     block); +       if (ret != EFI_SUCCESS) { +               efi_st_error("ReadBlocks failed\n"); +               return EFI_ST_FAILURE; +       } + +       if (memcmp(&block[1], buf, 11)) { +               efi_st_error("Unexpected block content\n"); +               return EFI_ST_FAILURE; +       } +  #ifdef CONFIG_FAT_WRITE         /* Write file */         ret = root->open(root, &file, u"u-boot.txt", EFI_FILE_MODE_READ |