Linksys WRT54G experiments - unaligned data access

Published on: 2005-12-26

Home | Archive

Linksys WRT54G experiments - unaligned data access

2005-12-26T22:34:00

Read my old entry on the Linux based WRT54G here. IBM DeveloperWorks has an interesting article about data alignment here The article says that MIPS h/w doesn't support unaligned data access. I wrote a program to test this out:


#include <sys/sysmips.h>
#include <signal.h>

void handler(int n)
{
	printf("caught %d\n", n);
	exit(1);
}

main()
{
	int a[100];
	int *p;
	signal(SIGBUS, handler);
	p = (char*)a + 1;
	*p = 1;
	printf("after unaligned access ...\n");
}
No problem at all ... the print statement after `*p = 1' seems to work perfectly! A few moments spent digging around the kernel source identified the reason - it seems the kernel catches the exception which the hardware generates and `emulates' the unaligned access in software (arch/mips/kernel/unaligned.c)! This `emulation' can be turned off by calling: sysmips(MIPS_FIXADE, 0); It may be instructive to demonstrate the necessity for structure padding by turning off padding (use -fpack-struct in gcc) and generating unaligned accesses. The effect on MIPS is much more dramatic than on x86 CPU's which can perform unaligned access.

Eric Smith

Fri Nov 13 08:36:01 2009

MIPS also has unaligned load/store instructions (which were patented, but the patent has now expired). These instructions are useful when you know that an access will be unaligned; it takes two instructions to do the access, but it won't trap. I doubt that the C compiler is smart enough to ever infer that they should be used.