Change load address of ofwboot for large (md root) kernel.
This commit is contained in:
parent
aeb6277b0e
commit
0fe318b3bc
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: bootxx.c,v 1.1 1998/06/12 21:07:24 tsubai Exp $ */
|
/* $NetBSD: bootxx.c,v 1.2 1998/06/26 12:29:28 tsubai Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
|
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
|
||||||
|
@ -37,12 +37,12 @@
|
||||||
int (*openfirmware)(void *);
|
int (*openfirmware)(void *);
|
||||||
int stack[1024];
|
int stack[1024];
|
||||||
|
|
||||||
#define MAXBLOCKNUM 16
|
#define MAXBLOCKNUM 32
|
||||||
|
|
||||||
int block_size = 0;
|
int block_size = 0;
|
||||||
int block_count = MAXBLOCKNUM;
|
int block_count = MAXBLOCKNUM;
|
||||||
int block_table[MAXBLOCKNUM] = { 0 };
|
int block_table[MAXBLOCKNUM] = { 0 };
|
||||||
void (*entry)(void *) = (void *)0x3e0000;
|
void (*entry_point)(int, int, void *) = (void *)0;
|
||||||
|
|
||||||
asm("
|
asm("
|
||||||
.text
|
.text
|
||||||
|
@ -269,7 +269,7 @@ startup(arg1, arg2, openfirm)
|
||||||
|
|
||||||
fd = OF_open(bootpath);
|
fd = OF_open(bootpath);
|
||||||
|
|
||||||
addr = (char *)entry;
|
addr = (char *)entry_point;
|
||||||
for (i = 0; i < block_count; i++) {
|
for (i = 0; i < block_count; i++) {
|
||||||
blk = block_table[i];
|
blk = block_table[i];
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ startup(arg1, arg2, openfirm)
|
||||||
isync
|
isync
|
||||||
" :: "r"(BATU(0)), "r"(BATL(0, 0)));
|
" :: "r"(BATU(0)), "r"(BATL(0, 0)));
|
||||||
|
|
||||||
entry(openfirm);
|
entry_point(0, 0, openfirm);
|
||||||
|
|
||||||
OF_exit();
|
OF_exit();
|
||||||
for (;;);
|
for (;;);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: installboot.c,v 1.1 1998/06/12 21:07:24 tsubai Exp $ */
|
/* $NetBSD: installboot.c,v 1.2 1998/06/26 12:29:29 tsubai Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994 Paul Kranenburg
|
* Copyright (c) 1994 Paul Kranenburg
|
||||||
|
@ -55,6 +55,10 @@ char *boot, *proto, *dev;
|
||||||
|
|
||||||
#define BOOTSECTOR_OFFSET 2048
|
#define BOOTSECTOR_OFFSET 2048
|
||||||
|
|
||||||
|
#ifndef DEFAULT_ENTRY
|
||||||
|
#define DEFAULT_ENTRY 0x6c0000
|
||||||
|
#endif
|
||||||
|
|
||||||
struct nlist nl[] = {
|
struct nlist nl[] = {
|
||||||
#define X_BLOCKTABLE 0
|
#define X_BLOCKTABLE 0
|
||||||
{"_block_table"},
|
{"_block_table"},
|
||||||
|
@ -62,12 +66,15 @@ struct nlist nl[] = {
|
||||||
{"_block_count"},
|
{"_block_count"},
|
||||||
#define X_BLOCKSIZE 2
|
#define X_BLOCKSIZE 2
|
||||||
{"_block_size"},
|
{"_block_size"},
|
||||||
|
#define X_ENTRY_POINT 3
|
||||||
|
{"_entry_point"},
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
daddr_t *block_table; /* block number array in prototype image */
|
daddr_t *block_table; /* block number array in prototype image */
|
||||||
int32_t *block_count_p; /* size of this array */
|
int32_t *block_count_p; /* size of this array */
|
||||||
int32_t *block_size_p; /* filesystem block size */
|
int32_t *block_size_p; /* filesystem block size */
|
||||||
|
int32_t *entry_point_p; /* entry point */
|
||||||
int32_t max_block_count;
|
int32_t max_block_count;
|
||||||
|
|
||||||
char *loadprotoblocks __P((char *, long *));
|
char *loadprotoblocks __P((char *, long *));
|
||||||
|
@ -232,6 +239,7 @@ loadprotoblocks(fname, size)
|
||||||
block_table = (daddr_t *)(bp + nl[X_BLOCKTABLE].n_value + off);
|
block_table = (daddr_t *)(bp + nl[X_BLOCKTABLE].n_value + off);
|
||||||
block_count_p = (int32_t *)(bp + nl[X_BLOCKCOUNT].n_value + off);
|
block_count_p = (int32_t *)(bp + nl[X_BLOCKCOUNT].n_value + off);
|
||||||
block_size_p = (int32_t *)(bp + nl[X_BLOCKSIZE].n_value + off);
|
block_size_p = (int32_t *)(bp + nl[X_BLOCKSIZE].n_value + off);
|
||||||
|
entry_point_p = (int32_t *)(bp + nl[X_ENTRY_POINT].n_value + off);
|
||||||
|
|
||||||
if ((int)block_table & 3) {
|
if ((int)block_table & 3) {
|
||||||
warn("%s: invalid address: block_table = %x",
|
warn("%s: invalid address: block_table = %x",
|
||||||
|
@ -254,10 +262,17 @@ loadprotoblocks(fname, size)
|
||||||
close(fd);
|
close(fd);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
if ((int)entry_point_p & 3) {
|
||||||
|
warn("%s: invalid address: entry_point_p = %x",
|
||||||
|
fname, entry_point_p);
|
||||||
|
free(bp);
|
||||||
|
close(fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
max_block_count = *block_count_p;
|
max_block_count = *block_count_p;
|
||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
printf("proto bootblock size %ld\n", sz);
|
printf("proto bootblock size: %ld\n", sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -360,6 +375,13 @@ int devfd;
|
||||||
*/
|
*/
|
||||||
*block_count_p = ndb;
|
*block_count_p = ndb;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register entry point.
|
||||||
|
*/
|
||||||
|
*entry_point_p = DEFAULT_ENTRY;
|
||||||
|
if (verbose)
|
||||||
|
printf("entry point: 0x%08x\n", *entry_point_p);
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
printf("%s: block numbers: ", boot);
|
printf("%s: block numbers: ", boot);
|
||||||
ap = ip->di_db;
|
ap = ip->di_db;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: Locore.c,v 1.1 1998/05/15 10:15:59 tsubai Exp $ */
|
/* $NetBSD: Locore.c,v 1.2 1998/06/26 12:29:29 tsubai Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
|
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
|
|
||||||
static int (*openfirmware) __P((void *));
|
static int (*openfirmware) __P((void *));
|
||||||
|
|
||||||
static void startup __P((int (*)(void *), char *, int));
|
static void startup __P((void *, int, int (*)(void *), char *, int));
|
||||||
static void setup __P((void));
|
static void setup __P((void));
|
||||||
|
|
||||||
static int stack[4096/4];
|
static int stack[4096/4];
|
||||||
|
@ -87,7 +87,9 @@ openfirmware(arg)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
startup(openfirm, arg, argl)
|
startup(vpd, res, openfirm, arg, argl)
|
||||||
|
void *vpd;
|
||||||
|
int res;
|
||||||
int (*openfirm)(void *);
|
int (*openfirm)(void *);
|
||||||
char *arg;
|
char *arg;
|
||||||
int argl;
|
int argl;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# $NetBSD: Makefile,v 1.2 1998/06/12 21:07:24 tsubai Exp $
|
# $NetBSD: Makefile,v 1.3 1998/06/26 12:29:29 tsubai Exp $
|
||||||
|
|
||||||
S= ${.CURDIR}/../../../..
|
S= ${.CURDIR}/../../../..
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ NEWVERSWHAT= "OpenFirmware Boot"
|
||||||
|
|
||||||
# For now...
|
# For now...
|
||||||
#RELOC= 20000
|
#RELOC= 20000
|
||||||
RELOC= 3e0000
|
RELOC= 6c0000
|
||||||
|
|
||||||
ENTRY= _start
|
ENTRY= _start
|
||||||
|
|
||||||
|
@ -24,7 +24,6 @@ CLEANFILES+= vers.c vers.o ${PROG}.elf
|
||||||
|
|
||||||
CPPFLAGS+= -I${.CURDIR}/../../.. -I${.CURDIR}/../../../..
|
CPPFLAGS+= -I${.CURDIR}/../../.. -I${.CURDIR}/../../../..
|
||||||
CPPFLAGS+= -DRELOC=0x${RELOC}
|
CPPFLAGS+= -DRELOC=0x${RELOC}
|
||||||
CPPFLAGS+= -DFIRMWORKSBUGS
|
|
||||||
CPPFLAGS+= -DPOWERPC_BOOT_AOUT
|
CPPFLAGS+= -DPOWERPC_BOOT_AOUT
|
||||||
CPPFLAGS+= -DPOWERPC_BOOT_ELF
|
CPPFLAGS+= -DPOWERPC_BOOT_ELF
|
||||||
#CPPFLAGS+= -DXCOFF_GLUE # for booting PCI Powermacs
|
#CPPFLAGS+= -DXCOFF_GLUE # for booting PCI Powermacs
|
||||||
|
|
Loading…
Reference in New Issue