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:
parent
f178fcd4de
commit
7ca4ea5592
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue