[OpenBIOS] r171 - openbios-devel/modules

svn at openbios.org svn at openbios.org
Tue Oct 16 22:59:36 CEST 2007


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




More information about the OpenBIOS mailing list