[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [PATCH] silo: Add 64-bit support



Some comments regarding the stack frames...
    
    Signed-off-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
    ---
     Rules.make          |  5 ++---
     common/console.c    |  6 +++---
     common/divdi3.S     | 11 ++++++++++-
     common/jmp.S        | 10 ++++++++--
     common/prom.c       |  4 ++--
     common/tree.c       |  8 ++++----
     common/udivdi3.S    | 10 +++++++++-
     first-isofs/crt0.S  |  8 +++++++-
     first-isofs/isofs.c |  6 +++---
     second/crt0.S       | 21 +++++++++++++++++++--
     second/disk.c       |  8 ++++----
     second/file.c       |  2 +-
     second/muldi3.S     | 10 +++++++++-
     silo/silo.c         | 12 ++++++------
     14 files changed, 87 insertions(+), 34 deletions(-)
    
    diff --git a/Rules.make b/Rules.make
    index 0f176db..e46af48 100644
    --- a/Rules.make
    +++ b/Rules.make
    @@ -2,10 +2,9 @@ VERSION=1.4.14
     IMGVERSION=0.99
     SHELL=/bin/bash
     RM=rm -f
    -# We want to force 32-bit builds
    -CC=gcc -m32
    +CC=gcc
     HOSTCC=gcc
    -LD=ld -m elf32_sparc
    +LD=ld
     AS=as
     STRIP=strip
     NM=nm
    diff --git a/common/console.c b/common/console.c
    index 44d7efb..270caca 100644
    --- a/common/console.c
    +++ b/common/console.c
    @@ -27,7 +27,7 @@ prom_nbgetchar(void)
     			i = inc;
     		break;
     	case PROM_P1275:
    -		if (p1275_cmd ("read", 3, prom_stdin, &inc, 1) == 1)
    +		if (p1275_cmd ("read", 3, (unsigned int) prom_stdin, &inc, 1) == 1)
     			i = inc;
     		break;
     	}
    @@ -55,7 +55,7 @@ prom_nbputchar(char c)
     		break;
     	case PROM_P1275:
     		outc = c;
    -		if (p1275_cmd ("write", 3, prom_stdout, &outc, 1) == 1)
    +		if (p1275_cmd ("write", 3, (unsigned int) prom_stdout, &outc, 1) == 1)
     			i = 0;
     		break;
     	}
    @@ -93,7 +93,7 @@ prom_puts (char *s, int len)
     		(*(romvec->pv_v2devops).v2_dev_write)(prom_stdout, s, len);
     		break;
     	case PROM_P1275:
    -		p1275_cmd ("write", 3, prom_stdout, s, len);
    +		p1275_cmd ("write", 3, (unsigned int) prom_stdout, s, len);
     		break;
     	}
     }
    diff --git a/common/divdi3.S b/common/divdi3.S
    index 681b368..128df53 100644
    --- a/common/divdi3.S
    +++ b/common/divdi3.S
    @@ -17,9 +17,18 @@ along with GNU CC; see the file COPYING.  If not, write to
     the Free Software Foundation, 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.  */
     
    +#if __WORDSIZE == 32
    +# define STACK_BIAS 0
    +#else
    +#define STACK_BIAS 2047
    +#endif
    +
     	.data
     	.align 8
     	.globl	__clz_tab
    +	.register %g2,#scratch
    +	.register %g3,#scratch
    +
     __clz_tab:
     	.byte	0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
     	.byte	6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
    @@ -36,7 +45,7 @@ __clz_tab:
     	.align 4
     	.globl __divdi3
     __divdi3:
    -	save %sp,-104,%sp
    +	save %sp,-STACK_BIAS-104,%sp


Subtracting the stack bias in that save instruction is wrong.  I would
suggest using something like this instead:

#if __WORDSIZE == 32
  save %sp,-104,%sp
#else
  save %sp,-192,%sp
