Message ID | 1424814498-6993-30-git-send-email-mdroth@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On 25 February 2015 at 17:39, Laurent Vivier <laurent@vivier.eu> wrote: > Hi, > > I think you should use abi_long instead of uint32_t. > > abi_long has an "aligned" attribute, and on m68k long are aligned on a short > boundary. > > > #ifdef TARGET_M68K > #define ABI_INT_ALIGNMENT 2 > #define ABI_LONG_ALIGNMENT 2 > #define ABI_LLONG_ALIGNMENT 2 > #endif > > typedef uint32_t abi_ulong __attribute__((aligned(ABI_LONG_ALIGNMENT))); In this instance it doesn't matter because get_sigframe() aligns the pointer we're going to write the sigframe to, and the elements in the struct before retcode[] won't make it worse than 4-aligned, I think? -- PMM
On 25 February 2015 at 20:58, Laurent Vivier <laurent@vivier.eu> wrote: > >> Le 25 février 2015 à 12:28, Peter Maydell <peter.maydell@linaro.org> a >> écrit : >> >> >> On 25 February 2015 at 17:39, Laurent Vivier <laurent@vivier.eu> wrote: >> > Hi, >> > >> > I think you should use abi_long instead of uint32_t. >> > >> > abi_long has an "aligned" attribute, and on m68k long are aligned on a >> > short >> > boundary. >> > >> > >> > #ifdef TARGET_M68K >> > #define ABI_INT_ALIGNMENT 2 >> > #define ABI_LONG_ALIGNMENT 2 >> > #define ABI_LLONG_ALIGNMENT 2 >> > #endif >> > >> > typedef uint32_t abi_ulong __attribute__((aligned(ABI_LONG_ALIGNMENT))); >> >> In this instance it doesn't matter because get_sigframe() aligns >> the pointer we're going to write the sigframe to, and the elements >> in the struct before retcode[] won't make it worse than 4-aligned, >> I think? > > Yes, I agree. But the aim of the abi_* types is to define the target ABI. > Thus, for consistency it should better to use the abi_long (or abi_ulong) > instead of uint32_t. Well, strictly speaking this is writing instructions into a byte array rather than ABI longs, so it ought to do it byte-at-a-time to respect the definition of the struct. Anyway, if you want to submit a patch I don't object. -- PMM
diff --git a/linux-user/signal.c b/linux-user/signal.c index e11b208..a324fd1 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -5091,7 +5091,7 @@ static void setup_frame(int sig, struct target_sigaction *ka, /* moveq #,d0; trap #0 */ __put_user(0x70004e40 + (TARGET_NR_sigreturn << 16), - (long *)(frame->retcode)); + (uint32_t *)(frame->retcode)); /* Set up to return from userspace */ @@ -5225,8 +5225,8 @@ static void setup_rt_frame(int sig, struct target_sigaction *ka, /* moveq #,d0; notb d0; trap #0 */ __put_user(0x70004600 + ((TARGET_NR_rt_sigreturn ^ 0xff) << 16), - (long *)(frame->retcode + 0)); - __put_user(0x4e40, (short *)(frame->retcode + 4)); + (uint32_t *)(frame->retcode + 0)); + __put_user(0x4e40, (uint16_t *)(frame->retcode + 4)); if (err) goto give_sigsegv;