]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
gpt: Use cache aligned buffers for gpt_h and gpt_e
authorLukasz Majewski <lukma@denx.de>
Fri, 27 Oct 2017 10:28:10 +0000 (12:28 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 6 Nov 2017 14:59:01 +0000 (09:59 -0500)
Before this patch one could receive following errors when executing
"gpt write" command on machine with cache enabled:

display5 factory > gpt write mmc ${mmcdev} ${partitions}
Writing GPT:
CACHE: Misaligned operation at range [4ef8f7f04ef8f9f0]
CACHE: Misaligned operation at range [4ef8f9f84ef939f8]
CACHE: Misaligned operation at range [4ef8f9f84ef939f8]
CACHE: Misaligned operation at range [4ef8f7f04ef8f9f0]
success!

To alleviate this problem - the calloc()s have been replaced with
malloc_cache_aligned() and memset().

After those changes the buffers are properly aligned (with both start
address and size) to SoC cache line.

Signed-off-by: Lukasz Majewski <lukma@denx.de>
disk/part_efi.c

index 7862beeea6f8392e736d832ceb40949049e8f458..f6f5bee8cd8b8b6f0474858151155f367deb4e0f 100644 (file)
@@ -622,25 +622,27 @@ int gpt_fill_header(struct blk_desc *dev_desc, gpt_header *gpt_h,
 int gpt_restore(struct blk_desc *dev_desc, char *str_disk_guid,
                disk_partition_t *partitions, int parts_count)
 {
 int gpt_restore(struct blk_desc *dev_desc, char *str_disk_guid,
                disk_partition_t *partitions, int parts_count)
 {
-       int ret;
-
-       gpt_header *gpt_h = calloc(1, PAD_TO_BLOCKSIZE(sizeof(gpt_header),
-                                                      dev_desc));
+       gpt_header *gpt_h;
        gpt_entry *gpt_e;
        gpt_entry *gpt_e;
+       int ret, size;
 
 
+       size = PAD_TO_BLOCKSIZE(sizeof(gpt_header), dev_desc);
+       gpt_h = malloc_cache_aligned(size);
        if (gpt_h == NULL) {
                printf("%s: calloc failed!\n", __func__);
                return -1;
        }
        if (gpt_h == NULL) {
                printf("%s: calloc failed!\n", __func__);
                return -1;
        }
+       memset(gpt_h, 0, size);
 
 
-       gpt_e = calloc(1, PAD_TO_BLOCKSIZE(GPT_ENTRY_NUMBERS
-                                              * sizeof(gpt_entry),
-                                              dev_desc));
+       size = PAD_TO_BLOCKSIZE(GPT_ENTRY_NUMBERS * sizeof(gpt_entry),
+                               dev_desc);
+       gpt_e = malloc_cache_aligned(size);
        if (gpt_e == NULL) {
                printf("%s: calloc failed!\n", __func__);
                free(gpt_h);
                return -1;
        }
        if (gpt_e == NULL) {
                printf("%s: calloc failed!\n", __func__);
                free(gpt_h);
                return -1;
        }
+       memset(gpt_e, 0, size);
 
        /* Generate Primary GPT header (LBA1) */
        ret = gpt_fill_header(dev_desc, gpt_h, str_disk_guid, parts_count);
 
        /* Generate Primary GPT header (LBA1) */
        ret = gpt_fill_header(dev_desc, gpt_h, str_disk_guid, parts_count);