Module Name: src Committed By: matt Date: Wed Sep 16 19:23:18 UTC 2009
Modified Files: src/sys/arch/pmax/include [matt-nb5-mips64]: dec_prom.h src/sys/arch/pmax/pmax [matt-nb5-mips64]: machdep.c promcall.c src/sys/arch/pmax/stand/common [matt-nb5-mips64]: callvec.c printf.S startprog.S Log Message: Deal with some LP64 issues with only O32 console. Make bootloader invoke kernel compatible with both O32 and N32 To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.20.96.1 src/sys/arch/pmax/include/dec_prom.h cvs rdiff -u -r1.223.8.1.2.2 -r1.223.8.1.2.3 src/sys/arch/pmax/pmax/machdep.c cvs rdiff -u -r1.12 -r1.12.76.1 src/sys/arch/pmax/pmax/promcall.c cvs rdiff -u -r1.16 -r1.16.96.1 src/sys/arch/pmax/stand/common/callvec.c cvs rdiff -u -r1.5 -r1.5.18.1 src/sys/arch/pmax/stand/common/printf.S cvs rdiff -u -r1.4 -r1.4.18.1 src/sys/arch/pmax/stand/common/startprog.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/pmax/include/dec_prom.h diff -u src/sys/arch/pmax/include/dec_prom.h:1.20 src/sys/arch/pmax/include/dec_prom.h:1.20.96.1 --- src/sys/arch/pmax/include/dec_prom.h:1.20 Sun Dec 11 12:18:39 2005 +++ src/sys/arch/pmax/include/dec_prom.h Wed Sep 16 19:23:18 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: dec_prom.h,v 1.20 2005/12/11 12:18:39 christos Exp $ */ +/* $NetBSD: dec_prom.h,v 1.20.96.1 2009/09/16 19:23:18 matt Exp $ */ /* * Copyright (c) 1992, 1993 @@ -92,55 +92,59 @@ typedef void (*psig_t)(int); struct callback { - void *(*_memcpy) __P((void *, void *, int)); /* 00 */ - void *(*_memset) __P((void *, int, int)); /* 04 */ - char *(*_strcat) __P((char *, char *)); /* 08 */ - int (*_strcmp) __P((char *, char *)); /* 0c */ - char *(*_strcpy) __P((char *, char *)); /* 10 */ - int (*_strlen) __P((char *)); /* 14 */ - char *(*_strncat) __P((char *, char *, int)); /* 18 */ - char *(*_strncpy) __P((char *, char *, int)); /* 1c */ - int (*_strncmp) __P((char *, char *, int)); /* 20 */ - int (*_getchar) __P((void)); /* 24 */ - char *(*_gets) __P((char *)); /* 28 */ - int (*_puts) __P((char *)); /* 2c */ - int (*_printf) __P((const char *, ...)); /* 30 */ - int (*_sprintf) __P((char *, char *, ...)); /* 34 */ - int (*_io_poll) __P((void)); /* 38 */ - long (*_strtol) __P((char *, char **, int)); /* 3c */ - psig_t (*_signal) __P((int, psig_t)); /* 40 */ - int (*_raise) __P((int)); /* 44 */ - long (*_time) __P((long *)); /* 48 */ - int (*_setjmp) __P((jmp_buf)); /* 4c */ - void (*_longjmp) __P((jmp_buf, int)); /* 50 */ - int (*_bootinit) __P((char *)); /* 54 */ - int (*_bootread) __P((int, void *, int)); /* 58 */ - int (*_bootwrite) __P((int, void *, int)); /* 5c */ - int (*_setenv) __P((char *, char *)); /* 60 */ - char *(*_getenv) __P((const char *)); /* 64 */ - int (*_unsetenv) __P((char *)); /* 68 */ - u_long (*_slot_address) __P((int)); /* 6c */ - void (*_wbflush) __P((void)); /* 70 */ - void (*_msdelay) __P((int)); /* 74 */ - void (*_leds) __P((int)); /* 78 */ - void (*_clear_cache) __P((char *, int)); /* 7c */ - int (*_getsysid) __P((void)); /* 80 */ - int (*_getbitmap) __P((memmap *)); /* 84 */ - int (*_disableintr) __P((int)); /* 88 */ - int (*_enableintr) __P((int)); /* 8c */ - int (*_testintr) __P((int)); /* 90 */ + void *(*_memcpy)(void *, void *, int); /* 00 */ + void *(*_memset)(void *, int, int); /* 04 */ + char *(*_strcat)(char *, char *); /* 08 */ + int (*_strcmp)(char *, char *); /* 0c */ + char *(*_strcpy)(char *, char *); /* 10 */ + int (*_strlen)(char *); /* 14 */ + char *(*_strncat)(char *, char *, int); /* 18 */ + char *(*_strncpy)(char *, char *, int); /* 1c */ + int (*_strncmp)(char *, char *, int); /* 20 */ + int (*_getchar)(void); /* 24 */ + char *(*_gets)(char *); /* 28 */ + int (*_puts)(char *); /* 2c */ + int (*_printf)(const char *, ...); /* 30 */ + int (*_sprintf)(char *, char *, ...); /* 34 */ + int (*_io_poll)(void); /* 38 */ + long (*_strtol)(char *, char **, int); /* 3c */ + psig_t (*_signal)(int, psig_t); /* 40 */ + int (*_raise)(int); /* 44 */ + long (*_time)(long *); /* 48 */ + int (*_setjmp)(jmp_buf); /* 4c */ + void (*_longjmp)(jmp_buf, int); /* 50 */ + int (*_bootinit)(char *); /* 54 */ + int (*_bootread)(int, void *, int); /* 58 */ + int (*_bootwrite)(int, void *, int); /* 5c */ + int (*_setenv)(char *, char *); /* 60 */ + char *(*_getenv)(const char *); /* 64 */ + int (*_unsetenv)(char *); /* 68 */ + u_long (*_slot_address)(int); /* 6c */ + void (*_wbflush)(void); /* 70 */ + void (*_msdelay)(int); /* 74 */ + void (*_leds)(int); /* 78 */ + void (*_clear_cache)(char *, int); /* 7c */ + int (*_getsysid)(void); /* 80 */ + int (*_getbitmap)(memmap *); /* 84 */ + int (*_disableintr)(int); /* 88 */ + int (*_enableintr)(int); /* 8c */ + int (*_testintr)(int); /* 90 */ void *_reserved_data; /* 94 */ - int (*_console_init) __P((void)); /* 98 */ - void (*_halt) __P((int *, int)); /* 9c */ - void (*_showfault) __P((void)); /* a0 */ - tcinfo *(*_gettcinfo) __P((void)); /*XXX* bogus proto */ /* a4 */ - int (*_execute_cmd) __P((char *)); /* a8 */ - void (*_rex) __P((char)); /* ac */ + int (*_console_init)(void); /* 98 */ + void (*_halt)(int *, int); /* 9c */ + void (*_showfault)(void); /* a0 */ + tcinfo *(*_gettcinfo)(void); /* XXX bogus proto */ /* a4 */ + int (*_execute_cmd)(char *); /* a8 */ + void (*_rex)(char); /* ac */ /* b0 to d4 reserved */ }; extern const struct callback *callv; +#ifdef _LP64 +extern struct callback callvec; +#else extern const struct callback callvec; +#endif #if defined(_STANDALONE) && !defined(_NO_PROM_DEFINES) #define memcpy (*callv -> _memcpy) Index: src/sys/arch/pmax/pmax/machdep.c diff -u src/sys/arch/pmax/pmax/machdep.c:1.223.8.1.2.2 src/sys/arch/pmax/pmax/machdep.c:1.223.8.1.2.3 --- src/sys/arch/pmax/pmax/machdep.c:1.223.8.1.2.2 Tue Sep 8 17:24:09 2009 +++ src/sys/arch/pmax/pmax/machdep.c Wed Sep 16 19:23:18 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.223.8.1.2.2 2009/09/08 17:24:09 matt Exp $ */ +/* $NetBSD: machdep.c,v 1.223.8.1.2.3 2009/09/16 19:23:18 matt Exp $ */ /* * Copyright (c) 1992, 1993 @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.223.8.1.2.2 2009/09/08 17:24:09 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.223.8.1.2.3 2009/09/16 19:23:18 matt Exp $"); #include "fs_mfs.h" #include "opt_ddb.h" @@ -101,12 +101,15 @@ #include <ufs/mfs/mfs_extern.h> /* mfs_initminiroot() */ #include <mips/cache.h> -#include <machine/psl.h> +#include <mips/regnum.h> +#include <mips/psl.h> + #include <machine/autoconf.h> #include <machine/dec_prom.h> #include <machine/sysconf.h> #include <machine/bootinfo.h> #include <machine/locore.h> + #include <pmax/pmax/machdep.h> #define _PMAX_BUS_DMA_PRIVATE @@ -158,7 +161,7 @@ */ int safepri = MIPS3_PSL_LOWIPL; /* XXX */ -void mach_init __P((int, char *[], int, intptr_t, u_int, char *)); /* XXX */ +void mach_init(int, int32_t *, int, intptr_t, u_int, char *); /* XXX */ /* Motherboard or system-specific initialization vector */ static void unimpl_bus_reset __P((void)); @@ -183,19 +186,15 @@ extern struct user *proc0paddr; /* XXX */ extern struct consdev promcd; /* XXX */ +#define ARGV(i) ((char *)(intptr_t)(argv32[i])) + /* * Do all the stuff that locore normally does before calling main(). * The first 4 argments are passed by PROM monitor, and remaining two - * are built on temporary stack by our boot loader. + * are built on temporary stack by our boot loader (or in reg if N32/N64). */ void -mach_init(argc, argv, code, cv, bim, bip) - int argc; - char *argv[]; - int code; - intptr_t cv; - u_int bim; - char *bip; +mach_init(int argc, int32_t *argv32, int code, intptr_t cv, u_int bim, char *bip) { char *cp; const char *bootinfo_msg; @@ -256,6 +255,21 @@ } /* Initialize callv so we can do PROM output... */ + if (code == DEC_PROM_MAGIC) { +#ifdef _LP64 + /* + * Convert the call vector from using 32bit function pointers + * to using 64bit function pointers. + */ + for (i = 0; i < sizeof(callvec) / sizeof(void *); i++) + ((intptr_t *)&callvec)[i] = ((int32_t *)cv)[i]; + callv = &callvec; +#else + callv = (void *)cv; +#endif + } else { + callv = &callvec; + } callv = (code == DEC_PROM_MAGIC) ? (void *)cv : &callvec; /* Use PROM console output until we initialize a console driver. */ @@ -284,13 +298,13 @@ pmax_bus_dma_init(); /* Check for direct boot from DS5000 REX monitor */ - if (argc > 0 && strcmp(argv[0], "boot") == 0) { + if (argc > 0 && strcmp(ARGV(0), "boot") == 0) { argc--; - argv++; + argv32++; } /* Look at argv[0] and compute bootdev */ - makebootdev(argv[0]); + makebootdev(ARGV(0)); /* * Look at arguments passed to us and compute boothowto. @@ -300,7 +314,7 @@ boothowto |= RB_KDB; #endif for (i = 1; i < argc; i++) { - for (cp = argv[i]; *cp; cp++) { + for (cp = ARGV(i); *cp; cp++) { switch (*cp) { case 'a': /* autoboot */ boothowto &= ~RB_SINGLE; @@ -347,7 +361,7 @@ lwp0.l_md.md_regs = (struct frame *)(kernend + USPACE) - 1; memset(lwp0.l_addr, 0, USPACE); #ifdef _LP64 - lwp0.l_md.md_regs->f_regs[_L_SR] = MIPS_SR_KX; + lwp0.l_md.md_regs->f_regs[_R_SR] = MIPS_SR_KX; #endif lwp0.l_addr->u_pcb.pcb_context.val[_L_SR] = #ifdef _LP64 Index: src/sys/arch/pmax/pmax/promcall.c diff -u src/sys/arch/pmax/pmax/promcall.c:1.12 src/sys/arch/pmax/pmax/promcall.c:1.12.76.1 --- src/sys/arch/pmax/pmax/promcall.c:1.12 Sat Sep 9 08:27:13 2006 +++ src/sys/arch/pmax/pmax/promcall.c Wed Sep 16 19:23:18 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: promcall.c,v 1.12 2006/09/09 08:27:13 tsutsui Exp $ */ +/* $NetBSD: promcall.c,v 1.12.76.1 2009/09/16 19:23:18 matt Exp $ */ /* * Copyright (c) 1992, 1993 @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: promcall.c,v 1.12 2006/09/09 08:27:13 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: promcall.c,v 1.12.76.1 2009/09/16 19:23:18 matt Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -90,8 +90,8 @@ #include <pmax/pmax/pmaxtype.h> #include <pmax/pmax/machdep.h> -static int romgetc __P((dev_t)); -static void romputc __P((dev_t, int)); +static int romgetc (dev_t); +static void romputc (dev_t, int); #define DEFAULT_SCSIID 7 /* XXX - this should really live somewhere else */ @@ -114,8 +114,7 @@ * Get character from PROM console. */ static int -romgetc(dev) - dev_t dev; +romgetc(dev_t dev) { int chr, s; @@ -129,9 +128,7 @@ * Print a character on PROM console. */ static void -romputc(dev, c) - dev_t dev; - int c; +romputc(dev_t dev, int c) { int s; @@ -146,10 +143,7 @@ * Encoding is idiosyncratic; see DECstation Owners Guide. */ void -prom_findcons(kbdslot, crtslot, prom_using_screen) - int *kbdslot; - int *crtslot; - int *prom_using_screen; +prom_findcons(int *kbdslot, int *crtslot, int *prom_using_screen) { char *oscon = 0; /* PROM osconsole string */ @@ -198,8 +192,7 @@ * Get a prom environment variable. */ char * -prom_getenv(name) - const char *name; +prom_getenv(const char *name) { return (*callv->_getenv)(name); } @@ -212,7 +205,7 @@ * hardware revision. u_int8_t [0] */ int -prom_systype() +prom_systype(void) { char *cp; @@ -226,7 +219,7 @@ * Reset machine by haltbutton. */ void -prom_haltbutton() +prom_haltbutton(void) { (*callv->_halt)((int *)0, 0); } @@ -234,15 +227,13 @@ /* * Halt/reboot machine. */ -void __attribute__((__noreturn__)) -prom_halt(howto, bootstr) - int howto; - char *bootstr; +void __dead +prom_halt(int howto, char *bootstr) { if (callv != &callvec) (*callv->_rex)((howto & RB_HALT) ? 'h' : 'b'); else { - void __attribute__((__noreturn__)) (*f) __P((void)); + void __dead (*f) __P((void)); f = (howto & RB_HALT) ? (void *)DEC_PROM_REINIT @@ -258,8 +249,7 @@ * Get the host SCSI ID from the PROM. */ int -prom_scsiid(cnum) - int cnum; +prom_scsiid(int cnum) { char scsiid_var[8]; /* strlen("scsiidX") + NULL */ char *cp; @@ -273,8 +263,7 @@ * Get the memory bitmap from the PROM if we can */ int -prom_getbitmap(map) - struct memmap *map; +prom_getbitmap(struct memmap *map) { char *cp; int len; Index: src/sys/arch/pmax/stand/common/callvec.c diff -u src/sys/arch/pmax/stand/common/callvec.c:1.16 src/sys/arch/pmax/stand/common/callvec.c:1.16.96.1 --- src/sys/arch/pmax/stand/common/callvec.c:1.16 Sun Dec 11 12:18:39 2005 +++ src/sys/arch/pmax/stand/common/callvec.c Wed Sep 16 19:23:18 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: callvec.c,v 1.16 2005/12/11 12:18:39 christos Exp $ */ +/* $NetBSD: callvec.c,v 1.16.96.1 2009/09/16 19:23:18 matt Exp $ */ /*- * Copyright (c) 1992, 1993 @@ -36,51 +36,22 @@ #include <machine/dec_prom.h> -const struct callback callvec = { - (void *(*) __P((void *, void *, int)))0, - (void *(*) __P((void *, int, int)))0, - (char *(*) __P((char *, char *)))DEC_PROM_STRCAT, - (int (*) __P((char *, char *)))DEC_PROM_STRCMP, - (char *(*) __P((char *, char *)))DEC_PROM_STRCPY, - (int (*) __P((char *)))DEC_PROM_STRLEN, - (char *(*) __P((char *, char *, int)))0, - (char *(*) __P((char *, char *, int)))0, - (int (*) __P((char *, char *, int)))0, - (int (*) __P((void)))DEC_PROM_GETCHAR, - (char *(*) __P((char *)))DEC_PROM_GETS, - (int (*) __P((char *)))DEC_PROM_PUTS, - (int (*) __P((const char *, ...)))DEC_PROM_PRINTF, - (int (*) __P((char *, char *, ...)))0, - (int (*) __P((void)))0, - (long (*) __P((char *, char **, int)))0, - (psig_t (*) __P((int, psig_t)))0, - (int (*) __P((int)))0, - (long (*) __P((long *)))0, - (int (*) __P((jmp_buf)))0, - (void (*) __P((jmp_buf, int)))0, - (int (*) __P(( char *)))0, - (int (*) __P((int, void *, int)))0, - (int (*) __P((int, void *, int)))0, - (int (*) __P((char *, char *)))DEC_PROM_SETENV2, - (char *(*) __P((const char *)))DEC_PROM_GETENV2, - (int (*) __P((char *)))DEC_PROM_UNSETENV, - (u_long (*) __P((int)))0, - (void (*) __P((void)))0, - (void (*) __P((int)))0, - (void (*) __P((int)))0, - (void (*) __P((char *, int)))DEC_PROM_CLEARCACHE, - (int (*) __P((void)))0, - (int (*) __P((memmap *)))0, - (int (*) __P((int)))0, - (int (*) __P((int)))0, - (int (*) __P((int)))0, - (void *)0, - (int (*) __P((void)))0, - (void (*) __P((int *, int)))0, - (void (*) __P((void)))0, - (tcinfo *(*) __P((void)))0, /* XXX what are the args for this?*/ - (int (*) __P((char *)))0, - (void (*) __P((char)))0, +#ifndef _LP64 +const +#endif +struct callback callvec = { + ._strcat = (void *)DEC_PROM_STRCAT, + ._strcmp = (void *)DEC_PROM_STRCMP, + ._strcpy = (void *)DEC_PROM_STRCPY, + ._strlen = (void *)DEC_PROM_STRLEN, + ._getchar = (void *)DEC_PROM_GETCHAR, + ._gets = (void *)DEC_PROM_GETS, + ._puts = (void *)DEC_PROM_PUTS, + ._printf = (void *)DEC_PROM_PRINTF, + ._setenv = (void *)DEC_PROM_SETENV2, + ._getenv = (void *)DEC_PROM_GETENV2, + ._unsetenv = (void *)DEC_PROM_UNSETENV, + ._clear_cache = (void *)DEC_PROM_CLEARCACHE, }; -const struct callback *callv = &callvec; +const struct callback *callv = &callvec; Index: src/sys/arch/pmax/stand/common/printf.S diff -u src/sys/arch/pmax/stand/common/printf.S:1.5 src/sys/arch/pmax/stand/common/printf.S:1.5.18.1 --- src/sys/arch/pmax/stand/common/printf.S:1.5 Mon Apr 28 20:23:31 2008 +++ src/sys/arch/pmax/stand/common/printf.S Wed Sep 16 19:23:18 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: printf.S,v 1.5 2008/04/28 20:23:31 martin Exp $ */ +/* $NetBSD: printf.S,v 1.5.18.1 2009/09/16 19:23:18 matt Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -35,8 +35,27 @@ LEAF(printf) lw v0, _C_LABEL(callv) # get pointer to call back vectors - lw v0, 0x30(v0) # offset for callv->_printf + lw t9, 0x30(v0) # offset for callv->_printf nop - j v0 # call PROM printf +#ifdef __mips_n32 + /* + * If someone calls printf with more than 4 args on n32, + * we need to synthesize a o32 call. For now we assume no more than + * 8 arguments and no 64bit values. + */ + subu sp, sp, 48 + sw a4, 16(sp) + sw a5, 20(sp) + sw a6, 24(sp) + sw a7, 28(sp) + sw ra, 44(sp) + jalr t9 # call PROM printf + nop + lw ra, 44(sp) + j ra + addu sp, sp, 48 +#else + j t9 # call PROM printf nop +#endif END(printf) Index: src/sys/arch/pmax/stand/common/startprog.S diff -u src/sys/arch/pmax/stand/common/startprog.S:1.4 src/sys/arch/pmax/stand/common/startprog.S:1.4.18.1 --- src/sys/arch/pmax/stand/common/startprog.S:1.4 Mon Apr 28 20:23:31 2008 +++ src/sys/arch/pmax/stand/common/startprog.S Wed Sep 16 19:23:18 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: startprog.S,v 1.4 2008/04/28 20:23:31 martin Exp $ */ +/* $NetBSD: startprog.S,v 1.4.18.1 2009/09/16 19:23:18 matt Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -39,26 +39,33 @@ #include <mips/asm.h> LEAF(startprog) - subu sp,sp,32 - addu t0,a1,-CALLFRAME_SIZ # new stack value - move t1,a0 + subu sp,sp,CALLFRAME_SIZ + addu t2,a1,-CALLFRAME_SIZ # new stack value + move t9,a0 move a0,a2 move a1,a3 +#ifdef __mips_o32 lw a2,48(sp) # load everything from old stack we need lw a3,52(sp) - lw v0,56(sp) - lw v1,60(sp) - - move sp,t0 # new stack pointer - sw ra,24(sp) - - sw v0,16(sp) - sw v1,20(sp) - jal ra,t1 + lw $8,56(sp) # use a4/t0 in case N32/N64 kernel + lw $9,60(sp) # use a5/t1 in case N32/N64 kernel +#else + move a2,a4 + move a3,a5 + move a4,a6 + move a5,a7 +#endif + + move sp,t2 # new stack pointer + sw ra,CALLFRAME_RA(sp) + + sw $8,16(sp) # save on stack for O32 + sw $9,20(sp) # save on stack for O32 + jal ra,t9 nop # BDslot - lw ra,24(sp) # should not get back here! + lw ra,CALLFRAME_RA(sp) # should not get back here! j ra - addu sp,sp,32 + addu sp,sp,CALLFRAME_SIZ END(startprog)