summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Dariz <luca@orpolo.org>2022-06-28 11:49:25 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2022-08-27 23:52:08 +0200
commitd29057d0866a663d4a5a867147a4a6366c12a647 (patch)
tree32ce8276b2857d78edbada89d2d60eddea3a19dd
parent39e68c6ed7c9d6a2a73ab079846bc53c2839351f (diff)
fix message fields alignment for 64 bit
On x86_64 alignment of structures is different, as the pointer size is different. For simplicity we keep the same 4-byte alignment as used on 32-bit. This simplifies the support for 32-bit rpc on 64-bit kernels, and also it seems not worth as an optimization, as we would need to add more code in the ipc_kmsg* routines. * routine.c: align both short and long descriptors * utils.c: use a fixed alignment for data fields in structures representing messages. Signed-off-by: Luca Dariz <luca@orpolo.org> Message-Id: <20220628094927.442907-2-luca@orpolo.org>
-rw-r--r--routine.c4
-rw-r--r--utils.c2
2 files changed, 4 insertions, 2 deletions
diff --git a/routine.c b/routine.c
index 0edc6b9..6972e14 100644
--- a/routine.c
+++ b/routine.c
@@ -321,9 +321,9 @@ rtFindSize(const argument_t *args, u_int mask)
{
ipc_type_t *it = arg->argType;
+ /* might need proper alignment on demanding 64bit archies */
+ size = (size + word_size-1) & ~(word_size-1);
if (arg->argLongForm) {
- /* might need proper alignment on 64bit archies */
- size = (size + word_size-1) & ~(word_size-1);
size += sizeof_mach_msg_type_long_t;
} else {
size += sizeof_mach_msg_type_t;
diff --git a/utils.c b/utils.c
index bdc39b7..a8ebc6b 100644
--- a/utils.c
+++ b/utils.c
@@ -338,10 +338,12 @@ void
WriteStructDecl(FILE *file, const argument_t *args, write_list_fn_t *func,
u_int mask, const char *name)
{
+ fprintf(file, "#pragma pack(push,%d)\n", word_size);
fprintf(file, "\ttypedef struct {\n");
fprintf(file, "\t\tmach_msg_header_t Head;\n");
WriteList(file, args, func, mask, "\n", "\n");
fprintf(file, "\t} %s;\n", name);
+ fprintf(file, "#pragma pack(pop)\n");
fprintf(file, "\n");
}