#endif

        cmp %i0,0
     	bge .LL40
     	mov 0,%l4
    diff --git a/common/jmp.S b/common/jmp.S
    index 3bc8c94..a446d78 100644
    --- a/common/jmp.S
    +++ b/common/jmp.S
    @@ -18,7 +18,13 @@
        Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
        USA.  */
     
    -#define _SV save %sp, -0x40, %sp
    +#if __WORDSIZE == 32
    +# define STACK_BIAS 0
    +#else
    +# define STACK_BIAS 2047
    +#endif
    +
    +#define _SV save %sp, -STACK_BIAS-0x40, %sp

Same problem than above.  Here I would suggest something like this:

#if __WORDSIZE == 32
# define FRAMESIZE 0x40
#else
# define FRAMESIZE 0x80
#endif

#define _SV save %sp, -FRAMESIZE, %sp

     #define _RV restore
     #define FLUSH_ALL_WINDOWS \
     	_SV; _SV; _SV; _SV; _SV; _SV; _SV; \
    @@ -46,7 +52,7 @@ __longjmp:
     	FLUSH_ALL_WINDOWS
     	ld [%o0], %o7		/* Return PC.  */
     	ld [%o0 + 4], %fp	/* Saved SP.  */
    -	sub %fp, 64, %sp	/* Allocate a register save area.  */
    +	sub %fp, 64+STACK_BIAS, %sp	/* Allocate a register save area.  */

And then use FRAMESIZE here:
sub %fp, FRAMESIZE, %sp

        tst %o1
     	be,a 1f
     	mov 1, %o1
    diff --git a/common/prom.c b/common/prom.c
    index 939bbb9..7585e10 100644
    --- a/common/prom.c
    +++ b/common/prom.c
    @@ -196,7 +196,7 @@ int prom_map(int mode, unsigned long long size,
     			    P1275_ARG_64B(3) | P1275_ARG_64B(4) |
     			    P1275_ARG_64B(6) | 7,
     			    "map",
    -			    prom_get_mmu_ihandle(),
    +			    (unsigned int) prom_get_mmu_ihandle(),
     			    mode,
     			    size,
     			    vaddr,
    @@ -211,7 +211,7 @@ void prom_unmap(unsigned long long size, unsigned long long vaddr)
     	p1275_cmd("call-method",
     		  P1275_ARG_64B(2) | P1275_ARG_64B(3) | 4,
     		  "unmap",
    -		  prom_get_mmu_ihandle(),
    +		  (unsigned int) prom_get_mmu_ihandle(),
     		  size,
     		  vaddr);
     }
    diff --git a/common/tree.c b/common/tree.c
    index 56da8b8..65a7743 100644
    --- a/common/tree.c
    +++ b/common/tree.c
    @@ -22,7 +22,7 @@ int prom_getchild(int node)
     	if (prom_vers != PROM_P1275)
     		cnode = prom_nodeops->no_child(node);
     	else
    -		cnode = p1275_cmd ("child", 1, node);
    +		cnode = p1275_cmd ("child", 1, (unsigned int) node);
     		
     	if (cnode == 0 || cnode == -1)
     		return 0;
    @@ -43,7 +43,7 @@ int prom_getsibling(int node)
     	if (prom_vers != PROM_P1275)
     		sibnode = prom_nodeops->no_nextnode(node);
     	else
    -		sibnode = p1275_cmd ("peer", 1, node);
    +		sibnode = p1275_cmd ("peer", 1, (unsigned int) node);
     		
     	if (sibnode == 0 || sibnode == -1)
     		return 0;
    @@ -64,7 +64,7 @@ int prom_getproplen(int node, char *prop)
     		if (prom_vers != PROM_P1275)
     			ret = prom_nodeops->no_proplen(node, prop);
     		else
    -			ret = p1275_cmd ("getproplen", 2, node, prop);
    +			ret = p1275_cmd ("getproplen", 2, (unsigned int) node, prop);
     	}
     	return ret;
     }
    @@ -85,7 +85,7 @@ int prom_getproperty(int node, char *prop, char *buffer, int bufsize)
     		if (prom_vers != PROM_P1275)
     			ret = prom_nodeops->no_getprop(node, prop, buffer);
     		else
    -			ret = p1275_cmd ("getprop", 4, node, prop, buffer, bufsize);
    +			ret = p1275_cmd ("getprop", 4, (unsigned int) node, prop, buffer, bufsize);
     	}
     	return ret;
     }
    diff --git a/common/udivdi3.S b/common/udivdi3.S
    index b430f1f..25ba6ef 100644
    --- a/common/udivdi3.S
    +++ b/common/udivdi3.S
    @@ -17,11 +17,19 @@ along with GNU CC; see the file COPYING.  If not, write to
     the Free Software Foundation, 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.  */
     
    +#if __WORDSIZE == 32
    +# define STACK_BIAS 0
    +#else
    +# define STACK_BIAS 2047
    +#endif
     	.text
     	.align 4
     	.globl __udivdi3
    +	.register %g2,#scratch
    +	.register %g3,#scratch
    +
     __udivdi3:
    -	save %sp,-104,%sp
    +	save %sp,STACK_BIAS-104,%sp

