Hello!
This is an Alpha AXPpxi33, ev4
gcc 2.96 (egcs-20000410)
kernel 2.3.99-pre5
I get an unaligned access in sys_swapon():
[from /proc/cpuinfo]:
kernel unaligned acc : 10 (pc=fffffc0000346384,va=fffffc0007c8fff6)
[from System.map]:
fffffc0000345bc0 T get_swaparea_info
fffffc0000345e10 T is_swap_partition
fffffc0000345e80 T sys_swapon
fffffc00003468c0 T si_swapinfo
fffffc00003469d0 T swap_duplicate
[gcc invocation]:
gcc -D__KERNEL__ -I/usr/src/linux-2.3.99-pre5-work/include -Wall
-Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing
-pipe -mno-fp-regs -ffixed-8 -mcpu=ev4 -Wa,-mev6
-c -o swapfile.o swapfile.c
[disassembled from swapfile.o]:
16e8: 1f 04 ff 47 nop
16ec: 00 00 e0 2f unop
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:700
16f0: fa 1f ef b3 stl zero,8186(fp)
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:704
16f4: 01 00 ff 24 ldah t6,1(zero)
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:700
16f8: fc 1f 2f a0 ldl t0,8188(fp)
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:701
16fc: 11 04 ff 47 clr a1
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:704
1700: 01 00 bf 20 lda t4,1(zero)
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:700
1704: f6 1f ef b3 stl zero,8182(fp) <-------- this is the
unaligned access
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:704
1708: ff ff e7 20 lda t6,-1(t6)
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:700
170c: 21 76 3e 48 zapnot t0,0xf3,t0
1710: fc 1f 2f b0 stl t0,8188(fp)
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:702
1714: 20 00 e9 b3 stl zero,32(s0)
/usr/src/linux-2.3.99-pre5-work/mm/swapfile.c:703
1718: 24 00 e9 b3 stl zero,36(s0)
171c: 00 00 e0 2f unop
[from swapfile.c]:
698: switch (swap_header_version) {
699: case 1:
700: memset(((char *) swap_header)+PAGE_SIZE-10,0,10);
701: j = 0;
702: p->lowest_bit = 0;
703: p->highest_bit = 0;
704: for (i = 1 ; i < 8*PAGE_SIZE ; i++) {
705: if (test_bit(i,(char *) swap_header)) {
So memset tries to fill the last 10 bytes of a page with '0'. But 2 of the
3 stl insns use an unaligned address!
...this page... | ...next page...
[0] [1] .... [8176] [8180] [8184] [8188]| [8192]
0123 4567 .... 0123 4567 89ab cdef | 0123
|
16f0:: WW WW unaligned write
16f8:: RRRR aligned read
1704:: WW WW unaligned write
1710:: ..WW aligned write
>From asm-alpha/string.h it appears thet memset is in fact __builtin_memset
in this case. Is this a gcc problem or did I miss something?
Bye,
Thorsten
--
| Thorsten Kranzkowski Internet: [EMAIL PROTECTED] |
| Mobile: ++49 170 1876134 Snail: Niemannsweg 30, 49201 Dissen, Germany |
| Ampr: dl8bcu@db0lj.#rpl.deu.eu, [EMAIL PROTECTED] [44.130.8.19] |