Author: mcayland Date: Sun Apr 21 10:27:23 2013 New Revision: 1128 URL: http://tracker.coreboot.org/trac/openbios/changeset/1128
Log: SPARC: Fix escc instance structure alignment
When binding C functions to Forth words using NODE_METHODs for the SPARC ESCC serial driver, the C instance parameter pointer was set to be a pointer to a phys_addr_t.
This is incorrect in the case where sizeof(phys_addr_t) != sizeof(cell) such as on SPARC32, as the address allocated from the Forth machine would be aligned to sizeof(cell); hence an alignment exception could be generated on random occasions on SPARC32 when the allocated address generated by Forth when opening the device was aligned to just 4 bytes (and not also 8 bytes) when dereferencing the instance parameter pointer.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk
Modified: trunk/openbios-devel/drivers/escc.c
Modified: trunk/openbios-devel/drivers/escc.c ============================================================================== --- trunk/openbios-devel/drivers/escc.c Sun Apr 21 10:27:21 2013 (r1127) +++ trunk/openbios-devel/drivers/escc.c Sun Apr 21 10:27:23 2013 (r1128) @@ -131,7 +131,7 @@
/* ( addr len -- actual ) */ static void -escc_read(phys_addr_t *address) +escc_read(ucell *address) { char *addr; int len; @@ -152,7 +152,7 @@
/* ( addr len -- actual ) */ static void -escc_write(phys_addr_t *address) +escc_write(ucell *address) { unsigned char *addr; int i, len; @@ -172,7 +172,7 @@ }
static void -escc_open(phys_addr_t *address) +escc_open(ucell *address) { #ifdef CONFIG_DRIVER_ESCC_SUN int len; @@ -199,7 +199,7 @@ RET ( -1 ); }
-DECLARE_UNNAMED_NODE(escc, INSTALL_OPEN, sizeof(phys_addr_t)); +DECLARE_UNNAMED_NODE(escc, INSTALL_OPEN, sizeof(ucell));
NODE_METHODS(escc) = { { "open", escc_open },