On Thu, 19 Nov 2020 00:35:44 +0900
Masami Hiramatsu <mhira...@kernel.org> wrote:

> +
> +     /* To align up the total size to BOOTCONFIG_ALIGN, get padding size */
> +     total_size = stat.st_size + size + sizeof(u32) * 2 + 
> BOOTCONFIG_MAGIC_LEN;
> +     pad = BOOTCONFIG_ALIGN - total_size % BOOTCONFIG_ALIGN;
> +     if (pad == BOOTCONFIG_ALIGN)
> +             pad = 0;

If alignment is always a power of two, you could simply do:

        pad = (total_size + BOOTCONFIG_ALIGN - 1) &  ~(BOOTCONFIG_ALIGN - 1)) - 
total_size;

Which will give you the proper padding, without the if.

> +     size += pad;
> +
> +     /* Add a footer */
> +     *(u32 *)(data + size) = size;
> +     *(u32 *)(data + size + sizeof(u32)) = csum;
> +     memcpy(data + size + sizeof(u32) * 2, BOOTCONFIG_MAGIC, 
> BOOTCONFIG_MAGIC_LEN);
> +     total_size = size + sizeof(u32) * 2 + BOOTCONFIG_MAGIC_LEN;

I wonder if it would be cleaner to just have a void pointer index for the above:

        void *p;

        p = data + size;
        *(u32 *)p = size;
        p += sizeof(u32);

        *(u32 *)p = csum;
        p += sizeof(u32);

        memcpy(p, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
        p += BOOTCONFIG_MAGIC_LEN;

        total_size = p - (void *)data;

Also, how does this work if we run this on a little endian box for a big
endian crossbuild?

-- Steve


> +
> +     ret = write(fd, data, total_size);
> +     if (ret < total_size) {
>               if (ret < 0)
>                       ret = -errno;
>               pr_err("Failed to apply a boot config: %d\n", ret);
> -             if (ret < 0)
> -                     goto out;
> -             goto out_rollback;
> -     }
> -     /* Write a magic word of the bootconfig */
> -     ret = write(fd, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN);
> -     if (ret < BOOTCONFIG_MAGIC_LEN) {
> -             if (ret < 0)
> -                     ret = -errno;
> -             pr_err("Failed to apply a boot config magic: %d\n", ret);
> -             goto out_rollback;
> -     }
> -     ret = 0;
> +             if (ret > 0)
> +                     goto out_rollback;
> +     } else
> +             ret = 0;
> +
>  out:
>       close(fd);
>       free(data);

Reply via email to