Author: blueswirl
Date: 2007-10-16 22:59:36 +0200 (Tue, 16 Oct 2007)
New Revision: 171
Modified:
openbios-devel/modules/deblocker.c
openbios-devel/modules/disk-label.c
openbios-devel/modules/sun-parts.c
Log:
Fix 8 byte alignment problems
Modified: openbios-devel/modules/deblocker.c
===================================================================
--- openbios-devel/modules/deblocker.c 2007-09-29 11:33:31 UTC (rev 170)
+++ openbios-devel/modules/deblocker.c 2007-10-16 20:59:36 UTC (rev 171)
@@ -20,7 +20,7 @@
#include "modules.h"
typedef struct {
- ducell mark;
+ ucell mark_hi, mark_lo;
xt_t read_xt;
xt_t write_xt;
@@ -79,7 +79,8 @@
/* -1 means seek to EOF (at least in our implementation) */
if( (dcell)mark == -1 )
RET(-1);
- di->mark = mark;
+ di->mark_hi = pos_hi;
+ di->mark_lo = pos_lo;
/* 0,1 == success, -1 == error */
PUSH(0);
@@ -89,7 +90,8 @@
static void
deblk_tell( deblk_info_t *di )
{
- DPUSH( di->mark );
+ PUSH( di->mark_lo );
+ PUSH( di->mark_hi );
}
@@ -110,9 +112,10 @@
static void
split( deblk_info_t *di, char *data, int len, work_t w[3] )
{
+ ducell mark = ((ducell)di->mark_hi << BITS) | di->mark_lo;
memset( w, 0, sizeof(work_t[3]) );
- w[0].offs = di->mark % di->blksize;
+ w[0].offs = mark % di->blksize;
w[0].blk_buf = di->buf;
w[0].data = data;
if( w[0].offs ) {
@@ -141,13 +144,14 @@
char *dest = (char*)POP();
int last=0, retlen=0;
work_t w[3];
+ ducell mark = ((ducell)di->mark_hi << BITS) | di->mark_lo;
/* printk("read: %x %x\n", (int)dest, len ); */
if( !xt )
return -1;
- blk = di->mark / di->blksize;
+ blk = mark / di->blksize;
split( di, dest, len, w );
for( i=0; !last && i<3; i++ ) {
@@ -174,8 +178,11 @@
retlen += w[i].len;
blk += n;
}
- if( retlen > 0 )
- di->mark += retlen;
+ if( retlen > 0 ) {
+ mark += retlen;
+ di->mark_hi = mark >> BITS;
+ di->mark_lo = mark & (ucell) -1;
+ }
return retlen;
}
Modified: openbios-devel/modules/disk-label.c
===================================================================
--- openbios-devel/modules/disk-label.c 2007-09-29 11:33:31 UTC (rev 170)
+++ openbios-devel/modules/disk-label.c 2007-10-16 20:59:36 UTC (rev 171)
@@ -22,8 +22,8 @@
typedef struct {
int fd;
- ducell offs;
- ducell size;
+ ucell offs_hi, offs_lo;
+ ucell size_hi, size_lo;
int type; /* partition type or -1 */
ihandle_t part_ih;
@@ -94,8 +94,10 @@
if( !(xt=find_ih_method("get-info", di->part_ih)) )
goto out;
call_package( xt , di->part_ih );
- di->size = DPOP();
- di->offs = DPOP();
+ di->size_hi = POP();
+ di->size_lo = POP();
+ di->offs_hi = POP();
+ di->offs_lo = POP();
di->type = POP();
}
@@ -139,12 +141,14 @@
{
llong pos = DPOP();
int ret;
+ ducell offs = ((ducell)di->offs_hi << BITS) | di->offs_lo;
+ ducell size = ((ducell)di->size_hi << BITS) | di->size_lo;
if( pos != -1 )
- pos += di->offs;
- else if( di->size ) {
+ pos += offs;
+ else if( size ) {
/* printk("Seek EOF\n"); */
- pos = di->offs + di->size;
+ pos = offs + size;
} else {
/* let parent handle the EOF seek. */
}
@@ -159,8 +163,9 @@
dlabel_tell( dlabel_info_t *di )
{
llong pos = tell( di->fd );
+ ducell offs = ((ducell)di->offs_hi << BITS) | di->offs_lo;
if( pos != -1 )
- pos -= di->offs;
+ pos -= offs;
DPUSH( pos );
}
@@ -179,7 +184,8 @@
dlabel_offset( dlabel_info_t *di )
{
ullong rel = DPOP();
- rel += di->offs;
+ ducell offs = ((ducell)di->offs_hi << BITS) | di->offs_lo;
+ rel += offs;
DPUSH( rel );
}
Modified: openbios-devel/modules/sun-parts.c
===================================================================
--- openbios-devel/modules/sun-parts.c 2007-09-29 11:33:31 UTC (rev 170)
+++ openbios-devel/modules/sun-parts.c 2007-10-16 20:59:36 UTC (rev 171)
@@ -25,8 +25,8 @@
#endif
typedef struct {
- ullong offs;
- ullong size;
+ ucell offs_hi, offs_lo;
+ ucell size_hi, size_lo;
int type;
} sunparts_info_t;
@@ -95,6 +95,7 @@
unsigned char buf[512];
struct sun_disklabel *p;
unsigned int i, bs;
+ ducell offs, size;
DPRINTF("sunparts_open '%s'\n", str );
@@ -136,12 +137,16 @@
parnum = 0;
DPRINTF("Selected partition %d\n", parnum);
- di->offs = (llong)__be32_to_cpu(p->partitions[parnum].start_cylinder) *
+ offs = (llong)__be32_to_cpu(p->partitions[parnum].start_cylinder) *
__be16_to_cpu(p->ntrks) * __be16_to_cpu(p->nsect) * bs;
- di->size = (llong)__be32_to_cpu(p->partitions[parnum].num_sectors) * bs;
+ di->offs_hi = offs >> BITS;
+ di->offs_lo = offs & (ucell) -1;
+ size = (llong)__be32_to_cpu(p->partitions[parnum].num_sectors) * bs;
+ di->size_hi = size >> BITS;
+ di->size_lo = size & (ucell) -1;
di->type = __be32_to_cpu(p->infos[parnum].id);
- DPRINTF("Found Sun partition table, offs %d size %d\n", (int)di->offs, (int)di->size);
+ DPRINTF("Found Sun partition table, offs %lld size %lld\n", offs, size);
RET( -1 );
}
@@ -161,8 +166,10 @@
{
DPRINTF("Sun get_info\n");
PUSH( di->type );
- DPUSH( di->offs );
- DPUSH( di->size );
+ PUSH( di->offs_lo );
+ PUSH( di->offs_hi );
+ PUSH( di->size_lo );
+ PUSH( di->size_hi );
}
static void