Replace the startup C code with assembler, which avoids having to

explicitly tell the compiler what registers the Bug args come in on.
This commit is contained in:
scw 2000-12-05 21:54:33 +00:00
parent 7da5cde117
commit 86c7dac956
4 changed files with 73 additions and 85 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: Makefile,v 1.11 2000/12/04 18:35:16 scw Exp $
# $NetBSD: Makefile,v 1.12 2000/12/05 21:54:33 scw Exp $
LIB=bug
@ -9,22 +9,21 @@ MKPROFILE= no
S=${.CURDIR}/../../../..
DIR_SA=$S/lib/libsa
SRCS= delay.c diskrd.c diskwr.c getbrdid.c inchr.c instat.c outln.c \
outstr.c putchar.c return.c rtc_rd.c
CLEANFILES+= bugcrt.o bugcrt.o.tmp
SRCS= bugcrt.c delay.c diskrd.c diskwr.c getbrdid.c inchr.c instat.c \
outln.c outstr.c putchar.c return.c rtc_rd.c
CLEANFILES+= bugstart.o
.include "../Makefile.booters"
# only needed during build
libinstall::
# separate rule for bugcrt.c - NEED NOT BE COMPILED WITH -O2
# separate rule for bugstart.c
# this is build separately from rest of libbug
bugcrt.o: bugcrt.c
${CC} -fomit-frame-pointer -nostdinc ${INCPATH} -D_STANDALONE \
-o ${.TARGET}.tmp -c ${.IMPSRC}
${LD} -x -r ${.TARGET}.tmp -o ${.TARGET}
bugstart.o: bugstart.s
${CC} -x assembler-with-cpp -traditional-cpp -nostdinc ${INCPATH} \
-D_STANDALONE -c ${.IMPSRC}
all realall: lib${LIB}.a bugcrt.o
all realall: lib${LIB}.a bugstart.o
.include <bsd.lib.mk>

View File

@ -1,46 +1,15 @@
/* $NetBSD: bugcrt.c,v 1.2 2000/11/30 22:26:27 scw Exp $ */
/* $NetBSD: bugcrt.c,v 1.3 2000/12/05 21:54:33 scw Exp $ */
#include <sys/types.h>
#include <machine/prom.h>
#include "libbug.h"
struct mvmeprom_args bugargs = { 1 }; /* not in BSS */
asm (".text");
asm (".long _start-0x10");
asm (".long _start");
#ifndef __ELF__
start()
#else
_start()
#endif
void
_bugstart(void)
{
register int dev_lun asm (MVMEPROM_REG_DEVLUN);
register int ctrl_lun asm (MVMEPROM_REG_CTRLLUN);
register int flags asm (MVMEPROM_REG_FLAGS);
register int ctrl_addr asm (MVMEPROM_REG_CTRLADDR);
register int entry asm (MVMEPROM_REG_ENTRY);
register int conf_blk asm (MVMEPROM_REG_CONFBLK);
register char *arg_start asm (MVMEPROM_REG_ARGSTART);
register char *arg_end asm (MVMEPROM_REG_ARGEND);
register char *nbarg_start asm (MVMEPROM_REG_NBARGSTART);
register char *nbarg_end asm (MVMEPROM_REG_NBARGEND);
extern int edata, end;
struct mvmeprom_brdid *id, *mvmeprom_getbrdid();
bugargs.dev_lun = dev_lun;
bugargs.ctrl_lun = ctrl_lun;
bugargs.flags = flags;
bugargs.ctrl_addr = ctrl_addr;
bugargs.entry = entry;
bugargs.conf_blk = conf_blk;
bugargs.arg_start = arg_start;
bugargs.arg_end = arg_end;
bugargs.nbarg_start = nbarg_start;
bugargs.nbarg_end = nbarg_end;
extern void main(void);
struct mvmeprom_brdid *id;
/*
* Be sure not to de-reference NULL
@ -48,46 +17,9 @@ _start()
if ( bugargs.arg_end )
*bugargs.arg_end = 0;
memset(&edata, 0, (int)&end-(int)&edata);
id = mvmeprom_getbrdid();
bugargs.cputyp = id->model;
main();
_rtt();
/* NOTREACHED */
}
__main()
{
}
void
bugexec(addr)
void (*addr)();
{
register int dev_lun asm (MVMEPROM_REG_DEVLUN);
register int ctrl_lun asm (MVMEPROM_REG_CTRLLUN);
register int flags asm (MVMEPROM_REG_FLAGS);
register int ctrl_addr asm (MVMEPROM_REG_CTRLADDR);
register int entry asm (MVMEPROM_REG_ENTRY);
register int conf_blk asm (MVMEPROM_REG_CONFBLK);
register char *arg_start asm (MVMEPROM_REG_ARGSTART);
register char *arg_end asm (MVMEPROM_REG_ARGEND);
dev_lun = bugargs.dev_lun;
ctrl_lun = bugargs.ctrl_lun;
flags = bugargs.flags;
ctrl_addr = bugargs.ctrl_addr;
entry = bugargs.entry;
conf_blk = bugargs.conf_blk;
arg_start = bugargs.arg_start;
arg_end = bugargs.arg_end;
(*addr)();
printf("bugexec: 0x%x returned!\n", addr);
_rtt();
}

