Revert previous at the moment.

This is wrong reasoning; 68020 and above (incl. 040 and 060) support
32-bit displacements for PC relative addressing (via "fully extension
addressing mode" with null index register).

I've still not figured out what goes wrong with amiga/boot(8) when
compiled without -l option for gas(1)...

On 2022/04/27 20:48, Rin Okuyama wrote:
> Module Name:	src
> Committed By:	rin
> Date:		Wed Apr 27 11:48:26 UTC 2022
>
> Modified Files:
> 	src/sys/lib/libsa: ext2fs.c minixfs3.c stand.h ufs.c
>
> Log Message:
> Introduce SA_HARDCODED_SECSIZE hack, by which hardcoded DEV_BSIZE is
> used instead of secsize obtained by SAIOSECSIZE ioctl.
>
> This hack avoids divdi3 and friends from being linked, in order to
> support variable secsize.
>
> This is useful for amiga/boot(8); it is loaded by firmware into
> unpredictable address, and therefore all symbols should be
> addressable by PC relative mode with only 16-bit displacements.
>
> See sys/arch/amiga/stand/bootblock/{boot/bbstart.s,elf2bb,txlt} for
> more details.
>
>
> To generate a diff of this commit:
> cvs rdiff -u -r1.31 -r1.32 src/sys/lib/libsa/ext2fs.c
> cvs rdiff -u -r1.10 -r1.11 src/sys/lib/libsa/minixfs3.c
> cvs rdiff -u -r1.83 -r1.84 src/sys/lib/libsa/stand.h src/sys/lib/libsa/ufs.c
>
> Please note that diffs are not public domain; they are subject to the
> copyright notices on the relevant files.
This commit is contained in:
rin 2022-04-27 14:48:50 +00:00
parent f178fcd4de
commit 7ca4ea5592
4 changed files with 26 additions and 27 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ext2fs.c,v 1.32 2022/04/27 11:48:26 rin Exp $ */
/* $NetBSD: ext2fs.c,v 1.33 2022/04/27 14:48:50 rin Exp $ */
/*
* Copyright (c) 1997 Manuel Bouyer.
@ -415,9 +415,15 @@ read_sblock(struct open_file *f, struct m_ext2fs *fs)
struct ext2fs ext2fs;
size_t buf_size;
int rc;
u_int secsize;
secsize = 0;
rc = DEV_IOCTL(f->f_dev)(f, SAIOSECSIZE, &secsize);
if (rc != 0 || secsize == 0)
secsize = DEV_BSIZE;
rc = DEV_STRATEGY(f->f_dev)(f->f_devdata, F_READ,
SBOFF / GETSECSIZE(f), SBSIZE, sbbuf, &buf_size);
SBOFF / secsize, SBSIZE, sbbuf, &buf_size);
if (rc)
return rc;

View File

@ -1,4 +1,4 @@
/* $NetBSD: minixfs3.c,v 1.11 2022/04/27 11:48:26 rin Exp $ */
/* $NetBSD: minixfs3.c,v 1.12 2022/04/27 14:48:50 rin Exp $ */
/*-
* Copyright (c) 2012
@ -449,6 +449,7 @@ read_sblock(struct open_file *f, struct mfs_sblock *fs)
static uint8_t sbbuf[MINBSIZE];
size_t buf_size;
int rc;
u_int secsize;
/* We must read amount multiple of sector size, hence we can't
* read SBSIZE and read MINBSIZE.
@ -456,8 +457,13 @@ read_sblock(struct open_file *f, struct mfs_sblock *fs)
if (SBSIZE > MINBSIZE)
return EINVAL;
secsize = 0;
rc = DEV_IOCTL(f->f_dev)(f, SAIOSECSIZE, &secsize);
if (rc != 0 || secsize == 0)
secsize = DEV_BSIZE;
rc = DEV_STRATEGY(f->f_dev)(f->f_devdata, F_READ,
SUPER_BLOCK_OFF / GETSECSIZE(f), MINBSIZE, sbbuf, &buf_size);
SUPER_BLOCK_OFF / secsize, MINBSIZE, sbbuf, &buf_size);
if (rc)
return rc;

View File

@ -1,4 +1,4 @@
/* $NetBSD: stand.h,v 1.84 2022/04/27 11:48:26 rin Exp $ */
/* $NetBSD: stand.h,v 1.85 2022/04/27 14:48:50 rin Exp $ */
/*
* Copyright (c) 1999 Christopher G. Demetriou. All rights reserved.
@ -64,7 +64,6 @@
#ifndef _LIBSA_STAND_H_
#define _LIBSA_STAND_H_
#include <sys/param.h>
#include <sys/types.h>
#include <sys/cdefs.h>
#include <sys/stat.h>
@ -321,22 +320,4 @@ void bzero(void *, size_t);
int atoi(const char *);
#if !defined(SA_HARDCODED_SECSIZE)
#define GETSECSIZE(f) getsecsize(f)
static inline u_int
getsecsize(struct open_file *f)
{
int rc;
u_int secsize = 0;
rc = DEV_IOCTL(f->f_dev)(f, SAIOSECSIZE, &secsize);
if (rc != 0 || secsize == 0)
secsize = DEV_BSIZE;
return secsize;
}
#else
#define GETSECSIZE(f) DEV_BSIZE
#endif
#endif /* _LIBSA_STAND_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: ufs.c,v 1.84 2022/04/27 11:48:26 rin Exp $ */
/* $NetBSD: ufs.c,v 1.85 2022/04/27 14:48:50 rin Exp $ */
/*-
* Copyright (c) 1993
@ -594,15 +594,21 @@ ffs_find_superblock(struct open_file *f, FS *fs)
struct file *fp = (struct file *)f->f_fsdata;
int rc;
size_t buf_size;
u_int secsize;
#ifdef LIBSA_FFSv2
static daddr_t sblock_try[] = SBLOCKSEARCH;
int i;
#endif
secsize = 0;
rc = DEV_IOCTL(f->f_dev)(f, SAIOSECSIZE, &secsize);
if (rc != 0 || secsize == 0)
secsize = DEV_BSIZE;
#ifdef LIBSA_FFSv2
for (i = 0; sblock_try[i] != -1; i++) {
rc = DEV_STRATEGY(f->f_dev)(f->f_devdata, F_READ,
sblock_try[i] / GETSECSIZE(f), SBLOCKSIZE, fs, &buf_size);
sblock_try[i] / secsize, SBLOCKSIZE, fs, &buf_size);
if (rc)
return rc;
if (buf_size != SBLOCKSIZE)
@ -617,7 +623,7 @@ ffs_find_superblock(struct open_file *f, FS *fs)
return EINVAL;
#else /* LIBSA_FFSv2 */
rc = DEV_STRATEGY(f->f_dev)(f->f_devdata, F_READ,
SBLOCKOFFSET / GETSECSIZE(f), SBLOCKSIZE, fs, &buf_size);
SBLOCKOFFSET / secsize, SBLOCKSIZE, fs, &buf_size);
if (rc)
return rc;
if (buf_size != SBLOCKSIZE)