As already noticed this is actually on purpose to align pointer on addr_t
size.

On Thu, 11 Apr 2019, 20:04 Milo Wenxiang Niu, <printer...@aliyun.com> wrote:

> From: Milo Wenxiang X Niu <printer...@aliyun.com>
>
> It's just to remove the common factor: "sizeof (grub_addr_t)"  from the
> numerator and denominator of the fractional expression of next var.
> Let me explain it:
> Shortly:
>         H: struct grub_module_header ;
>         B: grub_uint32_t ;
>         A: grub_addr_t;
>
> Thus, original expression can be expressed as:
>         var = (H *)((B*)var) + ( offset_exp ))
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>              (((H*)var)->size + sizeof(A) - 1)    sizeof(A)  |
> offset_exp = --------------------------------- * ----------- |
>                       sizeof(A)                   sizeof(B)  |
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> Remove the common factor "sizeof(A)" of fractional offset_exp, we got the
> result.
> offset_exp_new = ((H*)->size + sizeof(A) - 1) / sizeof(B)
>                            = ((struct grub_module_header *) var)->size +
> sizeof (grub_addr_t) -1) / sizeof (grub_uint32_t)
>
> so:
> var =(H *)(((B*)var) + ( (((H*)var)->size + sizeof(A) - 1) / sizeof(B) ))
> That's what I do.
>
> Still, the new offset express is meaningfull:
>     *numerator: ((struct grub_module_header *) var)->size + sizeof
> (grub_addr_t) -1)
>                 it present the offset value united by byte.
>         *denominator: sizeof (grub_uint32_t)
>                 it's means "struct grub_module_header" aligned by
> sizeof(grub_uint32_t)
> ---
>  include/grub/kernel.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/include/grub/kernel.h b/include/grub/kernel.h
> index 133a37c..b257224 100644
> --- a/include/grub/kernel.h
> +++ b/include/grub/kernel.h
> @@ -104,7 +104,7 @@ extern grub_addr_t EXPORT_VAR (grub_modbase);
>    var && (grub_addr_t) var \
>      < (grub_modbase + (((struct grub_module_info *)
> grub_modbase)->size));    \
>    var = (struct grub_module_header *)                                  \
> -    (((grub_uint32_t *) var) + ((((struct grub_module_header *)
> var)->size + sizeof (grub_addr_t) - 1) / sizeof (grub_addr_t)) * (sizeof
> (grub_addr_t) / sizeof (grub_uint32_t))))
> +    (((grub_uint32_t *) var) + ((((struct grub_module_header *)
> var)->size + sizeof (grub_addr_t) - 1) / sizeof (grub_uint32_t))))
>
>  grub_addr_t grub_modules_get_end (void);
>
> --
> 1.8.3.1
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to