View File

@ -0,0 +1,55 @@
/* $NetBSD: bugstart.s,v 1.1 2000/12/05 21:54:33 scw Exp $ */
#define _LOCORE
#include <machine/prom.h>
#undef _LOCORE
#include <machine/asm.h>
.data
.even
GLOBAL(bugargs)
.space MVMEPROM_ARGS_MAX*4
.text
.even
.long _C_LABEL(start) - 0x10
.long _C_LABEL(start)
#define BUG_ARG(which) _C_LABEL(bugargs) + (which)
ENTRY_NOPROFILE(_start)
ENTRY_NOPROFILE(start)
movl MVMEPROM_REG_DEVLUN, BUG_ARG(MVMEPROM_ARGS_DEVLUN)
movl MVMEPROM_REG_CTRLLUN, BUG_ARG(MVMEPROM_ARGS_CTRLLUN)
movl MVMEPROM_REG_FLAGS, BUG_ARG(MVMEPROM_ARGS_FLAGS)
movl MVMEPROM_REG_CTRLADDR, BUG_ARG(MVMEPROM_ARGS_CTRLADDR)
movl MVMEPROM_REG_ENTRY, BUG_ARG(MVMEPROM_ARGS_ENTRY)
movl MVMEPROM_REG_CONFBLK, BUG_ARG(MVMEPROM_ARGS_CONFBLK)
movl MVMEPROM_REG_NBARGSTART, BUG_ARG(MVMEPROM_ARGS_NBARGSTART)
movl MVMEPROM_REG_NBARGEND, BUG_ARG(MVMEPROM_ARGS_NBARGEND)
movl MVMEPROM_REG_ARGSTART, BUG_ARG(MVMEPROM_ARGS_ARGSTART)
movl MVMEPROM_REG_ARGEND, BUG_ARG(MVMEPROM_ARGS_ARGEND)
lea _C_LABEL(edata),%a0
movl #_C_LABEL(end) - 4,%d0
subl %a0,%d0
lsrl #2,%d0
1: clrl %a0@+
dbra %d0,1b
jmp _C_LABEL(_bugstart)
ENTRY_NOPROFILE(bugexec)
addql #4,%sp
movl BUG_ARG(MVMEPROM_ARGS_DEVLUN), MVMEPROM_REG_DEVLUN
movl BUG_ARG(MVMEPROM_ARGS_CTRLLUN), MVMEPROM_REG_CTRLLUN
movl BUG_ARG(MVMEPROM_ARGS_FLAGS), MVMEPROM_REG_FLAGS
movl BUG_ARG(MVMEPROM_ARGS_CTRLADDR), MVMEPROM_REG_CTRLADDR
movl BUG_ARG(MVMEPROM_ARGS_ENTRY), MVMEPROM_REG_ENTRY
movl BUG_ARG(MVMEPROM_ARGS_CONFBLK), MVMEPROM_REG_CONFBLK
movl BUG_ARG(MVMEPROM_ARGS_NBARGSTART), MVMEPROM_REG_NBARGSTART
movl BUG_ARG(MVMEPROM_ARGS_NBARGEND), MVMEPROM_REG_NBARGEND
movl BUG_ARG(MVMEPROM_ARGS_ARGSTART), MVMEPROM_REG_ARGSTART
movl BUG_ARG(MVMEPROM_ARGS_ARGEND), MVMEPROM_REG_ARGEND
ENTRY_NOPROFILE(__main)
rts

View File

@ -1,4 +1,4 @@
/* $NetBSD: libbug.h,v 1.2 2000/07/24 18:39:41 jdolecek Exp $ */
/* $NetBSD: libbug.h,v 1.3 2000/12/05 21:54:33 scw Exp $ */
/*
* prototypes and such. note that get/put char are in stand.h
@ -20,4 +20,6 @@ void mvmeprom_rtc_rd __P((struct mvmeprom_time *));
extern struct mvmeprom_args bugargs;
void bugexec __P((void (*)(void)));
extern void _bugstart __P((void));
extern void bugexec __P((void (*)(void)));
extern void _rtt(void);