From f02525dde50c7059756da9bbfe087d5d60d0ec08 Mon Sep 17 00:00:00 2001 From: David Given Date: Tue, 19 Jan 2016 21:46:44 +0100 Subject: [PATCH] Fix 32-bit alignment issues. --- Applications/util/init.c | 5 +++-- Kernel/syscall_fs.c | 7 ++++--- Library/include/syscalls.h | 12 +++++++----- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Applications/util/init.c b/Applications/util/init.c index f8b2f13d..678f90a4 100644 --- a/Applications/util/init.c +++ b/Applications/util/init.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -328,10 +329,10 @@ static void parse_inittab(void) while (sdata < sdata_end) parse_initline(); /* Allocate space for the control arrays */ - initpid = (uint16_t *) idata; - idata += 2 * initcount; initptr = (uint8_t **) idata; idata += sizeof(void *) * initcount; + initpid = (uint16_t *) idata; + idata += 2 * initcount; if (brk(idata) == -1) putstr("unable to return space\n"); memset(initpid, 0, 2 * initcount); diff --git a/Kernel/syscall_fs.c b/Kernel/syscall_fs.c index 2c8056a7..ac868845 100644 --- a/Kernel/syscall_fs.c +++ b/Kernel/syscall_fs.c @@ -134,9 +134,10 @@ arg_t _fstat(void) /* Utility for stat and fstat */ int stcpy(inoptr ino, char *buf) { - int err = uput((char *) &(ino->c_dev), buf, 12); - err |= uput((char *) &(ino->c_node.i_addr[0]), buf + 12, 2); - err |= uput((char *) &(ino->c_node.i_size), buf + 14, 16); + int err = uput((char *) &(ino->c_node.i_size), buf + 0, 5*4); + err |= uput((char *) &(ino->c_dev), buf + 5*4, 2*2); + err |= uput((char *) &(ino->c_node.i_mode), buf + 5*4 + 2*2, 4*2); + err |= uput((char *) &(ino->c_node.i_addr[0]), buf + 5*4 + 6*2, 1*2); return err; } diff --git a/Library/include/syscalls.h b/Library/include/syscalls.h index 3adde780..dd501eeb 100644 --- a/Library/include/syscalls.h +++ b/Library/include/syscalls.h @@ -15,6 +15,13 @@ extern int syscall(int callno, ...); struct _uzistat { + /* For alignment reasons, arrange this structure with largest objects + * first. */ + uint32_t st_size; + uint32_t st_atime; + uint32_t st_mtime; + uint32_t st_ctime; + uint32_t st_timeh; /* Time high bytes */ int16_t st_dev; uint16_t st_ino; uint16_t st_mode; @@ -22,11 +29,6 @@ struct _uzistat uint16_t st_uid; uint16_t st_gid; uint16_t st_rdev; - uint32_t st_size; - uint32_t st_atime; - uint32_t st_mtime; - uint32_t st_ctime; - uint32_t st_timeh; /* Time high bytes */ }; struct _uzisysinfoblk { -- 2.34.1