Same problem here.  Again I would suggest:

#if __WORDSIZE == 32
  save %sp,-104,%sp
#else
  save %sp,-192,%sp
#endif

        mov %i3,%o3
     	cmp %i2,0
     	bne .LL40
    diff --git a/first-isofs/crt0.S b/first-isofs/crt0.S
    index 2db1281..88fcab5 100644
    --- a/first-isofs/crt0.S
    +++ b/first-isofs/crt0.S
    @@ -21,6 +21,12 @@
        Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
        USA.  */
     
    +#if __WORDSIZE == 32
    +# define STACK_BIAS 0
    +#else
    +# define STACK_BIAS 2047
    +#endif
    +
     #define COPY	jmpl	%o7 + (copy - _start), %l7
     
     	.text
    @@ -76,7 +82,7 @@ jumphere:
     	! Set up a stack
     setup_stack:
     	set	0x400000, %l1
    -	save	%l1, -64, %sp
    +	save	%l1, -STACK_BIAS-64, %sp

Here the STACK_BIAS in the save instruction seems correct, but we need
a different frame size for 64 bits.  Something like this:

#if __WORDSIZE == 32
save    %l1, -64, %sp
#else
save    %l1, -2047-128, %sp
#endif

     	! Call cd_main() to start the whole thingie up
     
    diff --git a/first-isofs/isofs.c b/first-isofs/isofs.c
    index d7a603b..47d1c48 100644
    --- a/first-isofs/isofs.c
    +++ b/first-isofs/isofs.c
    @@ -114,7 +114,7 @@ static void cd_fini(void)
     		break;
     
     	case PROM_P1275:
    -		p1275_cmd("close", 1, fd);
    +		p1275_cmd("close", 1, (unsigned)fd);
     		break;
     	};
     }
    @@ -141,7 +141,7 @@ static int cd_read_block(unsigned long long offset, int size, void *data)
     
     		if (seekp != offset) {
     			if (prom_vers == PROM_P1275) {
    -				if (p1275_cmd("seek", P1275_ARG_64B(2) | 3, fd, 0, offset) == -1)
    +				if (p1275_cmd("seek", P1275_ARG_64B(2) | 3, (unsigned)fd, 0, offset) == -1)
     					return -1;
     			} else {
     				if ((*romvec->pv_v2devops.v2_dev_seek)
    @@ -152,7 +152,7 @@ static int cd_read_block(unsigned long long offset, int size, void *data)
     		}
     
     		if (prom_vers == PROM_P1275)
    -			ret = p1275_cmd ("read", 3, fd, data, size);
    +			ret = p1275_cmd ("read", 3, (unsigned)fd, data, size);
     		else
     			ret = (*romvec->pv_v2devops.v2_dev_read) (fd, data, size);
     
    diff --git a/second/crt0.S b/second/crt0.S
    index f1ba1c8..399d174 100644
    --- a/second/crt0.S
    +++ b/second/crt0.S
    @@ -21,6 +21,12 @@
        Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
        USA.  */
     
    +#if __WORDSIZE == 32
    +# define STACK_BIAS 0
    +#else
    +# define STACK_BIAS 2047
    +#endif
    +
     #define COPY	jmpl	%o7 + (copy - _start), %l7
     
     	.text
    @@ -82,7 +88,11 @@ boot_parts:
     	sub	%l0, 16, %l0
     	sethi	%hi(gzminpi), %l1
     	add	%l1, %i3, %l1
    +#if __WORDSIZE == 32
     	st	%l0, [%l1 + %lo(gzminpi)]
    +#else
    +	stx	%l0, [%l1 + %lo(gzminpi)]
    +#endif
     
     	/* Jump to relocated code */
     	sethi	%hi(_end), %l0
    @@ -121,12 +131,15 @@ jumphere:
     
     	! Set up a stack
     setup_stack:
    -	save	%i0,-120,%sp
    -
    +	save	%i0,-STACK_BIAS-120,%sp

Here I think that the stack bias is correct, but again we need to adjust
the frame size to 64-bits.  Something like:

#if __WORDSIZE == 32
save    %i0,-120,%sp
#else
save    %i0,-2047-192,%sp
#endif
         

        tst	%i4
     	be	0f
     	 sethi	%hi(gzminpi+0x100000), %l0
    +#if __WORDSIZE == 32
     	ld	[%l0 + %lo(gzminpi)], %l1
    +#else
    +	ldx	[%l0 + %lo(gzminpi)], %l1
    +#endif
     	sethi	%hi(LARGE_RELOC), %l2
     1:	lduh	[%l1], %l3
     	add	%l1, 2, %l1
    @@ -147,7 +160,11 @@ setup_stack:
     	add	%l3, 16, %l3
     	ba	3b
     	 stb	%l3, [%l2]
    +#if __WORDSIZE == 32
     4:	st	%l1, [%l0 + %lo(gzminpi)]
    +#else
    +4:	stx	%l1, [%l0 + %lo(gzminpi)]
    +#endif
     
     	! Call my_main() to start the whole thingie up
     
    diff --git a/second/disk.c b/second/disk.c
    index 40234b3..989ab61 100644
    --- a/second/disk.c
    +++ b/second/disk.c
    @@ -79,7 +79,7 @@ int silo_disk_open(char *device)
     
             	fd = p1275_cmd ("open", 1, device);
             	if ((unsigned)(fd + 1) > 1) {
    -		    node = p1275_cmd ("instance-to-package", 1, fd);
    +		    node = p1275_cmd ("instance-to-package", 1, (unsigned)fd);
                         /*
                          * Don't use our argument due to devalias.
                          * Alas, flash has no device_type property.
    @@ -301,7 +301,7 @@ int silo_disk_read(char *buff, int size, unsigned long long offset)
     	    }
     	    if (seekp != offset) {
     	    	if (prom_vers == PROM_P1275) {
    -		        if ((rc = p1275_cmd ("seek", P1275_ARG_64B(2) | 3, fd, 0, offset)) == -1)
    +		        if ((rc = p1275_cmd ("seek", P1275_ARG_64B(2) | 3, (unsigned) fd, 0, offset)) == -1)
     			    return -1;
     	    	} else {
     		        if ((*romvec->pv_v2devops.v2_dev_seek) (fd, (unsigned)(offset >> 32), (unsigned)offset) == -1)
    @@ -311,7 +311,7 @@ int silo_disk_read(char *buff, int size, unsigned long long offset)
     	    }
     	}
     	if (prom_vers == PROM_P1275) {
    -		rc = p1275_cmd ("read", 3, fd, buff, size);
    +		rc = p1275_cmd ("read", 3, (unsigned) fd, buff, size);
     	} else {
     		int i;
     		for (i = 0; i < 2; i++) {
    @@ -355,7 +355,7 @@ void silo_disk_close(void)
     	case PROM_V3:
     	    (*romvec->pv_v2devops.v2_dev_close) (fd); break;
     	case PROM_P1275:
    -	    p1275_cmd ("close", 1, fd); break;
    +	    p1275_cmd ("close", 1, (unsigned) fd); break;
     	}
         }
         *currentdevice = 0;
    diff --git a/second/file.c b/second/file.c
    index c7c1ed2..379af2f 100644
    --- a/second/file.c
    +++ b/second/file.c
    @@ -193,7 +193,7 @@ int dump_block (blk_t * blocknr, int blockcnt)
                     }
                     last_blockcnt = -1;
                 }
    -            if ((char *)filebuffer + (block_cnt + ((*blocknr) ? (blockcnt - last_blockcnt - 1) : 0)) * bs > filelimit) {
    +            if ((unsigned int)filebuffer + (block_cnt + ((*blocknr) ? (blockcnt - last_blockcnt - 1) : 0)) * bs > filelimit) {
                     silo_fatal("Image too large to fit in destination");
                     return BLOCK_ABORT;
                 }
    diff --git a/second/muldi3.S b/second/muldi3.S
    index 7f17872..7180630 100644
    --- a/second/muldi3.S
    +++ b/second/muldi3.S
    @@ -17,11 +17,19 @@ along with GNU CC; see the file COPYING.  If not, write to
     the Free Software Foundation, 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.  */
     
    +#if __WORDSIZE == 32
    +# define STACK_BIAS 0
    +#else
    +# define STACK_BIAS 2047
    +#endif
    +
     	.text
     	.align 4
     	.globl __muldi3
    +	.register %g2,#scratch
    +	.register %g3,#scratch
     __muldi3:
    -	save  %sp, -104, %sp
    +	save  %sp, -STACK_BIAS-104, %sp

Same problem with the stack bias.

#if __WORDSIZE == 32
  save %sp,-104,%sp
#else
  save %sp,-192,%sp
#endif

        wr  %g0, %i1, %y
     	sra  %i3, 0x1f, %g2
     	and  %i1, %g2, %g2
    diff --git a/silo/silo.c b/silo/silo.c
    index 9728af2..20b7a0c 100644
    --- a/silo/silo.c
    +++ b/silo/silo.c
    @@ -107,14 +107,14 @@ static int allow_confchk_fail = 0;
     
     /* This is just so that we don't have to fight with incompatible ufs_fs.h headers */
     #define SILO_UFS_MAGIC 0x00011954
    -struct silo_ufs_super_block {
    +struct __attribute__((packed)) silo_ufs_super_block {
     	unsigned char xxx1[36];
     	unsigned int fs_fsize;
     	unsigned char xxx2[1332];
     	unsigned int fs_magic;
     };
                                     
    -struct sun_disklabel {
    +struct __attribute__((packed)) sun_disklabel {
         unsigned char info[128];	/* Informative text string */
         unsigned char spare[292];	/* Boot information etc. */
         unsigned short rspeed;	/* Disk rotational speed */
    @@ -127,9 +127,9 @@ struct sun_disklabel {
         unsigned short ntrks;	/* Tracks per cylinder */
         unsigned short nsect;	/* Sectors per track */
         unsigned char spare3[4];	/* Even more magic... */
    -    struct sun_partition {
    -	unsigned long start_cylinder;
    -	unsigned long num_sectors;
    +    struct __attribute__((packed)) sun_partition {
    +	unsigned int start_cylinder;
    +	unsigned int num_sectors;
         } partitions[8];
         unsigned short magic;	/* Magic number */
         unsigned short csum;	/* Label xor'd checksum */
    @@ -205,7 +205,7 @@ int check_fs (int fd)
     {
         struct silo_ufs_super_block ufs;
         struct ext2_super_block sb;	/* Super Block Info */
    -    struct romfs_super_block {
    +    struct __attribute__((packed)) romfs_super_block {
     	__u32 word0;
     	__u32 word1;
     	__u32 size;


Reply to: