[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2] Optimization calculation expression of FOR_MODULES(var)
From: |
Milo Wenxiang Niu |
Subject: |
[PATCH v2] Optimization calculation expression of FOR_MODULES(var) |
Date: |
Thu, 11 Apr 2019 04:39:47 -0400 |
From: Milo Wenxiang X Niu <address@hidden>
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
- [PATCH v2] Optimization calculation expression of FOR_MODULES(var),
Milo Wenxiang Niu <=