From mboxrd@z Thu Jan 1 00:00:00 1970 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 phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6C436C43334 for ; Thu, 30 Jun 2022 11:27:02 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 679EC844DE; Thu, 30 Jun 2022 13:26:26 +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="f7OG/k0e"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id E6916843EA; Thu, 30 Jun 2022 13:03:06 +0200 (CEST) Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) (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 478B68432E for ; Thu, 30 Jun 2022 13:03:04 +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-qk1-x72c.google.com with SMTP id r138so14024812qke.13 for ; Thu, 30 Jun 2022 04:03:04 -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; bh=uVbxApX0GLNKkkhvqreu/nYEfuU+RjKRvZqZsV4vOOs=; b=f7OG/k0eOnIWpThTBOB1LEw03pFpzXUaiBRmuYMRYuB5sO2vUqldq4z6ba5uTUTD5P epZNq8bNMIeA8stoEL9K/Pgnf27nP3ofii2/VJFGG3o2u/RVBXUNetsof7w69yyIFVRi 7DSyxz7Bl5+yeFikXNJ2E856SZYX9kObtM8Rk8YZiPFzezdw/ZxZ4Az0gjZjJ2PdndrG lpVIfnnREOmvcHdvGZodcIbMGt07VM5qyKZcD288Rp5csJ1EEBwjRAtXwiFtiPChEwE+ mG8cd/DLTxTQzCjWykbKu96H5SAwhZSBJhb12xdXfwA1ODb7RdRR1vbH1PhiXCtqXEov A5Xg== 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; bh=uVbxApX0GLNKkkhvqreu/nYEfuU+RjKRvZqZsV4vOOs=; b=ePWX5BAqRZ1L0/omIbNFab+wLosQ4ZvqRyFp+4lXZGJPNbC6GZ75UAT9lVF6+qVEwM yA+ZZkAR2K8WyICaWsjxXN2mivLmQnR/ce98+B0SqHu29XVOdAN5OMOQWBBQFUUmpAWV Yb87Zgjkg6hfgdHQuZcnmAY/txfMNQ1ZSNLi3vu6cTBLPAoC0BVmmBvRYe9d9aiXsEGG 9+lchFTXEzwlrO4P9Ry3a85MI18sjyk+x2NDk0gOGWTniWYuIuOTqnKTGkA9fzNSPzsE GG/MlGJikF/lt1/Td/kX96s/73KcL9kgEtCTi5KvBEKLDrpBUCEFh97Xg3RwPFH0ByY+ 3fNQ== X-Gm-Message-State: AJIora+Te3AySnbMlM9gIz0Yv3Hh8QpnFUIeNgQ912uzNTKFhPlasMvV CNghS1Ug2xhxTQtxJzicnraoBDbXHqG8XQ== X-Google-Smtp-Source: AGRyM1vI3X0F9zPL8lYglYOzsKoWggxWlvkg+/47GX37JzqvW6LvQN3p9LtpLshhwRFvtiG6QdCHPA== X-Received: by 2002:a37:d281:0:b0:6af:24c7:a981 with SMTP id f123-20020a37d281000000b006af24c7a981mr5688499qkj.736.1656586982325; Thu, 30 Jun 2022 04:03:02 -0700 (PDT) Received: from barbieri-MS-7C37.xts.us.baesystems.com (pool-70-109-56-67.clppva.fios.verizon.net. [70.109.56.67]) by smtp.gmail.com with ESMTPSA id x8-20020a05620a258800b006a75a0ffc97sm15693813qko.3.2022.06.30.04.03.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jun 2022 04:03:01 -0700 (PDT) From: Paul Barbieri To: u-boot@lists.denx.de Cc: Paul Barbieri , Heinrich Schuchardt , AKASHI Takahiro Subject: [PATCH v3] EFI: Fix ReadBlocks API reading incorrect sector for UCLASS_PARTITION devices Date: Thu, 30 Jun 2022 07:02:04 -0400 Message-Id: <20220630110204.19160-1-plb365@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <90538c2d-2fa2-3c7d-7e4f-ec26164cf06e@gmx.de> References: <90538c2d-2fa2-3c7d-7e4f-ec26164cf06e@gmx.de> X-Mailman-Approved-At: Thu, 30 Jun 2022 13:26:18 +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 The requsted partition disk sector incorrectly has the parition 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 --- Changes for v3: - Added requested comment in test code lib/efi_loader/efi_disk.c | 8 +----- lib/efi_selftest/efi_selftest_block_device.c | 28 ++++++++++++++++++++ 2 files changed, 29 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..d11f673148 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,9 @@ static int execute(void) char buf[16] __aligned(ARCH_DMA_MINALIGN); u32 part1_size; u64 pos; + char block[2 * (1 << LB_BLOCK_SIZE)]; + char *block_io_aligned; + u32 align; /* Connect controller to virtual disk */ ret = boottime->connect_controller(disk_handle, NULL, NULL, 1); @@ -449,6 +453,30 @@ static int execute(void) return EFI_ST_FAILURE; } + /* Test read_blocks() can read same file data. */ + boottime->set_mem(block, sizeof(block), 0); + align = block_io_protocol->media->io_align; + block_io_aligned = (char *)(((uintptr_t)block + align-1) & ~(align-1)); + /* In the test data, the partition starts at block 1 and the file + hello.txt with the content 'Hello world!' is located at 0x5000 + of the disk. Here we read block 0x27 (offset 0x4e00 of the + partition) and expect the string 'Hello world!' to be at the + start of block. */ + 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_io_aligned); + if (ret != EFI_SUCCESS) { + efi_st_error("ReadBlocks failed\n"); + return EFI_ST_FAILURE; + } + + if (memcmp(&block_io_aligned[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 | -- 2.17.1