* Unaligned access question
@ 2003-09-25 1:34 Ian Wienand
2003-09-25 2:04 ` Peter Chubb
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Ian Wienand @ 2003-09-25 1:34 UTC (permalink / raw)
To: linux-ia64
Hi,
This isn't directly related to kernel development, but I am a bit
stumped as to why my test program below causes an unaligned access
when 'i' is 7 (that is, when it tries to access across a 64 bit
boundary of 'array'). It's counter intuitive to me, I would have
expected it either fault on all loads (for every value of 'i') or to
have not faulted at all.
(yes, this is abstracted from some code that is chopping up data
coming over the network, which seems to be a common cause of alignment
problems).
Thanks for any suggestions,
-i
ianw@gelato.unsw.edu.au
http://www.gelato.unsw.edu.au
--- little test program ---
#include <stdio.h>
typedef struct a_struct_t {
unsigned char a[2];
} a_struct;
void print(const a_struct st) {
printf("%p -> %c | %p -> %c\n", &st.a[0], st.a[0], &st.a[1], st.a[1]);
}
int main(void)
{
unsigned char *array = "1234567812345678";
int i;
for ( i = 1 ; i < 10 ; i+=2 ) {
printf("array[%d] %p\n", i, &array[i]);
print( *((a_struct*)&array[i]) );
}
return 0;
}
--- sample output ---
array[1] 0x4000000000000a79
0x60000fffffffbcf0 -> 2 | 0x60000fffffffbcf1 -> 3
array[3] 0x4000000000000a7b
0x60000fffffffbcf0 -> 4 | 0x60000fffffffbcf1 -> 5
array[5] 0x4000000000000a7d
0x60000fffffffbcf0 -> 6 | 0x60000fffffffbcf1 -> 7
array[7] 0x4000000000000a7f
align(20189): unaligned access to 0x4000000000000a7f, ip=0x4000000000000770
0x60000fffffffbcf0 -> 8 | 0x60000fffffffbcf1 -> 1
array[9] 0x4000000000000a81
0x60000fffffffbcf0 -> 2 | 0x60000fffffffbcf1 -> 3
^ permalink raw reply [flat|nested] 4+ messages in thread* Unaligned access question
2003-09-25 1:34 Unaligned access question Ian Wienand
@ 2003-09-25 2:04 ` Peter Chubb
2003-09-25 2:23 ` Martin Pool
2003-09-25 8:32 ` Andreas Schwab
2 siblings, 0 replies; 4+ messages in thread
From: Peter Chubb @ 2003-09-25 2:04 UTC (permalink / raw)
To: linux-ia64
>>>>> "Ian" = Ian Wienand <ianw@gelato.unsw.edu.au> writes:
Ian> Hi,
Ian> This isn't directly related to kernel development, but I am a bit
Ian> stumped as to why my test program below causes an unaligned
Ian> access when 'i' is 7 (that is, when it tries to access across a
Ian> 64 bit boundary of 'array'). It's counter intuitive to me, I
Ian> would have expected it either fault on all loads (for every value
Ian> of 'i') or to have not faulted at all.
The IA64 can handle unaligned acceses itself if they're within a small
window -- eight bytes for Itanium-2, can't remember for Itanium-I --
and if PSR.ac is 0.
--
Dr Peter Chubb http://www.gelato.unsw.edu.au peterc AT gelato.unsw.edu.au
You are lost in a maze of BitKeeper repositories, all slightly different.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Unaligned access question
2003-09-25 1:34 Unaligned access question Ian Wienand
2003-09-25 2:04 ` Peter Chubb
@ 2003-09-25 2:23 ` Martin Pool
2003-09-25 8:32 ` Andreas Schwab
2 siblings, 0 replies; 4+ messages in thread
From: Martin Pool @ 2003-09-25 2:23 UTC (permalink / raw)
To: linux-ia64
[-- Attachment #1: Type: text/plain, Size: 802 bytes --]
On 25 Sep 2003, Ian Wienand <ianw@gelato.unsw.edu.au> wrote:
> Hi,
>
> This isn't directly related to kernel development, but I am a bit
> stumped as to why my test program below causes an unaligned access
> when 'i' is 7 (that is, when it tries to access across a 64 bit
> boundary of 'array'). It's counter intuitive to me, I would have
> expected it either fault on all loads (for every value of 'i') or to
> have not faulted at all.
I think adding
__attribute__ ((aligned (1)))
will make it read the structure in a way that can handle less-aligned
addresses. (Or maybe 2-byte aligned.) By default gcc assumes strong
alignment so that it can use faster operations (ld8 or something I
suppose).
As Peter said unaligned access will not necessarily trap.
--
Martin
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: Unaligned access question
2003-09-25 1:34 Unaligned access question Ian Wienand
2003-09-25 2:04 ` Peter Chubb
2003-09-25 2:23 ` Martin Pool
@ 2003-09-25 8:32 ` Andreas Schwab
2 siblings, 0 replies; 4+ messages in thread
From: Andreas Schwab @ 2003-09-25 8:32 UTC (permalink / raw)
To: linux-ia64
[-- Attachment #1: Type: text/plain, Size: 980 bytes --]
Martin Pool <mbp@samba.org> writes:
> On 25 Sep 2003, Ian Wienand <ianw@gelato.unsw.edu.au> wrote:
>> Hi,
>>
>> This isn't directly related to kernel development, but I am a bit
>> stumped as to why my test program below causes an unaligned access
>> when 'i' is 7 (that is, when it tries to access across a 64 bit
>> boundary of 'array'). It's counter intuitive to me, I would have
>> expected it either fault on all loads (for every value of 'i') or to
>> have not faulted at all.
>
> I think adding
>
> __attribute__ ((aligned (1)))
You cannot decrease alignment with the aligned attribute, for that you
need the packed attribute. This sets alignment to 1, which you can
increase again with the aligned attribute.
Andreas.
--
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux AG, Deutschherrnstr. 15-19, D-90429 Nürnberg
Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
[-- Attachment #2: Type: application/pgp-signature, Size: 188 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2003-09-25 8:32 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-09-25 1:34 Unaligned access question Ian Wienand
2003-09-25 2:04 ` Peter Chubb
2003-09-25 2:23 ` Martin Pool
2003-09-25 8:32 ` Andreas Schwab
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox